- 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 '^:'
-Sat Jun 20 07:23:43 CEST 2020
+Tue Aug 4 07:23:45 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
# Translators:
# 411370735b8ef90fa32c21e58a50941e_d905c03 <7784313cf022f885419b74f26eaf98f3_541595>, 2016-2017
# set_killer <mettall@abv.bg>, 2014
+# Nik Dim <lilo@abv.bg>, 2020
# ubone <van_ds_ff@mail.bg>, 2016
# set_killer <mettall@abv.bg>, 2014
# ubone <van_ds_ff@mail.bg>, 2016
"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-29 08:59+0000\n"
+"Last-Translator: Nik Dim <lilo@abv.bg>\n"
"Language-Team: Bulgarian (http://www.transifex.com/team-xonotic/xonotic/"
"language/bg/)\n"
"Language: bg\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:217
msgid "^1Spectating this player:"
-msgstr ""
+msgstr "^1Наблюдаващи този играч:"
#: qcsrc/client/hud/panel/infomessages.qc:217
msgid "^1Spectating you:"
-msgstr ""
+msgstr "^1Наблюдаващи теб:"
#: qcsrc/client/hud/panel/infomessages.qc:233
msgid "^7Press ^3ESC ^7to show HUD options."
#: qcsrc/client/hud/panel/quickmenu.qc:787
#: qcsrc/client/hud/panel/quickmenu.qc:794
msgid "Chat"
-msgstr ""
+msgstr "Чат"
#: qcsrc/client/hud/panel/quickmenu.qc:788
msgid "QMCMD^Send public message to"
#: qcsrc/client/hud/panel/quickmenu.qc:790
msgid "QMCMD^good game"
-msgstr ""
+msgstr "QMCMD^добра игра"
#: qcsrc/client/hud/panel/quickmenu.qc:791
msgid "QMCMD^hi / good luck"
#: qcsrc/client/hud/panel/quickmenu.qc:798
#: qcsrc/client/hud/panel/quickmenu.qc:814
msgid "QMCMD^Team chat"
-msgstr ""
+msgstr "QMCMD^Отборен чат"
#: qcsrc/client/hud/panel/quickmenu.qc:799
msgid "QMCMD^strength soon"
#: qcsrc/client/hud/panel/quickmenu.qc:802
msgid "QMCMD^negative"
-msgstr ""
+msgstr "QMCMD^отрицателен"
#: qcsrc/client/hud/panel/quickmenu.qc:803
msgid "QMCMD^positive"
-msgstr ""
+msgstr "QMCMD^положителен"
#: qcsrc/client/hud/panel/quickmenu.qc:804
msgid "QMCMD^need help (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
#: qcsrc/client/hud/panel/quickmenu.qc:817
msgid "QMCMD^Send private message to"
-msgstr ""
+msgstr "QMCMD^Изпрати лично съобщение до"
#: qcsrc/client/hud/panel/quickmenu.qc:819
#: qcsrc/client/hud/panel/quickmenu.qc:849
msgid "QMCMD^Settings"
-msgstr ""
+msgstr "QMCMD^Настройки"
#: qcsrc/client/hud/panel/quickmenu.qc:820
#: qcsrc/client/hud/panel/quickmenu.qc:827
#: qcsrc/client/hud/panel/quickmenu.qc:842
msgid "QMCMD^Increase speed"
-msgstr ""
+msgstr "QMCMD^Увеличи скоростта"
#: qcsrc/client/hud/panel/quickmenu.qc:843
msgid "QMCMD^Decrease speed"
-msgstr ""
+msgstr "QMCMD^Намали скоростта"
#: qcsrc/client/hud/panel/quickmenu.qc:844
msgid "QMCMD^Wall collision"
#: qcsrc/client/hud/panel/quickmenu.qc:848
msgid "QMCMD^Fullscreen"
-msgstr ""
+msgstr "QMCMD^Цял екран"
#: qcsrc/client/hud/panel/quickmenu.qc:851
#: qcsrc/client/hud/panel/quickmenu.qc:861
#: qcsrc/client/hud/panel/quickmenu.qc:852
msgid "QMCMD^Restart the map"
-msgstr ""
+msgstr "QMCMD^Рестартиране на картата"
#: qcsrc/client/hud/panel/quickmenu.qc:853
msgid "QMCMD^End match"
#: qcsrc/client/hud/panel/racetimer.qc:159 qcsrc/client/main.qc:1102
msgid "missing a checkpoint"
-msgstr ""
+msgstr "пропуснат чекпойнт"
#: qcsrc/client/hud/panel/radar.qc:386
msgid "Click to select teleport destination"
#: qcsrc/client/hud/panel/scoreboard.qc:109
msgid "Number of deaths"
-msgstr ""
+msgstr "Брой умирания"
#: qcsrc/client/hud/panel/scoreboard.qc:109
msgid "SCO^deaths"
#: qcsrc/client/hud/panel/scoreboard.qc:111
msgid "The total damage done"
-msgstr ""
+msgstr "Общa нанесена щета"
#: qcsrc/client/hud/panel/scoreboard.qc:112
msgid "SCO^dmgtaken"
#: 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:125
msgid "Number of kills"
-msgstr ""
+msgstr "Брой убийства"
#: qcsrc/client/hud/panel/scoreboard.qc:125
msgid "SCO^kills"
#: qcsrc/client/hud/panel/scoreboard.qc:128
msgid "Number of times a key was lost"
-msgstr ""
+msgstr "Колко пъти ключа е бил изгубен"
#: qcsrc/client/hud/panel/scoreboard.qc:128
msgid "SCO^losses"
#: qcsrc/client/hud/panel/scoreboard.qc:129
#: qcsrc/client/hud/panel/scoreboard.qc:130
msgid "Player name"
-msgstr ""
+msgstr "Име на играч"
#: qcsrc/client/hud/panel/scoreboard.qc:129
msgid "SCO^name"
#: qcsrc/client/hud/panel/scoreboard.qc:131
msgid "Number of objectives destroyed"
-msgstr ""
+msgstr "Брой унищожени цели"
#: qcsrc/client/hud/panel/scoreboard.qc:131
msgid "SCO^objectives"
#: qcsrc/client/hud/panel/scoreboard.qc:134
msgid "Packet loss"
-msgstr ""
+msgstr "Загубени пакети"
#: qcsrc/client/hud/panel/scoreboard.qc:134
msgid "SCO^pl"
#: qcsrc/client/hud/panel/scoreboard.qc:138
msgid "Number of revivals"
-msgstr ""
+msgstr "Брой съживявания"
#: qcsrc/client/hud/panel/scoreboard.qc:138
msgid "SCO^revivals"
#: 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"
-msgstr ""
+msgstr "SCO^спечелени рундове"
#: qcsrc/client/hud/panel/scoreboard.qc:140
msgid "SCO^score"
#: qcsrc/client/hud/panel/scoreboard.qc:140
msgid "Total score"
-msgstr ""
+msgstr "Общ резултат"
#: qcsrc/client/hud/panel/scoreboard.qc:141
msgid "Number of suicides"
#: qcsrc/client/hud/panel/scoreboard.qc:331
msgid "Usage:"
-msgstr ""
+msgstr "Употреба:"
#: qcsrc/client/hud/panel/scoreboard.qc:333
msgid "^2scoreboard_columns_set ^3field1 field2 ..."
#: qcsrc/client/hud/panel/timer.qc:72
msgid "WARMUP"
-msgstr ""
+msgstr "ЗАГРЯВКА"
#: qcsrc/client/hud/panel/vote.qc:33
msgid "^1You must answer before entering hud configure mode"
#: qcsrc/common/items/item/armor.qh:42
msgid "Small armor"
-msgstr ""
+msgstr "Малка броня"
#: qcsrc/common/items/item/armor.qh:80
msgid "Medium armor"
-msgstr ""
+msgstr "Средна броня"
#: qcsrc/common/items/item/armor.qh:118 qcsrc/common/items/item/armor.qh:121
msgid "Big armor"
-msgstr ""
+msgstr "Голяма броня"
#: qcsrc/common/items/item/armor.qh:158 qcsrc/common/items/item/armor.qh:161
msgid "Mega armor"
-msgstr ""
+msgstr "Мега броня"
#: qcsrc/common/items/item/health.qh:42
msgid "Small health"
-msgstr ""
+msgstr "Малка аптечка"
#: qcsrc/common/items/item/health.qh:80
msgid "Medium health"
-msgstr ""
+msgstr "Средна аптечка"
#: qcsrc/common/items/item/health.qh:118 qcsrc/common/items/item/health.qh:121
msgid "Big health"
-msgstr ""
+msgstr "Голяма аптечка"
#: qcsrc/common/items/item/health.qh:158 qcsrc/common/items/item/health.qh:161
msgid "Mega health"
-msgstr ""
+msgstr "Мега аптечка"
#: qcsrc/common/items/item/jetpack.qh:38 qcsrc/common/items/item/jetpack.qh:41
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:91
#: qcsrc/common/mapinfo.qh:590
msgid "Duel"
-msgstr ""
+msgstr "Дуел"
#: qcsrc/common/mapinfo.qh:590
msgid "Fight in a one versus one arena battle to decide the winner"
#: qcsrc/common/minigames/minigame/pong.qc:589
#: qcsrc/common/minigames/minigame/ttt.qc:299
msgid "AI"
-msgstr ""
+msgstr "ИИ"
#: qcsrc/common/minigames/minigame/pong.qc:606
msgid "Press ^1Start Match^7 to start the match with the current players"
#: qcsrc/common/minigames/minigame/ttt.qc:672
msgid "Single Player"
-msgstr ""
+msgstr "Солова Игра"
#: qcsrc/common/monsters/monster/mage.qh:17
#: qcsrc/menu/xonotic/dialog_monstertools.qc:18
#: qcsrc/common/mutators/mutator/buffs/all.inc:87
msgid "Jump"
-msgstr ""
+msgstr "Скок"
#: qcsrc/common/mutators/mutator/buffs/all.inc:96
msgid "Invisible"
#: qcsrc/common/mutators/mutator/buffs/all.inc:129
msgid "Luck"
-msgstr ""
+msgstr "Късмет"
#: qcsrc/common/mutators/mutator/buffs/all.inc:137
msgid "Flight"
#: qcsrc/common/mutators/mutator/nades/nades.inc:18
msgid "Napalm grenade"
-msgstr ""
+msgstr "Напалмова граната"
#: qcsrc/common/mutators/mutator/nades/nades.inc:26
msgid "Ice grenade"
-msgstr ""
+msgstr "Ледена граната"
#: qcsrc/common/mutators/mutator/nades/nades.inc:34
msgid "Translocate grenade"
#: qcsrc/common/mutators/mutator/nades/nades.qh:33
msgid "Grenade"
-msgstr ""
+msgstr "Граната"
#: qcsrc/common/mutators/mutator/overkill/okhmg.qh:20
msgid "Overkill Heavy Machine Gun"
#: qcsrc/common/notifications/all.inc:561
msgid "^BGYou got the flag!"
-msgstr ""
+msgstr "^BGТи взе флага!"
#: qcsrc/common/notifications/all.inc:562
#, c-format
msgid "^BGYou got your %steam^BG's flag, return it!"
-msgstr ""
+msgstr "^BGТи взе твоя %s team^BG's флаг, върни го!"
#: qcsrc/common/notifications/all.inc:563
#, c-format
#: qcsrc/common/notifications/all.qh:419
msgid "point"
-msgstr ""
+msgstr "точка"
#: qcsrc/common/notifications/all.qh:419
msgid "points"
-msgstr ""
+msgstr "точки"
#: qcsrc/common/notifications/all.qh:428
msgid "drop flag"
#: qcsrc/common/util.qc:1451 qcsrc/common/util.qc:1508
#, c-format
msgid "UPARROW"
-msgstr ""
+msgstr "СТРЕЛКА НАГОРЕ"
#: qcsrc/common/util.qc:1452 qcsrc/common/util.qc:1503
#, c-format
msgid "DOWNARROW"
-msgstr ""
+msgstr "СТРЕЛКА НАДОЛУ"
#: qcsrc/common/util.qc:1453 qcsrc/common/util.qc:1505
#, c-format
msgid "LEFTARROW"
-msgstr ""
+msgstr "СТРЕЛКА НАЛЯВО"
#: qcsrc/common/util.qc:1454 qcsrc/common/util.qc:1506
#, c-format
msgid "RIGHTARROW"
-msgstr ""
+msgstr "СТРЕЛКА НАДЯСНО"
#: qcsrc/common/util.qc:1456
msgid "ALT"
#: qcsrc/common/util.qc:1477
msgid "APOSTROPHE"
-msgstr ""
+msgstr "АПОСТРОФ"
#: qcsrc/common/util.qc:1478
msgid "BACKSLASH"
#: qcsrc/common/util.qc:1510
#, c-format
msgid "PERIOD"
-msgstr ""
+msgstr "ТОЧКА"
#: qcsrc/common/util.qc:1512
#, c-format
#: qcsrc/common/util.qc:1515
#, c-format
msgid "MINUS"
-msgstr ""
+msgstr "МИНУС"
#: qcsrc/common/util.qc:1516
#, c-format
msgid "PLUS"
-msgstr ""
+msgstr "ПЛЮС"
#: qcsrc/common/util.qc:1518
#, c-format
msgid "EQUALS"
-msgstr ""
+msgstr "РАВНО"
#: qcsrc/common/util.qc:1523
msgid "PRINTSCREEN"
#: qcsrc/common/util.qc:1546
#, c-format
msgid "START"
-msgstr ""
+msgstr "СТАРТ"
#: qcsrc/common/util.qc:1547
#, c-format
#: qcsrc/common/util.qc:1571
#, c-format
msgid "UP"
-msgstr ""
+msgstr "НАГОРЕ"
#: qcsrc/common/util.qc:1572
#, c-format
#: qcsrc/menu/xonotic/credits.qc:158
msgid "Bulgarian"
-msgstr ""
+msgstr "Български"
#: qcsrc/menu/xonotic/credits.qc:165
msgid "Chinese (China)"
#: qcsrc/menu/xonotic/credits.qc:179
msgid "Czech"
-msgstr ""
+msgstr "Чешки"
#: qcsrc/menu/xonotic/credits.qc:184
msgid "Dutch"
#: qcsrc/menu/xonotic/credits.qc:201
msgid "French"
-msgstr ""
+msgstr "Френски"
#: qcsrc/menu/xonotic/credits.qc:209
msgid "German"
-msgstr ""
+msgstr "Немски"
#: qcsrc/menu/xonotic/credits.qc:220
msgid "Greek"
-msgstr ""
+msgstr "Гръцки"
#: qcsrc/menu/xonotic/credits.qc:226
msgid "Hungarian"
-msgstr ""
+msgstr "Унгарски"
#: qcsrc/menu/xonotic/credits.qc:230
msgid "Irish"
#: qcsrc/menu/xonotic/credits.qc:233
msgid "Italian"
-msgstr ""
+msgstr "Италиански"
#: qcsrc/menu/xonotic/credits.qc:239
msgid "Kazakh"
#: qcsrc/menu/xonotic/credits.qc:242
msgid "Korean"
-msgstr ""
+msgstr "Корейски"
#: qcsrc/menu/xonotic/credits.qc:246
msgid "Polish"
-msgstr ""
+msgstr "Полски"
#: qcsrc/menu/xonotic/credits.qc:254
msgid "Portuguese"
#: qcsrc/menu/xonotic/credits.qc:260
msgid "Romanian"
-msgstr ""
+msgstr "Румънски"
#: qcsrc/menu/xonotic/credits.qc:267
msgid "Russian"
-msgstr ""
+msgstr "Руски"
#: qcsrc/menu/xonotic/credits.qc:278
msgid "Scottish Gaelic"
#: qcsrc/menu/xonotic/credits.qc:281
msgid "Serbian"
-msgstr ""
+msgstr "Сръбски"
#: qcsrc/menu/xonotic/credits.qc:287
msgid "Spanish"
-msgstr ""
+msgstr "Испански"
#: qcsrc/menu/xonotic/credits.qc:298
msgid "Swedish"
#: qcsrc/menu/xonotic/credits.qc:302
msgid "Ukrainian"
-msgstr ""
+msgstr "Украински"
#: qcsrc/menu/xonotic/credits.qc:309
msgid "Past Contributors"
#: 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"
#: qcsrc/menu/xonotic/dialog_multiplayer_media_screenshot_viewer.qc:142
msgid "Previous"
-msgstr ""
+msgstr "Предходен"
#: qcsrc/menu/xonotic/dialog_multiplayer_media_screenshot_viewer.qc:145
msgid "Next"
-msgstr ""
+msgstr "Следващ"
#: qcsrc/menu/xonotic/dialog_multiplayer_media_screenshot_viewer.qc:150
msgid "Slide show"
#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:156
msgid "Select language..."
-msgstr ""
+msgstr "Избери език..."
#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:172
msgid "Gender:"
#: qcsrc/menu/xonotic/keybinder.qc:56
msgid "reload"
-msgstr ""
+msgstr "презареждане"
#: qcsrc/menu/xonotic/keybinder.qc:57
msgid "drop weapon / throw nade"
#: qcsrc/menu/xonotic/keybinder.qc:102
msgid "Client"
-msgstr ""
+msgstr "Клиент"
#: qcsrc/menu/xonotic/keybinder.qc:106 qcsrc/menu/xonotic/keybinder.qc:108
msgid "enter console"
#: qcsrc/menu/xonotic/statslist.qc:29
msgid "January"
-msgstr ""
+msgstr "Януари"
#: qcsrc/menu/xonotic/statslist.qc:30
msgid "February"
-msgstr ""
+msgstr "Февруари"
#: qcsrc/menu/xonotic/statslist.qc:31
msgid "March"
-msgstr ""
+msgstr "Март"
#: qcsrc/menu/xonotic/statslist.qc:32
msgid "April"
-msgstr ""
+msgstr "Април"
#: qcsrc/menu/xonotic/statslist.qc:33
msgid "May"
-msgstr ""
+msgstr "Май"
#: qcsrc/menu/xonotic/statslist.qc:34
msgid "June"
-msgstr ""
+msgstr "Юни"
#: qcsrc/menu/xonotic/statslist.qc:35
msgid "July"
-msgstr ""
+msgstr "Юли"
#: qcsrc/menu/xonotic/statslist.qc:36
msgid "August"
-msgstr ""
+msgstr "Август"
#: qcsrc/menu/xonotic/statslist.qc:37
msgid "September"
-msgstr ""
+msgstr "Септември"
#: qcsrc/menu/xonotic/statslist.qc:38
msgid "October"
-msgstr ""
+msgstr "Октомври"
#: qcsrc/menu/xonotic/statslist.qc:39
msgid "November"
-msgstr ""
+msgstr "Ноември"
#: qcsrc/menu/xonotic/statslist.qc:40
msgid "December"
-msgstr ""
+msgstr "Декември"
#: qcsrc/menu/xonotic/statslist.qc:46
#, no-c-format
# 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-31 22:16+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 ""
"or in all but these game types. You can also specify 'all' as a\n"
"field to show all fields available for the current game mode."
msgstr ""
+"Després d'un camp pots posar un signe + o -, i després una llista de \n"
+"tipus de joc separats per comes, després una barra diagonal, per fer \n"
+"que el camp es mostri només en aquests o en tots menys en aquests \n"
+"tipus de jocs. També pots especificar 'all' com a camp per a mostrar \n"
+"tots els camps disponibles per a la manera de joc actual."
#: qcsrc/client/hud/panel/scoreboard.qc:350
msgid ""
"The special game type names 'teams' and 'noteams' can be used to\n"
"include/exclude ALL teams/noteams game modes."
msgstr ""
+"Els noms especials de tipus de joc 'teams' i 'noteams' poden ser \n"
+"utilitzats per a incloure/excloure TOTS els modes de joc teams/noteams."
#: qcsrc/client/hud/panel/scoreboard.qc:354
msgid "Example: scoreboard_columns_set name ping pl | +ctf/field3 -dm/field4"
-msgstr ""
+msgstr "Exemple: scoreboard_columns_set name ping pl | +ctf/field3 -dm/field4"
#: qcsrc/client/hud/panel/scoreboard.qc:355
msgid ""
"will display name, ping and pl aligned to the left, and the fields\n"
"right of the vertical bar aligned to the right."
msgstr ""
+"mostrarà el nom, ping i pl alineats a l'esquerra, i els camps a la \n"
+"dreta de la barra vertical alineada a la dreta."
#: qcsrc/client/hud/panel/scoreboard.qc:357
msgid ""
"'field3' will only be shown in CTF, and 'field4' will be shown in all\n"
"other gamemodes except DM."
msgstr ""
+"'field3' només serà mostrat en CTF, i 'field4' serà mostrat en tots \n"
+"els altres modes de joc excepte DM."
#: qcsrc/client/hud/panel/scoreboard.qc:621
#: qcsrc/client/hud/panel/scoreboard.qc:628
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:164
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:169
msgid "N/A"
-msgstr ""
+msgstr "N/A"
#: qcsrc/client/hud/panel/scoreboard.qc:1206
#, c-format
msgid "Accuracy stats (average %d%%)"
-msgstr ""
+msgstr "Estadístiques de precisió (mitjana %d%%)"
#: qcsrc/client/hud/panel/scoreboard.qc:1354
msgid "Map stats:"
-msgstr ""
+msgstr "Estadístiques de mapa:"
#: qcsrc/client/hud/panel/scoreboard.qc:1384
msgid "Monsters killed:"
-msgstr ""
+msgstr "Monstres assassinats:"
#: qcsrc/client/hud/panel/scoreboard.qc:1391
msgid "Secrets found:"
-msgstr ""
+msgstr "Secrets trobats:"
#: qcsrc/client/hud/panel/scoreboard.qc:1413
msgid "Capture time rankings"
-msgstr ""
+msgstr "Classificacions de temps de captura"
#: qcsrc/client/hud/panel/scoreboard.qc:1413
msgid "Rankings"
-msgstr ""
+msgstr "Classificacions"
#: qcsrc/client/hud/panel/scoreboard.qc:1631
#, c-format
msgid "^3%1.0f minutes"
-msgstr ""
+msgstr "^3%1.0f minuts"
#: qcsrc/client/hud/panel/scoreboard.qc:1640
#: qcsrc/client/hud/panel/scoreboard.qc:1647
#, c-format
msgid "^5%s %s"
-msgstr ""
+msgstr "^5%s %s"
#: qcsrc/client/hud/panel/scoreboard.qc:1641
#: qcsrc/client/hud/panel/scoreboard.qc:1648
#: qcsrc/client/hud/panel/scoreboard.qc:1667
#: qcsrc/client/hud/panel/scoreboard.qc:1674
msgid "SCO^points"
-msgstr ""
+msgstr "punts"
#: qcsrc/client/hud/panel/scoreboard.qc:1666
#: qcsrc/client/hud/panel/scoreboard.qc:1673
#, c-format
msgid "^2+%s %s"
-msgstr ""
+msgstr "^2+%s %s"
#: qcsrc/client/hud/panel/scoreboard.qc:1684
#, c-format
msgid "^7Map: ^2%s"
-msgstr ""
+msgstr "^7Mapa: ^2%s"
#: qcsrc/client/hud/panel/scoreboard.qc:1823
#, c-format
msgid "Speed award: %d%s ^7(%s^7)"
-msgstr ""
+msgstr "Premi de velocitat: %d%s ^7(%s^7)"
#: qcsrc/client/hud/panel/scoreboard.qc:1827
#, c-format
msgid "All-time fastest: %d%s ^7(%s^7)"
-msgstr ""
+msgstr "El més ràpid de tots els temps: %d%s ^7(%s^7)"
#: qcsrc/client/hud/panel/scoreboard.qc:1843
#, c-format
msgid "Spectators"
-msgstr ""
+msgstr "Espectadors"
#: qcsrc/client/hud/panel/scoreboard.qc:1870
#, c-format
msgid "^1Respawning in ^3%s^1..."
-msgstr ""
+msgstr "^1Reapareixent en ^3%s^1..."
#: qcsrc/client/hud/panel/scoreboard.qc:1880
#, c-format
--- /dev/null
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Translators:
+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: 2013-09-12 16:53+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Danish (http://www.transifex.com/team-xonotic/xonotic/"
+"language/da/)\n"
+"Language: da\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: qcsrc/client/hud/hud_config.qc:81
+#, c-format
+msgid "^2Successfully exported to %s! (Note: It's saved in data/data/)"
+msgstr ""
+
+#: qcsrc/client/hud/hud_config.qc:85
+#, c-format
+msgid "^1Couldn't write to %s"
+msgstr ""
+
+#: qcsrc/client/hud/panel/centerprint.qc:174
+#, c-format
+msgid "^3Countdown message at time %s, seconds left: ^COUNT"
+msgstr ""
+
+#: qcsrc/client/hud/panel/centerprint.qc:176
+#, c-format
+msgid ""
+"^1Multiline message at time %s that\n"
+"^1lasts longer than normal"
+msgstr ""
+
+#: qcsrc/client/hud/panel/centerprint.qc:178
+#, c-format
+msgid "Message at time %s"
+msgstr ""
+
+#: qcsrc/client/hud/panel/centerprint.qc:183
+msgid "Generic message"
+msgstr ""
+
+#: qcsrc/client/hud/panel/chat.qc:89
+msgid "^3Player^7: This is the chat area."
+msgstr ""
+
+#: qcsrc/client/hud/panel/engineinfo.qc:76
+#, c-format
+msgid "FPS: %.*f"
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:95
+msgid "^1Observing"
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:97
+#, c-format
+msgid "^1Spectating: ^7%s"
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:108
+#, c-format
+msgid "^1Press ^3%s^1 to spectate"
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:108
+#: qcsrc/menu/xonotic/keybinder.qc:47
+msgid "primary fire"
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:110
+#, c-format
+msgid "^1Press ^3%s^1 or ^3%s^1 for next or previous player"
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:110
+#: qcsrc/client/hud/panel/infomessages.qc:114
+msgid "next weapon"
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:110
+#: qcsrc/client/hud/panel/infomessages.qc:114
+msgid "previous weapon"
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:114
+#, c-format
+msgid "^1Use ^3%s^1 or ^3%s^1 to change the speed"
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:116
+#, c-format
+msgid "^1Press ^3%s^1 to observe, ^3%s^1 to change camera mode"
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:116
+#: qcsrc/common/vehicles/cl_vehicles.qc:190
+msgid "drop weapon"
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:116
+#: qcsrc/menu/xonotic/keybinder.qc:48
+msgid "secondary fire"
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:119
+#, c-format
+msgid "^1Press ^3%s^1 for gamemode info"
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:119
+#: qcsrc/menu/xonotic/keybinder.qc:103
+msgid "server info"
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:132
+msgid "^1Match has already begun"
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:134
+msgid "^1You have no more lives left"
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:136
+#: qcsrc/client/hud/panel/infomessages.qc:139
+#, c-format
+msgid "^1Press ^3%s^1 to join"
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:136
+#: qcsrc/client/hud/panel/infomessages.qc:139
+#: qcsrc/common/notifications/all.qh:430
+msgid "jump"
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:147
+#, c-format
+msgid "^1Game starts in ^3%d^1 seconds"
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:153
+msgid "^2Currently in ^1warmup^2 stage!"
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:168
+#, c-format
+msgid "%sPress ^3%s%s to end warmup"
+msgstr ""
+
+#: 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 ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:170
+#, c-format
+msgid "%sPress ^3%s%s once you are ready"
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:175
+msgid "^2Waiting for others to ready up to end warmup..."
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:177
+msgid "^2Waiting for others to ready up..."
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:183
+#, c-format
+msgid "^2Press ^3%s^2 to end warmup"
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:204
+msgid "Teamnumbers are unbalanced!"
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:207
+#, c-format
+msgid " Press ^3%s%s to adjust"
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:207
+#: qcsrc/menu/xonotic/keybinder.qc:115
+msgid "team menu"
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:217
+msgid "^1Spectating this player:"
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:217
+msgid "^1Spectating you:"
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:233
+msgid "^7Press ^3ESC ^7to show HUD options."
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:234
+msgid "^3Doubleclick ^7a panel for panel-specific options."
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:235
+msgid "^3CTRL ^7to disable collision testing, ^3SHIFT ^7and"
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:236
+msgid "^3ALT ^7+ ^3ARROW KEYS ^7for fine adjustments."
+msgstr ""
+
+#: qcsrc/client/hud/panel/modicons.qc:183
+msgid "Personal best"
+msgstr ""
+
+#: qcsrc/client/hud/panel/modicons.qc:193
+msgid "Server best"
+msgstr ""
+
+#: 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 ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:597
+#: qcsrc/client/hud/panel/quickmenu.qc:599
+#, c-format
+msgid "Submenu%d"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:604
+#, c-format
+msgid "Command%d"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:630
+msgid "Continue..."
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:787
+#: qcsrc/client/hud/panel/quickmenu.qc:794
+msgid "Chat"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:788
+msgid "QMCMD^Send public message to"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:789
+msgid "QMCMD^:-) / nice one"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:789
+msgid "QMCMD^nice one"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:790
+msgid "QMCMD^good game"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:791
+msgid "QMCMD^hi / good luck"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:791
+msgid "QMCMD^hi / good luck and have fun"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:793
+msgid "QMCMD^Send in English"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:798
+#: qcsrc/client/hud/panel/quickmenu.qc:814
+msgid "QMCMD^Team chat"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:799
+msgid "QMCMD^strength soon"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:800
+msgid "QMCMD^free item %x^7 (l:%y^7)"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:800
+msgid "QMCMD^free item, icon"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:801
+msgid "QMCMD^took item (l:%l^7)"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:801
+msgid "QMCMD^took item, icon"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:802
+msgid "QMCMD^negative"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:803
+msgid "QMCMD^positive"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:804
+msgid "QMCMD^need help (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:804
+msgid "QMCMD^need help, icon"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:805
+msgid "QMCMD^enemy seen (l:%y^7)"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:805
+msgid "QMCMD^enemy seen, icon"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:806
+msgid "QMCMD^flag seen (l:%y^7)"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:806
+msgid "QMCMD^flag seen, icon"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:807
+msgid "QMCMD^defending (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:807
+msgid "QMCMD^defending, icon"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:808
+msgid "QMCMD^roaming (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:808
+msgid "QMCMD^roaming, icon"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:809
+msgid "QMCMD^attacking (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:809
+msgid "QMCMD^attacking, icon"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:810
+msgid "QMCMD^killed flagcarrier (l:%y^7)"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:810
+msgid "QMCMD^killed flagcarrier, icon"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:811
+#, c-format
+msgid "QMCMD^dropped flag (l:%d^7)"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:811
+msgid "QMCMD^dropped flag, icon"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:812
+msgid "QMCMD^drop weapon, icon"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:812
+msgid "QMCMD^dropped weapon %w^7 (l:%l^7)"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:813
+msgid "QMCMD^drop flag/key, icon"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:813
+msgid "QMCMD^dropped flag/key %w^7 (l:%l^7)"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:817
+msgid "QMCMD^Send private message to"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:819
+#: qcsrc/client/hud/panel/quickmenu.qc:849
+msgid "QMCMD^Settings"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:820
+#: qcsrc/client/hud/panel/quickmenu.qc:827
+msgid "QMCMD^View/HUD settings"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:821
+msgid "QMCMD^3rd person view"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:822
+msgid "QMCMD^Player models like mine"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:823
+msgid "QMCMD^Names above players"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:824
+msgid "QMCMD^Crosshair per weapon"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:825
+msgid "QMCMD^FPS"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:826
+msgid "QMCMD^Net graph"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:829
+#: qcsrc/client/hud/panel/quickmenu.qc:832
+msgid "QMCMD^Sound settings"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:830
+msgid "QMCMD^Hit sound"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:831
+msgid "QMCMD^Chat sound"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:836
+msgid "QMCMD^Change spectator camera"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:841
+#: qcsrc/client/hud/panel/quickmenu.qc:845
+msgid "QMCMD^Observer camera"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:842
+msgid "QMCMD^Increase speed"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:843
+msgid "QMCMD^Decrease speed"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:844
+msgid "QMCMD^Wall collision"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:848
+msgid "QMCMD^Fullscreen"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:851
+#: qcsrc/client/hud/panel/quickmenu.qc:861
+msgid "QMCMD^Call a vote"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:852
+msgid "QMCMD^Restart the map"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:853
+msgid "QMCMD^End match"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:856
+msgid "QMCMD^Reduce match time"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:857
+msgid "QMCMD^Extend match time"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:860
+msgid "QMCMD^Shuffle teams"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:865
+msgid "QMCMD^Spectate a player"
+msgstr ""
+
+#: qcsrc/client/hud/panel/racetimer.qc:59
+#, c-format
+msgid " (-%dL)"
+msgstr ""
+
+#: qcsrc/client/hud/panel/racetimer.qc:64
+#, c-format
+msgid " (+%dL)"
+msgstr ""
+
+#: qcsrc/client/hud/panel/racetimer.qc:83
+msgid "Start line"
+msgstr ""
+
+#: qcsrc/client/hud/panel/racetimer.qc:85
+#: qcsrc/client/hud/panel/racetimer.qc:89
+msgid "Finish line"
+msgstr ""
+
+#: qcsrc/client/hud/panel/racetimer.qc:87
+#: qcsrc/client/hud/panel/racetimer.qc:156
+#, c-format
+msgid "Intermediate %d"
+msgstr ""
+
+#: 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 ""
+
+#: qcsrc/client/hud/panel/racetimer.qc:159 qcsrc/client/main.qc:1102
+msgid "missing a checkpoint"
+msgstr ""
+
+#: qcsrc/client/hud/panel/radar.qc:386
+msgid "Click to select teleport destination"
+msgstr ""
+
+#: qcsrc/client/hud/panel/radar.qc:390
+msgid "Click to select spawn location"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:105
+msgid "Number of ball carrier kills"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:105
+msgid "SCO^bckills"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:106
+msgid "SCO^bctime"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:106
+msgid "Total amount of time holding the ball in Keepaway"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:107
+msgid "How often a flag (CTF) or a key (KeyHunt) was captured"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:107
+msgid "SCO^caps"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:108
+msgid "SCO^captime"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:108
+msgid "Time of fastest capture (CTF)"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:109
+msgid "Number of deaths"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:109
+msgid "SCO^deaths"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:110
+msgid "Number of keys destroyed by pushing them into void"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:110
+msgid "SCO^destroyed"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:111
+msgid "SCO^damage"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:111
+msgid "The total damage done"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:112
+msgid "SCO^dmgtaken"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:112
+msgid "The total damage taken"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:113
+msgid "Number of flag drops"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:113
+msgid "SCO^drops"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:114
+msgid "Player ELO"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:114
+msgid "SCO^elo"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:115
+msgid "SCO^fastest"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:115
+msgid "Time of fastest lap (Race/CTS)"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:116
+msgid "Number of faults committed"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:116
+msgid "SCO^faults"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:117
+msgid "Number of flag carrier kills"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:117
+msgid "SCO^fckills"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:118
+msgid "FPS"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:118
+msgid "SCO^fps"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:119
+msgid "Number of kills minus suicides"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:119
+msgid "SCO^frags"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:120
+msgid "Number of goals scored"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:120
+msgid "SCO^goals"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:121
+msgid "Number of keys carrier kills"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:121
+msgid "SCO^kckills"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:122
+msgid "SCO^k/d"
+msgstr ""
+
+#: 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 ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:123
+msgid "SCO^kdr"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:124
+msgid "SCO^kdratio"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:125
+msgid "Number of kills"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:125
+msgid "SCO^kills"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:126
+msgid "Number of laps finished (Race/CTS)"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:126
+msgid "SCO^laps"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:127
+msgid "Number of lives (LMS)"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:127
+msgid "SCO^lives"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:128
+msgid "Number of times a key was lost"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:128
+msgid "SCO^losses"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:129
+#: qcsrc/client/hud/panel/scoreboard.qc:130
+msgid "Player name"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:129
+msgid "SCO^name"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:130
+msgid "SCO^nick"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:131
+msgid "Number of objectives destroyed"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:131
+msgid "SCO^objectives"
+msgstr ""
+
+#: 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 ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:132
+msgid "SCO^pickups"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:133
+msgid "Ping time"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:133
+msgid "SCO^ping"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:134
+msgid "Packet loss"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:134
+msgid "SCO^pl"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:135
+msgid "Number of players pushed into void"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:135
+msgid "SCO^pushes"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:136
+msgid "Player rank"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:136
+msgid "SCO^rank"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:137
+msgid "Number of flag returns"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:137
+msgid "SCO^returns"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:138
+msgid "Number of revivals"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:138
+msgid "SCO^revivals"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:139
+msgid "Number of rounds won"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:139
+msgid "SCO^rounds won"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:140
+msgid "SCO^score"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:140
+msgid "Total score"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:141
+msgid "Number of suicides"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:141
+msgid "SCO^suicides"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:142
+msgid "Number of kills minus deaths"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:142
+msgid "SCO^sum"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:143
+msgid "Number of domination points taken (Domination)"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:143
+msgid "SCO^takes"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:144
+msgid "Number of teamkills"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:144
+msgid "SCO^teamkills"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:145
+msgid "Number of ticks (Domination)"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:145
+msgid "SCO^ticks"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:146
+msgid "SCO^time"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:146
+msgid "Total time raced (Race/CTS)"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:330
+msgid ""
+"You can modify the scoreboard using the ^2scoreboard_columns_set command."
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:331
+msgid "Usage:"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:333
+msgid "^2scoreboard_columns_set ^3field1 field2 ..."
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:334
+msgid ""
+"^2scoreboard_columns_set ^7without arguments reads the arguments from the "
+"cvar scoreboard_columns"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:335
+msgid ""
+" ^5Note: ^7scoreboard_columns_set without arguments is executed on every "
+"map start"
+msgstr ""
+
+#: 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 ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:337
+msgid "You can use a ^3|^7 to start the right-aligned fields."
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:338
+msgid "The following field names are recognized (case insensitive):"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:344
+msgid ""
+"Before a field you can put a + or - sign, then a comma separated list\n"
+"of game types, then a slash, to make the field show up only in these\n"
+"or in all but these game types. You can also specify 'all' as a\n"
+"field to show all fields available for the current game mode."
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:350
+msgid ""
+"The special game type names 'teams' and 'noteams' can be used to\n"
+"include/exclude ALL teams/noteams game modes."
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:354
+msgid "Example: scoreboard_columns_set name ping pl | +ctf/field3 -dm/field4"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:355
+msgid ""
+"will display name, ping and pl aligned to the left, and the fields\n"
+"right of the vertical bar aligned to the right."
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:357
+msgid ""
+"'field3' will only be shown in CTF, and 'field4' will be shown in all\n"
+"other gamemodes except DM."
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:621
+#: qcsrc/client/hud/panel/scoreboard.qc:628
+#: qcsrc/client/hud/panel/scoreboard.qc:680
+#: qcsrc/client/hud/panel/scoreboard.qc:691
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:46
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:47
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:121
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:164
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:169
+msgid "N/A"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:1206
+#, c-format
+msgid "Accuracy stats (average %d%%)"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:1354
+msgid "Map stats:"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:1384
+msgid "Monsters killed:"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:1391
+msgid "Secrets found:"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:1413
+msgid "Capture time rankings"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:1413
+msgid "Rankings"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:1631
+#, c-format
+msgid "^3%1.0f minutes"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:1640
+#: qcsrc/client/hud/panel/scoreboard.qc:1647
+#, c-format
+msgid "^5%s %s"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:1641
+#: qcsrc/client/hud/panel/scoreboard.qc:1648
+#: qcsrc/client/hud/panel/scoreboard.qc:1667
+#: qcsrc/client/hud/panel/scoreboard.qc:1674
+msgid "SCO^points"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:1666
+#: qcsrc/client/hud/panel/scoreboard.qc:1673
+#, c-format
+msgid "^2+%s %s"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:1684
+#, c-format
+msgid "^7Map: ^2%s"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:1823
+#, c-format
+msgid "Speed award: %d%s ^7(%s^7)"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:1827
+#, c-format
+msgid "All-time fastest: %d%s ^7(%s^7)"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:1843
+#, c-format
+msgid "Spectators"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:1870
+#, c-format
+msgid "^1Respawning in ^3%s^1..."
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:1880
+#, c-format
+msgid "You are dead, wait ^3%s^7 before respawning"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:1889
+#, c-format
+msgid "You are dead, press ^2%s^7 to respawn"
+msgstr ""
+
+#: qcsrc/client/hud/panel/timer.qc:72
+msgid "WARMUP"
+msgstr ""
+
+#: qcsrc/client/hud/panel/vote.qc:33
+msgid "^1You must answer before entering hud configure mode"
+msgstr ""
+
+#: qcsrc/client/hud/panel/vote.qc:36
+msgid "^2Name ^7instead of \"^1Anonymous player^7\" in stats"
+msgstr ""
+
+#: qcsrc/client/hud/panel/vote.qc:122
+msgid "A vote has been called for:"
+msgstr ""
+
+#: qcsrc/client/hud/panel/vote.qc:124
+msgid "Allow servers to store and display your name?"
+msgstr ""
+
+#: qcsrc/client/hud/panel/vote.qc:128
+msgid "^1Configure the HUD"
+msgstr ""
+
+#: qcsrc/client/hud/panel/vote.qc:132
+#: qcsrc/menu/xonotic/dialog_disconnect.qc:19
+#: qcsrc/menu/xonotic/dialog_firstrun.qc:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_demo_startconfirm.qc:18
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_demo_timeconfirm.qc:18
+#: qcsrc/menu/xonotic/dialog_quit.qc:14
+#: qcsrc/menu/xonotic/dialog_settings_bindings_reset.qc:14
+#: qcsrc/menu/xonotic/dialog_settings_game_hudconfirm.qc:26
+#: qcsrc/menu/xonotic/dialog_settings_misc_reset.qc:16
+#: qcsrc/menu/xonotic/dialog_uid2name.qc:15
+msgid "Yes"
+msgstr ""
+
+#: qcsrc/client/hud/panel/vote.qc:134
+#: qcsrc/menu/xonotic/dialog_disconnect.qc:22
+#: qcsrc/menu/xonotic/dialog_firstrun.qc:83
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_demo_startconfirm.qc:21
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_demo_timeconfirm.qc:21
+#: qcsrc/menu/xonotic/dialog_quit.qc:16
+#: qcsrc/menu/xonotic/dialog_settings_bindings_reset.qc:17
+#: qcsrc/menu/xonotic/dialog_settings_game_hudconfirm.qc:29
+#: qcsrc/menu/xonotic/dialog_settings_misc_reset.qc:17
+#: qcsrc/menu/xonotic/dialog_uid2name.qc:17
+msgid "No"
+msgstr ""
+
+#: qcsrc/client/hud/panel/weapons.qc:584
+msgid "Out of ammo"
+msgstr ""
+
+#: qcsrc/client/hud/panel/weapons.qc:588
+msgid "Don't have"
+msgstr ""
+
+#: qcsrc/client/hud/panel/weapons.qc:592
+msgid "Unavailable"
+msgstr ""
+
+#: qcsrc/client/main.qc:1000
+msgid " qu/s"
+msgstr ""
+
+#: qcsrc/client/main.qc:1002
+msgid " m/s"
+msgstr ""
+
+#: qcsrc/client/main.qc:1004
+msgid " km/h"
+msgstr ""
+
+#: qcsrc/client/main.qc:1006
+msgid " mph"
+msgstr ""
+
+#: qcsrc/client/main.qc:1008
+msgid " knots"
+msgstr ""
+
+#: qcsrc/client/main.qc:1255
+#, c-format
+msgid "%s (not bound)"
+msgstr ""
+
+#: qcsrc/client/mapvoting.qc:59
+msgid " (1 vote)"
+msgstr ""
+
+#: qcsrc/client/mapvoting.qc:61
+#, c-format
+msgid " (%d votes)"
+msgstr ""
+
+#: qcsrc/client/mapvoting.qc:281
+msgid "Don't care"
+msgstr ""
+
+#: qcsrc/client/mapvoting.qc:382
+msgid "Decide the gametype"
+msgstr ""
+
+#: qcsrc/client/mapvoting.qc:382
+msgid "Vote for a map"
+msgstr ""
+
+#: qcsrc/client/mapvoting.qc:399
+#, c-format
+msgid "%d seconds left"
+msgstr ""
+
+#: qcsrc/client/mapvoting.qc:512
+msgid "mv_mapdownload: ^3You're not supposed to use this command on your own!"
+msgstr ""
+
+#: qcsrc/client/mapvoting.qc:522
+msgid "^1Error:^7 Couldn't find pak index."
+msgstr ""
+
+#: qcsrc/client/mapvoting.qc:531
+msgid "Requesting preview..."
+msgstr ""
+
+#: qcsrc/client/miscfunctions.qc:111
+msgid "Trying to remove a team which is not in the teamlist!"
+msgstr ""
+
+#: qcsrc/client/view.qc:939
+msgid "Nade timer"
+msgstr ""
+
+#: qcsrc/client/view.qc:944
+msgid "Capture progress"
+msgstr ""
+
+#: qcsrc/client/view.qc:949
+msgid "Revival progress"
+msgstr ""
+
+#: qcsrc/common/command/generic.qc:156
+msgid "error creating curl handle"
+msgstr ""
+
+#: qcsrc/common/command/generic.qc:412
+msgid "Notification restart command only works with cl_cmd and sv_cmd."
+msgstr ""
+
+#: qcsrc/common/gamemodes/gamemode/nexball/weapon.qh:7
+msgid "Ball Stealer"
+msgstr ""
+
+#: qcsrc/common/items/item/ammo.qh:66
+msgid "bullets"
+msgstr ""
+
+#: qcsrc/common/items/item/ammo.qh:96
+msgid "cells"
+msgstr ""
+
+#: qcsrc/common/items/item/ammo.qh:126
+msgid "plasma"
+msgstr ""
+
+#: qcsrc/common/items/item/ammo.qh:156
+msgid "rockets"
+msgstr ""
+
+#: qcsrc/common/items/item/ammo.qh:190
+msgid "shells"
+msgstr ""
+
+#: qcsrc/common/items/item/armor.qh:42
+msgid "Small armor"
+msgstr ""
+
+#: qcsrc/common/items/item/armor.qh:80
+msgid "Medium armor"
+msgstr ""
+
+#: qcsrc/common/items/item/armor.qh:118 qcsrc/common/items/item/armor.qh:121
+msgid "Big armor"
+msgstr ""
+
+#: qcsrc/common/items/item/armor.qh:158 qcsrc/common/items/item/armor.qh:161
+msgid "Mega armor"
+msgstr ""
+
+#: qcsrc/common/items/item/health.qh:42
+msgid "Small health"
+msgstr ""
+
+#: qcsrc/common/items/item/health.qh:80
+msgid "Medium health"
+msgstr ""
+
+#: qcsrc/common/items/item/health.qh:118 qcsrc/common/items/item/health.qh:121
+msgid "Big health"
+msgstr ""
+
+#: qcsrc/common/items/item/health.qh:158 qcsrc/common/items/item/health.qh:161
+msgid "Mega health"
+msgstr ""
+
+#: qcsrc/common/items/item/jetpack.qh:38 qcsrc/common/items/item/jetpack.qh:41
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:91
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:215
+msgid "Jetpack"
+msgstr ""
+
+#: qcsrc/common/items/item/jetpack.qh:71
+msgid "fuel"
+msgstr ""
+
+#: qcsrc/common/items/item/jetpack.qh:96
+msgid "Fuel regenerator"
+msgstr ""
+
+#: qcsrc/common/items/item/jetpack.qh:99
+msgid "Fuel regen"
+msgstr ""
+
+#: qcsrc/common/items/item/powerup.qh:43 qcsrc/common/items/item/powerup.qh:46
+msgid "Strength"
+msgstr ""
+
+#: qcsrc/common/items/item/powerup.qh:79 qcsrc/common/items/item/powerup.qh:82
+msgid "Shield"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qc:626
+#, no-c-format
+msgid "@!#%'n Tuba Throwing"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:72 qcsrc/common/mapinfo.qh:334
+#: qcsrc/common/mapinfo.qh:529
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:105
+msgid "Frag limit:"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:72 qcsrc/common/mapinfo.qh:334
+#: qcsrc/common/mapinfo.qh:529
+msgid "The amount of frags needed before the match will end"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:115
+msgid "Deathmatch"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:115
+msgid "Score as many frags as you can"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:128
+msgid "Last Man Standing"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:128
+msgid "Survive and kill until the enemies have no lives left"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:137
+msgid "Lives:"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:149
+msgid "Race"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:149
+msgid "Race against other players to the finish line"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:176
+msgid "Laps:"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:189
+msgid "Race CTS"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:189
+msgid "Race for fastest time."
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:206 qcsrc/common/mapinfo.qh:257
+#: qcsrc/common/mapinfo.qh:373 qcsrc/common/mapinfo.qh:416
+#: qcsrc/common/mapinfo.qh:442 qcsrc/common/mapinfo.qh:462
+#: qcsrc/common/mapinfo.qh:582
+msgid "Point limit:"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:219
+msgid "Help your team score the most frags against the enemy team"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:219
+msgid "Team Deathmatch"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:257 qcsrc/common/mapinfo.qh:373
+#: qcsrc/common/mapinfo.qh:416
+msgid "The amount of points needed before the match will end"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:271
+msgid "Capture the Flag"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:271
+msgid ""
+"Find and bring the enemy flag to your base to capture it, defend your base "
+"from the other team"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:289
+msgid "Capture limit:"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:289
+msgid "The amount of captures needed before the match will end"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:306
+msgid "Clan Arena"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:306
+msgid "Kill all enemy teammates to win the round"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:350
+msgid "Capture and defend all the control points to win"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:350
+msgid "Domination"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:388
+msgid "Gather all the keys to win the round"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:388
+msgid "Key Hunt"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:428
+msgid "Assault"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:428
+msgid ""
+"Destroy obstacles to find and destroy the enemy power core before time runs "
+"out"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:452
+msgid "Capture control points to reach and destroy the enemy generator"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:452
+msgid "Onslaught"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:474
+msgid "Nexball"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:474
+msgid "Shoot and kick the ball into the enemies goal, keep your goal clean"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:488
+msgid "Goals:"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:488
+msgid "The amount of goals needed before the match will end"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:501
+msgid "Freeze Tag"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:501
+msgid ""
+"Kill enemies to freeze them, stand next to frozen teammates to revive them; "
+"freeze all enemies to win"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:545
+msgid "Hold the ball to get points for kills"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:545
+msgid "Keepaway"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:560
+msgid "Invasion"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:560
+msgid "Survive against waves of monsters"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:590
+msgid "Duel"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:590
+msgid "Fight in a one versus one arena battle to decide the winner"
+msgstr ""
+
+#: qcsrc/common/minigames/cl_minigames.qc:383
+msgid "It's your turn"
+msgstr ""
+
+#: qcsrc/common/minigames/cl_minigames_hud.qc:366
+#: qcsrc/menu/xonotic/dialog_quit.qh:6
+msgid "Quit"
+msgstr ""
+
+#: qcsrc/common/minigames/cl_minigames_hud.qc:371
+msgid "Invite"
+msgstr ""
+
+#: qcsrc/common/minigames/cl_minigames_hud.qc:410
+msgid "Current Game"
+msgstr ""
+
+#: qcsrc/common/minigames/cl_minigames_hud.qc:435
+msgid "Exit Menu"
+msgstr ""
+
+#: qcsrc/common/minigames/cl_minigames_hud.qc:447
+#: qcsrc/menu/xonotic/dialog_multiplayer.qc:16
+msgid "Create"
+msgstr ""
+
+#: qcsrc/common/minigames/cl_minigames_hud.qc:450
+msgid "Join"
+msgstr ""
+
+#: qcsrc/common/minigames/cl_minigames_hud.qc:526
+msgid "Minigames"
+msgstr ""
+
+#: qcsrc/common/minigames/cl_minigames_hud.qc:587
+msgid "Minigame message"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/bd.qc:2
+msgid "Bulldozer"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/bd.qc:1092
+#: qcsrc/common/minigames/minigame/ps.qc:421
+#: qcsrc/common/minigames/minigame/ps.qc:427
+msgid "Game over!"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/bd.qc:1095
+msgid "Well done! Click 'Next Level' to continue"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/bd.qc:1162
+msgid "Better luck next time!"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/bd.qc:1167
+msgid "Tubular! Press \"Next Level\" to continue!"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/bd.qc:1169
+msgid "Wicked! Press \"Next Level\" to continue!"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/bd.qc:1173
+msgid "Press the space bar to change your currently selected tile"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/bd.qc:1176
+msgid "Push the boulders onto the targets"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/bd.qc:1403
+msgid "Next Level"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/bd.qc:1404
+msgid "Restart"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/bd.qc:1405
+msgid "Editor"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/bd.qc:1406
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.qc:37
+msgid "Save"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/c4.qc:2
+msgid "Connect Four"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/c4.qc:311
+#: qcsrc/common/minigames/minigame/c4.qc:317
+#: qcsrc/common/minigames/minigame/nmm.qc:491
+#: qcsrc/common/minigames/minigame/nmm.qc:497
+#: qcsrc/common/minigames/minigame/pp.qc:362
+#: qcsrc/common/minigames/minigame/pp.qc:368
+#, c-format
+msgid "%s^7 won the game!"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/c4.qc:373
+#: qcsrc/common/minigames/minigame/pp.qc:438
+#: qcsrc/common/minigames/minigame/ttt.qc:319
+msgid "Draw"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/c4.qc:378
+#: qcsrc/common/minigames/minigame/nmm.qc:606
+#: qcsrc/common/minigames/minigame/pp.qc:444
+#: qcsrc/common/minigames/minigame/ttt.qc:326
+msgid "You lost the game!"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/c4.qc:379
+#: qcsrc/common/minigames/minigame/nmm.qc:607
+#: qcsrc/common/minigames/minigame/pp.qc:445
+#: qcsrc/common/minigames/minigame/ttt.qc:327
+msgid "You win!"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/c4.qc:383
+#: qcsrc/common/minigames/minigame/nmm.qc:611
+#: qcsrc/common/minigames/minigame/pp.qc:456
+#: qcsrc/common/minigames/minigame/ttt.qc:338
+msgid "Wait for your opponent to make their move"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/c4.qc:386
+#: qcsrc/common/minigames/minigame/nmm.qc:613
+#: qcsrc/common/minigames/minigame/pp.qc:459
+#: qcsrc/common/minigames/minigame/ttt.qc:341
+msgid "Click on the game board to place your piece"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/nmm.qc:7
+msgid "Nine Men's Morris"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/nmm.qc:615
+msgid ""
+"You can select one of your pieces to move it in one of the surrounding places"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/nmm.qc:617
+msgid "You can select one of your pieces to move it anywhere on the board"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/nmm.qc:619
+msgid "You can take one of the opponent's pieces"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/pong.qc:2
+msgid "Pong"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/pong.qc:589
+#: qcsrc/common/minigames/minigame/ttt.qc:299
+msgid "AI"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/pong.qc:606
+msgid "Press ^1Start Match^7 to start the match with the current players"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/pong.qc:679
+msgid "Start Match"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/pong.qc:680
+msgid "Add AI player"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/pong.qc:681
+msgid "Remove AI player"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/pp.qc:2
+msgid "Push-Pull"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/pp.qc:444
+#: qcsrc/common/minigames/minigame/ttt.qc:326
+msgid "Select \"^1Next Match^7\" on the menu for a rematch!"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/pp.qc:445
+#: qcsrc/common/minigames/minigame/pp.qc:451
+#: qcsrc/common/minigames/minigame/ttt.qc:327
+#: qcsrc/common/minigames/minigame/ttt.qc:333
+msgid "Select \"^1Next Match^7\" on the menu to start a new match!"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/pp.qc:452
+#: qcsrc/common/minigames/minigame/ttt.qc:334
+msgid "Wait for your opponent to confirm the rematch"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/pp.qc:587
+#: qcsrc/common/minigames/minigame/ttt.qc:671
+msgid "Next Match"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/ps.qc:2
+msgid "Peg Solitaire"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/ps.qc:414
+msgid "All pieces cleared!"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/ps.qc:416
+msgid "Remaining pieces:"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/ps.qc:481
+#, c-format
+msgid "Pieces left: %s"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/ps.qc:491
+msgid "No more valid moves"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/ps.qc:494
+msgid "Well done, you win!"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/ps.qc:497
+msgid "Jump a piece over another to capture it"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/ttt.qc:2
+msgid "Tic Tac Toe"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/ttt.qc:672
+msgid "Single Player"
+msgstr ""
+
+#: qcsrc/common/monsters/monster/mage.qh:17
+#: qcsrc/menu/xonotic/dialog_monstertools.qc:18
+msgid "Mage"
+msgstr ""
+
+#: qcsrc/common/monsters/monster/mage.qh:29
+msgid "Mage spike"
+msgstr ""
+
+#: qcsrc/common/monsters/monster/shambler.qh:17
+#: qcsrc/menu/xonotic/dialog_monstertools.qc:17
+msgid "Shambler"
+msgstr ""
+
+#: qcsrc/common/monsters/monster/spider.qh:17
+#: qcsrc/menu/xonotic/dialog_monstertools.qc:16
+msgid "Spider"
+msgstr ""
+
+#: qcsrc/common/monsters/monster/spider.qh:28
+msgid "Spider attack"
+msgstr ""
+
+#: qcsrc/common/monsters/monster/wyvern.qh:17
+#: qcsrc/menu/xonotic/dialog_monstertools.qc:19
+msgid "Wyvern"
+msgstr ""
+
+#: qcsrc/common/monsters/monster/wyvern.qh:28
+msgid "Wyvern attack"
+msgstr ""
+
+#: qcsrc/common/monsters/monster/zombie.qh:17
+#: qcsrc/menu/xonotic/dialog_monstertools.qc:15
+msgid "Zombie"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/buffs/all.inc:16
+msgid "Ammo"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/buffs/all.inc:25
+msgid "Resistance"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/buffs/all.inc:34
+#: qcsrc/common/mutators/mutator/instagib/items.qh:126
+#: qcsrc/common/mutators/mutator/instagib/items.qh:129
+msgid "Speed"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/buffs/all.inc:44
+msgid "Medic"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/buffs/all.inc:54
+msgid "Bash"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/buffs/all.inc:63
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:83
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:184
+msgid "Vampire"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/buffs/all.inc:71
+msgid "Disability"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/buffs/all.inc:79
+msgid "Vengeance"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/buffs/all.inc:87
+msgid "Jump"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/buffs/all.inc:96
+msgid "Invisible"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/buffs/all.inc:105
+msgid "Inferno"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/buffs/all.inc:113
+msgid "Swapper"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/buffs/all.inc:121
+msgid "Magnet"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/buffs/all.inc:129
+msgid "Luck"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/buffs/all.inc:137
+msgid "Flight"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/buffs/buffs.qh:11
+msgid "Buff"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/damagetext/ui_damagetext.qc:8
+msgid "Damage text"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/damagetext/ui_damagetext.qc:18
+msgid "Draw damage numbers"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/damagetext/ui_damagetext.qc:20
+msgid "Font size minimum:"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/damagetext/ui_damagetext.qc:25
+msgid "Font size maximum:"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/damagetext/ui_damagetext.qc:30
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:55
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:102
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:60
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:109
+#: qcsrc/menu/xonotic/util.qc:775
+msgid "Color:"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/damagetext/ui_damagetext.qc:36
+msgid "Draw damage numbers for friendly fire"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/instagib/items.qh:33
+msgid "Vaporizer ammo"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/instagib/items.qh:59
+#: qcsrc/common/mutators/mutator/instagib/items.qh:62
+msgid "Extra life"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/instagib/items.qh:91
+#: qcsrc/common/mutators/mutator/instagib/items.qh:94
+msgid "Invisibility"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/nades/nades.inc:18
+msgid "Napalm grenade"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/nades/nades.inc:26
+msgid "Ice grenade"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/nades/nades.inc:34
+msgid "Translocate grenade"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/nades/nades.inc:42
+msgid "Spawn grenade"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/nades/nades.inc:50
+msgid "Heal grenade"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/nades/nades.inc:58
+msgid "Monster grenade"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/nades/nades.inc:66
+msgid "Entrap grenade"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/nades/nades.inc:74
+msgid "Veil grenade"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/nades/nades.qh:33
+msgid "Grenade"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/overkill/okhmg.qh:20
+msgid "Overkill Heavy Machine Gun"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/overkill/okmachinegun.qh:18
+msgid "Overkill MachineGun"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/overkill/oknex.qh:19
+msgid "Overkill Nex"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/overkill/okrpc.qh:20
+msgid "Overkill Rocket Propelled Chainsaw"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/overkill/okshotgun.qh:18
+msgid "Overkill Shotgun"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:3
+msgid "Waypoint"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:4
+msgid "Help me!"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:5
+msgid "Here"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:6
+msgid "DANGER"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:8
+msgid "Frozen!"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:10
+msgid "Item"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:12
+msgid "Checkpoint"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:13
+#: qcsrc/common/mutators/mutator/waypoints/waypointsprites.qc:240
+msgid "Finish"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:14
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:15
+#: qcsrc/common/mutators/mutator/waypoints/waypointsprites.qc:240
+msgid "Start"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:17
+msgid "Defend"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:18
+msgid "Destroy"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:19
+msgid "Push"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:21
+msgid "Flag carrier"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:22
+msgid "Enemy carrier"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:23
+msgid "Dropped flag"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:24
+msgid "White base"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:25
+msgid "Red base"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:26
+msgid "Blue base"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:27
+msgid "Yellow base"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:28
+msgid "Pink base"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:29
+msgid "Return flag here"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:31
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:32
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:33
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:34
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:35
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:51
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:52
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:53
+msgid "Control point"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:37
+msgid "Dropped key"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:38
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:40
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:41
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:42
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:43
+msgid "Key carrier"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:39
+msgid "Run here"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:45
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:48
+msgid "Ball"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:46
+msgid "Ball carrier"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:49
+msgid "Goal"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:54
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:55
+msgid "Generator"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:57
+msgid "Weapon"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:59
+msgid "Monster"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:61
+msgid "Vehicle"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:62
+msgid "Intruder!"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:64
+msgid "Tagged"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/waypointsprites.qc:697
+#, c-format
+msgid "%s needing help!"
+msgstr ""
+
+#: qcsrc/common/net_notice.qc:90
+msgid "^1Server notices:"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:230
+msgid "^F4NOTE: ^BGSpectator chat is not sent to players during the match"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:232
+#, c-format
+msgid "^BG%s^BG captured the ^TC^TT^BG flag"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:233
+#, c-format
+msgid ""
+"^BG%s^BG captured the ^TC^TT^BG flag in ^F1%s^BG seconds, breaking ^BG"
+"%s^BG's previous record of ^F2%s^BG seconds"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:234
+#, c-format
+msgid "^BG%s^BG captured the flag"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:235
+#, c-format
+msgid "^BG%s^BG captured the ^TC^TT^BG flag in ^F1%s^BG seconds"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:236
+#, c-format
+msgid ""
+"^BG%s^BG captured the ^TC^TT^BG flag in ^F2%s^BG seconds, failing to break "
+"^BG%s^BG's previous record of ^F1%s^BG seconds"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:237
+msgid "^BGThe ^TC^TT^BG flag was returned to base by its owner"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:238
+msgid "^BGThe flag was returned by its owner"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:239
+msgid "^BGThe ^TC^TT^BG flag was destroyed and returned to base"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:240
+msgid "^BGThe flag was destroyed and returned to base"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:241
+msgid "^BGThe ^TC^TT^BG flag was dropped in the base and returned itself"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:242
+msgid "^BGThe flag was dropped in the base and returned itself"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:243
+msgid ""
+"^BGThe ^TC^TT^BG flag fell somewhere it couldn't be reached and returned to "
+"base"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:244
+msgid "^BGThe flag fell somewhere it couldn't be reached and returned to base"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:245
+#, c-format
+msgid ""
+"^BGThe ^TC^TT^BG flag became impatient after ^F1%.2f^BG seconds and returned "
+"itself"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:246
+#, c-format
+msgid ""
+"^BGThe flag became impatient after ^F1%.2f^BG seconds and returned itself"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:247
+msgid "^BGThe ^TC^TT^BG flag has returned to the base"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:248
+msgid "^BGThe flag has returned to the base"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:249
+#, c-format
+msgid "^BG%s^BG lost the ^TC^TT^BG flag"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:250
+#, c-format
+msgid "^BG%s^BG lost the flag"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:251
+#, c-format
+msgid "^BG%s^BG got the ^TC^TT^BG flag"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:252
+#, c-format
+msgid "^BG%s^BG got the flag"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:253
+#: qcsrc/common/notifications/all.inc:254
+#, c-format
+msgid "^BG%s^BG returned the ^TC^TT^BG flag"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:256
+#: qcsrc/common/notifications/all.inc:544
+#, c-format
+msgid "^F2Throwing coin... Result: %s^F2!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:258
+msgid "^BGYou don't have any fuel for the ^F1Jetpack"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:260
+msgid "^F2You lack a UID, superspec options will not be saved/restored"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:262
+msgid "^F1Round already started, you will join the game in the next round"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:263
+msgid "^F2You will spectate in the next round"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:265
+#, c-format
+msgid "^BG%s%s^K1 was killed by ^BG%s^K1's ^BG%s^K1 buff ^K1%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:265
+#, c-format
+msgid "^BG%s%s^K1 was scored against by ^BG%s^K1's ^BG%s^K1 buff ^K1%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:266
+#, c-format
+msgid "^BG%s%s^K1 was unfairly eliminated by ^BG%s^K1%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:267
+#, c-format
+msgid "^BG%s%s^K1 was drowned by ^BG%s^K1%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:268
+#, c-format
+msgid "^BG%s%s^K1 was grounded by ^BG%s^K1%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:269
+#, c-format
+msgid "^BG%s%s^K1 felt a little hot from ^BG%s^K1's fire^K1%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:269
+#, c-format
+msgid "^BG%s%s^K1 was burnt up into a crisp by ^BG%s^K1%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:270
+#, c-format
+msgid "^BG%s%s^K1 was cooked by ^BG%s^K1%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:271
+#, c-format
+msgid "^BG%s%s^K1 was pushed in front of a monster by ^BG%s^K1%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:272
+#, c-format
+msgid "^BG%s%s^K1 was blown up by ^BG%s^K1's Nade%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:273
+#, c-format
+msgid "^BG%s%s^K1 got too close to a napalm explosion%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:273
+#, c-format
+msgid "^BG%s%s^K1 was burned to death by ^BG%s^K1's Napalm Nade%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:274
+#, c-format
+msgid "^BG%s%s^K1 was blown up by ^BG%s^K1's Ice Nade%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:275
+#, c-format
+msgid "^BG%s%s^K1 was frozen to death by ^BG%s^K1's Ice Nade%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:276
+#, c-format
+msgid "^BG%s%s^K1 has not been healed by ^BG%s^K1's Healing Nade%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:277
+#, c-format
+msgid "^BG%s%s^K1 was shot into space by ^BG%s^K1%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:278
+#, c-format
+msgid "^BG%s%s^K1 was slimed by ^BG%s^K1%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:279
+#, c-format
+msgid "^BG%s%s^K1 was preserved by ^BG%s^K1%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:280
+#, c-format
+msgid "^BG%s%s^K1 tried to occupy ^BG%s^K1's teleport destination space%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:280
+#, c-format
+msgid "^BG%s%s^K1 was telefragged by ^BG%s^K1%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:281
+#, c-format
+msgid "^BG%s%s^K1 died in an accident with ^BG%s^K1%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:282
+#, c-format
+msgid ""
+"^BG%s%s^K1 got caught in the blast when ^BG%s^K1's Bumblebee exploded%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:283
+#, c-format
+msgid "^BG%s%s^K1 saw the pretty lights of ^BG%s^K1's Bumblebee gun%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:284
+#, c-format
+msgid "^BG%s%s^K1 was crushed by ^BG%s^K1%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:285
+#, c-format
+msgid "^BG%s%s^K1 was cluster bombed by ^BG%s^K1's Raptor%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:286
+#, c-format
+msgid "^BG%s%s^K1 couldn't resist ^BG%s^K1's purple blobs%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:287
+#, c-format
+msgid "^BG%s%s^K1 got caught in the blast when ^BG%s^K1's Raptor exploded%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:288
+#, c-format
+msgid ""
+"^BG%s%s^K1 got caught in the blast when ^BG%s^K1's Spiderbot exploded%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:289
+#, c-format
+msgid "^BG%s%s^K1 got shredded by ^BG%s^K1's Spiderbot%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:290
+#, c-format
+msgid "^BG%s%s^K1 was blasted to bits by ^BG%s^K1's Spiderbot%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:291
+#, c-format
+msgid "^BG%s%s^K1 got caught in the blast when ^BG%s^K1's Racer exploded%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:292
+#, c-format
+msgid "^BG%s%s^K1 was bolted down by ^BG%s^K1's Racer%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:293
+#, c-format
+msgid "^BG%s%s^K1 couldn't find shelter from ^BG%s^K1's Racer%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:294
+#, c-format
+msgid "^BG%s%s^K1 was thrown into a world of hurt by ^BG%s^K1%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:296
+#, c-format
+msgid "^BG%s^K1 was moved into the %s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:297
+#, c-format
+msgid "^BG%s^K1 became enemies with the Lord of Teamplay%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:298
+#, c-format
+msgid "^BG%s^K1 thought they found a nice camping ground%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:299
+#, c-format
+msgid "^BG%s^K1 unfairly eliminated themself%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:301
+#, c-format
+msgid "^BG%s^K1 couldn't catch their breath%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:301
+#, c-format
+msgid "^BG%s^K1 was in the water for too long%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:302
+#, c-format
+msgid "^BG%s^K1 hit the ground with a bit too much force%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:302
+#, c-format
+msgid "^BG%s^K1 hit the ground with a crunch%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:303
+#, c-format
+msgid "^BG%s^K1 became a bit too crispy%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:303
+#, c-format
+msgid "^BG%s^K1 felt a little hot%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:304
+#, c-format
+msgid "^BG%s^K1 died%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:305
+#, c-format
+msgid "^BG%s^K1 found a hot place%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:305
+#, c-format
+msgid "^BG%s^K1 turned into hot slag%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:306
+#, c-format
+msgid "^BG%s^K1 was exploded by a Mage%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:307
+#, c-format
+msgid "^BG%s^K1's innards became outwards by a Shambler%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:308
+#, c-format
+msgid "^BG%s^K1 was smashed by a Shambler%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:309
+#, c-format
+msgid "^BG%s^K1 was zapped to death by a Shambler%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:310
+#, c-format
+msgid "^BG%s^K1 was bitten by a Spider%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:311
+#, c-format
+msgid "^BG%s^K1 was fireballed by a Wyvern%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:312
+#, c-format
+msgid "^BG%s^K1 joins the Zombies%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:313
+#, c-format
+msgid "^BG%s^K1 was given kung fu lessons by a Zombie%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:314
+#: qcsrc/common/notifications/all.inc:316
+#, c-format
+msgid "^BG%s^K1 mastered the art of self-nading%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:315
+#, c-format
+msgid ""
+"^BG%s^K1 decided to take a look at the results of their napalm explosion%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:315
+#, c-format
+msgid "^BG%s^K1 was burned to death by their own Napalm Nade%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:317
+#, c-format
+msgid "^BG%s^K1 felt a little chilly%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:317
+#, c-format
+msgid "^BG%s^K1 was frozen to death by their own Ice Nade%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:318
+#, c-format
+msgid "^BG%s^K1's Healing Nade didn't quite heal them%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:319
+#, c-format
+msgid "^BG%s^K1 died%s%s. What's the point of living without ammo?"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:319
+#, c-format
+msgid "^BG%s^K1 ran out of ammo%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:320
+#, c-format
+msgid "^BG%s^K1 rotted away%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:321
+#, c-format
+msgid "^BG%s^K1 became a shooting star%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:322
+#, c-format
+msgid "^BG%s^K1 was slimed%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:323
+#, c-format
+msgid "^BG%s^K1 couldn't take it anymore%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:324
+#, c-format
+msgid "^BG%s^K1 is now preserved for centuries to come%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:325
+#, c-format
+msgid "^BG%s^K1 switched to the %s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:326
+#, c-format
+msgid "^BG%s^K1 died in an accident%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:327
+#, c-format
+msgid "^BG%s^K1 ran into a turret%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:328
+#, c-format
+msgid "^BG%s^K1 was blasted away by an eWheel turret%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:329
+#, c-format
+msgid "^BG%s^K1 got caught up in the FLAC turret fire%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:330
+#, c-format
+msgid "^BG%s^K1 was blasted away by a Hellion turret%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:331
+#, c-format
+msgid "^BG%s^K1 could not hide from the Hunter turret%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:332
+#, c-format
+msgid "^BG%s^K1 was riddled full of holes by a Machinegun turret%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:333
+#, c-format
+msgid "^BG%s^K1 got turned into smoldering gibs by an MLRS turret%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:334
+#, c-format
+msgid "^BG%s^K1 was phased out by a turret%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:335
+#, c-format
+msgid "^BG%s^K1 got served some superheated plasma from a turret%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:336
+#, c-format
+msgid "^BG%s^K1 was electrocuted by a Tesla turret%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:337
+#, c-format
+msgid "^BG%s^K1 got served a lead enrichment by a Walker turret%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:338
+#, c-format
+msgid "^BG%s^K1 was impaled by a Walker turret%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:339
+#, c-format
+msgid "^BG%s^K1 was blasted away by a Walker turret%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:340
+#, c-format
+msgid "^BG%s^K1 got caught in the blast of a Bumblebee explosion%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:341
+#, c-format
+msgid "^BG%s^K1 was crushed by a vehicle%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:342
+#, c-format
+msgid "^BG%s^K1 was caught in a Raptor cluster bomb%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:343
+#, c-format
+msgid "^BG%s^K1 got caught in the blast of a Raptor explosion%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:344
+#, c-format
+msgid "^BG%s^K1 got caught in the blast of a Spiderbot explosion%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:345
+#, c-format
+msgid "^BG%s^K1 was blasted to bits by a Spiderbot rocket%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:346
+#, c-format
+msgid "^BG%s^K1 got caught in the blast of a Racer explosion%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:347
+#, c-format
+msgid "^BG%s^K1 couldn't find shelter from a Racer rocket%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:350
+#, c-format
+msgid "^BG%s^K1 was betrayed by ^BG%s^K1%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:352
+#, c-format
+msgid "^BG%s^BG%s^BG (%s %s every %s seconds)"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:354
+#, c-format
+msgid "^BG%s^K1 was frozen by ^BG%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:355
+#, c-format
+msgid "^BG%s^K3 was revived by ^BG%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:356
+#, c-format
+msgid "^BG%s^K3 was revived by falling"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:357
+#, c-format
+msgid "^BG%s^K3 was revived by their Nade explosion"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:358
+#, c-format
+msgid "^BG%s^K3 was automatically revived after %s seconds"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:359
+#, c-format
+msgid "^BG%s^K1 froze themself"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:361
+#: qcsrc/common/notifications/all.inc:675
+msgid "^TC^TT^BG team wins the round"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:362
+#: qcsrc/common/notifications/all.inc:676
+#, c-format
+msgid "^BG%s^BG wins the round"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:363
+#: qcsrc/common/notifications/all.inc:539
+msgid "^BGRound tied"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:364
+#: qcsrc/common/notifications/all.inc:540
+msgid "^BGRound over, there's no winner"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:366
+#, c-format
+msgid "^BGGodmode saved you %s units of damage, cheater!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:368
+#, c-format
+msgid "^BG%s^BG got the %s^BG buff!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:369
+#, c-format
+msgid "^BG%s^BG lost the %s^BG buff!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:370
+#: qcsrc/common/notifications/all.inc:683
+#, c-format
+msgid "^BGYou dropped the %s^BG buff!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:371
+#: qcsrc/common/notifications/all.inc:684
+#, c-format
+msgid "^BGYou got the %s^BG buff!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:373
+#: qcsrc/common/notifications/all.inc:687
+#, c-format
+msgid "^BGYou do not have the ^F1%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:374
+#: qcsrc/common/notifications/all.inc:688
+#, c-format
+msgid "^BGYou dropped the ^F1%s^BG%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:375
+#: qcsrc/common/notifications/all.inc:689
+#, c-format
+msgid "^BGYou got the ^F1%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:376
+#: qcsrc/common/notifications/all.inc:690
+#, c-format
+msgid "^BGYou don't have enough ammo for the ^F1%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:377
+#: qcsrc/common/notifications/all.inc:691
+#, c-format
+msgid "^F1%s %s^BG is unable to fire, but its ^F1%s^BG can"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:378
+#: qcsrc/common/notifications/all.inc:692
+#, c-format
+msgid "^F1%s^BG is ^F4not available^BG on this map"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:380
+#, c-format
+msgid "^BG%s^BG is connecting..."
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:381
+#, c-format
+msgid "^BG%s^F3 connected"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:382
+#, c-format
+msgid "^BG%s^F3 is now playing"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:383
+#, c-format
+msgid "^BG%s^F3 is now playing on the ^TC^TT team"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:385
+#: qcsrc/common/notifications/all.inc:697
+#, c-format
+msgid "^BG%s^BG has dropped the ball!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:386
+#: qcsrc/common/notifications/all.inc:698
+#, c-format
+msgid "^BG%s^BG has picked up the ball!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:388
+#, c-format
+msgid "^BG%s^BG captured the keys for the ^TC^TT team"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:389
+#, c-format
+msgid "^BG%s^BG dropped the ^TC^TT Key"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:390
+#, c-format
+msgid "^BG%s^BG lost the ^TC^TT Key"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:391
+#, c-format
+msgid "^BG%s^BG pushed %s^BG causing the ^TC^TT Key ^BGdestruction"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:392
+#, c-format
+msgid "^BG%s^BG destroyed the ^TC^TT Key"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:393
+#, c-format
+msgid "^BG%s^BG picked up the ^TC^TT Key"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:395
+#, c-format
+msgid "^BG%s^F3 forfeited"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:396
+#, c-format
+msgid "^BG%s^F3 has no more lives left"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:398
+msgid "^BGMonsters are currently disabled"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:400
+msgid "^BGThe ^TC^TT^BG team held the ball for too long"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:402
+#, c-format
+msgid "^BG%s^BG captured %s^BG control point"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:403
+#, c-format
+msgid "^BG%s^BG captured a control point"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:404
+#, c-format
+msgid "^TC^TT^BG team %s^BG control point has been destroyed by %s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:405
+#, c-format
+msgid "^TC^TT^BG team control point has been destroyed by %s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:406
+msgid "^TC^TT^BG generator has been destroyed"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:407
+msgid "^TC^TT^BG generator spontaneously combusted due to overtime!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:409
+#, c-format
+msgid "^BG%s^K1 picked up Invisibility"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:410
+#, c-format
+msgid "^BG%s^K1 picked up Shield"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:411
+#, c-format
+msgid "^BG%s^K1 picked up Speed"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:412
+#, c-format
+msgid "^BG%s^K1 picked up Strength"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:414
+#, c-format
+msgid "^BG%s^F3 disconnected"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:415
+#, c-format
+msgid "^BG%s^F3 was kicked for idling"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:416
+msgid ""
+"^F2You were kicked from the server because you are a spectator and "
+"spectators aren't allowed at the moment."
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:417
+#, c-format
+msgid "^BG%s^F3 was kicked for excessive teamkilling"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:418
+#, c-format
+msgid "^BG%s^F3 is now spectating"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:420
+#, c-format
+msgid "^BG%s^BG has abandoned the race"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:421
+#, c-format
+msgid "^BG%s^BG couldn't break their %s%s^BG place record of %s%s %s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:422
+#, c-format
+msgid "^BG%s^BG couldn't break the %s%s^BG place record of %s%s %s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:423
+#, c-format
+msgid "^BG%s^BG has finished the race"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:424
+#, c-format
+msgid "^BG%s^BG broke %s^BG's %s%s^BG place record with %s%s %s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:425
+#, c-format
+msgid "^BG%s^BG improved their %s%s^BG place record with %s%s %s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:426
+#, c-format
+msgid ""
+"^BG%s^BG scored a new record with ^F2%s^BG, but unfortunately lacks a UID "
+"and will be lost."
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:427
+#, c-format
+msgid ""
+"^BG%s^BG scored a new record with ^F2%s^BG, but is anonymous and will be "
+"lost."
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:428
+#, c-format
+msgid "^BG%s^BG set the %s%s^BG place record with %s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:430
+#, c-format
+msgid ""
+"^F4You have been invited by ^BG%s^F4 to join their game of ^F2%s^F4 "
+"(^F1%s^F4)"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:432
+msgid "^TC^TT ^BGteam scores!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:434
+#, c-format
+msgid ""
+"^F2You have to become a player within the next %s, otherwise you will be "
+"kicked, because spectating isn't allowed at this time!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:436
+#, c-format
+msgid "^BG%s^K1 picked up a Superweapon"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:438
+msgid "^BGYou cannot change to a larger team"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:439
+msgid "^BGYou are not allowed to change teams"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:441
+#, c-format
+msgid ""
+"^F4NOTE: ^BGThe server is running ^F1Xonotic %s (beta)^BG, you have "
+"^F2Xonotic %s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:442
+#, c-format
+msgid ""
+"^F4NOTE: ^BGThe server is running ^F1Xonotic %s^BG, you have ^F2Xonotic %s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:443
+#, c-format
+msgid ""
+"^F4NOTE: ^F1Xonotic %s^BG is out, and you still have ^F2Xonotic %s^BG - get "
+"the update from ^F3http://www.xonotic.org/^BG!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:445
+#, c-format
+msgid "^F3SVQC Build information: ^F4%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:447
+#, c-format
+msgid ""
+"^BG%s%s^K1 died of ^BG%s^K1's great playing on the @!#%%'n Accordeon%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:448
+#, c-format
+msgid "^BG%s^K1 hurt their own ears with the @!#%%'n Accordeon%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:449
+#, c-format
+msgid "^BG%s%s^K1 was electrocuted by ^BG%s^K1's Arc%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:450
+#, c-format
+msgid "^BG%s%s^K1 was blasted by ^BG%s^K1's Arc bolts%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:451
+#, c-format
+msgid "^BG%s%s^K1 was shot to death by ^BG%s^K1's Blaster%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:452
+#, c-format
+msgid "^BG%s^K1 shot themself to hell with their Blaster%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:453
+#, c-format
+msgid "^BG%s%s^K1 felt the strong pull of ^BG%s^K1's Crylink%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:454
+#, c-format
+msgid "^BG%s^K1 felt the strong pull of their Crylink%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:455
+#, c-format
+msgid "^BG%s%s^K1 ate ^BG%s^K1's rocket%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:456
+#, c-format
+msgid "^BG%s%s^K1 got too close to ^BG%s^K1's rocket%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:457
+#, c-format
+msgid "^BG%s^K1 blew themself up with their Devastator%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:458
+#, c-format
+msgid "^BG%s%s^K1 was blasted by ^BG%s^K1's Electro bolt%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:459
+#, c-format
+msgid "^BG%s%s^K1 felt the electrifying air of ^BG%s^K1's Electro combo%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:460
+#, c-format
+msgid "^BG%s%s^K1 got too close to ^BG%s^K1's Electro orb%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:461
+#, c-format
+msgid "^BG%s^K1 played with Electro bolts%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:462
+#, c-format
+msgid "^BG%s^K1 could not remember where they put their Electro orb%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:463
+#, c-format
+msgid "^BG%s%s^K1 got too close to ^BG%s^K1's fireball%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:464
+#, c-format
+msgid "^BG%s%s^K1 got burnt by ^BG%s^K1's firemine%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:465
+#, c-format
+msgid "^BG%s^K1 should have used a smaller gun%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:466
+#, c-format
+msgid "^BG%s^K1 forgot about their firemine%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:467
+#, c-format
+msgid "^BG%s%s^K1 was pummeled by a burst of ^BG%s^K1's Hagar rockets%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:468
+#, c-format
+msgid "^BG%s%s^K1 was pummeled by ^BG%s^K1's Hagar rockets%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:469
+#, c-format
+msgid "^BG%s^K1 played with tiny Hagar rockets%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:470
+#, c-format
+msgid "^BG%s%s^K1 was cut down with ^BG%s^K1's HLAC%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:471
+#, c-format
+msgid "^BG%s^K1 got a little jumpy with their HLAC%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:472
+#, c-format
+msgid "^BG%s%s^K1 was caught in ^BG%s^K1's Hook gravity bomb%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:473
+#, c-format
+msgid ""
+"^BG%s%s^K1 died of ^BG%s^K1's great playing on the @!#%%'n Klein Bottle%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:474
+#, c-format
+msgid "^BG%s^K1 hurt their own ears with the @!#%%'n Klein Bottle%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:475
+#, c-format
+msgid "^BG%s%s^K1 was sniped by ^BG%s^K1's Machine Gun%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:476
+#, c-format
+msgid "^BG%s%s^K1 was riddled full of holes by ^BG%s^K1's Machine Gun%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:477
+#: qcsrc/common/notifications/all.inc:782
+#, c-format
+msgid "^BGYou cannot place more than ^F2%s^BG mines at a time"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:478
+#, c-format
+msgid "^BG%s%s^K1 got too close to ^BG%s^K1's mine%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:479
+#, c-format
+msgid "^BG%s^K1 forgot about their mine%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:480
+#, c-format
+msgid "^BG%s%s^K1 got too close to ^BG%s^K1's Mortar grenade%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:481
+#, c-format
+msgid "^BG%s%s^K1 ate ^BG%s^K1's Mortar grenade%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:482
+#, c-format
+msgid "^BG%s^K1 didn't see their own Mortar grenade%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:483
+#, c-format
+msgid "^BG%s^K1 blew themself up with their own Mortar%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:484
+#, c-format
+msgid "^BG%s%s^K1 was sniped by ^BG%s^K1's Overkill Heavy Machine Gun%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:485
+#, c-format
+msgid ""
+"^BG%s%s^K1 was torn to bits by ^BG%s^K1's Overkill Heavy Machine Gun%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:486
+#, c-format
+msgid ""
+"^BG%s%s^K1 was riddled full of holes by ^BG%s^K1's Overkill Machine Gun%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:487
+#, c-format
+msgid "^BG%s%s^K1 has been vaporized by ^BG%s^K1's Overkill Nex%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:488
+#, c-format
+msgid ""
+"^BG%s%s^K1 was sawn in half by ^BG%s^K1's Overkill Rocket Propelled Chainsaw"
+"%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:489
+#, c-format
+msgid ""
+"^BG%s%s^K1 almost dodged ^BG%s^K1's Overkill Rocket Propelled Chainsaw%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:490
+#, c-format
+msgid ""
+"^BG%s^K1 was sawn in half by their own Overkill Rocket Propelled Chainsaw%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:491
+#, c-format
+msgid ""
+"^BG%s^K1 blew themself up with their Overkill Rocket Propelled Chainsaw%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:493
+#, c-format
+msgid "^BG%s%s^K1 was gunned down by ^BG%s^K1's Overkill Shotgun%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:494
+#, c-format
+msgid "^BG%s%s^K1 was sniped with a Rifle by ^BG%s^K1%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:495
+#, c-format
+msgid "^BG%s%s^K1 died in ^BG%s^K1's Rifle bullet hail%s%s"
+msgstr ""
+
+#: 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 ""
+
+#: 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 ""
+
+#: qcsrc/common/notifications/all.inc:498
+#, c-format
+msgid "^BG%s%s^K1 was pummeled by ^BG%s^K1's Seeker rockets%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:499
+#, c-format
+msgid "^BG%s%s^K1 was tagged by ^BG%s^K1's Seeker%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:500
+#, c-format
+msgid "^BG%s^K1 played with tiny Seeker rockets%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:501
+#, c-format
+msgid "^BG%s%s^K1 was gunned down by ^BG%s^K1's Shockwave%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:502
+#, c-format
+msgid "^BG%s%s^K1 slapped ^BG%s^K1 around a bit with a large Shockwave%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:503
+#, c-format
+msgid "^BG%s%s^K1 was gunned down by ^BG%s^K1's Shotgun%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:504
+#, c-format
+msgid "^BG%s%s^K1 slapped ^BG%s^K1 around a bit with a large Shotgun%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:505
+#, c-format
+msgid "^BG%s^K1 is now thinking with portals%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:506
+#, c-format
+msgid "^BG%s%s^K1 died of ^BG%s^K1's great playing on the @!#%%'n Tuba%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:507
+#, c-format
+msgid "^BG%s^K1 hurt their own ears with the @!#%%'n Tuba%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:508
+#, c-format
+msgid "^BG%s%s^K1 has been sublimated by ^BG%s^K1's Vaporizer%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:509
+#, c-format
+msgid "^BG%s%s^K1 has been vaporized by ^BG%s^K1's Vortex%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:528
+msgid "^F4You are now alone!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:530
+msgid "^BGYou are attacking!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:531
+msgid "^BGYou are defending!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:532
+#, c-format
+msgid "^BGObjective destroyed in ^F4%s^BG!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:534
+msgid "^F4Begin!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:535
+msgid "^F4Game starts in ^COUNT"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:536
+msgid "^F4Round starts in ^COUNT"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:537
+msgid "^F4Round cannot start"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:542
+msgid "^F2Don't camp!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:546
+msgid ""
+"^BGYou are now free.\n"
+"^BGFeel free to ^F2try to capture^BG the flag again\n"
+"^BGif you think you will succeed."
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:547
+msgid "^BGThis flag is currently inactive"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:548
+msgid ""
+"^BGYou are now ^F1shielded^BG from the flag(s)\n"
+"^BGfor ^F2too many unsuccessful attempts^BG to capture.\n"
+"^BGMake some defensive scores before trying again."
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:549
+msgid "^BGYou captured the ^TC^TT^BG flag!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:550
+msgid "^BGYou captured the flag!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:551
+#, c-format
+msgid "^BGToo many flag throws! Throwing disabled for %s."
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:552
+#, c-format
+msgid "^BG%s^BG passed the ^TC^TT^BG flag to %s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:553
+#, c-format
+msgid "^BG%s^BG passed the flag to %s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:554
+#, c-format
+msgid "^BGYou received the ^TC^TT^BG flag from %s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:555
+#, c-format
+msgid "^BGYou received the flag from %s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:556
+#, c-format
+msgid "^BGPress ^F2%s^BG to receive the flag from %s^BG"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:557
+#, c-format
+msgid "^BGRequesting %s^BG to pass you the flag"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:558
+#, c-format
+msgid "^BGYou passed the ^TC^TT^BG flag to %s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:559
+#, c-format
+msgid "^BGYou passed the flag to %s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:560
+msgid "^BGYou got the ^TC^TT^BG flag!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:561
+msgid "^BGYou got the flag!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:562
+#, c-format
+msgid "^BGYou got your %steam^BG's flag, return it!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:563
+#, c-format
+msgid "^BGYou got the %senemy^BG's flag, return it!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:564
+#, c-format
+msgid "^BGThe %senemy^BG got your flag! Retrieve it!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:565
+#, c-format
+msgid "^BGThe %senemy (^BG%s%s)^BG got your flag! Retrieve it!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:566
+#, c-format
+msgid "^BGThe %senemy^BG got the flag! Retrieve it!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:567
+#, c-format
+msgid "^BGThe %senemy (^BG%s%s)^BG got the flag! Retrieve it!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:568
+#, c-format
+msgid "^BGThe %senemy^BG got their flag! Retrieve it!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:569
+#, c-format
+msgid "^BGThe %senemy (^BG%s%s)^BG got their flag! Retrieve it!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:570
+#, c-format
+msgid "^BGYour %steam mate^BG got the ^TC^TT^BG flag! Protect them!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:571
+#, c-format
+msgid "^BGYour %steam mate (^BG%s%s)^BG got the ^TC^TT^BG flag! Protect them!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:572
+#, c-format
+msgid "^BGYour %steam mate^BG got the flag! Protect them!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:573
+#, c-format
+msgid "^BGYour %steam mate (^BG%s%s)^BG got the flag! Protect them!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:574
+msgid "^BGEnemies can now see you on radar!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:575
+msgid "^BGYou returned the ^TC^TT^BG flag!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:576
+msgid "^BGStalemate! Enemies can now see you on radar!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:577
+msgid "^BGStalemate! Flag carriers can now be seen by enemies on radar!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:581
+#, c-format
+msgid "^K3%sYou fragged ^BG%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:582
+#: qcsrc/common/notifications/all.inc:591
+#: qcsrc/common/notifications/all.inc:600
+#, c-format
+msgid "^K3%sYou scored against ^BG%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:583
+#, c-format
+msgid "^K1%sYou were fragged by ^BG%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:584
+#: qcsrc/common/notifications/all.inc:593
+#: qcsrc/common/notifications/all.inc:602
+#, c-format
+msgid "^K1%sYou were scored against by ^BG%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:590
+#, c-format
+msgid "^K3%sYou burned ^BG%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:592
+#, c-format
+msgid "^K1%sYou were burned by ^BG%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:599
+#, c-format
+msgid "^K3%sYou froze ^BG%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:601
+#, c-format
+msgid "^K1%sYou were frozen by ^BG%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:608
+#, c-format
+msgid "^K1%sYou typefragged ^BG%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:609
+#, c-format
+msgid "^K1%sYou scored against ^BG%s^K1 while they were typing"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:610
+#, c-format
+msgid "^K1%sYou were typefragged by ^BG%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:611
+#, c-format
+msgid "^K1%sYou were scored against by ^BG%s^K1 while typing"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:617
+#, c-format
+msgid "^BGPress ^F2%s^BG again to toss the nade!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:618
+msgid "^F2You got a ^K1BONUS GRENADE^F2!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:620
+#, c-format
+msgid ""
+"^BGYou have been moved into a different team\n"
+"You are now on: %s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:621
+msgid "^K1Don't go against your team mates!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:621
+msgid "^K1Don't shoot your team mates!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:622
+msgid "^K1Die camper!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:622
+msgid "^K1Reconsider your tactics, camper!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:623
+msgid "^K1You unfairly eliminated yourself!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:624
+#, c-format
+msgid "^K1You were %s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:625
+msgid "^K1You couldn't catch your breath!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:626
+msgid "^K1You hit the ground with a crunch!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:627
+msgid "^K1You felt a little too hot!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:627
+msgid "^K1You got a little bit too crispy!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:628
+msgid "^K1You killed your own dumb self!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:628
+msgid "^K1You need to be more careful!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:629
+msgid "^K1You couldn't stand the heat!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:630
+msgid "^K1You need to watch out for monsters!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:630
+msgid "^K1You were killed by a monster!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:631
+msgid "^K1Tastes like chicken!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:631
+msgid "^K1You forgot to put the pin back in!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:632
+msgid "^K1Hanging around a napalm explosion is bad!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:633
+msgid "^K1You felt a little chilly!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:633
+msgid "^K1You got a little bit too cold!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:634
+msgid "^K1Your Healing Nade is a bit defective"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:635
+msgid "^K1You are respawning for running out of ammo..."
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:635
+msgid "^K1You were killed for running out of ammo..."
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:636
+msgid "^K1You grew too old without taking your medicine"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:636
+msgid "^K1You need to preserve your health"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:637
+msgid "^K1You became a shooting star!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:638
+msgid "^K1You melted away in slime!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:639
+msgid "^K1You committed suicide!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:639
+msgid "^K1You ended it all!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:640
+msgid "^K1You got stuck in a swamp!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:641
+#, c-format
+msgid "^BGYou are now on: %s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:642
+msgid "^K1You died in an accident!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:643
+msgid "^K1You had an unfortunate run in with a turret!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:643
+msgid "^K1You were fragged by a turret!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:644
+msgid "^K1You had an unfortunate run in with an eWheel turret!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:644
+msgid "^K1You were fragged by an eWheel turret!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:645
+msgid "^K1You had an unfortunate run in with a Walker turret!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:645
+msgid "^K1You were fragged by a Walker turret!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:646
+msgid "^K1You got caught in the blast of a Bumblebee explosion!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:647
+msgid "^K1You were crushed by a vehicle!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:648
+msgid "^K1You were caught in a Raptor cluster bomb!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:649
+msgid "^K1You got caught in the blast of a Raptor explosion!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:650
+msgid "^K1You got caught in the blast of a Spiderbot explosion!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:651
+msgid "^K1You were blasted to bits by a Spiderbot rocket!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:652
+msgid "^K1You got caught in the blast of a Racer explosion!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:653
+msgid "^K1You couldn't find shelter from a Racer rocket!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:654
+msgid "^K1Watch your step!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:656
+#, c-format
+msgid "^K1Moron! You fragged ^BG%s^K1, a team mate!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:656
+#, c-format
+msgid "^K1Moron! You went against ^BG%s^K1, a team mate!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:657
+#, c-format
+msgid "^K1You were fragged by ^BG%s^K1, a team mate"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:657
+#, c-format
+msgid "^K1You were scored against by ^BG%s^K1, a team mate"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:659
+msgid ""
+"^K1Stop idling!\n"
+"^BGDisconnecting in ^COUNT..."
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:661
+#, c-format
+msgid "^BGYou need %s^BG!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:662
+#, c-format
+msgid "^BGYou also need %s^BG!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:663
+msgid "^BGDoor unlocked!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:665
+#, c-format
+msgid "^F2Extra lives taken: ^K1%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:667
+#, c-format
+msgid "^K3You revived ^BG%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:668
+msgid "^K3You revived yourself"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:669
+#, c-format
+msgid "^K3You were revived by ^BG%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:670
+#, c-format
+msgid "^K3You were automatically revived after %s seconds"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:672
+msgid "^BGThe generator is under attack!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:674
+msgid "^TC^TT^BG team loses the round"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:678
+msgid "^K1You froze yourself"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:679
+msgid "^K1Round already started, you spawn as frozen"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:681
+#, c-format
+msgid "^K1A %s has arrived!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:685
+msgid "^BGYou got the ^F1Fuel regenerator"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:686
+msgid "^BGYou got the ^F1Jetpack"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:694
+msgid ""
+"^K1No spawnpoints available!\n"
+"Hope your team can fix it..."
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:695
+msgid ""
+"^K1You may not join the game at this time.\n"
+"The player limit reached maximum capacity."
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:699
+msgid "^BGYou picked up the ball"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:700
+msgid "^BGKilling people while you don't have the ball gives no points!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:702
+msgid ""
+"^BGAll keys are in your team's hands!\n"
+"Help the key carriers to meet!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:703
+msgid ""
+"^BGAll keys are in ^TC^TT team^BG's hands!\n"
+"Interfere ^F4NOW^BG!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:704
+msgid ""
+"^BGAll keys are in your team's hands!\n"
+"Meet the other key carriers ^F4NOW^BG!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:705
+msgid "^F4Round will start in ^COUNT"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:706
+msgid "^BGScanning frequency range..."
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:707
+msgid "^BGYou are starting with the ^TC^TT Key"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:709
+msgid "^BGYou have no lives left, you must wait until the next match"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:711
+#, c-format
+msgid ""
+"^BGWaiting for players to join...\n"
+"Need active players for: %s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:712
+#, c-format
+msgid "^BGWaiting for %s player(s) to join..."
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:714
+msgid "^BGYour weapon has been downgraded until you find some ammo!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:715
+msgid "^F4^COUNT^BG left to find some ammo!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:716
+msgid "^BGGet some ammo or you'll be dead in ^F4^COUNT^BG!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:716
+msgid "^BGGet some ammo! ^F4^COUNT^BG left!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:717
+#, c-format
+msgid "^F2Extra lives remaining: ^K1%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:719 qcsrc/menu/xonotic/campaign.qc:244
+#, c-format
+msgid "Level %s: "
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:719
+#, c-format
+msgid "^BGPress ^F2%s^BG to enter the game"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:722
+#, c-format
+msgid ""
+"^F2^COUNT^BG until weapon change...\n"
+"Next weapon: ^F1%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:723
+#, c-format
+msgid "^F2Active weapon: ^F1%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:725
+#, c-format
+msgid "^BGYou captured %s^BG control point"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:726
+msgid "^BGYou captured a control point"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:727
+#, c-format
+msgid "^TC^TT^BG team captured %s^BG control point"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:728
+msgid "^TC^TT^BG team captured a control point"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:729
+msgid "^BGThis control point currently cannot be captured"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:730
+msgid ""
+"^BGThe enemy generator cannot be destroyed yet\n"
+"^F2Capture some control points to unshield it"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:731
+msgid "^BGThe ^TCenemy^BG generator is no longer shielded!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:732
+msgid ""
+"^K1Your generator is NOT shielded!\n"
+"^BGRe-capture control points to shield it!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:733
+#, c-format
+msgid "^BGPress ^F2%s^BG to teleport"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:734
+#, c-format
+msgid "^BGTeleporting disabled for %s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:736
+msgid ""
+"^F2Now playing ^F4OVERTIME^F2!\n"
+"Keep fragging until we have a winner!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:736
+msgid ""
+"^F2Now playing ^F4OVERTIME^F2!\n"
+"Keep scoring until we have a winner!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:737
+msgid ""
+"^F2Now playing ^F4OVERTIME^F2!\n"
+"\n"
+"Generators are now decaying.\n"
+"The more control points your team holds,\n"
+"the faster the enemy generator decays"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:738
+#, c-format
+msgid ""
+"^F2Now playing ^F4OVERTIME^F2!\n"
+"^BGAdded ^F4%s^BG to the game!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:740
+msgid "^K1In^BG-portal created"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:741
+msgid "^F3Out^BG-portal created"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:742
+msgid "^F1Portal creation failed"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:744
+msgid "^F2Strength infuses your weapons with devastating power"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:745
+msgid "^F2Strength has worn off"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:747
+msgid "^F2Shield surrounds you"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:748
+msgid "^F2Shield has worn off"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:750
+msgid "^F2You are on speed"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:751
+msgid "^F2Speed has worn off"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:753
+msgid "^F2You are invisible"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:754
+msgid "^F2Invisibility has worn off"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:756
+msgid "^F2The race is over, finish your lap!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:758
+msgid "^BGSequence completed!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:759
+msgid "^BGThere are more to go..."
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:760
+#, c-format
+msgid "^BGOnly %s^BG more to go..."
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:762
+msgid "^F2Superweapons have broken down"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:763
+msgid "^F2Superweapons have been lost"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:764
+msgid "^F2You now have a superweapon"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:766
+msgid "^K1Changing to ^TC^TT^K1 in ^COUNT"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:767
+msgid "^K1Changing team in ^COUNT"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:768
+msgid "^K1Spectating in ^COUNT"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:769
+msgid "^K1Suicide in ^COUNT"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:771
+msgid "^F4Timeout begins in ^COUNT"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:772
+msgid "^F4Timeout ends in ^COUNT"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:774
+msgid "^K1Cannot join given minigame session!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:776
+#, c-format
+msgid "^BGPress ^F2%s^BG to enter/exit the vehicle"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:777
+#, c-format
+msgid "^BGPress ^F2%s^BG to enter the vehicle gunner"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:778
+#, c-format
+msgid "^BGPress ^F2%s^BG to steal this vehicle"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:779
+msgid ""
+"^F2The enemy is stealing one of your vehicles!\n"
+"^F4Stop them!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:780
+msgid "^F2Intruder detected, disabling shields!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:198
+msgid "Notification dump command only works with cl_cmd and sv_cmd."
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:408 qcsrc/common/notifications/all.qh:409
+#, c-format
+msgid " (near %s)"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:416 qcsrc/common/notifications/all.qh:417
+msgid "primary"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:416 qcsrc/common/notifications/all.qh:417
+msgid "secondary"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:419
+msgid "point"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:419
+msgid "points"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:428
+msgid "drop flag"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:429
+msgid "throw nade"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:455
+#, c-format
+msgid "%s^K1 made a TRIPLE FRAG! %s^BG"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:455
+#, c-format
+msgid "%s^K1 made a TRIPLE SCORE! %s^BG"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:455
+msgid "TRIPLE FRAG! "
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:456
+#, c-format
+msgid "%s^K1 made FIVE SCORES IN A ROW! %s^BG"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:456
+#, c-format
+msgid "%s^K1 unlocked RAGE! %s^BG"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:456
+msgid "RAGE! "
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:457
+#, c-format
+msgid "%s^K1 made TEN SCORES IN A ROW! %s^BG"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:457
+#, c-format
+msgid "%s^K1 started a MASSACRE! %s^BG"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:457
+msgid "MASSACRE! "
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:458
+#, c-format
+msgid "%s^K1 executed MAYHEM! %s^BG"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:458
+#, c-format
+msgid "%s^K1 made FIFTEEN SCORES IN A ROW! %s^BG"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:458
+msgid "MAYHEM! "
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:459
+#, c-format
+msgid "%s^K1 is a BERSERKER! %s^BG"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:459
+#, c-format
+msgid "%s^K1 made TWENTY SCORES IN A ROW! %s^BG"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:459
+msgid "BERSERKER! "
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:460
+#, c-format
+msgid "%s^K1 inflicts CARNAGE! %s^BG"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:460
+#, c-format
+msgid "%s^K1 made TWENTY FIVE SCORES IN A ROW! %s^BG"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:460
+msgid "CARNAGE! "
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:461
+#, c-format
+msgid "%s^K1 made THIRTY SCORES IN A ROW! %s^BG"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:461
+#, c-format
+msgid "%s^K1 unleashes ARMAGEDDON! %s^BG"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:461
+msgid "ARMAGEDDON! "
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:468
+#, c-format
+msgid "%s(^F1Bot^BG)"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:470
+#, c-format
+msgid "%s(Ping ^F1%d^BG)"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:477
+#, c-format
+msgid ""
+"\n"
+"(Health ^1%d^BG / Armor ^2%d^BG)%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:479
+#, c-format
+msgid ""
+"\n"
+"(^F4Dead^BG)%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:500 qcsrc/common/notifications/all.qh:513
+#, c-format
+msgid "%d score spree! "
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:512
+#, c-format
+msgid "%d frag spree! "
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:525
+msgid "First blood! "
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:525
+msgid "First score! "
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:529
+msgid "First casualty! "
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:529
+msgid "First victim! "
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:570
+#, c-format
+msgid "%s^K1 has %d frags in a row! %s^BG"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:571
+#, c-format
+msgid "%s^K1 made %d scores in a row! %s^BG"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:589
+#, c-format
+msgid "%s^K1 drew first blood! %s^BG"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:590
+#, c-format
+msgid "%s^K1 got the first score! %s^BG"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:606
+#, c-format
+msgid ", ending their %d frag spree"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:607
+#, c-format
+msgid ", ending their %d score spree"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:621
+#, c-format
+msgid ", losing their %d frag spree"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:622
+#, c-format
+msgid ", losing their %d score spree"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:647
+#, c-format
+msgid " with %d %s"
+msgstr ""
+
+#: qcsrc/common/teams.qh:31
+msgid "TEAM^Red"
+msgstr ""
+
+#: qcsrc/common/teams.qh:32
+msgid "TEAM^Blue"
+msgstr ""
+
+#: qcsrc/common/teams.qh:33
+msgid "TEAM^Yellow"
+msgstr ""
+
+#: qcsrc/common/teams.qh:34
+msgid "TEAM^Pink"
+msgstr ""
+
+#: qcsrc/common/teams.qh:35
+msgid "Team"
+msgstr ""
+
+#: qcsrc/common/teams.qh:36
+msgid "Neutral"
+msgstr ""
+
+#: qcsrc/common/teams.qh:39
+msgid "KEY^Red"
+msgstr ""
+
+#: qcsrc/common/teams.qh:40
+msgid "KEY^Blue"
+msgstr ""
+
+#: qcsrc/common/teams.qh:41
+msgid "KEY^Yellow"
+msgstr ""
+
+#: qcsrc/common/teams.qh:42
+msgid "KEY^Pink"
+msgstr ""
+
+#: qcsrc/common/teams.qh:43
+msgid "FLAG^Red"
+msgstr ""
+
+#: qcsrc/common/teams.qh:44
+msgid "FLAG^Blue"
+msgstr ""
+
+#: qcsrc/common/teams.qh:45
+msgid "FLAG^Yellow"
+msgstr ""
+
+#: qcsrc/common/teams.qh:46
+msgid "FLAG^Pink"
+msgstr ""
+
+#: qcsrc/common/teams.qh:47
+msgid "GENERATOR^Red"
+msgstr ""
+
+#: qcsrc/common/teams.qh:48
+msgid "GENERATOR^Blue"
+msgstr ""
+
+#: qcsrc/common/teams.qh:49
+msgid "GENERATOR^Yellow"
+msgstr ""
+
+#: qcsrc/common/teams.qh:50
+msgid "GENERATOR^Pink"
+msgstr ""
+
+#: qcsrc/common/turrets/all.qh:95
+msgid "Turrets dump command only works with sv_cmd."
+msgstr ""
+
+#: qcsrc/common/turrets/cl_turrets.qc:125
+#, c-format
+msgid "%s under attack!"
+msgstr ""
+
+#: qcsrc/common/turrets/turret.qh:11
+msgid "Turret"
+msgstr ""
+
+#: qcsrc/common/turrets/turret/ewheel.qh:15
+msgid "eWheel Turret"
+msgstr ""
+
+#: qcsrc/common/turrets/turret/ewheel_weapon.qh:7
+msgid "eWheel"
+msgstr ""
+
+#: qcsrc/common/turrets/turret/flac.qh:13
+msgid "FLAC Cannon"
+msgstr ""
+
+#: qcsrc/common/turrets/turret/flac_weapon.qh:7
+msgid "FLAC"
+msgstr ""
+
+#: qcsrc/common/turrets/turret/fusionreactor.qh:11
+msgid "Fusion Reactor"
+msgstr ""
+
+#: qcsrc/common/turrets/turret/hellion.qh:13
+msgid "Hellion Missile Turret"
+msgstr ""
+
+#: qcsrc/common/turrets/turret/hellion_weapon.qh:7
+msgid "Hellion"
+msgstr ""
+
+#: qcsrc/common/turrets/turret/hk.qh:15
+msgid "Hunter-Killer Turret"
+msgstr ""
+
+#: qcsrc/common/turrets/turret/hk_weapon.qh:7
+msgid "Hunter-Killer"
+msgstr ""
+
+#: qcsrc/common/turrets/turret/machinegun.qh:13
+msgid "Machinegun Turret"
+msgstr ""
+
+#: qcsrc/common/turrets/turret/machinegun_weapon.qh:7
+msgid "Machinegun"
+msgstr ""
+
+#: qcsrc/common/turrets/turret/mlrs.qh:13
+msgid "MLRS Turret"
+msgstr ""
+
+#: qcsrc/common/turrets/turret/mlrs_weapon.qh:7
+msgid "MLRS"
+msgstr ""
+
+#: qcsrc/common/turrets/turret/phaser.qh:13
+msgid "Phaser Cannon"
+msgstr ""
+
+#: qcsrc/common/turrets/turret/phaser_weapon.qh:7
+msgid "Phaser"
+msgstr ""
+
+#: qcsrc/common/turrets/turret/plasma.qh:13
+msgid "Plasma Cannon"
+msgstr ""
+
+#: qcsrc/common/turrets/turret/plasma_dual.qh:8
+msgid "Dual plasma"
+msgstr ""
+
+#: qcsrc/common/turrets/turret/plasma_dual.qh:20
+msgid "Dual Plasma Cannon"
+msgstr ""
+
+#: qcsrc/common/turrets/turret/plasma_weapon.qh:7
+msgid "Plasma"
+msgstr ""
+
+#: qcsrc/common/turrets/turret/tesla.qh:13
+#: qcsrc/common/turrets/turret/tesla_weapon.qh:7
+msgid "Tesla Coil"
+msgstr ""
+
+#: qcsrc/common/turrets/turret/walker.qh:15
+msgid "Walker Turret"
+msgstr ""
+
+#: qcsrc/common/turrets/turret/walker_weapon.qh:7
+msgid "Walker"
+msgstr ""
+
+#: qcsrc/common/util.qc:1390
+#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:176
+#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:186
+msgid "Male"
+msgstr ""
+
+#: qcsrc/common/util.qc:1391
+#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:175
+#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:185
+msgid "Female"
+msgstr ""
+
+#: qcsrc/common/util.qc:1392
+#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:174
+#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:187
+msgid "Undisclosed"
+msgstr ""
+
+#: qcsrc/common/util.qc:1439
+msgid "<KEY NOT FOUND>"
+msgstr ""
+
+#: qcsrc/common/util.qc:1440
+msgid "<UNKNOWN KEYNUM>"
+msgstr ""
+
+#: qcsrc/common/util.qc:1445
+msgid "TAB"
+msgstr ""
+
+#: qcsrc/common/util.qc:1446 qcsrc/common/util.qc:1517
+#, c-format
+msgid "ENTER"
+msgstr ""
+
+#: qcsrc/common/util.qc:1447
+msgid "ESCAPE"
+msgstr ""
+
+#: qcsrc/common/util.qc:1448
+msgid "SPACE"
+msgstr ""
+
+#: qcsrc/common/util.qc:1450
+msgid "BACKSPACE"
+msgstr ""
+
+#: qcsrc/common/util.qc:1451 qcsrc/common/util.qc:1508
+#, c-format
+msgid "UPARROW"
+msgstr ""
+
+#: qcsrc/common/util.qc:1452 qcsrc/common/util.qc:1503
+#, c-format
+msgid "DOWNARROW"
+msgstr ""
+
+#: qcsrc/common/util.qc:1453 qcsrc/common/util.qc:1505
+#, c-format
+msgid "LEFTARROW"
+msgstr ""
+
+#: qcsrc/common/util.qc:1454 qcsrc/common/util.qc:1506
+#, c-format
+msgid "RIGHTARROW"
+msgstr ""
+
+#: qcsrc/common/util.qc:1456
+msgid "ALT"
+msgstr ""
+
+#: qcsrc/common/util.qc:1457
+msgid "CTRL"
+msgstr ""
+
+#: qcsrc/common/util.qc:1458
+msgid "SHIFT"
+msgstr ""
+
+#: qcsrc/common/util.qc:1460 qcsrc/common/util.qc:1501
+#, c-format
+msgid "INS"
+msgstr ""
+
+#: qcsrc/common/util.qc:1461 qcsrc/common/util.qc:1511
+#, c-format
+msgid "DEL"
+msgstr ""
+
+#: qcsrc/common/util.qc:1462 qcsrc/common/util.qc:1504
+#, c-format
+msgid "PGDN"
+msgstr ""
+
+#: qcsrc/common/util.qc:1463 qcsrc/common/util.qc:1509
+#, c-format
+msgid "PGUP"
+msgstr ""
+
+#: qcsrc/common/util.qc:1464 qcsrc/common/util.qc:1507
+#, c-format
+msgid "HOME"
+msgstr ""
+
+#: qcsrc/common/util.qc:1465 qcsrc/common/util.qc:1502
+#, c-format
+msgid "END"
+msgstr ""
+
+#: qcsrc/common/util.qc:1467
+msgid "PAUSE"
+msgstr ""
+
+#: qcsrc/common/util.qc:1469
+msgid "NUMLOCK"
+msgstr ""
+
+#: qcsrc/common/util.qc:1470
+msgid "CAPSLOCK"
+msgstr ""
+
+#: qcsrc/common/util.qc:1471
+msgid "SCROLLOCK"
+msgstr ""
+
+#: qcsrc/common/util.qc:1473
+msgid "SEMICOLON"
+msgstr ""
+
+#: qcsrc/common/util.qc:1474
+msgid "TILDE"
+msgstr ""
+
+#: qcsrc/common/util.qc:1475
+msgid "BACKQUOTE"
+msgstr ""
+
+#: qcsrc/common/util.qc:1476
+msgid "QUOTE"
+msgstr ""
+
+#: qcsrc/common/util.qc:1477
+msgid "APOSTROPHE"
+msgstr ""
+
+#: qcsrc/common/util.qc:1478
+msgid "BACKSLASH"
+msgstr ""
+
+#: qcsrc/common/util.qc:1486
+#, c-format
+msgid "F%d"
+msgstr ""
+
+#: qcsrc/common/util.qc:1496
+#, c-format
+msgid "KP_%d"
+msgstr ""
+
+#: qcsrc/common/util.qc:1501 qcsrc/common/util.qc:1502
+#: qcsrc/common/util.qc:1503 qcsrc/common/util.qc:1504
+#: qcsrc/common/util.qc:1505 qcsrc/common/util.qc:1506
+#: qcsrc/common/util.qc:1507 qcsrc/common/util.qc:1508
+#: qcsrc/common/util.qc:1509 qcsrc/common/util.qc:1510
+#: qcsrc/common/util.qc:1511 qcsrc/common/util.qc:1512
+#: qcsrc/common/util.qc:1513 qcsrc/common/util.qc:1514
+#: qcsrc/common/util.qc:1515 qcsrc/common/util.qc:1516
+#: qcsrc/common/util.qc:1517 qcsrc/common/util.qc:1518
+#, c-format
+msgid "KP_%s"
+msgstr ""
+
+#: qcsrc/common/util.qc:1510
+#, c-format
+msgid "PERIOD"
+msgstr ""
+
+#: qcsrc/common/util.qc:1512
+#, c-format
+msgid "DIVIDE"
+msgstr ""
+
+#: qcsrc/common/util.qc:1513
+#, c-format
+msgid "SLASH"
+msgstr ""
+
+#: qcsrc/common/util.qc:1514
+#, c-format
+msgid "MULTIPLY"
+msgstr ""
+
+#: qcsrc/common/util.qc:1515
+#, c-format
+msgid "MINUS"
+msgstr ""
+
+#: qcsrc/common/util.qc:1516
+#, c-format
+msgid "PLUS"
+msgstr ""
+
+#: qcsrc/common/util.qc:1518
+#, c-format
+msgid "EQUALS"
+msgstr ""
+
+#: qcsrc/common/util.qc:1523
+msgid "PRINTSCREEN"
+msgstr ""
+
+#: qcsrc/common/util.qc:1526
+#, c-format
+msgid "MOUSE%d"
+msgstr ""
+
+#: qcsrc/common/util.qc:1528
+msgid "MWHEELUP"
+msgstr ""
+
+#: qcsrc/common/util.qc:1529
+msgid "MWHEELDOWN"
+msgstr ""
+
+#: qcsrc/common/util.qc:1532
+#, c-format
+msgid "JOY%d"
+msgstr ""
+
+#: qcsrc/common/util.qc:1535
+#, c-format
+msgid "AUX%d"
+msgstr ""
+
+#: qcsrc/common/util.qc:1542
+#, c-format
+msgid "DPAD_UP"
+msgstr ""
+
+#: qcsrc/common/util.qc:1542 qcsrc/common/util.qc:1543
+#: qcsrc/common/util.qc:1544 qcsrc/common/util.qc:1545
+#: qcsrc/common/util.qc:1546 qcsrc/common/util.qc:1547
+#: qcsrc/common/util.qc:1548 qcsrc/common/util.qc:1549
+#: qcsrc/common/util.qc:1550 qcsrc/common/util.qc:1551
+#: qcsrc/common/util.qc:1552 qcsrc/common/util.qc:1553
+#: qcsrc/common/util.qc:1554 qcsrc/common/util.qc:1555
+#: qcsrc/common/util.qc:1556 qcsrc/common/util.qc:1557
+#: qcsrc/common/util.qc:1558 qcsrc/common/util.qc:1559
+#: qcsrc/common/util.qc:1560 qcsrc/common/util.qc:1561
+#, c-format
+msgid "X360_%s"
+msgstr ""
+
+#: qcsrc/common/util.qc:1543
+#, c-format
+msgid "DPAD_DOWN"
+msgstr ""
+
+#: qcsrc/common/util.qc:1544
+#, c-format
+msgid "DPAD_LEFT"
+msgstr ""
+
+#: qcsrc/common/util.qc:1545
+#, c-format
+msgid "DPAD_RIGHT"
+msgstr ""
+
+#: qcsrc/common/util.qc:1546
+#, c-format
+msgid "START"
+msgstr ""
+
+#: qcsrc/common/util.qc:1547
+#, c-format
+msgid "BACK"
+msgstr ""
+
+#: qcsrc/common/util.qc:1548
+#, c-format
+msgid "LEFT_THUMB"
+msgstr ""
+
+#: qcsrc/common/util.qc:1549
+#, c-format
+msgid "RIGHT_THUMB"
+msgstr ""
+
+#: qcsrc/common/util.qc:1550
+#, c-format
+msgid "LEFT_SHOULDER"
+msgstr ""
+
+#: qcsrc/common/util.qc:1551
+#, c-format
+msgid "RIGHT_SHOULDER"
+msgstr ""
+
+#: qcsrc/common/util.qc:1552
+#, c-format
+msgid "LEFT_TRIGGER"
+msgstr ""
+
+#: qcsrc/common/util.qc:1553
+#, c-format
+msgid "RIGHT_TRIGGER"
+msgstr ""
+
+#: qcsrc/common/util.qc:1554
+#, c-format
+msgid "LEFT_THUMB_UP"
+msgstr ""
+
+#: qcsrc/common/util.qc:1555
+#, c-format
+msgid "LEFT_THUMB_DOWN"
+msgstr ""
+
+#: qcsrc/common/util.qc:1556
+#, c-format
+msgid "LEFT_THUMB_LEFT"
+msgstr ""
+
+#: qcsrc/common/util.qc:1557
+#, c-format
+msgid "LEFT_THUMB_RIGHT"
+msgstr ""
+
+#: qcsrc/common/util.qc:1558
+#, c-format
+msgid "RIGHT_THUMB_UP"
+msgstr ""
+
+#: qcsrc/common/util.qc:1559
+#, c-format
+msgid "RIGHT_THUMB_DOWN"
+msgstr ""
+
+#: qcsrc/common/util.qc:1560
+#, c-format
+msgid "RIGHT_THUMB_LEFT"
+msgstr ""
+
+#: qcsrc/common/util.qc:1561
+#, c-format
+msgid "RIGHT_THUMB_RIGHT"
+msgstr ""
+
+#: qcsrc/common/util.qc:1571 qcsrc/common/util.qc:1572
+#: qcsrc/common/util.qc:1573 qcsrc/common/util.qc:1574
+#, c-format
+msgid "JOY_%s"
+msgstr ""
+
+#: qcsrc/common/util.qc:1571
+#, c-format
+msgid "UP"
+msgstr ""
+
+#: qcsrc/common/util.qc:1572
+#, c-format
+msgid "DOWN"
+msgstr ""
+
+#: qcsrc/common/util.qc:1573
+#, c-format
+msgid "LEFT"
+msgstr ""
+
+#: qcsrc/common/util.qc:1574
+#, c-format
+msgid "RIGHT"
+msgstr ""
+
+#: qcsrc/common/util.qc:1580
+#, c-format
+msgid "MIDINOTE%d"
+msgstr ""
+
+#: qcsrc/common/vehicles/cl_vehicles.qc:190
+#, c-format
+msgid "Press %s"
+msgstr ""
+
+#: qcsrc/common/vehicles/vehicle/bumblebee.qc:954
+msgid "No right gunner!"
+msgstr ""
+
+#: qcsrc/common/vehicles/vehicle/bumblebee.qc:960
+msgid "No left gunner!"
+msgstr ""
+
+#: qcsrc/common/vehicles/vehicle/bumblebee.qh:19
+msgid "Bumblebee"
+msgstr ""
+
+#: qcsrc/common/vehicles/vehicle/racer.qh:19
+msgid "Racer"
+msgstr ""
+
+#: qcsrc/common/vehicles/vehicle/racer_weapon.qh:9
+msgid "Racer cannon"
+msgstr ""
+
+#: qcsrc/common/vehicles/vehicle/raptor.qh:19
+msgid "Raptor"
+msgstr ""
+
+#: qcsrc/common/vehicles/vehicle/raptor_weapons.qh:9
+msgid "Raptor cannon"
+msgstr ""
+
+#: qcsrc/common/vehicles/vehicle/raptor_weapons.qh:17
+msgid "Raptor bomb"
+msgstr ""
+
+#: qcsrc/common/vehicles/vehicle/raptor_weapons.qh:25
+msgid "Raptor flare"
+msgstr ""
+
+#: qcsrc/common/vehicles/vehicle/spiderbot.qh:19
+msgid "Spiderbot"
+msgstr ""
+
+#: qcsrc/common/weapons/all.qh:76
+msgid "Weapons dump command only works with sv_cmd."
+msgstr ""
+
+#: qcsrc/common/weapons/weapon/arc.qh:18
+msgid "Arc"
+msgstr ""
+
+#: qcsrc/common/weapons/weapon/blaster.qh:18
+msgid "Blaster"
+msgstr ""
+
+#: qcsrc/common/weapons/weapon/crylink.qh:18
+msgid "Crylink"
+msgstr ""
+
+#: qcsrc/common/weapons/weapon/devastator.qh:18
+msgid "Devastator"
+msgstr ""
+
+#: qcsrc/common/weapons/weapon/electro.qh:18
+msgid "Electro"
+msgstr ""
+
+#: qcsrc/common/weapons/weapon/fireball.qh:18
+msgid "Fireball"
+msgstr ""
+
+#: qcsrc/common/weapons/weapon/hagar.qh:18
+msgid "Hagar"
+msgstr ""
+
+#: qcsrc/common/weapons/weapon/hlac.qh:18
+msgid "Heavy Laser Assault Cannon"
+msgstr ""
+
+#: qcsrc/common/weapons/weapon/hook.qh:18
+msgid "Grappling Hook"
+msgstr ""
+
+#: qcsrc/common/weapons/weapon/machinegun.qh:18
+msgid "MachineGun"
+msgstr ""
+
+#: qcsrc/common/weapons/weapon/minelayer.qh:18
+msgid "Mine Layer"
+msgstr ""
+
+#: qcsrc/common/weapons/weapon/mortar.qh:18
+msgid "Mortar"
+msgstr ""
+
+#: qcsrc/common/weapons/weapon/porto.qh:18
+msgid "Port-O-Launch"
+msgstr ""
+
+#: qcsrc/common/weapons/weapon/rifle.qh:19
+msgid "Rifle"
+msgstr ""
+
+#: qcsrc/common/weapons/weapon/seeker.qh:18
+msgid "T.A.G. Seeker"
+msgstr ""
+
+#: qcsrc/common/weapons/weapon/shockwave.qh:18
+msgid "Shockwave"
+msgstr ""
+
+#: qcsrc/common/weapons/weapon/shotgun.qh:18
+msgid "Shotgun"
+msgstr ""
+
+#: qcsrc/common/weapons/weapon/tuba.qh:18
+#, no-c-format
+msgid "@!#%'n Tuba"
+msgstr ""
+
+#: qcsrc/common/weapons/weapon/vaporizer.qh:19
+msgid "Vaporizer"
+msgstr ""
+
+#: qcsrc/common/weapons/weapon/vortex.qh:19
+msgid "Vortex"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:9
+#, c-format
+msgid "CI_DEC^%s years"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:12
+#, c-format
+msgid "CI_ZER^%d years"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:13
+#, c-format
+msgid "CI_FIR^%d year"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:14
+#, c-format
+msgid "CI_SEC^%d years"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:15
+#, c-format
+msgid "CI_THI^%d years"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:16
+#, c-format
+msgid "CI_MUL^%d years"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:18
+#, c-format
+msgid "CI_DEC^%s weeks"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:21
+#, c-format
+msgid "CI_ZER^%d weeks"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:22
+#, c-format
+msgid "CI_FIR^%d week"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:23
+#, c-format
+msgid "CI_SEC^%d weeks"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:24
+#, c-format
+msgid "CI_THI^%d weeks"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:25
+#, c-format
+msgid "CI_MUL^%d weeks"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:27
+#, c-format
+msgid "CI_DEC^%s days"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:30
+#, c-format
+msgid "CI_ZER^%d days"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:31
+#, c-format
+msgid "CI_FIR^%d day"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:32
+#, c-format
+msgid "CI_SEC^%d days"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:33
+#, c-format
+msgid "CI_THI^%d days"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:34
+#, c-format
+msgid "CI_MUL^%d days"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:36
+#, c-format
+msgid "CI_DEC^%s hours"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:39
+#, c-format
+msgid "CI_ZER^%d hours"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:40
+#, c-format
+msgid "CI_FIR^%d hour"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:41
+#, c-format
+msgid "CI_SEC^%d hours"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:42
+#, c-format
+msgid "CI_THI^%d hours"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:43
+#, c-format
+msgid "CI_MUL^%d hours"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:46
+#, c-format
+msgid "CI_DEC^%s minutes"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:49
+#, c-format
+msgid "CI_ZER^%d minutes"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:50
+#, c-format
+msgid "CI_FIR^%d minute"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:51
+#, c-format
+msgid "CI_SEC^%d minutes"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:52
+#, c-format
+msgid "CI_THI^%d minutes"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:53
+#, c-format
+msgid "CI_MUL^%d minutes"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:55
+#, c-format
+msgid "CI_DEC^%s seconds"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:58
+#, c-format
+msgid "CI_ZER^%d seconds"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:59
+#, c-format
+msgid "CI_FIR^%d second"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:60
+#, c-format
+msgid "CI_SEC^%d seconds"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:61
+#, c-format
+msgid "CI_THI^%d seconds"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:62
+#, c-format
+msgid "CI_MUL^%d seconds"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:79
+#, c-format
+msgid "%dst"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:80
+#, c-format
+msgid "%dnd"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:81
+#, c-format
+msgid "%drd"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:85
+#, c-format
+msgid "%dth"
+msgstr ""
+
+#: qcsrc/lib/oo.qh:324
+msgid "No description"
+msgstr ""
+
+#: qcsrc/lib/spawnfunc.qh:248
+#, c-format
+msgid ""
+"Entity field %s.%s (%s) is not whitelisted. If you believe this is an error, "
+"please file an issue."
+msgstr ""
+
+#: qcsrc/lib/string.qh:81
+#, c-format
+msgid "%d days, %02d:%02d:%02d"
+msgstr ""
+
+#: qcsrc/lib/string.qh:82
+#, c-format
+msgid "%02d:%02d:%02d"
+msgstr ""
+
+#: qcsrc/menu/command/menu_cmd.qc:48
+msgid "Usage: menu_cmd command..., where possible commands are:"
+msgstr ""
+
+#: qcsrc/menu/command/menu_cmd.qc:49
+msgid " sync - reloads all cvars on the current menu page"
+msgstr ""
+
+#: qcsrc/menu/command/menu_cmd.qc:50
+msgid " directmenu ITEM - select a menu item as main item"
+msgstr ""
+
+#: qcsrc/menu/command/menu_cmd.qc:51
+msgid " dumptree - dump the state of the menu as a tree to the console"
+msgstr ""
+
+#: qcsrc/menu/command/menu_cmd.qc:81
+msgid "Available options:"
+msgstr ""
+
+#: qcsrc/menu/command/menu_cmd.qc:130
+msgid "Invalid command. For a list of supported commands, try menu_cmd help."
+msgstr ""
+
+#: qcsrc/menu/item/listbox.qc:413
+#, c-format
+msgid "Item %d"
+msgstr ""
+
+#: qcsrc/menu/item/textslider.qc:11 qcsrc/menu/item/textslider.qc:12
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:37
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:68
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:115
+msgid "Custom"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:4
+msgid "Core Team"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:15
+msgid "Extended Team"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:46
+msgid "Website"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:51
+msgid "Stats"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:55
+msgid "Art"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:63
+msgid "Animation"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:67
+msgid "Level Design"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:90
+msgid "Music / Sound FX"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:106
+msgid "Game Code"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:114
+msgid "Marketing / PR"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:120
+msgid "Legal"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:125
+msgid "Game Engine"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:129
+msgid "Engine Additions"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:135
+msgid "Compiler"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:141
+msgid "Other Active Contributors"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:148
+msgid "Translators"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:150
+msgid "Asturian"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:155
+msgid "Belarusian"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:158
+msgid "Bulgarian"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:165
+msgid "Chinese (China)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:171
+msgid "Chinese (Taiwan)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:176
+msgid "Cornish"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:179
+msgid "Czech"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:184
+msgid "Dutch"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:191
+msgid "English (Australia)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:196
+msgid "Finnish"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:201
+msgid "French"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:209
+msgid "German"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:220
+msgid "Greek"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:226
+msgid "Hungarian"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:230
+msgid "Irish"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:233
+msgid "Italian"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:239
+msgid "Kazakh"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:242
+msgid "Korean"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:246
+msgid "Polish"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:254
+msgid "Portuguese"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:260
+msgid "Romanian"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:267
+msgid "Russian"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:278
+msgid "Scottish Gaelic"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:281
+msgid "Serbian"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:287
+msgid "Spanish"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:298
+msgid "Swedish"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:302
+msgid "Ukrainian"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:309
+msgid "Past Contributors"
+msgstr ""
+
+#: qcsrc/menu/xonotic/cvarlist.qc:73
+msgid "forced to be saved to config.cfg"
+msgstr ""
+
+#: qcsrc/menu/xonotic/cvarlist.qc:79 qcsrc/menu/xonotic/cvarlist.qc:89
+msgid "will not be saved"
+msgstr ""
+
+#: qcsrc/menu/xonotic/cvarlist.qc:84
+msgid "will be saved to config.cfg"
+msgstr ""
+
+#: qcsrc/menu/xonotic/cvarlist.qc:93
+msgid "private"
+msgstr ""
+
+#: qcsrc/menu/xonotic/cvarlist.qc:95
+msgid "engine setting"
+msgstr ""
+
+#: qcsrc/menu/xonotic/cvarlist.qc:97
+msgid "read only"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_credits.qc:13
+#: qcsrc/menu/xonotic/dialog_monstertools.qc:38
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:303
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:85
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.qc:75
+#: qcsrc/menu/xonotic/dialog_singleplayer_winner.qc:14
+msgid "OK"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_credits.qh:7
+msgid "Credits"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_credits.qh:8
+msgid "The Xonotic credits"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_disconnect.qc:16
+msgid "Are you sure to disconnect from server?"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_disconnect.qc:19
+msgid "I would disconnect from server..."
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_disconnect.qc:22
+msgid "I would play more!"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_disconnect.qh:6
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_demo_startconfirm.qh:6
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_demo_timeconfirm.qh:6
+msgid "Disconnect"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_disconnect.qh:7
+msgid "Disconnect from the server you are connected to"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_firstrun.qc:39
+msgid ""
+"Welcome to Xonotic, please select your language preference and enter your "
+"player name to get started. You can change these options later through the "
+"menu system."
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_firstrun.qc:45
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.qc:28
+msgid "Name:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_firstrun.qc:53
+#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:62
+msgid "Name under which you will appear in the game"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_firstrun.qc:69
+msgid "Text language:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_firstrun.qc:78
+msgid "Allow player statistics to use your nickname at stats.xonotic.org?"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_firstrun.qc:84
+msgid "Undecided"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_firstrun.qc:88
+msgid "Save settings"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_firstrun.qh:6
+msgid "Welcome"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.qc:18
+msgid "Ammunition display:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.qc:21
+msgid "Show only current ammo type"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.qc:24
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:46
+msgid "Noncurrent alpha:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.qc:28
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:50
+msgid "Noncurrent scale:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.qc:32
+#: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:24
+msgid "Align icon:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.qc:33
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qc:32
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:25
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:37
+#: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:25
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.qc:23
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.qc:35
+#: qcsrc/menu/xonotic/dialog_hudpanel_quickmenu.qc:21
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:57
+msgid "Left"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.qc:34
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qc:34
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:27
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:38
+#: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:26
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.qc:25
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.qc:36
+#: qcsrc/menu/xonotic/dialog_hudpanel_quickmenu.qc:23
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:59
+msgid "Right"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.qh:6
+msgid "Ammo Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qc:19
+msgid "Message duration:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qc:23
+msgid "Fade time:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qc:27
+msgid "Flip messages order"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qc:29
+#: qcsrc/menu/xonotic/dialog_hudpanel_quickmenu.qc:18
+msgid "Text alignment:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qc:33
+#: qcsrc/menu/xonotic/dialog_hudpanel_quickmenu.qc:22
+#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:70
+msgid "Center"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qc:37
+msgid "Font scale:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qh:6
+msgid "Centerprint Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.qc:17
+msgid "Chat entries:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.qc:20
+msgid "Chat size:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.qc:24
+msgid "Chat lifetime:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.qc:28
+msgid "Chat beep sound"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.qh:6
+msgid "Chat Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.qc:16
+msgid "Engine info:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.qc:19
+msgid "Use an averaging algorithm for fps"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.qh:6
+msgid "Engine Info Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:17
+msgid "Combine health and armor"
+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 ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:21
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.qc:19
+msgid "Status bar alignment:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:29
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:39
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.qc:27
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.qc:37
+msgid "Inward"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:31
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:40
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.qc:29
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.qc:38
+msgid "Outward"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:34
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.qc:32
+msgid "Icon alignment:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:42
+msgid "Flip health and armor positions"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qh:6
+msgid "Health/Armor Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.qc:16
+msgid "Info messages:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.qc:19
+msgid "Flip align"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.qh:6
+msgid "Info Messages Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:16
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:15
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.qc:14
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:15
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:50
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:62
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:77
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:116
+#: qcsrc/menu/xonotic/util.qc:770 qcsrc/menu/xonotic/util.qc:786
+#: qcsrc/menu/xonotic/util.qc:803
+msgid "Disable"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:17
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.qc:15
+msgid "Enable spectating"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:18
+msgid "Enable even playing in warmup"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:29
+msgid "Reduced"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:32
+msgid "Text/icon ratio:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:35
+msgid "Hide spawned items"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:37
+msgid "Hide big armor and health"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:39
+msgid "Dynamic size"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qh:6
+msgid "Items Time Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_modicons.qh:6
+msgid "Mod Icons Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.qc:17
+msgid "Notifications:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.qc:20
+msgid "Also print notifications to the console"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.qc:23
+msgid "Flip notify order"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.qc:26
+msgid "Entry lifetime:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.qc:30
+msgid "Entry fadetime:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.qh:6
+msgid "Notification Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:16
+#: qcsrc/menu/xonotic/util.qc:758
+msgid "Enable"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:17
+msgid "Enable even observing"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:18
+msgid "Enable only in Race/CTS"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:24
+msgid "Status bar"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:26
+#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:67
+msgid "Left align"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:27
+#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:73
+msgid "Right align"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:28
+msgid "Inward align"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:29
+msgid "Outward align"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:33
+msgid "Flip speed/acceleration positions"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:37
+msgid "Speed:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:38
+msgid "Include vertical speed"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:49
+msgid "Speed unit:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:51
+msgid "qu/s"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:52
+msgid "m/s"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:53
+msgid "km/h"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:54
+msgid "mph"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:55
+msgid "knots"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:57
+msgid "Show"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:60
+msgid "Top speed"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:66
+msgid "Acceleration:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:67
+msgid "Include vertical acceleration"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qh:6
+msgid "Physics Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.qh:6
+msgid "Powerups Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.qc:16
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:17
+msgid "Always enable"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.qc:23
+msgid "Forced aspect:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.qh:6
+msgid "Pressed Keys Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_quickmenu.qh:6
+msgid "Quick Menu Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_racetimer.qh:6
+msgid "Race Timer Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:16
+msgid "Enable in team games"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:23
+msgid "Radar:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:26
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:68
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:107
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:54
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:87
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:103
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:45
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:70
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:124
+#: qcsrc/menu/xonotic/util.qc:792
+msgid "Alpha:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:30
+msgid "Rotation:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:32
+msgid "Forward"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:33
+msgid "West"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:34
+msgid "South"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:35
+msgid "East"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:36
+msgid "North"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:40
+msgid "Scale:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:44
+msgid "Zoom mode:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:46
+msgid "Zoomed in"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:47
+msgid "Zoomed out"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:48
+msgid "Always zoomed"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:49
+msgid "Never zoomed"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qh:6
+msgid "Radar Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.qc:17
+msgid "Score:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.qc:20
+msgid "Rankings:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.qc:21
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:58
+msgid "Off"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.qc:22
+msgid "And me"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.qc:23
+msgid "Pure"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.qh:6
+msgid "Score Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_timer.qc:16
+msgid "Timer:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_timer.qc:19
+msgid "Show elapsed time"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_timer.qh:6
+msgid "Timer Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_vote.qc:17
+msgid "Alpha after voting:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_vote.qh:6
+msgid "Vote Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:22
+msgid "Fade out after:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:24
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:167
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:145
+#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:55
+msgid "Never"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:26
+#, c-format
+msgid "%ds"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:30
+msgid "Fade effect:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:33
+msgid "EF^None"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:34
+msgid "Alpha"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:35
+msgid "Slide"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:36
+msgid "EF^Both"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:40
+msgid "Weapon icons:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:43
+msgid "Show only owned weapons"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:54
+msgid "Show weapon ID as:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:55
+msgid "SHOWAS^None"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:56
+msgid "Number"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:57
+msgid "Bind"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:60
+msgid "Weapon ID scale:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:66
+msgid "Show Accuracy"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:67
+msgid "Show Ammo"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:70
+msgid "Ammo bar alpha:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:76
+msgid "Ammo bar color:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qh:6
+msgid "Weapons Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:19
+msgid "HUD skins"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:22
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:173
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:32
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_demo.qc:42
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:25
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_screenshot.qc:33
+msgid "Filter:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:30
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:54
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_demo.qc:49
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_screenshot.qc:43
+msgid "Refresh"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:33
+#: qcsrc/menu/xonotic/dialog_settings_user.qc:28
+msgid "Set skin"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:37
+msgid "Save current skin"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:46
+msgid "Panel background defaults:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:48
+#: qcsrc/menu/xonotic/util.qc:767
+msgid "Background:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:60
+#: qcsrc/menu/xonotic/util.qc:783
+msgid "Border size:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:75
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:114
+msgid "Team color:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:83
+#: qcsrc/menu/xonotic/util.qc:809
+msgid "Test team color in configure mode"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:86
+#: qcsrc/menu/xonotic/util.qc:812
+msgid "Padding:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:93
+msgid "HUD Dock:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:95
+msgid "DOCK^Disabled"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:96
+msgid "DOCK^Small"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:97
+msgid "DOCK^Medium"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:98
+msgid "DOCK^Large"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:121
+msgid "Grid settings:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:124
+msgid "Snap panels to grid"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:127
+msgid "Grid size:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:129
+msgid "X:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:136
+msgid "Y:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:145
+msgid "Exit setup"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qh:6
+msgid "Panel HUD Setup"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_monstertools.qc:13
+msgid "Monster:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_monstertools.qc:22
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:20
+msgid "Spawn"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_monstertools.qc:23
+msgid "Remove"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_monstertools.qc:25
+msgid "Move target:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_monstertools.qc:26
+msgid "Follow"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_monstertools.qc:27
+msgid "Wander"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_monstertools.qc:28
+msgid "Spawnpoint"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_monstertools.qc:29
+msgid "No moving"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_monstertools.qc:31
+msgid "Colors:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_monstertools.qc:33
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:39
+msgid "Set skin:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_monstertools.qh:6
+msgid "Monster Tools"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.qc:14
+msgid "Servers"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.qc:15
+msgid "Find servers to play on"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.qc:17
+msgid "Host your own game"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.qc:18
+msgid "Media"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.qc:19
+msgid "Profile"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.qh:6
+msgid "Multiplayer"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.qh:7
+msgid ""
+"Play online, against your friends in LAN, view demos or change player "
+"settings"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:38
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:111
+#: qcsrc/menu/xonotic/skinlist.qc:88 qcsrc/menu/xonotic/util.qc:769
+#: qcsrc/menu/xonotic/util.qc:785 qcsrc/menu/xonotic/util.qc:794
+#: qcsrc/menu/xonotic/util.qc:802 qcsrc/menu/xonotic/util.qc:814
+msgid "Default"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:40
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:60
+msgid "Unlimited"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:74
+msgid "Gametype"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:79
+msgid "Time limit:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:81
+msgid "Timelimit in minutes that when hit, will end the match"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:82
+#, c-format
+msgid "%d minutes"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:83
+msgid "TIMLIM^Default"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:84
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:159
+msgid "1 minute"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:101
+msgid "TIMLIM^Infinite"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:109
+msgid "Teams:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:112
+msgid "2 teams"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:113
+msgid "3 teams"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:114
+msgid "4 teams"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:117
+msgid "Player slots:"
+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 ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:121
+msgid "Number of bots:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:123
+msgid "Amount of bots on your server"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:125
+msgid "Bot skill:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:128
+msgid "Specify how experienced the bots will be"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:129
+msgid "Botlike"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:130
+msgid "Beginner"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:131
+msgid "You will win"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:132
+msgid "You can win"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:133
+msgid "You might win"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:134
+msgid "Advanced"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:135
+msgid "Expert"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:136
+msgid "Pro"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:137
+msgid "Assassin"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:138
+msgid "Unhuman"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:139
+msgid "Godlike"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:155
+msgid "Mutators..."
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:156
+msgid "Mutators and weapon arenas"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:165
+msgid "Maplist"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:175
+msgid ""
+"Click here or Ctrl-F to provide a keyword to narrow down the map list. Ctrl-"
+"Delete to clear; Enter when done."
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:184
+msgid "Add shown"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:185
+msgid "Add the maps shown in the list to your selection"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:188
+msgid "Remove shown"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:189
+msgid "Remove the maps shown in the list from your selection"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:194
+msgid "Add all"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:195
+msgid "Add every available map to your selection"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:198
+msgid "Remove all"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:199
+msgid "Remove all the maps from your selection"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:206
+msgid "Start Multiplayer!"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.qc:50
+msgid "Title:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.qc:56
+msgid "Author:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.qc:62
+msgid "Game types:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.qc:85
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:257
+msgid "Close"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.qc:88
+msgid "MAP^Play"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.qh:7
+msgid "Map Information"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:28
+msgid "All Weapons Arena"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:30
+msgid "Most Weapons Arena"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:46
+#, c-format
+msgid "%s Arena"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:57
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:163
+msgid "Dodging"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:59
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:283
+msgid "InstaGib"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:61
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:224
+msgid "New Toys"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:63
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:288
+msgid "NIX"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:65
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:229
+msgid "Rocket Flying"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:67
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:219
+msgid "Invincible Projectiles"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:71
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:298
+msgid "No start weapons"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:73
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:202
+msgid "Low gravity"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:75
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:171
+msgid "Cloaked"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:77
+msgid "Hook"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:79
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:180
+msgid "Midair"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:81
+msgid "Melee only"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:85
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:234
+msgid "Piñata"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:87
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:239
+msgid "Weapons stay"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:89
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:191
+msgid "Blood loss"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:93
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:175
+msgid "Buffs"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:95
+msgid "Overkill"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:97
+msgid "No powerups"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:99
+msgid "Powerups"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:101
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:167
+msgid "Touch explode"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:103
+msgid "Wall jumping"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:105
+msgid "MUT^None"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:160
+msgid "Gameplay mutators:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:164
+msgid ""
+"Enable dodging (quick acceleration in a given direction). Double-tap a "
+"directional key to dodge"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:168
+msgid "An explosion occurs when two players collide"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:172
+msgid "All players are almost invisible"
+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 ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:185
+msgid "Damage done to your enemy gets added to your own health"
+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 ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:199
+msgid "Make things fall to the ground slower (percentage of normal gravity)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:208
+msgid "Weapon & item mutators:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:211
+msgid "Grappling hook"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:212
+msgid "Players spawn with the grappling hook. Press the 'hook' key to use it"
+msgstr ""
+
+#: 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 ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:230
+msgid ""
+"Devastator rockets can be detonated instantly (otherwise, there's a short "
+"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 ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:240
+msgid "Weapons stay after they are picked up"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:245
+msgid "Regular (no arena)"
+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 ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:248
+msgid "Weapon arenas:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:251
+msgid "Custom weapons"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:273
+msgid "Most weapons"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:277
+msgid "All weapons"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:280
+msgid "Special arenas:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:284
+msgid ""
+"Players will be given only one weapon, which can instantly kill the opponent "
+"with a single shot. If the player runs out of ammo, he will have 10 seconds "
+"to find some or if he fails to do so, face death. The secondary fire mode "
+"does not inflict any damage but is good for doing trickjumps."
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:289
+msgid ""
+"No items Xonotic - instead of pickup items, everyone plays with the same "
+"weapon. After some time, a countdown will start, after which everyone will "
+"switch to another weapon."
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:293
+msgid "with blaster"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:294
+msgid "Always carry the blaster as an additional weapon in Nix"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qh:9
+msgid "Mutators"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:39
+msgid "SRVS^Categories"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:42
+msgid "SRVS^Empty"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:43
+msgid "Show empty servers"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:47
+msgid "SRVS^Full"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:48
+msgid "Show full servers that have no slots available"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:52
+msgid "Pause"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:53
+msgid ""
+"Pause updating the server list to prevent servers from \"jumping around\""
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:54
+msgid "Reload the server list"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:68
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:184
+msgid "Address:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:79
+msgid "Info..."
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:80
+msgid "Show more information about the currently highlighted server"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:92
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:264
+msgid "Join!"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:114
+#: qcsrc/menu/xonotic/serverlist.qc:1020
+msgid "MOD^Default"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:121
+#, c-format
+msgid "%d modified"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:121
+msgid "Official"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:129
+msgid "N/A (auth library missing, can't connect)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:131
+msgid "N/A (auth library missing)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:137
+msgid "Not supported (can't connect)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:139
+msgid "Not supported (won't encrypt)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:143
+msgid "Supported (will encrypt)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:145
+msgid "Supported (won't encrypt)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:149
+msgid "Requested (will encrypt)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:151
+msgid "Requested (won't encrypt)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:155
+msgid "Required (can't connect)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:157
+msgid "Required (will encrypt)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:161
+msgid "Use the `crypto_aeslevel` cvar to change your preferences"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:178
+msgid "Hostname:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:192
+msgid "Gametype:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:197
+msgid "Map:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:202
+msgid "Mod:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:207
+msgid "Version:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:212
+msgid "Settings:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:219
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:251
+msgid "Players:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:224
+msgid "Bots:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:229
+msgid "Free slots:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:235
+msgid "Encryption:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:240
+msgid "ID:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:245
+msgid "Key:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qh:7
+msgid "Server Information"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media.qc:25
+msgid "Demos"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media.qc:26
+msgid "Screenshots"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media.qc:27
+msgid "Music Player"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_demo.qc:48
+msgid "Auto record demos"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_demo.qc:57
+msgid "Timedemo"
+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 ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_demo_startconfirm.qc:13
+msgid "Playing a demo will disconnect you from the current match."
+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 ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_demo_timeconfirm.qc:13
+msgid "Timing a demo will disconnect you from the current match."
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:37
+msgid "MUSICPL^Add"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:40
+msgid "MUSICPL^Add all"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:44
+msgid "Set as menu track"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:48
+msgid "Reset default menu track"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:54
+msgid "Playlist:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:55
+msgid "Random order"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:60
+msgid "MUSICPL^Stop"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:63
+msgid "MUSICPL^Play"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:66
+msgid "MUSICPL^Pause"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:69
+msgid "MUSICPL^Prev"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:72
+msgid "MUSICPL^Next"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:76
+msgid "MUSICPL^Remove"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:79
+msgid "MUSICPL^Remove all"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_screenshot.qc:41
+msgid "Auto screenshot scoreboard"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_screenshot.qc:62
+msgid "Open in the viewer"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_screenshot_viewer.qc:137
+msgid "Reset"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_screenshot_viewer.qc:142
+msgid "Previous"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_screenshot_viewer.qc:145
+msgid "Next"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_screenshot_viewer.qc:150
+msgid "Slide show"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:38
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:21
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:37
+#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:26
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:21
+msgid "Apply immediately"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:50
+msgid "Name"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:79
+msgid "Model"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:98
+msgid "Glowing color"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:108
+msgid "Detail color"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:123
+msgid "Statistics"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:127
+msgid "Allow player statistics to track your client"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:131
+msgid "Allow player statistics to use your nickname"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:136
+msgid "Allow player statistics to rank you in leaderboards"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:152
+msgid "Country"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:156
+msgid "Select language..."
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:172
+msgid "Gender:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:179
+msgid "Gender"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_quit.qc:11
+msgid "Are you sure you want to quit?"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_quit.qc:15
+msgid "Back to work..."
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_quit.qc:17
+msgid "I got some more fragging to do!"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_quit.qh:7
+msgid "Quit the game"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:15
+msgid "Model:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:21
+msgid "Remove *"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:23
+msgid "Copy *"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:24
+msgid "Paste"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:26
+msgid "Bone:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:31
+msgid "Set * as child"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:32
+msgid "Attach to *"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:34
+msgid "Detach from *"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:37
+msgid "Visual object properties for *:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:41
+msgid "Set alpha:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:44
+msgid "Set color main:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:46
+msgid "Set color glow:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:50
+msgid "Set frame:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:54
+msgid "Physical object properties for *:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:56
+msgid "Set material:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:62
+msgid "Set solidity:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:63
+msgid "Non-solid"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:64
+msgid "Solid"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:65
+msgid "Set physics:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:66
+msgid "Static"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:67
+msgid "Movable"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:68
+msgid "Physical"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:70
+msgid "Set scale:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:72
+msgid "Set force:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:76
+msgid "Claim *"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:78
+msgid "* object info"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:79
+msgid "* mesh info"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:80
+msgid "* attachment info"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:81
+msgid "Show help"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:82
+msgid "* is the object you are facing"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qh:6
+msgid "Sandbox Tools"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings.qc:18
+msgid "Video"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings.qc:19
+msgid "Effects"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings.qc:20
+msgid "Audio"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings.qc:22
+msgid "Game"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings.qc:23
+msgid "Input"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings.qc:24
+msgid "User"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings.qc:25
+#: qcsrc/menu/xonotic/keybinder.qc:119
+msgid "Misc"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings.qh:6
+msgid "Settings"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings.qh:7
+msgid "Change the game settings"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:29
+msgid "Master:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:35
+msgid "Music:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:43
+msgid "VOL^Ambient:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:50
+msgid "Info:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:57
+msgid "Items:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:64
+msgid "Pain:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:71
+msgid "Player:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:78
+msgid "Shots:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:85
+msgid "Voice:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:93
+msgid "Weapons:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:99
+msgid "New style sound attenuation"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:102
+msgid "Mute sounds when not active"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:105
+msgid "Frequency:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:107
+msgid "Sound output frequency"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:108
+msgid "8 kHz"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:109
+msgid "11.025 kHz"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:110
+msgid "16 kHz"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:111
+msgid "22.05 kHz"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:112
+msgid "24 kHz"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:113
+msgid "32 kHz"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:114
+msgid "44.1 kHz"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:115
+msgid "48 kHz"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:119
+msgid "Channels:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:121
+msgid "Number of channels for the sound output"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:122
+msgid "Mono"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:123
+msgid "Stereo"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:124
+msgid "2.1"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:125
+msgid "4"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:126
+msgid "5"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:127
+msgid "5.1"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:128
+msgid "6.1"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:129
+msgid "7.1"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:134
+msgid "Swap stereo output channels"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:135
+msgid "Swap left/right channels"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:138
+msgid "Headphone friendly mode"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:139
+msgid ""
+"Enable spatialization (blend the right and left channel slightly to decrease "
+"stereo separation a bit for headphones)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:143
+msgid "Hit indication sound"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:144
+msgid "Play a hit indicator sound when your shot hits an enemy"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:147
+msgid "Chat message sound"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:149
+msgid "Menu sounds"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:150
+msgid "Play sounds when clicking menu items"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:151
+msgid "Focus sounds"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:152
+msgid "Play sounds when hovering over menu items too"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:156
+msgid "Time announcer:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:158
+msgid "WRN^Disabled"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:160
+msgid "5 minutes"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:161
+msgid "WRN^Both"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:164
+msgid "Automatic taunts:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:166
+msgid "Automatically taunt enemies after fragging them"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:168
+msgid "Sometimes"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:169
+msgid "Often"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:170
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:147
+#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:57
+msgid "Always"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:176
+msgid "Debug info about sounds"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_bindings_reset.qc:11
+msgid "Are you sure you want to reset all key bindings?"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_bindings_reset.qh:6
+msgid "Reset key bindings"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:41
+msgid "Quality preset:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:45
+msgid "PRE^OMG!"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:48
+msgid "PRE^Low"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:50
+msgid "PRE^Medium"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:52
+msgid "PRE^Normal"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:54
+msgid "PRE^High"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:56
+msgid "PRE^Ultra"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:60
+msgid "PRE^Ultimate"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:65
+msgid "Geometry detail:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:67
+msgid "Change the smoothness of the curves on the map"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:68
+msgid "DET^Lowest"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:69
+msgid "DET^Low"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:70
+msgid "DET^Normal"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:71
+msgid "DET^Good"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:72
+msgid "DET^Best"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:73
+msgid "DET^Insane"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:77
+msgid "Player detail:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:79
+msgid "PDET^Low"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:80
+msgid "PDET^Medium"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:81
+msgid "PDET^Normal"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:82
+msgid "PDET^Good"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:83
+msgid "PDET^Best"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:87
+msgid "Texture resolution:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:91
+msgid "RES^Leet"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:92
+msgid "RES^Lowest"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:93
+msgid "RES^Very low"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:94
+msgid "RES^Low"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:95
+msgid "RES^Normal"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:96
+msgid "RES^Good"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:97
+msgid "RES^Best"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:110
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:115
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:120
+msgid "Avoid lossy texture compression"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:129
+msgid "Disable sky for performance and visibility"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:129
+msgid "Show sky"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:132
+msgid "Show surfaces"
+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 ""
+
+#: 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 ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:140
+msgid "Use per-pixel lighting effects"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:142
+msgid "Gloss"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:143
+msgid "Enable the use of glossmaps on textures supporting it"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:146
+msgid "Offset mapping"
+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 ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:149
+msgid "Relief mapping"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:150
+msgid ""
+"Higher quality offset mapping, which also has a huge impact on performance"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:153
+msgid "Reflections:"
+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 ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:158
+msgid "Blurred"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:159
+msgid "REFL^Good"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:160
+msgid "Sharp"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:164
+msgid "Decals"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:165
+msgid "Enable decals (bullet holes and blood)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:166
+msgid "Decals on models"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:170
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:254
+msgid "Distance:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:173
+msgid "Decals further away than this will not be drawn"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:177
+msgid "Time:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:180
+msgid "Time in seconds before decals fade away"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:184
+msgid "Damage effects:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:186
+msgid "DMGFX^Disabled"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:187
+msgid "Skeletal"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:188
+msgid "DMGFX^All"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:192
+msgid "No dynamic lighting"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:193
+msgid "Enable corona flares around certain lights"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:195
+msgid "Fake corona lighting"
+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 ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:200
+msgid "Enable rendering of dynamic lights such as explosions and rocket lights"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:202
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:208
+msgid "Shadows"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:203
+msgid "Enable rendering of shadows from dynamic lights"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:206
+msgid "Realtime world lighting"
+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 ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:213
+msgid "Use normal maps"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:214
+msgid "Enable use of directional shading on textures"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:216
+msgid "Soft shadows"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:220
+msgid "Fade corona according to visibility"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:221
+msgid "Fade coronas according to visibility"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:225
+msgid "Bloom"
+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 ""
+
+#: 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 ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:234
+msgid "Motion blur:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:240
+msgid "Particles"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:241
+msgid "Spawnpoint effects"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:242
+msgid "Particles effects at all spawn points and whenever a player spawns"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:247
+msgid "Quality:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:250
+#: qcsrc/menu/xonotic/slider_particles.qc:13
+msgid ""
+"Multiplier for amount of particles. Less means less particles, which in turn "
+"gives for better performance"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:257
+msgid "Particles further away than this will not be drawn"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:31
+msgid "No crosshair"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:33
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:62
+msgid "Per weapon"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:34
+msgid ""
+"Set a different crosshair for each weapon, good if you play without weapon "
+"models"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:48
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:81
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:97
+msgid "Size:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:64
+msgid "By health"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:76
+msgid "Use rings to indicate weapon status"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:93
+msgid "Enable center crosshair dot"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:111
+msgid "Use normal crosshair color"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:122
+msgid "Smooth effects of crosshairs"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:125
+msgid "Hit testing:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:128
+msgid ""
+"None: do not do hit tests for the crosshair; TrueAim: blur the crosshair "
+"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"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:130
+msgid "HTTST^TrueAim"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:131
+msgid "HTTST^Enemies"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:136
+msgid "Blur crosshair if the shot is obstructed"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:140
+msgid "Enlarge crosshair if targeting an enemy"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:143
+msgid "Animate crosshair when hitting an enemy"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:146
+msgid "Animate crosshair when picking up an item"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qh:7
+msgid "Crosshair"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:43
+msgid "Scoreboard"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:48
+msgid "Fading speed:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:51
+msgid "Enable rows / columns highlighting"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:53
+msgid "Show accuracy underneath scoreboard"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:55
+msgid "Show team sizes:"
+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 ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:66
+msgid "Display waypoint markers for objectives on the map"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:67
+msgid "Show various gametype specific waypoints"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:73
+msgid "Control transparency of the waypoints"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:77
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:130
+msgid "Fontsize:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:83
+msgid "Edge offset:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:91
+msgid "Fade when near the crosshair"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:95
+msgid "Display names instead of icons"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:100
+msgid "Damage"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:102
+msgid "Overlay:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:105
+msgid "Factor:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:110
+msgid "Fade rate:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:118
+msgid "Player Names"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:120
+msgid "Show names above players"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:136
+msgid "Max distance:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:142
+msgid "Decolorize:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:146
+#: qcsrc/menu/xonotic/keybinder.qc:113
+msgid "Teamplay"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:154
+msgid "Only when near crosshair"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:158
+msgid "Display health and armor"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:163
+msgid "Damage overlay:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:166
+msgid "Dynamic HUD"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:167
+msgid "HUD moves around following player's movement"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:169
+msgid "Shake the HUD when hurt"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:173
+#: qcsrc/menu/xonotic/dialog_settings_game_hudconfirm.qh:6
+msgid "Enter HUD editor"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qh:7
+msgid "HUD"
+msgstr ""
+
+#: 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 ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hudconfirm.qc:23
+msgid "Do you wish to start a local game to set up the HUD?"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:24
+msgid "Frag Information"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:26
+msgid "Display information about killing sprees"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:29
+msgid "Only display sprees if they are achievements"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:34
+msgid "Show spree information in centerprints"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:38
+msgid "Show spree information in death messages"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:43
+msgid "Sprees in info messages:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:46
+msgid "SPREES^Disabled"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:47
+msgid "Target"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:48
+msgid "Attacker"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:49
+msgid "SPREES^Both"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:55
+msgid "Print on a seperate line"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:58
+msgid "Add extra frag information to centerprint when available"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:62
+msgid "Add frag location to death messages when available"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:65
+msgid "Gamemode Settings"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:67
+msgid "Display capture times in Capture The Flag"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:71
+msgid "Display name of flag stealer in Capture The Flag"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:76
+#: qcsrc/menu/xonotic/dialog_settings_input.qc:92
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:126
+msgid "Other"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:78
+msgid "Display console messages in the top left corner"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:80
+msgid "Display all info messages in the chatbox"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:82
+msgid "Display player statuses in the chatbox"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:86
+msgid "Powerup notifications"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:89
+msgid "Weapon centerprint notifications"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:92
+msgid "Weapon info message notifications"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:96
+msgid "Announcers"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:98
+msgid "Respawn countdown sounds"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:101
+msgid "Killstreak sounds"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:104
+msgid "Achievement sounds"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qh:7
+msgid "Messages"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:30
+msgid "Items"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:32
+msgid "Use simple 2D images instead of item models"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:34
+msgid "Unavailable alpha:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:37
+msgid "Unavailable color:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:39
+msgid "GHOITEMS^Black"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:40
+msgid "GHOITEMS^Dark"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:41
+msgid "GHOITEMS^Tinted"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:42
+msgid "GHOITEMS^Normal"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:43
+msgid "GHOITEMS^Blue"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:49
+#: qcsrc/menu/xonotic/serverlist.qc:737
+msgid "Players"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:51
+msgid "Force player models to mine"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:53
+msgid "Force player colors to mine"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:56
+msgid "In non teamplay modes only"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:60
+msgid "Body fading:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:63
+msgid "Gibs:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:65
+msgid "GIBS^None"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:66
+msgid "GIBS^Few"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:67
+msgid "GIBS^Many"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:68
+msgid "GIBS^Lots"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_model.qh:7
+msgid "Models"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_model.qh:8
+msgid "Customize how players and items are displayed in game"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:26
+msgid "1st person perspective"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:29
+msgid "Slide to third person upon death"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:33
+msgid "Smooth the view when landing from a jump"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:37
+msgid "Smooth the view while crouching"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:41
+msgid "View waving while idle"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:45
+msgid "View bobbing while walking around"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:50
+msgid "3rd person perspective"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:53
+msgid "Back distance"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:59
+msgid "Up distance"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:65
+msgid "Allow passing through walls while spectating"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:69
+msgid "Field of view:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:71
+msgid "Field of vision in degrees"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:75
+msgid "ZOOM^Zoom factor:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:77
+msgid "How big the zoom factor is when the zoom button is pressed"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:80
+msgid "ZOOM^Zoom speed:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:82
+msgid "How fast the view will be zoomed, disable to zoom instantly"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:91
+msgid "ZOOM^Instant"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:95
+msgid "ZOOM^Zoom sensitivity:"
+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 ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:100
+msgid "Velocity zoom"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:101
+msgid "Forward movement only"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:105
+msgid "VZOOM^Factor"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:112
+msgid "Display reticle 2D overlay while zooming"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:115
+msgid "Release zoom when you die or respawn"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:119
+msgid "Release zoom when you switch weapons"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_view.qh:7
+#: qcsrc/menu/xonotic/keybinder.qc:83
+msgid "View"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:33
+msgid "Weapon Priority List (* = mutator weapon)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:39
+msgid "Up"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:43
+msgid "Down"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:49
+msgid "Use priority list for weapon cycling"
+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 ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:52
+msgid "Cycle through only usable weapon selections"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:56
+msgid "Auto switch weapons on pickup"
+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 ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:60
+msgid "Release attack buttons when you switch weapons"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:63
+msgid "Draw 1st person weapon model"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:64
+msgid "Draw the weapon model"
+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 ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:77
+msgid "Weapon model opacity:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:91
+msgid "Gun model swaying"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:96
+msgid "Gun model bobbing"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qh:7
+#: qcsrc/menu/xonotic/keybinder.qc:51
+msgid "Weapons"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.qc:34
+msgid "Key Bindings"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.qc:38
+msgid "Change key..."
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.qc:42
+msgid "Edit..."
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.qc:48
+msgid "Clear"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.qc:53
+msgid "Reset all"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.qc:58
+msgid "Mouse"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.qc:60
+msgid "Sensitivity:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.qc:62
+msgid "Mouse speed multiplier"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.qc:64
+msgid "Smooth aiming"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.qc:65
+msgid "Smoothes the mouse movement, but makes aiming slightly less responsive"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.qc:67
+msgid "Invert aiming"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.qc:68
+msgid "Invert mouse movement on the Y-axis"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.qc:70
+msgid "Use system mouse positioning"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.qc:75
+msgid "Enable built in mouse acceleration"
+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 ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.qc:80
+msgid "Make use of DGA mouse input"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.qc:94
+msgid "Pressing \"enter console\" key also closes it"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.qc:95
+msgid "Allow the console toggling bind to also close the console"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.qc:97
+msgid "Automatically repeat jumping if holding jump"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.qc:100
+msgid "Jetpack on jump:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.qc:102
+msgid "JPJUMP^Disabled"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.qc:103
+msgid "Air only"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.qc:104
+msgid "JPJUMP^All"
+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 ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.qc:31
+msgid "Command when pressed:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.qc:34
+msgid "Command when released:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.qc:40
+msgid "Cancel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.qh:7
+msgid "User defined key bind"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:11
+#, c-format
+msgid "%d fps"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:12
+#, c-format
+msgid "%d KB/s"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:13
+#, c-format
+msgid "%d MB/s"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:27
+msgid "Network"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:29
+msgid "Client UDP port:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:31
+msgid "Force client to use chosen port unless it is set to 0"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:34
+msgid "Bandwidth:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:36
+msgid "Specify your network speed"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:37
+msgid "56k"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:38
+msgid "ISDN"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:39
+msgid "Slow ADSL"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:40
+msgid "Fast ADSL"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:41
+msgid "Broadband"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:44
+msgid "Server queries/s:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:48
+msgid "Downloads:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:50
+msgid "Maximum number of concurrent HTTP/FTP downloads"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:52
+msgid "Download speed:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:65
+msgid "Local latency:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:69
+msgid "Show netgraph"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:70
+msgid "Show a graph of packet sizes and other information"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:72
+msgid "Client-side movement prediction"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:74
+msgid "Movement error compensation"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:78
+msgid "Use encryption (AES) when available"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:81
+msgid "Framerate"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:83
+msgid "Maximum:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:93
+msgid "MAXFPS^Unlimited"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:96
+msgid "Target:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:98
+msgid "TRGT^Disabled"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:109
+msgid "Idle limit:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:115
+msgid "IDLFPS^Unlimited"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:119
+msgid "Save processing time for other apps"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:122
+msgid "Show frames per second"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:123
+msgid "Show your rendered frames per second"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:128
+msgid "Menu tooltips:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:130
+msgid ""
+"Menu tooltips: disabled, standard or advanced (also shows cvar or console "
+"command bound to the menu item)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:131
+msgid "TLTIP^Disabled"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:132
+msgid "TLTIP^Standard"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:133
+msgid "TLTIP^Advanced"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:136
+msgid "Show current date and time"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:137
+msgid "Show current date and time of day, useful on screenshots"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:140
+msgid "Enable developer mode"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:144
+msgid "Advanced settings..."
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:145
+msgid "Advanced settings where you can tweak every single variable of the game"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:150
+#: qcsrc/menu/xonotic/dialog_settings_misc_reset.qh:6
+msgid "Factory reset"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.qc:31
+msgid "Cvar filter:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.qc:38
+msgid "Modified cvars only"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.qc:45
+msgid "Setting:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.qc:49
+msgid "Type:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.qc:53
+msgid "Value:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.qc:70
+msgid "Description:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.qh:7
+msgid "Advanced settings"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_reset.qc:11
+msgid "Are you sure you want to reset all settings?"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_reset.qc:13
+msgid "This will create a backup config in your data directory"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_user.qc:23
+msgid "Menu Skins"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_user.qc:62
+msgid "Text Language"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_user.qc:67
+msgid "Set language"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_user.qc:72
+msgid "Disable gore effects and harsh language"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_user.qc:73
+msgid "Replace blood and gibs with content that does not have any gore effects"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_user_languagewarning.qc:10
+msgid "While connected language changes will be applied only to the menu,"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_user_languagewarning.qc:12
+msgid "full language changes will take effect starting from the next game"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_user_languagewarning.qc:16
+msgid "Disconnect now"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_user_languagewarning.qc:17
+msgid "Switch language"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_user_languagewarning.qh:6
+msgid "Warning"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:33
+msgid "Resolution:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:37
+msgid "Font/UI size:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:39
+msgid "SZ^Unreadable"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:40
+msgid "SZ^Tiny"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:41
+msgid "SZ^Little"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:42
+msgid "SZ^Small"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:43
+msgid "SZ^Medium"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:44
+msgid "SZ^Large"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:45
+msgid "SZ^Huge"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:46
+msgid "SZ^Gigantic"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:47
+msgid "SZ^Colossal"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:51
+msgid "Color depth:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:53
+msgid "How many bits per pixel (BPP) to render at, 32 is recommended"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:54
+msgid "16bit"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:55
+msgid "32bit"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:59
+msgid "Full screen"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:61
+msgid "Vertical Synchronization"
+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 ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:67
+msgid "Flip view horizontally"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:68
+msgid "Poor man's left handed mode"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:71
+msgid "Anisotropy:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:73
+msgid "Anisotropic filtering quality"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:74
+msgid "ANISO^Disabled"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:75
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:86
+msgid "2x"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:76
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:87
+msgid "4x"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:77
+msgid "8x"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:78
+msgid "16x"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:81
+msgid "Antialiasing:"
+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 ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:85
+msgid "AA^Disabled"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:92
+msgid "High-quality frame buffer"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:97
+msgid "Depth first:"
+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"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:101
+msgid "DF^World"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:102
+msgid "DF^All"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:105
+msgid "Vertex Buffer Objects (VBOs)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:108
+msgid "VBO^Off"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:109
+msgid "Vertices, some Tris (compatible)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:110
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:114
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:116
+msgid ""
+"Make use of Vertex Buffer Objects to store static geometry in video memory "
+"for faster rendering"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:113
+msgid "Vertices"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:115
+msgid "Vertices and Triangles"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:119
+msgid "Brightness:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:121
+msgid "Brightness of black"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:123
+msgid "Contrast:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:125
+msgid "Brightness of white"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:127
+msgid "Gamma:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:130
+msgid ""
+"Inverse gamma correction value, a brightness effect that does not affect "
+"white or black"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:133
+msgid "Contrast boost:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:136
+msgid "By how much to multiply the contrast in dark areas"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:139
+msgid "Saturation:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:142
+msgid ""
+"Saturation adjustment (0 = grayscale, 1 = normal, 2 = oversaturated), "
+"requires GLSL color control"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:146
+msgid "LIT^Ambient:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:148
+msgid ""
+"Ambient lighting, if set too high it tends to make light on maps look dull "
+"and flat"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:150
+msgid "Intensity:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:152
+msgid "Global rendering brightness"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:155
+msgid "Wait for GPU to finish each frame"
+msgstr ""
+
+#: 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 ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:158
+msgid "Use OpenGL 2.0 shaders (GLSL)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:163
+msgid "Psycho coloring (easter egg)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:166
+msgid "Trippy vertices (easter egg)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.qc:109
+msgid "Instant action! (random map with bots)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.qc:116
+msgid "???"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.qc:129
+msgid "Campaign Difficulty:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.qc:130
+msgid "CSKL^Easy"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.qc:131
+msgid "CSKL^Medium"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.qc:132
+msgid "CSKL^Hard"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.qc:134
+msgid "Start Singleplayer!"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.qh:6
+msgid "Singleplayer"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.qh:7
+msgid "Play the singleplayer campaign or instant action matches against bots"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_singleplayer_winner.qh:7
+msgid "Winner"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_teamselect.qc:32
+msgid "join 'best' team (auto-select)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_teamselect.qc:33
+msgid "Autoselect team (recommended)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_teamselect.qc:37
+msgid "red"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_teamselect.qc:38
+msgid "blue"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_teamselect.qc:39
+msgid "yellow"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_teamselect.qc:40
+msgid "pink"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_teamselect.qc:43
+#: qcsrc/menu/xonotic/keybinder.qc:116
+msgid "spectate"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_teamselect.qh:7
+msgid "Team Selection"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_uid2name.qc:10
+msgid "Allow player statistics to use your nickname?"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_uid2name.qc:12
+msgid "Answering \"No\" you will appear as \"Anonymous player\""
+msgstr ""
+
+#: qcsrc/menu/xonotic/gametypelist.qc:87
+msgid "teamplay"
+msgstr ""
+
+#: qcsrc/menu/xonotic/gametypelist.qc:89
+msgid "free for all"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:35
+msgid "Moving"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:36
+msgid "forward"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:37
+msgid "backpedal"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:38
+msgid "strafe left"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:39
+msgid "strafe right"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:40
+msgid "jump / swim"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:41
+msgid "crouch / sink"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:42
+msgid "off-hand hook"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:43
+msgid "jetpack"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:46
+msgid "Attacking"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:52
+msgid "WEAPON^previous"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:53
+msgid "WEAPON^next"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:54
+msgid "WEAPON^previously used"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:55
+msgid "WEAPON^best"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:56
+msgid "reload"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:57
+msgid "drop weapon / throw nade"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:84
+msgid "hold zoom"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:85
+msgid "toggle zoom"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:86
+msgid "show scores"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:87
+msgid "screen shot"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:88
+msgid "maximize radar"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:89
+msgid "3rd person view"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:90
+msgid "enter spectator mode"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:93
+msgid "Communication"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:94
+msgid "public chat"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:95
+msgid "team chat"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:96
+msgid "show chat history"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:97
+msgid "vote YES"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:98
+msgid "vote NO"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:102
+msgid "Client"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:106 qcsrc/menu/xonotic/keybinder.qc:108
+msgid "enter console"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:109
+msgid "disconnect"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:110
+msgid "quit"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:114
+msgid "auto-join team"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:120
+msgid "drop key/flag, exit vehicle"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:121
+msgid "suicide / respawn"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:122
+msgid "quick menu"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:125
+msgid "User defined"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:132
+msgid "Development"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:133
+msgid "sandbox menu"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:134
+msgid "drag object (sandbox)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:135
+msgid "waypoint editor menu"
+msgstr ""
+
+#: qcsrc/menu/xonotic/mainwindow.qc:96 qcsrc/menu/xonotic/mainwindow.qc:99
+msgid "Do not press this button again!"
+msgstr ""
+
+#: qcsrc/menu/xonotic/maplist.qc:288
+msgid ""
+"Huh? Can't play this (m is NULL). Refiltering so this won't happen again."
+msgstr ""
+
+#: qcsrc/menu/xonotic/maplist.qc:296
+#, c-format
+msgid "%s's Xonotic Server"
+msgstr ""
+
+#: qcsrc/menu/xonotic/maplist.qc:301
+msgid ""
+"Huh? Can't play this (invalid game type). Refiltering so this won't happen "
+"again."
+msgstr ""
+
+#: qcsrc/menu/xonotic/playerlist.qc:102 qcsrc/menu/xonotic/playerlist.qc:112
+msgid "spectator"
+msgstr ""
+
+#: qcsrc/menu/xonotic/playermodel.qc:161
+msgid "<no model found>"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.qc:256
+msgid "SERVER^Remove favorite"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.qc:257
+msgid "Remove the currently highlighted server from bookmarks"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.qc:261
+msgid "SERVER^Favorite"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.qc:262
+msgid ""
+"Bookmark the currently highlighted server so that it's faster to find in the "
+"future"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.qc:733
+msgid "Ping"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.qc:734
+msgid "Hostname"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.qc:735
+msgid "Map"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.qc:736
+msgid "Type"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.qc:1019
+#, c-format
+msgid "AES level %d"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.qc:1019
+msgid "ENC^none"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.qc:1019
+msgid "encryption:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.qc:1020
+#, c-format
+msgid "mod: %s"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.qc:1022
+#, c-format
+msgid "modified settings"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.qc:1022
+#, c-format
+msgid "official settings"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.qc:1024
+msgid "stats disabled"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.qc:1024
+msgid "stats enabled"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.qh:152
+msgid "SLCAT^Favorites"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.qh:153
+msgid "SLCAT^Recommended"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.qh:154
+msgid "SLCAT^Normal Servers"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.qh:155
+msgid "SLCAT^Servers"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.qh:156
+msgid "SLCAT^Competitive Mode"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.qh:157
+msgid "SLCAT^Modified Servers"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.qh:158
+msgid "SLCAT^Overkill"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.qh:159
+msgid "SLCAT^InstaGib"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.qh:160
+msgid "SLCAT^Defrag Mode"
+msgstr ""
+
+#: qcsrc/menu/xonotic/skinlist.qc:70
+msgid "<TITLE>"
+msgstr ""
+
+#: qcsrc/menu/xonotic/skinlist.qc:71
+msgid "<AUTHOR>"
+msgstr ""
+
+#: qcsrc/menu/xonotic/slider_decibels.qc:72
+msgid "VOL^MAX"
+msgstr ""
+
+#: qcsrc/menu/xonotic/slider_decibels.qc:74
+msgid "VOL^OFF"
+msgstr ""
+
+#: qcsrc/menu/xonotic/slider_decibels.qc:82
+#, c-format
+msgid "%s dB"
+msgstr ""
+
+#: qcsrc/menu/xonotic/slider_particles.qc:14
+msgid "PART^OMG"
+msgstr ""
+
+#: qcsrc/menu/xonotic/slider_particles.qc:15
+msgid "PART^Low"
+msgstr ""
+
+#: qcsrc/menu/xonotic/slider_particles.qc:16
+msgid "PART^Medium"
+msgstr ""
+
+#: qcsrc/menu/xonotic/slider_particles.qc:17
+#: qcsrc/menu/xonotic/slider_sbfadetime.qc:14
+msgid "PART^Normal"
+msgstr ""
+
+#: qcsrc/menu/xonotic/slider_particles.qc:18
+msgid "PART^High"
+msgstr ""
+
+#: qcsrc/menu/xonotic/slider_particles.qc:19
+msgid "PART^Ultra"
+msgstr ""
+
+#: qcsrc/menu/xonotic/slider_particles.qc:20
+msgid "PART^Ultimate"
+msgstr ""
+
+#: qcsrc/menu/xonotic/slider_picmip.qc:13
+msgid ""
+"Change the sharpness of the textures. Lowering it will effectively reduce "
+"texture memory usage, but make the textures appear very blurry."
+msgstr ""
+
+#: qcsrc/menu/xonotic/slider_resolution.qc:115
+msgid "Screen resolution"
+msgstr ""
+
+#: qcsrc/menu/xonotic/slider_sbfadetime.qc:13
+msgid "PART^Slow"
+msgstr ""
+
+#: qcsrc/menu/xonotic/slider_sbfadetime.qc:15
+msgid "PART^Fast"
+msgstr ""
+
+#: qcsrc/menu/xonotic/slider_sbfadetime.qc:16
+msgid "PART^Instant"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:29
+msgid "January"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:30
+msgid "February"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:31
+msgid "March"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:32
+msgid "April"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:33
+msgid "May"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:34
+msgid "June"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:35
+msgid "July"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:36
+msgid "August"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:37
+msgid "September"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:38
+msgid "October"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:39
+msgid "November"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:40
+msgid "December"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:46
+#, no-c-format
+msgid "DATE^%m %d, %Y"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:97
+msgid "Joined:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:104
+msgid "Last match:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:111
+msgid "Time played:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:118 qcsrc/menu/xonotic/statslist.qc:231
+msgid "Favorite map:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:150 qcsrc/menu/xonotic/statslist.qc:202
+#: qcsrc/menu/xonotic/statslist.qc:245
+#, c-format
+msgid "Matches:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:155
+#, c-format
+msgid "Wins/Losses:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:156
+#, c-format
+msgid "Win percentage:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:167
+#, c-format
+msgid "Kills/Deaths:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:173
+#, c-format
+msgid "Kill ratio:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:208
+msgid "ELO:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:215
+msgid "Rank:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:222
+msgid "Percentile:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:247
+#, c-format
+msgid "%d (unranked)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/util.qc:420
+msgid "Update can be downloaded at:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/util.qc:528
+msgid "Autogenerating mapinfo for newly added maps..."
+msgstr ""
+
+#: qcsrc/menu/xonotic/util.qc:566
+#, c-format
+msgid "Update to %s now!"
+msgstr ""
+
+#: qcsrc/menu/xonotic/util.qc:650
+msgid ""
+"^1ERROR: Texture compression is required but not supported.\n"
+"^1Expect visual problems."
+msgstr ""
+
+#: qcsrc/menu/xonotic/util.qc:780
+msgid "Use default"
+msgstr ""
+
+#: qcsrc/menu/xonotic/util.qc:800
+msgid "Team Color:"
+msgstr ""
#
# Translators:
# 77960155d0a4db79ed901e7c2ee242e7_4b8c532, 2016
+# aaa627661149cfc7c57d1c75ef650b07_039425b, 2018
# Hector Champipis <hector-hab@hotmail.com>, 2019
# 77960155d0a4db79ed901e7c2ee242e7_4b8c532, 2016
# Vindex <kon14.inside@gmail.com>, 2014
# Konstantinos Mihalenas <ldinos99@gmail.com>, 2014
# Marinus Savoritias, 2018
-# Marinus Savoritias, 2018
+# aaa627661149cfc7c57d1c75ef650b07_039425b, 2018
# MasterWord, 2016
# Mensious Mensious <ektoras@tutanota.com>, 2018-2019
# Vindex <kon14.inside@gmail.com>, 2014
# roader_gentoo <ivanviso123@gmail.com>, 2014
# kammy smb <kammysmb@gmail.com>, 2013
# kammy smb <kammysmb@gmail.com>, 2013
+# LegendGuard, 2020
+# LegendGuard, 2020
+# LegendGuard, 2020
# roader_gentoo <ivanviso123@gmail.com>, 2014
# Rodrigo Mouton Laudin <ratogenesis@gmail.com>, 2011
# f0318285068af6a23b2bced52c20e7ad_5b405a0 <dd7053d9f4e5c78579dd2ad9ce71aaa5_243277>, 2014-2015
"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:49+0000\n"
+"Last-Translator: LegendGuard\n"
"Language-Team: Spanish (http://www.transifex.com/team-xonotic/xonotic/"
"language/es/)\n"
"Language: es\n"
"^1Multiline message at time %s that\n"
"^1lasts longer than normal"
msgstr ""
-"^1Mensaje de multiples líneas a la hora %s que\n"
-"^1dura mas de lo normal"
+"^1Mensaje de múltiples líneas a la hora %s que\n"
+"^1dura más de lo normal"
#: qcsrc/client/hud/panel/centerprint.qc:178
#, c-format
#: qcsrc/client/hud/panel/chat.qc:89
msgid "^3Player^7: This is the chat area."
-msgstr "^3Jugador^7: Este es el area del chat."
+msgstr "^3Jugador^7: Este es el área del chat."
#: qcsrc/client/hud/panel/engineinfo.qc:76
#, c-format
#: qcsrc/client/hud/panel/infomessages.qc:110
#, c-format
msgid "^1Press ^3%s^1 or ^3%s^1 for next or previous player"
-msgstr "^1Presiona ^3%s^1 o ^3%s^1 para el jugador siguiente o anterior"
+msgstr "^1Pulsa ^3%s^1 o ^3%s^1 para ver el jugador siguiente o anterior"
#: qcsrc/client/hud/panel/infomessages.qc:110
#: qcsrc/client/hud/panel/infomessages.qc:114
#: 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:119
#, c-format
msgid "^1Press ^3%s^1 for gamemode info"
-msgstr "^1Presiona ^3%s^1 para mostrar información del modo de juego"
+msgstr "^1Pulsa ^3%s^1 para mostrar información del modo de juego"
#: qcsrc/client/hud/panel/infomessages.qc:119
#: qcsrc/menu/xonotic/keybinder.qc:103
#: qcsrc/client/hud/panel/infomessages.qc:139
#, c-format
msgid "^1Press ^3%s^1 to join"
-msgstr "^1Presiona ^3%s^1 para unirte"
+msgstr "^1Pulsa ^3%s^1 para unirte"
#: qcsrc/client/hud/panel/infomessages.qc:136
#: qcsrc/client/hud/panel/infomessages.qc:139
#: qcsrc/client/hud/panel/infomessages.qc:153
msgid "^2Currently in ^1warmup^2 stage!"
-msgstr "^2Actualmente 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/infomessages.qc:170
#, c-format
msgid "%sPress ^3%s%s once you are ready"
-msgstr "%sPulsa ^3%s%s cuando estes listo"
+msgstr "%sPulsa ^3%s%s cuando estés listo"
#: qcsrc/client/hud/panel/infomessages.qc:175
msgid "^2Waiting for others to ready up to end warmup..."
msgstr ""
-"^2Esperando a que los demas esten listos para terminar el calentamiento"
+"^2Esperando a que los demás estén listos para terminar el calentamiento"
#: qcsrc/client/hud/panel/infomessages.qc:177
msgid "^2Waiting for others to ready up..."
#: qcsrc/client/hud/panel/infomessages.qc:183
#, c-format
msgid "^2Press ^3%s^2 to end warmup"
-msgstr "^2Presiona ^3%s^2 para terminar el calentamiento"
+msgstr "^2Pulsa ^3%s^2 para terminar el calentamiento"
#: qcsrc/client/hud/panel/infomessages.qc:204
msgid "Teamnumbers are unbalanced!"
-msgstr "¡Los números de equipo están desbalanceados!"
+msgstr "¡Los números de equipo están desequilibrados!"
#: qcsrc/client/hud/panel/infomessages.qc:207
#, c-format
msgid " Press ^3%s%s to adjust"
-msgstr " Presiona ^3%s%s para ajustar"
+msgstr " Pulsa ^3%s%s para ajustar"
#: qcsrc/client/hud/panel/infomessages.qc:207
#: qcsrc/menu/xonotic/keybinder.qc:115
#: qcsrc/client/hud/panel/infomessages.qc:217
msgid "^1Spectating you:"
-msgstr "^1Espectandote a ti:"
+msgstr "^1Espectándote a ti:"
#: qcsrc/client/hud/panel/infomessages.qc:233
msgid "^7Press ^3ESC ^7to show HUD options."
#: qcsrc/client/hud/panel/modicons.qc:183
msgid "Personal best"
-msgstr "Record personal"
+msgstr "Récord personal"
#: qcsrc/client/hud/panel/modicons.qc:193
msgid "Server best"
-msgstr "Record del servidor"
+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
#: qcsrc/client/hud/panel/quickmenu.qc:790
msgid "QMCMD^good game"
-msgstr "QMCMD^buen juego"
+msgstr "QMCMD^bien jugado"
#: qcsrc/client/hud/panel/quickmenu.qc:791
msgid "QMCMD^hi / good luck"
#: qcsrc/client/hud/panel/quickmenu.qc:798
#: qcsrc/client/hud/panel/quickmenu.qc:814
msgid "QMCMD^Team chat"
-msgstr "QMCMD^Chat de equipo"
+msgstr "QMCMD^Chat del equipo"
#: qcsrc/client/hud/panel/quickmenu.qc:799
msgid "QMCMD^strength soon"
-msgstr ""
+msgstr "QMCMD^la fuerza aparecerá pronto"
#: qcsrc/client/hud/panel/quickmenu.qc:800
msgid "QMCMD^free item %x^7 (l:%y^7)"
-msgstr "QMCMD^item gratis %x^7 (l:%y^7)"
+msgstr "QMCMD^objeto gratuito %x^7 (l:%y^7)"
#: qcsrc/client/hud/panel/quickmenu.qc:800
msgid "QMCMD^free item, icon"
-msgstr "QMCMD^item gratis, icono"
+msgstr "QMCMD^objeto gratuito, icono"
#: qcsrc/client/hud/panel/quickmenu.qc:801
msgid "QMCMD^took item (l:%l^7)"
-msgstr "QMCMD^tomó el item (l:%l^7)"
+msgstr "QMCMD^tomó el objeto (l:%l^7)"
#: qcsrc/client/hud/panel/quickmenu.qc:801
msgid "QMCMD^took item, icon"
-msgstr "QMCMD^tomo el item, icono"
+msgstr "QMCMD^tomó el objeto, icono"
#: qcsrc/client/hud/panel/quickmenu.qc:802
msgid "QMCMD^negative"
#: qcsrc/client/hud/panel/quickmenu.qc:808
msgid "QMCMD^roaming (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
-msgstr "QMCMD^moviendome (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
+msgstr "QMCMD^moviéndome (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
#: qcsrc/client/hud/panel/quickmenu.qc:808
msgid "QMCMD^roaming, icon"
-msgstr "QMCMD^moviendome, icono"
+msgstr "QMCMD^moviéndome, icono"
#: qcsrc/client/hud/panel/quickmenu.qc:809
msgid "QMCMD^attacking (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
#: qcsrc/client/hud/panel/quickmenu.qc:810
msgid "QMCMD^killed flagcarrier (l:%y^7)"
-msgstr "QMCMD^asesinado el portador de bandera (l:%y^7)"
+msgstr "QMCMD^el portador de la bandera ha sido asesinado (l:%y^7)"
#: qcsrc/client/hud/panel/quickmenu.qc:810
msgid "QMCMD^killed flagcarrier, icon"
-msgstr "QMCMD^asesinado el portador de la bandera, icono"
+msgstr "QMCMD^el portador de la bandera ha sido asesinado, icono"
#: qcsrc/client/hud/panel/quickmenu.qc:811
#, 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:820
#: qcsrc/client/hud/panel/quickmenu.qc:827
msgid "QMCMD^View/HUD settings"
-msgstr "QMCMD^Ver/HUD ajustes"
+msgstr "QMCMD^Ajustes de la Vista/HUD"
#: qcsrc/client/hud/panel/quickmenu.qc:821
msgid "QMCMD^3rd person view"
#: qcsrc/client/hud/panel/quickmenu.qc:822
msgid "QMCMD^Player models like mine"
-msgstr "QMCMD^Modelos de jugador como el mio"
+msgstr "QMCMD^Modelos del jugador como el mío"
#: qcsrc/client/hud/panel/quickmenu.qc:823
msgid "QMCMD^Names above players"
-msgstr "QMCMD^Nombres sobre jugadores"
+msgstr "QMCMD^Nombres por encima de los jugadores"
#: qcsrc/client/hud/panel/quickmenu.qc:824
msgid "QMCMD^Crosshair per weapon"
#: qcsrc/client/hud/panel/quickmenu.qc:830
msgid "QMCMD^Hit sound"
-msgstr "QMCMD^Sonido de golpe"
+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"
-msgstr ""
+msgstr "QMCMD^Cambiar cámara de espectador"
#: qcsrc/client/hud/panel/quickmenu.qc:841
#: qcsrc/client/hud/panel/quickmenu.qc:845
msgid "QMCMD^Observer camera"
-msgstr "QMCMD^Camara de observador"
+msgstr "QMCMD^Cámara de observador"
#: qcsrc/client/hud/panel/quickmenu.qc:842
msgid "QMCMD^Increase speed"
#: qcsrc/client/hud/panel/quickmenu.qc:844
msgid "QMCMD^Wall collision"
-msgstr ""
+msgstr "QMCMD^Colisión del muro"
#: qcsrc/client/hud/panel/quickmenu.qc:848
msgid "QMCMD^Fullscreen"
#: qcsrc/client/hud/panel/quickmenu.qc:856
msgid "QMCMD^Reduce match time"
-msgstr "QMCMD^Redicir tiempo de partida"
+msgstr "QMCMD^Reducir tiempo de partida"
#: qcsrc/client/hud/panel/quickmenu.qc:857
msgid "QMCMD^Extend match time"
#: 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
#: qcsrc/client/hud/panel/racetimer.qc:83
msgid "Start line"
-msgstr "Linea de salida"
+msgstr "Línea de salida"
#: qcsrc/client/hud/panel/racetimer.qc:85
#: qcsrc/client/hud/panel/racetimer.qc:89
#: qcsrc/client/hud/panel/racetimer.qc:267
#, c-format
msgid "PENALTY: %.1f (%s)"
-msgstr "SANCION: %.1f (%s)"
+msgstr "SANCIÓN: %.1f (%s)"
#: qcsrc/client/hud/panel/racetimer.qc:159 qcsrc/client/main.qc:1102
msgid "missing a checkpoint"
#: 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 pelotas"
+msgstr "Número de asesinatos de portador de pelota"
#: qcsrc/client/hud/panel/scoreboard.qc:105
msgid "SCO^bckills"
-msgstr "SCO^bckills"
+msgstr "asesin.p.pe"
#: qcsrc/client/hud/panel/scoreboard.qc:106
msgid "SCO^bctime"
-msgstr "SCO^bctime"
+msgstr "tiempo p.pe"
#: qcsrc/client/hud/panel/scoreboard.qc:106
msgid "Total amount of time holding the ball in Keepaway"
#: qcsrc/client/hud/panel/scoreboard.qc:107
msgid "SCO^caps"
-msgstr "SCO^capturas"
+msgstr "capturas"
#: qcsrc/client/hud/panel/scoreboard.qc:108
msgid "SCO^captime"
-msgstr "SCO^tiempo de captura"
+msgstr "tiempo de captura"
#: qcsrc/client/hud/panel/scoreboard.qc:108
msgid "Time of fastest capture (CTF)"
#: qcsrc/client/hud/panel/scoreboard.qc:109
msgid "SCO^deaths"
-msgstr "SCO^muertes"
+msgstr "muertes"
#: qcsrc/client/hud/panel/scoreboard.qc:110
msgid "Number of keys destroyed by pushing them into void"
#: qcsrc/client/hud/panel/scoreboard.qc:110
msgid "SCO^destroyed"
-msgstr "SCO^destruido"
+msgstr "destruido"
#: qcsrc/client/hud/panel/scoreboard.qc:111
msgid "SCO^damage"
-msgstr "SCO^daño"
+msgstr "daño"
#: qcsrc/client/hud/panel/scoreboard.qc:111
msgid "The total damage done"
#: qcsrc/client/hud/panel/scoreboard.qc:112
msgid "SCO^dmgtaken"
-msgstr "SCO^daño recibido"
+msgstr "daño recibido"
#: qcsrc/client/hud/panel/scoreboard.qc:112
msgid "The total damage taken"
#: 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"
-msgstr "SCO^caidas"
+msgstr "caídas"
#: qcsrc/client/hud/panel/scoreboard.qc:114
msgid "Player ELO"
#: qcsrc/client/hud/panel/scoreboard.qc:115
msgid "SCO^fastest"
-msgstr "el mas rápido"
+msgstr "el más rápido"
#: qcsrc/client/hud/panel/scoreboard.qc:115
msgid "Time of fastest lap (Race/CTS)"
-msgstr "Tiempo de la vuelta mas rápida (Race/CTS)"
+msgstr "Tiempo de la vuelta más rápida (Carrera/CTS)"
#: qcsrc/client/hud/panel/scoreboard.qc:116
msgid "Number of faults committed"
#: qcsrc/client/hud/panel/scoreboard.qc:116
msgid "SCO^faults"
-msgstr "SCO^faltas"
+msgstr "faltas"
#: qcsrc/client/hud/panel/scoreboard.qc:117
msgid "Number of flag carrier kills"
-msgstr "Número de asesinatos de portadores de bandera"
+msgstr "Número de asesinatos de portador de bandera"
#: qcsrc/client/hud/panel/scoreboard.qc:117
msgid "SCO^fckills"
-msgstr "SCO^fckills"
+msgstr "asesin.p.ba"
#: qcsrc/client/hud/panel/scoreboard.qc:118
msgid "FPS"
#: qcsrc/client/hud/panel/scoreboard.qc:120
msgid "Number of goals scored"
-msgstr "Número de goles marcados"
+msgstr "Número de goles acertados"
#: qcsrc/client/hud/panel/scoreboard.qc:120
msgid "SCO^goals"
-msgstr "SCO^metas"
+msgstr "goles"
#: qcsrc/client/hud/panel/scoreboard.qc:121
msgid "Number of keys carrier kills"
-msgstr "Número de asesinatos de portadores de llaves"
+msgstr "Número de asesinatos de portador de llaves"
#: qcsrc/client/hud/panel/scoreboard.qc:121
msgid "SCO^kckills"
-msgstr "SCO^kckills"
+msgstr "asesin.p.ll"
#: qcsrc/client/hud/panel/scoreboard.qc:122
msgid "SCO^k/d"
-msgstr "SCO^k/d"
+msgstr "a/m"
#: qcsrc/client/hud/panel/scoreboard.qc:122
#: qcsrc/client/hud/panel/scoreboard.qc:123
#: qcsrc/client/hud/panel/scoreboard.qc:123
msgid "SCO^kdr"
-msgstr "SCO^kdr"
+msgstr "amr"
#: qcsrc/client/hud/panel/scoreboard.qc:124
msgid "SCO^kdratio"
-msgstr "SCO^kdratio"
+msgstr "amratio"
#: qcsrc/client/hud/panel/scoreboard.qc:125
msgid "Number of kills"
#: qcsrc/client/hud/panel/scoreboard.qc:125
msgid "SCO^kills"
-msgstr "SCO^muertes"
+msgstr "asesinatos"
#: qcsrc/client/hud/panel/scoreboard.qc:126
msgid "Number of laps finished (Race/CTS)"
-msgstr "Número de vueltas terminadas (carrera/cts)"
+msgstr "Número de vueltas terminadas (Carrera/CTS)"
#: qcsrc/client/hud/panel/scoreboard.qc:126
msgid "SCO^laps"
-msgstr "SCO^vueltas"
+msgstr "vueltas"
#: qcsrc/client/hud/panel/scoreboard.qc:127
msgid "Number of lives (LMS)"
#: qcsrc/client/hud/panel/scoreboard.qc:127
msgid "SCO^lives"
-msgstr "SCO^vidas"
+msgstr "vidas"
#: qcsrc/client/hud/panel/scoreboard.qc:128
msgid "Number of times a key was lost"
#: qcsrc/client/hud/panel/scoreboard.qc:128
msgid "SCO^losses"
-msgstr "SCO^derrotas"
+msgstr "perdidas"
#: qcsrc/client/hud/panel/scoreboard.qc:129
#: qcsrc/client/hud/panel/scoreboard.qc:130
#: qcsrc/client/hud/panel/scoreboard.qc:129
msgid "SCO^name"
-msgstr "SCO^nombre"
+msgstr "nombre"
#: qcsrc/client/hud/panel/scoreboard.qc:130
msgid "SCO^nick"
-msgstr "SCO^nick"
+msgstr "apodo"
#: qcsrc/client/hud/panel/scoreboard.qc:131
msgid "Number of objectives destroyed"
#: qcsrc/client/hud/panel/scoreboard.qc:131
msgid "SCO^objectives"
-msgstr "SCO^objetivos"
+msgstr "objetivos"
#: 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 ""
-"Frecuencia con que 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"
-msgstr "SCO^recogidas"
+msgstr "recogidas"
#: qcsrc/client/hud/panel/scoreboard.qc:133
msgid "Ping time"
-msgstr "Tiempo del ping"
+msgstr "Tiempo de ping"
#: qcsrc/client/hud/panel/scoreboard.qc:133
msgid "SCO^ping"
-msgstr "SCO^ping"
+msgstr "ping"
#: qcsrc/client/hud/panel/scoreboard.qc:134
msgid "Packet loss"
#: qcsrc/client/hud/panel/scoreboard.qc:134
msgid "SCO^pl"
-msgstr "SCO^pl"
+msgstr "pl"
#: qcsrc/client/hud/panel/scoreboard.qc:135
msgid "Number of players pushed into void"
#: qcsrc/client/hud/panel/scoreboard.qc:135
msgid "SCO^pushes"
-msgstr "SCO^ofensivas"
+msgstr "ofensivas"
#: qcsrc/client/hud/panel/scoreboard.qc:136
msgid "Player rank"
#: qcsrc/client/hud/panel/scoreboard.qc:136
msgid "SCO^rank"
-msgstr "SCO^rango"
+msgstr "rango"
#: qcsrc/client/hud/panel/scoreboard.qc:137
msgid "Number of flag returns"
#: qcsrc/client/hud/panel/scoreboard.qc:137
msgid "SCO^returns"
-msgstr "SCO^devoluciones"
+msgstr "regresos"
#: qcsrc/client/hud/panel/scoreboard.qc:138
msgid "Number of revivals"
#: qcsrc/client/hud/panel/scoreboard.qc:138
msgid "SCO^revivals"
-msgstr "SCO^reanimaciones"
+msgstr "reanimaciones"
#: qcsrc/client/hud/panel/scoreboard.qc:139
msgid "Number of rounds won"
#: qcsrc/client/hud/panel/scoreboard.qc:139
msgid "SCO^rounds won"
-msgstr "SCO^rondas ganadas"
+msgstr "rondas ganadas"
#: qcsrc/client/hud/panel/scoreboard.qc:140
msgid "SCO^score"
-msgstr "SCO^puntuación"
+msgstr "puntuación"
#: qcsrc/client/hud/panel/scoreboard.qc:140
msgid "Total score"
#: qcsrc/client/hud/panel/scoreboard.qc:141
msgid "SCO^suicides"
-msgstr "SCO^suicidios"
+msgstr "suicidios"
#: qcsrc/client/hud/panel/scoreboard.qc:142
msgid "Number of kills minus deaths"
#: qcsrc/client/hud/panel/scoreboard.qc:142
msgid "SCO^sum"
-msgstr "SCO^suma"
+msgstr "suma"
#: qcsrc/client/hud/panel/scoreboard.qc:143
msgid "Number of domination points taken (Domination)"
-msgstr "Número de puntos de dominación tomados (Domination)"
+msgstr "Número de puntos de dominación tomados (Dominación)"
#: qcsrc/client/hud/panel/scoreboard.qc:143
msgid "SCO^takes"
-msgstr "SCO^tomas"
+msgstr "tomados"
#: qcsrc/client/hud/panel/scoreboard.qc:144
msgid "Number of teamkills"
#: qcsrc/client/hud/panel/scoreboard.qc:145
msgid "Number of ticks (Domination)"
-msgstr "Número de ticks (Domination)"
+msgstr "Número de ticks (Dominación)"
#: qcsrc/client/hud/panel/scoreboard.qc:145
msgid "SCO^ticks"
-msgstr "SCO^ticks"
+msgstr "ticks"
#: qcsrc/client/hud/panel/scoreboard.qc:146
msgid "SCO^time"
#: qcsrc/client/hud/panel/scoreboard.qc:146
msgid "Total time raced (Race/CTS)"
-msgstr "Tiempo total de carrera (Race/CTS)"
+msgstr "Tiempo 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 "Puedes modificar el marcador con el comando ^2scoreboard_columns_set "
+msgstr ""
+"Puedes modificar la tabla de puntuaciones con el comando "
+"^2scoreboard_columns_set"
#: qcsrc/client/hud/panel/scoreboard.qc:331
msgid "Usage:"
"^2scoreboard_columns_set ^7without arguments reads the arguments from the "
"cvar scoreboard_columns"
msgstr ""
-"^2scoreboard_columns_set ^7sin argumentos lee los argumentos del cvar "
+"^2scoreboard_columns_set ^7sin argumentos se leen los argumentos del cvar "
"scoreboard_columns"
#: qcsrc/client/hud/panel/scoreboard.qc:335
" ^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 ""
"or in all but these game types. You can also specify 'all' as a\n"
"field to show all fields available for the current game mode."
msgstr ""
-"Después de un campo puedes poner un signo + o - , y luego una lista \n"
-"de tipos de juego separados por comas, luego una barra diagonal, \n"
+"Después de un campo puedes poner un signo + o - , y luego una lista\n"
+"de tipos de juego separados por comas, luego una barra diagonal,\n"
"para hacer que el campo se muestre solo en esos o en todos menos en\n"
-"esos tipos de juegos. También puedes especificar 'all' como campo \n"
+"esos tipos de juegos. También puedes especificar 'all' como campo\n"
"para mostrar todos los campos disponibles para el modo de juego \n"
"actual."
"include/exclude ALL teams/noteams game modes."
msgstr ""
"Los nombres especiales de tipo de juego 'teams' y 'noteams' pueden \n"
-"ser usados para incluir/excluir TODOS los modos de juego\n"
-"teams/noteams."
+"ser usados para incluir/excluir TODOS los modos de juego teams/noteams."
#: qcsrc/client/hud/panel/scoreboard.qc:354
msgid "Example: scoreboard_columns_set name ping pl | +ctf/field3 -dm/field4"
"will display name, ping and pl aligned to the left, and the fields\n"
"right of the vertical bar aligned to the right."
msgstr ""
-"mostrará el nombre, ping y pl alinieados a la izquierda, y los campos a la\n"
+"mostrará el nombre, ping y pl alineados a la izquierda, y los campos a la\n"
"derecha de la barra vertical alineada a la derecha."
#: qcsrc/client/hud/panel/scoreboard.qc:357
#: qcsrc/client/hud/panel/scoreboard.qc:1667
#: qcsrc/client/hud/panel/scoreboard.qc:1674
msgid "SCO^points"
-msgstr "SCO^puntos"
+msgstr "puntos"
#: qcsrc/client/hud/panel/scoreboard.qc:1666
#: qcsrc/client/hud/panel/scoreboard.qc:1673
#: qcsrc/client/hud/panel/scoreboard.qc:1827
#, c-format
msgid "All-time fastest: %d%s ^7(%s^7)"
-msgstr "El mas rápido de todos los tiempos: %d%s ^7(%s^7)"
+msgstr "El más rápido de todos los tiempos: %d%s ^7(%s^7)"
#: qcsrc/client/hud/panel/scoreboard.qc:1843
#, c-format
#: qcsrc/client/hud/panel/vote.qc:33
msgid "^1You must answer before entering hud configure mode"
msgstr ""
-"^1Debes de responder antes de entrar al modo de configuración de la interfaz"
+"^1Debes de responder antes de entrar al modo de configuración de la HUD"
#: qcsrc/client/hud/panel/vote.qc:36
msgid "^2Name ^7instead of \"^1Anonymous player^7\" in stats"
#: qcsrc/client/hud/panel/vote.qc:122
msgid "A vote has been called for:"
-msgstr "Una votacion ha sido iniciada para:"
+msgstr "Una votación ha sido iniciada para:"
#: qcsrc/client/hud/panel/vote.qc:124
msgid "Allow servers to store and display your name?"
#: qcsrc/menu/xonotic/dialog_settings_misc_reset.qc:16
#: qcsrc/menu/xonotic/dialog_uid2name.qc:15
msgid "Yes"
-msgstr "Si"
+msgstr "Sí"
#: qcsrc/client/hud/panel/vote.qc:134
#: qcsrc/menu/xonotic/dialog_disconnect.qc:22
#: qcsrc/client/hud/panel/weapons.qc:588
msgid "Don't have"
-msgstr "No tienes"
+msgstr "No lo/la tienes"
#: qcsrc/client/hud/panel/weapons.qc:592
msgid "Unavailable"
#: qcsrc/client/mapvoting.qc:512
msgid "mv_mapdownload: ^3You're not supposed to use this command on your own!"
-msgstr "mv_mapdownload: ^3¡No deberias usar esta orden por tu cuenta!"
+msgstr "mv_mapdownload: ^3¡No deberías usar este comando por tu cuenta!"
#: qcsrc/client/mapvoting.qc:522
msgid "^1Error:^7 Couldn't find pak index."
#: qcsrc/client/miscfunctions.qc:111
msgid "Trying to remove a team which is not in the teamlist!"
-msgstr "¡Intentado eliminar un equipo que no esta en la lista de equipos !"
+msgstr "¡Intentando eliminar un equipo que no está en la lista de equipos!"
#: qcsrc/client/view.qc:939
msgid "Nade timer"
#: qcsrc/common/command/generic.qc:412
msgid "Notification restart command only works with cl_cmd and sv_cmd."
msgstr ""
-"El comando de reinicio de notificaciones solo funciona con cl_cmd y sv_cmd."
+"El comando de reinicio de notificaciones sólo funciona con cl_cmd y sv_cmd."
#: 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/menu/xonotic/dialog_multiplayer_create_mutators.qc:91
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:215
msgid "Jetpack"
-msgstr "Jetpack"
+msgstr "Mochila propulsora"
#: qcsrc/common/items/item/jetpack.qh:71
msgid "fuel"
#: qcsrc/common/mapinfo.qc:626
#, no-c-format
msgid "@!#%'n Tuba Throwing"
-msgstr "@!#%'n Lanzamiento de Tuba"
+msgstr "Lanzamiento de la @!#%'n Tuba"
#: qcsrc/common/mapinfo.qh:72 qcsrc/common/mapinfo.qh:334
#: qcsrc/common/mapinfo.qh:529
#: qcsrc/common/mapinfo.qh:149
msgid "Race against other players to the finish line"
-msgstr "Carrera contra otros jugadores hasta la linea de meta"
+msgstr "Carrera contra otros jugadores hasta la línea de meta"
#: qcsrc/common/mapinfo.qh:176
msgid "Laps:"
#: qcsrc/common/mapinfo.qh:219
msgid "Help your team score the most frags against the enemy team"
msgstr ""
-"Ayuda a tu equipo a marcar tantos frags como puedas contra el equipo enemigo"
+"Ayuda a tu equipo a acertar tantas eliminaciones como puedas contra el "
+"equipo enemigo"
#: qcsrc/common/mapinfo.qh:219
msgid "Team Deathmatch"
"from the other team"
msgstr ""
"Encuentra la bandera enemiga y tráela hasta tu base para capturarla, "
-"defiende tu base del equipo contrario. "
+"defiende tu base del equipo contrario"
#: qcsrc/common/mapinfo.qh:289
msgid "Capture limit:"
#: qcsrc/common/mapinfo.qh:388
msgid "Key Hunt"
-msgstr "Caza de llave"
+msgstr "Caza de llaves"
#: qcsrc/common/mapinfo.qh:428
msgid "Assault"
#: 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 porteria enemiga, manten tu porteria "
+"Dispara y golpea la pelota dentro de la portería enemiga, mantén tu portería "
"limpia"
#: qcsrc/common/mapinfo.qh:488
msgid "Goals:"
-msgstr "Puntos:"
+msgstr "Goles:"
#: qcsrc/common/mapinfo.qh:488
msgid "The amount of goals needed before the match will end"
-msgstr "Cantidad de objetivos necesarios antes de que termine el combate"
+msgstr "Cantidad de goles necesarios antes de que termine la partida"
#: qcsrc/common/mapinfo.qh:501
msgid "Freeze Tag"
-msgstr "Freeze Tag"
+msgstr "Tag de congelación"
#: qcsrc/common/mapinfo.qh:501
msgid ""
#: qcsrc/common/mapinfo.qh:545
msgid "Hold the ball to get points for kills"
-msgstr "Mantén la pelota para ganar puntos por asesinatos"
+msgstr "Retén la pelota para ganar puntos por asesinatos"
#: qcsrc/common/mapinfo.qh:545
msgid "Keepaway"
#: qcsrc/common/mapinfo.qh:560
msgid "Invasion"
-msgstr "Invasión "
+msgstr "Invasión"
#: qcsrc/common/mapinfo.qh:560
msgid "Survive against waves of monsters"
-msgstr "Sobrevive contra las oleadas de monstruos "
+msgstr "Sobrevive contra las oleadas de monstruos"
#: qcsrc/common/mapinfo.qh:590
msgid "Duel"
#: 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 "¡Horrible! ¡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"
msgid "You can select one of your pieces to move it anywhere on the board"
msgstr ""
"Puedes seleccionar una de tus piezas para moverla a cualquier lugar del "
-"tablearo"
+"tablero"
#: qcsrc/common/minigames/minigame/nmm.qc:619
msgid "You can take one of the opponent's pieces"
#: qcsrc/common/minigames/minigame/pong.qc:606
msgid "Press ^1Start Match^7 to start the match with the current players"
msgstr ""
-"Pulsa ^1Start Match^7 para empezar la partida con los jugadores actuales"
+"Pulsa ^1Comenzar Partida^7 para empezar la partida con los jugadores actuales"
#: qcsrc/common/minigames/minigame/pong.qc:679
msgid "Start Match"
#: qcsrc/common/minigames/minigame/pp.qc:444
#: qcsrc/common/minigames/minigame/ttt.qc:326
msgid "Select \"^1Next Match^7\" on the menu for a rematch!"
-msgstr "¡Selecciona \"^1Next Match^7\" en el menú para una revancha!"
+msgstr "¡Selecciona \"^1Siguiente Partida^7\" en el menú para una revancha!"
#: qcsrc/common/minigames/minigame/pp.qc:445
#: qcsrc/common/minigames/minigame/pp.qc:451
#: qcsrc/common/minigames/minigame/ttt.qc:333
msgid "Select \"^1Next Match^7\" on the menu to start a new match!"
msgstr ""
-"¡Selecciona \"^1Next Match^7\" en el menú para empezar una nueva partida!"
+"¡Selecciona \"^Siguiente Partida^7\" en el menú para empezar una nueva "
+"partida!"
#: qcsrc/common/minigames/minigame/pp.qc:452
#: qcsrc/common/minigames/minigame/ttt.qc:334
#: qcsrc/common/minigames/minigame/ps.qc:414
msgid "All pieces cleared!"
-msgstr "Todas las piezas despejadas!"
+msgstr "¡Todas las piezas despejadas!"
#: qcsrc/common/minigames/minigame/ps.qc:416
msgid "Remaining pieces:"
#: qcsrc/common/mutators/mutator/buffs/all.inc:71
msgid "Disability"
-msgstr "Descapacitado"
+msgstr "Discapacidad"
#: qcsrc/common/mutators/mutator/buffs/all.inc:79
msgid "Vengeance"
#: qcsrc/common/mutators/mutator/buffs/all.inc:113
msgid "Swapper"
-msgstr "Swapper"
+msgstr "Intercambiador"
#: qcsrc/common/mutators/mutator/buffs/all.inc:121
msgid "Magnet"
#: qcsrc/common/mutators/mutator/buffs/buffs.qh:11
msgid "Buff"
-msgstr "Beneficio"
+msgstr "Mejora"
#: qcsrc/common/mutators/mutator/damagetext/ui_damagetext.qc:8
msgid "Damage text"
#: qcsrc/common/mutators/mutator/nades/nades.inc:18
msgid "Napalm grenade"
-msgstr "Granada Napalm"
+msgstr "Granada de Napalm"
#: qcsrc/common/mutators/mutator/nades/nades.inc:26
msgid "Ice grenade"
#: qcsrc/common/mutators/mutator/nades/nades.inc:50
msgid "Heal grenade"
-msgstr "Granada de curación"
+msgstr "Granada de Curación"
#: qcsrc/common/mutators/mutator/nades/nades.inc:58
msgid "Monster grenade"
-msgstr "Granada monstruo"
+msgstr "Granada de Monstruo"
#: qcsrc/common/mutators/mutator/nades/nades.inc:66
msgid "Entrap grenade"
-msgstr "Granada trampa"
+msgstr "Granada de Trampa"
#: qcsrc/common/mutators/mutator/nades/nades.inc:74
msgid "Veil grenade"
-msgstr "Granada velo"
+msgstr "Granada de Velo"
#: qcsrc/common/mutators/mutator/nades/nades.qh:33
msgid "Grenade"
#: qcsrc/common/mutators/mutator/overkill/oknex.qh:19
msgid "Overkill Nex"
-msgstr "Nex Overkill"
+msgstr "Overkill Nex"
#: qcsrc/common/mutators/mutator/overkill/okrpc.qh:20
msgid "Overkill Rocket Propelled Chainsaw"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:4
msgid "Help me!"
-msgstr "¡Ayudame!"
+msgstr "¡Ayudadme!"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:5
msgid "Here"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:10
msgid "Item"
-msgstr "Artículo"
+msgstr "Objeto"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:12
msgid "Checkpoint"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:21
msgid "Flag carrier"
-msgstr "Portador de bandera"
+msgstr "Portador de la bandera"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:22
msgid "Enemy carrier"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:23
msgid "Dropped flag"
-msgstr "Bandera perdida"
+msgstr "Bandera caída"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:24
msgid "White base"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:29
msgid "Return flag here"
-msgstr "Devuelva la bandera aquí"
+msgstr "Regresa la bandera aquí"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:31
#: qcsrc/common/mutators/mutator/waypoints/all.inc:32
#: qcsrc/common/mutators/mutator/waypoints/all.inc:37
msgid "Dropped key"
-msgstr "Llave perdida"
+msgstr "Llave caída"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:38
#: qcsrc/common/mutators/mutator/waypoints/all.inc:40
#: 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/mutators/mutator/waypoints/all.inc:61
msgid "Vehicle"
-msgstr "Vehiculo"
+msgstr "Vehículo"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:62
msgid "Intruder!"
"%s^BG's previous record of ^F2%s^BG seconds"
msgstr ""
"^BG%s^BG capturó la bandera ^TC^TT^BG en ^F1%s^BG segundos, batiendo el "
-"record anterior de ^BG%s^BG de ^F2%s^BG segundos"
+"récord anterior de ^BG%s^BG de ^F2%s^BG segundos"
#: qcsrc/common/notifications/all.inc:234
#, c-format
"^BG%s^BG's previous record of ^F1%s^BG seconds"
msgstr ""
"^BG%s^BG capturó la bandera ^TC^TT^BG en ^F2%s^BG segundos, fallando al "
-"batir el record anterior de ^BG%s^BG de ^F1%s^BG segundos"
+"batir el récord anterior de ^BG%s^BG de ^F1%s^BG segundos"
#: qcsrc/common/notifications/all.inc:237
msgid "^BGThe ^TC^TT^BG flag was returned to base by its owner"
#: qcsrc/common/notifications/all.inc:239
msgid "^BGThe ^TC^TT^BG flag was destroyed and returned to base"
-msgstr "^BGLa ^TC^TT^BG bandera fue destruida y devuelta a la base"
+msgstr "^BGLa ^TC^TT^BG bandera fue destruida y regresada a la base"
#: qcsrc/common/notifications/all.inc:240
msgid "^BGThe flag was destroyed and returned to base"
-msgstr "^BGLa bandera fué destruida y devuelta a la base"
+msgstr "^BGLa bandera fue destruida y regresada a la base"
#: qcsrc/common/notifications/all.inc:241
msgid "^BGThe ^TC^TT^BG flag was dropped in the base and returned itself"
-msgstr "^BGLa bandera ^TC^TT^BG fué soltada en la base y volvió"
+msgstr "^BGLa bandera ^TC^TT^BG fue soltada en la base y regresó sola"
#: qcsrc/common/notifications/all.inc:242
msgid "^BGThe flag was dropped in the base and returned itself"
-msgstr "^BGLa bandera fue soltada en la base y volvió"
+msgstr "^BGLa bandera fue soltada en la base y regresó sola"
#: qcsrc/common/notifications/all.inc:243
msgid ""
"base"
msgstr ""
"^BGTLa bandera ^TC^TT^BG cayó en algún lugar y no pudo ser alcanzada y "
-"devuelta a la base"
+"regresada a la base"
#: qcsrc/common/notifications/all.inc:244
msgid "^BGThe flag fell somewhere it couldn't be reached and returned to base"
msgstr ""
-"^BGLa bandera cayó en algún lugar y no pudo ser alcanzada y devuelta a la "
+"^BGLa bandera cayó en algún lugar y no pudo ser alcanzada y regresada a la "
"base"
#: qcsrc/common/notifications/all.inc:245
msgid ""
"^BGThe ^TC^TT^BG flag became impatient after ^F1%.2f^BG seconds and returned "
"itself"
-msgstr "^BGLa bandera ^TC^TT^BG se desesperó tras ^F1%.2f^BG segundos y volvió"
+msgstr ""
+"^BGLa bandera ^TC^TT^BG se desesperó tras ^F1%.2f^BG segundos y regresó sola"
#: qcsrc/common/notifications/all.inc:246
#, c-format
msgid ""
"^BGThe flag became impatient after ^F1%.2f^BG seconds and returned itself"
-msgstr "^BGLa bandera se desesperó tras ^F1%.2f^BG segundos y volvió"
+msgstr "^BGLa bandera se desesperó tras ^F1%.2f^BG segundos y regresó sola"
#: qcsrc/common/notifications/all.inc:247
msgid "^BGThe ^TC^TT^BG flag has returned to the base"
#: qcsrc/common/notifications/all.inc:544
#, c-format
msgid "^F2Throwing coin... Result: %s^F2!"
-msgstr "^F2Tirando moneda... Resultado: %s^F2!"
+msgstr "^F2Tirando moneda... Resultado: ¡%s^F2!"
#: qcsrc/common/notifications/all.inc:258
msgid "^BGYou don't have any fuel for the ^F1Jetpack"
#: qcsrc/common/notifications/all.inc:260
msgid "^F2You lack a UID, superspec options will not be saved/restored"
msgstr ""
-"^F2Te falta un UID, las opciones superspec no serán guardadas/restaudaras"
+"^F2Te falta un UID, las opciones superspec no serán guardadas/restauradas"
#: qcsrc/common/notifications/all.inc:262
msgid "^F1Round already started, you will join the game in the next round"
#: qcsrc/common/notifications/all.inc:265
#, c-format
msgid "^BG%s%s^K1 was killed by ^BG%s^K1's ^BG%s^K1 buff ^K1%s%s"
-msgstr "^BG%s%s^K1 fue asesinado por ^BG%s^K1's ^BG%s^K1 buff ^K1%s%s"
+msgstr "^BG%s%s^K1 fue asesinado por ^BG%s^K1 ^BG%s^K1 con mejora ^K1%s%s"
#: qcsrc/common/notifications/all.inc:265
#, c-format
msgid "^BG%s%s^K1 was scored against by ^BG%s^K1's ^BG%s^K1 buff ^K1%s%s"
-msgstr "^BG%s%s^K1 se marcó por ^BG%s^K1's ^BG%s^K1 buff ^K1%s%s"
+msgstr "^BG%s%s^K1 ha sido acertado por ^BG%s^K1 ^BG%s^K1 con mejora ^K1%s%s"
#: qcsrc/common/notifications/all.inc:266
#, c-format
msgid "^BG%s%s^K1 was unfairly eliminated by ^BG%s^K1%s%s"
-msgstr "^BG%s%s^K1 fué eliminado injustamente por ^BG%s^K1%s%s"
+msgstr "^BG%s%s^K1 fue eliminado injustamente por ^BG%s^K1%s%s"
#: qcsrc/common/notifications/all.inc:267
#, c-format
#: qcsrc/common/notifications/all.inc:269
#, c-format
msgid "^BG%s%s^K1 felt a little hot from ^BG%s^K1's fire^K1%s%s"
-msgstr "^BG%s%s^K1 sintió calorcito de ^BG%s^K1's fuego^K1%s%s"
+msgstr "^BG%s%s^K1 sintió calorcito del fuego^K1%s%s de ^BG%s^K1 "
#: qcsrc/common/notifications/all.inc:269
#, c-format
msgid "^BG%s%s^K1 was burnt up into a crisp by ^BG%s^K1%s%s"
-msgstr "^BG%s%s^K1 fue frito por ^BG%s^K1%s%s"
+msgstr "^BG%s%s^K1 fue quemado frito por ^BG%s^K1%s%s"
#: qcsrc/common/notifications/all.inc:270
#, c-format
#: qcsrc/common/notifications/all.inc:272
#, c-format
msgid "^BG%s%s^K1 was blown up by ^BG%s^K1's Nade%s%s"
-msgstr "^BG%s%s^K1 fue explotado por la granada de ^BG%s^K1 %s%s"
+msgstr "^BG%s%s^K1 fue explotado por la granada de ^BG%s^K1%s%s"
#: qcsrc/common/notifications/all.inc:273
#, c-format
msgid "^BG%s%s^K1 got too close to a napalm explosion%s%s"
-msgstr "^BG%s%s^K1 se acercó demasiado a una explosión de napalm %s%s"
+msgstr "^BG%s%s^K1 se acercó demasiado a una explosión de napalm%s%s"
#: qcsrc/common/notifications/all.inc:273
#, c-format
msgid "^BG%s%s^K1 was burned to death by ^BG%s^K1's Napalm Nade%s%s"
-msgstr "^BG%s%s^K1 fue calcinado por la Granada de Napalm de ^BG%s^K1 %s%s"
+msgstr "^BG%s%s^K1 fue calcinado por la Granada de Napalm de ^BG%s^K1%s%s"
#: qcsrc/common/notifications/all.inc:274
#, c-format
#: qcsrc/common/notifications/all.inc:275
#, c-format
msgid "^BG%s%s^K1 was frozen to death by ^BG%s^K1's Ice Nade%s%s"
-msgstr "^BG%s%s^K1 fue congelado por la Granada de Hielo de ^BG%s^K1 %s%s"
+msgstr "^BG%s%s^K1 fue congelado por la Granada de Hielo de ^BG%s^K1%s%s"
#: qcsrc/common/notifications/all.inc:276
#, c-format
#: qcsrc/common/notifications/all.inc:280
#, c-format
msgid "^BG%s%s^K1 was telefragged by ^BG%s^K1%s%s"
-msgstr "^BG%s%s^K1 fue telegrafiado por ^BG%s^K1%s%s"
+msgstr "^BG%s%s^K1 fue remotamente eliminado por ^BG%s^K1%s%s"
#: qcsrc/common/notifications/all.inc:281
#, c-format
#, c-format
msgid "^BG%s%s^K1 was cluster bombed by ^BG%s^K1's Raptor%s%s"
msgstr ""
-"^BG%s%s^K1 fue victima del bombardeo de racimo del Raptor de ^BG%s^K1%s%s"
+"^BG%s%s^K1 fue víctima del bombardeo de racimo del Raptor de ^BG%s^K1%s%s"
#: qcsrc/common/notifications/all.inc:286
#, c-format
msgid "^BG%s%s^K1 couldn't resist ^BG%s^K1's purple blobs%s%s"
-msgstr "^BG%s%s^K1 no pudo resistir los blobs morados de ^BG%s^K1%s%s"
+msgstr "^BG%s%s^K1 no pudo resistir las manchas moradas de ^BG%s^K1%s%s"
#: qcsrc/common/notifications/all.inc:287
#, c-format
#: qcsrc/common/notifications/all.inc:290
#, c-format
msgid "^BG%s%s^K1 was blasted to bits by ^BG%s^K1's Spiderbot%s%s"
-msgstr "^BG%s%s^K1 fue explotado a bits por el Robot Araña de ^BG%s^K1%s%s"
+msgstr "^BG%s%s^K1 fue explotado a pedazos por el Robot Araña de ^BG%s^K1%s%s"
#: qcsrc/common/notifications/all.inc:291
#, c-format
#: qcsrc/common/notifications/all.inc:297
#, c-format
msgid "^BG%s^K1 became enemies with the Lord of Teamplay%s%s"
-msgstr "^BG%s^K1 se hicieron enemigos Del Señor del Juego en Equipo%s%s"
+msgstr "^BG%s^K1 se hicieron enemigos del Señor del Juego en Equipo%s%s"
#: qcsrc/common/notifications/all.inc:298
#, c-format
msgid "^BG%s^K1 thought they found a nice camping ground%s%s"
-msgstr "^BG%s^K1 pensaron que habían encontrado una buena zona de camping%s%s"
+msgstr "^BG%s^K1 pensaron que habían encontrado un buen campamento%s%s"
#: qcsrc/common/notifications/all.inc:299
#, c-format
msgid "^BG%s^K1 unfairly eliminated themself%s%s"
-msgstr "^BG%s^K1 se eliminó injustamente a si mismo%s%s"
+msgstr "^BG%s^K1 se eliminó injustamente a sí mismo%s%s"
#: qcsrc/common/notifications/all.inc:301
#, c-format
msgid "^BG%s^K1 couldn't catch their breath%s%s"
-msgstr "^BG%s^K1 no podian respirar %s%s"
+msgstr "^BG%s^K1 no podían respirar %s%s"
#: qcsrc/common/notifications/all.inc:301
#, c-format
#: qcsrc/common/notifications/all.inc:302
#, c-format
msgid "^BG%s^K1 hit the ground with a bit too much force%s%s"
-msgstr "^BG%s^K1 chocó contra el suelo con un poquito demasiada fuerza%s%s"
+msgstr "^BG%s^K1 chocó contra el suelo con poca fuerza%s%s"
#: qcsrc/common/notifications/all.inc:302
#, c-format
#: qcsrc/common/notifications/all.inc:303
#, c-format
msgid "^BG%s^K1 became a bit too crispy%s%s"
-msgstr "^BG%s^K1 se volvió un poco demasiado crujiente%s%s"
+msgstr "^BG%s^K1 se volvió un poco crujiente%s%s"
#: qcsrc/common/notifications/all.inc:303
#, c-format
#: qcsrc/common/notifications/all.inc:307
#, c-format
msgid "^BG%s^K1's innards became outwards by a Shambler%s%s"
-msgstr "Las entrañas de ^BG%s^K1 fueron sacads por un Shambler%s%s"
+msgstr "Las entrañas de ^BG%s^K1 fueron sacadas por un Shambler%s%s"
#: qcsrc/common/notifications/all.inc:308
#, c-format
#: qcsrc/common/notifications/all.inc:309
#, c-format
msgid "^BG%s^K1 was zapped to death by a Shambler%s%s"
-msgstr "^BG%s^K1 fue borrado por un Shambler%s%s"
+msgstr "^BG%s^K1 fue electrocutado por un Shambler%s%s"
#: qcsrc/common/notifications/all.inc:310
#, c-format
#: qcsrc/common/notifications/all.inc:316
#, c-format
msgid "^BG%s^K1 mastered the art of self-nading%s%s"
-msgstr "^BG%s^K1 dominó el arte de auto-nadearse%s%s"
+msgstr "^BG%s^K1 dominó el arte de autodestruirse con granadas%s%s"
#: qcsrc/common/notifications/all.inc:315
#, c-format
#: qcsrc/common/notifications/all.inc:317
#, c-format
msgid "^BG%s^K1 felt a little chilly%s%s"
-msgstr "^BG%s^K1 sintió un poco de fresco%s%s"
+msgstr "^BG%s^K1 sintió fresquito%s%s"
#: qcsrc/common/notifications/all.inc:317
#, c-format
#: 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 murió%s%s. ¿De que sirve vivir sin munición?"
+msgstr "^BG%s^K1 murió%s%s. ¿De qué sirve vivir sin munición?"
#: qcsrc/common/notifications/all.inc:319
#, c-format
#: qcsrc/common/notifications/all.inc:325
#, c-format
msgid "^BG%s^K1 switched to the %s%s"
-msgstr "^BG%s^K1 cambio al %s%s"
+msgstr "^BG%s^K1 cambió al %s%s"
#: qcsrc/common/notifications/all.inc:326
#, c-format
#: qcsrc/common/notifications/all.inc:327
#, c-format
msgid "^BG%s^K1 ran into a turret%s%s"
-msgstr "^BG%s^K1 encontró una torreta%s%s"
+msgstr "^BG%s^K1 se topó con una torreta%s%s"
#: qcsrc/common/notifications/all.inc:328
#, c-format
#: qcsrc/common/notifications/all.inc:333
#, c-format
msgid "^BG%s^K1 got turned into smoldering gibs by an MLRS turret%s%s"
-msgstr "^BG%s^K1 fue convertido en entrañas ardientes por una torreta MLRS%s%s"
+msgstr "^BG%s^K1 fue convertido en vísceras ardientes por una torreta MLRS%s%s"
#: qcsrc/common/notifications/all.inc:334
#, c-format
#, c-format
msgid "^BG%s^K1 got served some superheated plasma from a turret%s%s"
msgstr ""
-"^BGa %s^K1 le sirvieron un poco de plasma sobrecalentado de una torreta %s%s"
+"^BGA%s^K1 le sirvieron un poco de plasma sobrecalentado de una torreta%s%s"
#: qcsrc/common/notifications/all.inc:336
#, c-format
#: qcsrc/common/notifications/all.inc:337
#, c-format
msgid "^BG%s^K1 got served a lead enrichment by a Walker turret%s%s"
-msgstr "^BGa %s^K1 le llenó de plomo una torreta Walker %s%s"
+msgstr "^BGA %s^K1 le llenó de plomo una torreta Walker%s%s"
#: qcsrc/common/notifications/all.inc:338
#, c-format
#, c-format
msgid "^BG%s^K1 got caught in the blast of a Bumblebee explosion%s%s"
msgstr ""
-"^BG%s^K1 fue alcanzado por la onda expansiva de una explosion de Bumblebee%s"
+"^BG%s^K1 fue alcanzado por la onda expansiva de una explosión de Bumblebee%s"
"%s"
#: qcsrc/common/notifications/all.inc:341
#: qcsrc/common/notifications/all.inc:345
#, c-format
msgid "^BG%s^K1 was blasted to bits by a Spiderbot rocket%s%s"
-msgstr "^BG%s^K1 fue reventado a bits por un cohete de Robot Araña%s%s"
+msgstr "^BG%s^K1 fue reventado a pedazos por un cohete de Robot Araña%s%s"
#: qcsrc/common/notifications/all.inc:346
#, c-format
#: qcsrc/common/notifications/all.inc:357
#, c-format
msgid "^BG%s^K3 was revived by their Nade explosion"
-msgstr "^BG%s^K3 fue revivido por la eplosión de su Granada"
+msgstr "^BG%s^K3 fue revivido por la explosión de su Granada"
#: qcsrc/common/notifications/all.inc:358
#, c-format
msgid "^BG%s^K3 was automatically revived after %s seconds"
-msgstr ""
+msgstr "^BG%s^K3 fue revivido automáticamente después de %s segundos"
#: qcsrc/common/notifications/all.inc:359
#, c-format
msgid "^BG%s^K1 froze themself"
-msgstr "^BG%s^K1 se auto-congeló"
+msgstr "^BG%s^K1 se congelaron"
#: qcsrc/common/notifications/all.inc:361
#: qcsrc/common/notifications/all.inc:675
#: qcsrc/common/notifications/all.inc:368
#, c-format
msgid "^BG%s^BG got the %s^BG buff!"
-msgstr "^BG¡%s^BG tiene la ventaja %s^BG!"
+msgstr "^BG¡%s^BG tiene la mejora %s^BG!"
#: qcsrc/common/notifications/all.inc:369
#, c-format
msgid "^BG%s^BG lost the %s^BG buff!"
-msgstr "^BG¡%s^BG pierde la ventaja %s^BG!"
+msgstr "^BG¡%s^BG pierde la mejora %s^BG!"
#: qcsrc/common/notifications/all.inc:370
#: qcsrc/common/notifications/all.inc:683
#, c-format
msgid "^BGYou dropped the %s^BG buff!"
-msgstr "^BG¡Has tirado la ventaja %s^BG!"
+msgstr "^BG¡Has tirado la mejora %s^BG!"
#: qcsrc/common/notifications/all.inc:371
#: qcsrc/common/notifications/all.inc:684
#, c-format
msgid "^BGYou got the %s^BG buff!"
-msgstr "^BG¡Tienes la ventaja %s^BG!"
+msgstr "^BG¡Tienes la mejora %s^BG!"
#: qcsrc/common/notifications/all.inc:373
#: qcsrc/common/notifications/all.inc:687
#, c-format
msgid "^BGYou do not have the ^F1%s"
-msgstr "^BGNo tienes la ^F1%s"
+msgstr "^BGNo tienes el/la ^F1%s"
#: qcsrc/common/notifications/all.inc:374
#: qcsrc/common/notifications/all.inc:688
#, c-format
msgid "^BGYou dropped the ^F1%s^BG%s"
-msgstr "^BGHas tirado la ^F1%s^BG%s"
+msgstr "^BGHas tirado el/la ^F1%s^BG%s"
#: qcsrc/common/notifications/all.inc:375
#: qcsrc/common/notifications/all.inc:689
#, c-format
msgid "^BGYou got the ^F1%s"
-msgstr "^BGTienes la ^F1%s"
+msgstr "^BGTienes el/la ^F1%s"
#: qcsrc/common/notifications/all.inc:376
#: qcsrc/common/notifications/all.inc:690
#, c-format
msgid "^BGYou don't have enough ammo for the ^F1%s"
-msgstr "^BGNo tienes suficiente munición para el ^F1%s"
+msgstr "^BGNo tienes suficiente munición para el/la ^F1%s"
#: qcsrc/common/notifications/all.inc:377
#: qcsrc/common/notifications/all.inc:691
#: qcsrc/common/notifications/all.inc:383
#, c-format
msgid "^BG%s^F3 is now playing on the ^TC^TT team"
-msgstr "^BG%s^F3 esta jugando en el equipo ^TC^TT"
+msgstr "^BG%s^F3 está jugando en el equipo ^TC^TT"
#: qcsrc/common/notifications/all.inc:385
#: 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:389
#, c-format
msgid "^BG%s^BG dropped the ^TC^TT Key"
-msgstr "^BG%s^BG ha tirado la llave ^TC^TT"
+msgstr "^BG%s^BG ha tirado la Llave ^TC^TT"
#: qcsrc/common/notifications/all.inc:390
#, c-format
msgid "^BG%s^BG lost the ^TC^TT Key"
-msgstr "^BG%s^BG pierde la llave ^TC^TT"
+msgstr "^BG%s^BG pierde la Llave ^TC^TT"
#: qcsrc/common/notifications/all.inc:391
#, c-format
#: qcsrc/common/notifications/all.inc:395
#, c-format
msgid "^BG%s^F3 forfeited"
-msgstr "^BG%s^F3 perdido"
+msgstr "^BG%s^F3 ha abandonado"
#: qcsrc/common/notifications/all.inc:396
#, 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:403
#, c-format
msgid "^BG%s^BG captured a control point"
-msgstr ""
+msgstr "^BG%s^BG ha capturado un punto de control"
#: qcsrc/common/notifications/all.inc:404
#, c-format
msgid "^TC^TT^BG team %s^BG control point has been destroyed by %s"
msgstr ""
-"^TC^TT^BG El punto de control del equipo %s^BG ha sido destruido por %s"
+"^BGEl punto de control %s^BG del equipo ^TC^TT^BG ha sido destruido por %s"
#: qcsrc/common/notifications/all.inc:405
#, c-format
msgid "^TC^TT^BG team control point has been destroyed by %s"
-msgstr ""
+msgstr "^BGEl punto de control del equipo ^TC^TT^BG ha sido destruido por %s"
#: qcsrc/common/notifications/all.inc:406
msgid "^TC^TT^BG generator has been destroyed"
-msgstr "^TC^TT^BG el generador ha sido destruido"
+msgstr "^BGEl generador ^TC^TT^BG ha sido destruido"
#: qcsrc/common/notifications/all.inc:407
msgid "^TC^TT^BG generator spontaneously combusted due to overtime!"
msgstr ""
-"^TC^TT^BG ¡el generador se ha quemado expontaneamete debido al tiempo extra!"
+"^BG¡El generador ^TC^TT^BG se ha quemado espontáneamente debido al tiempo "
+"extra!"
#: qcsrc/common/notifications/all.inc:409
#, c-format
"spectators aren't allowed at the moment."
msgstr ""
"^F2Fuiste expulsado del servidor porque eres un espectador y los "
-"espectadores no estan permitidos por el momento"
+"espectadores no están permitidos por el momento"
#: qcsrc/common/notifications/all.inc:417
#, c-format
msgid "^BG%s^F3 was kicked for excessive teamkilling"
-msgstr "^BG%s^F3 ha sido echado por matar a sus propios compañeros"
+msgstr "^BG%s^F3 ha sido expulsado por matar a tus propios compañeros"
#: qcsrc/common/notifications/all.inc:418
#, c-format
#: qcsrc/common/notifications/all.inc:421
#, c-format
msgid "^BG%s^BG couldn't break their %s%s^BG place record of %s%s %s"
-msgstr "^BG%s^BG no pudo romper su %s%s^BG posición de record %s%s %s"
+msgstr "^BG%s^BG no pudo romper su récord de %s%s^BG en lugar de %s%s %s"
#: qcsrc/common/notifications/all.inc:422
#, c-format
msgid "^BG%s^BG couldn't break the %s%s^BG place record of %s%s %s"
-msgstr "^BG%s^BG no pudo romper el %s%s^BG posición de record %s%s %s"
+msgstr "^BG%s^BG no pudo romper el récord de %s%s^BG en lugar de %s%s %s"
#: qcsrc/common/notifications/all.inc:423
#, c-format
msgid "^BG%s^BG has finished the race"
-msgstr "^BG%s^BG ha terminado la carrear"
+msgstr "^BG%s^BG ha terminado la carrera"
#: qcsrc/common/notifications/all.inc:424
#, c-format
msgid "^BG%s^BG broke %s^BG's %s%s^BG place record with %s%s %s"
-msgstr "^BG%s^BG rompió el record de %s^BG %s%s^BG posición con %s%s %s"
+msgstr "^BG%s^BG rompió el récord de %s^BG %s%s^BG con %s%s %s"
#: qcsrc/common/notifications/all.inc:425
#, c-format
msgid "^BG%s^BG improved their %s%s^BG place record with %s%s %s"
-msgstr "^BG%s^BG mejoró su %s%s^BG posición de record con %s%s %s"
+msgstr "^BG%s^BG mejoró el récord de %s%s^BG con %s%s %s"
#: qcsrc/common/notifications/all.inc:426
#, c-format
"^BG%s^BG scored a new record with ^F2%s^BG, but unfortunately lacks a UID "
"and will be lost."
msgstr ""
-"^BG%s^BG ha logrado adquirir un nuevo record con ^F2%s^BG, pero "
-"desafortunadamente no tiene un UID y el record se perderá."
+"^BG%s^BG ha logrado adquirir un nuevo récord con ^F2%s^BG, pero "
+"desafortunadamente no tiene un UID y el récord se perderá."
#: qcsrc/common/notifications/all.inc:427
#, c-format
"^BG%s^BG scored a new record with ^F2%s^BG, but is anonymous and will be "
"lost."
msgstr ""
-"^BG%s^BG ha logrado adquirir un nuevo record con ^F2%s^BG, pero es anonimo y "
-"el record se perderá"
+"^BG%s^BG ha logrado adquirir un nuevo récord con ^F2%s^BG, pero es anónimo y "
+"el récord se perderá."
#: qcsrc/common/notifications/all.inc:428
#, c-format
msgid "^BG%s^BG set the %s%s^BG place record with %s%s"
-msgstr "^BG%s^BG ha establecido el record en la posición %s%s^BG con %s%s"
+msgstr "^BG%s^BG ha establecido el récord en la posición de %s%s^BG con %s%s"
#: qcsrc/common/notifications/all.inc:430
#, c-format
#: qcsrc/common/notifications/all.inc:432
msgid "^TC^TT ^BGteam scores!"
-msgstr "¡El equipo ^TC^TT^BG ha anotado!"
+msgstr "¡El equipo ^TC^TT^BG ha acertado!"
#: qcsrc/common/notifications/all.inc:434
#, c-format
"kicked, because spectating isn't allowed at this time!"
msgstr ""
"^F2¡Tienes que convertirte en jugador en los siguientes %s, o serás "
-"expulsado, porque no esta permitido espectar en este momento!"
+"expulsado, porque no está permitido espectar en este momento!"
#: qcsrc/common/notifications/all.inc:436
#, c-format
#: qcsrc/common/notifications/all.inc:439
msgid "^BGYou are not allowed to change teams"
-msgstr "^BGNo se te permite cambiar equipos"
+msgstr "^BGNo tienes permitido cambiar de equipo"
#: qcsrc/common/notifications/all.inc:441
#, c-format
"^F4NOTE: ^BGThe server is running ^F1Xonotic %s (beta)^BG, you have "
"^F2Xonotic %s"
msgstr ""
-"^F4NOTA: ^BGEl servidor esta usando la versión ^F1Xonotic %s (beta)^BG y tu "
+"^F4NOTA: ^BGEl servidor está usando la versión ^F1Xonotic %s (beta)^BG, tú "
"tienes ^F2Xonotic %s"
#: qcsrc/common/notifications/all.inc:442
msgid ""
"^F4NOTE: ^BGThe server is running ^F1Xonotic %s^BG, you have ^F2Xonotic %s"
msgstr ""
-"^F4NOTA: ^BGEl servidor esta usando la versión ^F1Xonotic %s^BG y tu tienes "
+"^F4NOTA: ^BGEl servidor está usando la versión ^F1Xonotic %s^BG, tú tienes "
"^F2Xonotic %s"
#: qcsrc/common/notifications/all.inc:443
"^F4NOTE: ^F1Xonotic %s^BG is out, and you still have ^F2Xonotic %s^BG - get "
"the update from ^F3http://www.xonotic.org/^BG!"
msgstr ""
-"^F4NOTA: ^F1Xonotic %s^BG ya esta disponible, pero aun tienes ^F2Xonotic "
-"%s^BG - consigue la actualizacion en ^F3http://www.xonotic.org/^BG!"
+"^F4NOTA: ^F1Xonotic %s^BG ya está disponible, pero aún tienes ^F2Xonotic "
+"%s^BG - consigue la actualización en ^F3http://www.xonotic.org/^BG!"
#: qcsrc/common/notifications/all.inc:445
#, c-format
#: qcsrc/common/notifications/all.inc:448
#, c-format
msgid "^BG%s^K1 hurt their own ears with the @!#%%'n Accordeon%s%s"
-msgstr "^BG%s^K1 lastimó sus propios oidos con el @!#%%'n Acordeón%s%s"
+msgstr "^BG%s^K1 lastimó sus propios oídos con el @!#%%'n Acordeón%s%s"
#: qcsrc/common/notifications/all.inc:449
#, c-format
#: qcsrc/common/notifications/all.inc:455
#, c-format
msgid "^BG%s%s^K1 ate ^BG%s^K1's rocket%s%s"
-msgstr "^BG%s%s^K1 se comió el misil de ^BG%s^K1%s%s"
+msgstr "^BG%s%s^K1 se comió el cohete de ^BG%s^K1%s%s"
#: qcsrc/common/notifications/all.inc:456
#, 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 se explotó a si mismo con su Devastatora%s%s"
+msgstr "^BG%s^K1 se explotó a sí mismo con su Devastador%s%s"
#: qcsrc/common/notifications/all.inc:458
#, c-format
#: qcsrc/common/notifications/all.inc:461
#, c-format
msgid "^BG%s^K1 played with Electro bolts%s%s"
-msgstr "^BG%s^K1 jugó con rayos de Electro%s%s"
+msgstr "^BG%s^K1 jugó con los rayos del Electro%s%s"
#: qcsrc/common/notifications/all.inc:462
#, c-format
#, c-format
msgid "^BG%s%s^K1 was pummeled by a burst of ^BG%s^K1's Hagar rockets%s%s"
msgstr ""
-"^BG%s%s^K1 fue golpeado por un estallido de misiles Hagar de ^BG%s^K1%s%s"
+"^BG%s%s^K1 fue golpeado por un estallido de misiles de Hagar de ^BG%s^K1%s%s"
#: qcsrc/common/notifications/all.inc:468
#, c-format
msgid "^BG%s%s^K1 was pummeled by ^BG%s^K1's Hagar rockets%s%s"
-msgstr "^Bg%s%s^K1 fue golpeado por los misiles Hagar de ^BG%s^K1%s%s"
+msgstr "^Bg%s%s^K1 fue golpeado por los misiles de Hagar de ^BG%s^K1%s%s"
#: qcsrc/common/notifications/all.inc:469
#, c-format
msgid "^BG%s^K1 played with tiny Hagar rockets%s%s"
-msgstr "^BG%s^K1 jugó con pequeños misiles Hagar%s%s"
+msgstr "^BG%s^K1 jugó con los pequeños misiles de Hagar%s%s"
#: qcsrc/common/notifications/all.inc:470
#, c-format
#: qcsrc/common/notifications/all.inc:471
#, c-format
msgid "^BG%s^K1 got a little jumpy with their HLAC%s%s"
-msgstr "^BG%s^K1 se puso un poco acelerado con su HLAC%s%s"
+msgstr "^BG%s^K1 se puso un poco nervioso con su HLAC%s%s"
#: qcsrc/common/notifications/all.inc:472
#, c-format
msgid ""
"^BG%s%s^K1 died of ^BG%s^K1's great playing on the @!#%%'n Klein Bottle%s%s"
msgstr ""
-"^BG%s%s^K1 murió por la gran actuación de ^BG%s^K1 en la @!#%%'n Klein Bottle"
-"%s%s"
+"^BG%s%s^K1 murió por la gran actuación de ^BG%s^K1 en la @!#%%'n Botella de "
+"Klein%s%s"
#: qcsrc/common/notifications/all.inc:474
#, c-format
msgid "^BG%s^K1 hurt their own ears with the @!#%%'n Klein Bottle%s%s"
-msgstr "^BG%s^K1 lastimó sus propios oídos con la @!#%%'n Klein Bottle%s%s"
+msgstr "^BG%s^K1 lastimó sus propios oídos con la @!#%%'n Botella de Klein%s%s"
#: qcsrc/common/notifications/all.inc:475
#, c-format
msgid "^BG%s%s^K1 was sniped by ^BG%s^K1's Machine Gun%s%s"
-msgstr "^Bg%s%s^K1 fue baleado por la Ametralladora de ^BG%s^K1%s%s"
+msgstr "^Bg%s%s^K1 fue arrebatado por la Ametralladora de ^BG%s^K1%s%s"
#: qcsrc/common/notifications/all.inc:476
#, c-format
#: qcsrc/common/notifications/all.inc:782
#, c-format
msgid "^BGYou cannot place more than ^F2%s^BG mines at a time"
-msgstr "^BGNo puedes colocar mas de ^F2%s^BG minas a la vez"
+msgstr "^BGNo puedes colocar más de ^F2%s^BG minas a la vez"
#: qcsrc/common/notifications/all.inc:478
#, c-format
#: qcsrc/common/notifications/all.inc:480
#, c-format
msgid "^BG%s%s^K1 got too close to ^BG%s^K1's Mortar grenade%s%s"
-msgstr "^BG%s%s^K1 se acercó demasiado a la granada del Mortar de ^BG%s^K1%s%s"
+msgstr ""
+"^BG%s%s^K1 se acercó demasiado a la granada del Mortero de ^BG%s^K1%s%s"
#: qcsrc/common/notifications/all.inc:481
#, c-format
#: qcsrc/common/notifications/all.inc:482
#, c-format
msgid "^BG%s^K1 didn't see their own Mortar grenade%s%s"
-msgstr "^BG%s^K1 no vio su propia granada del Mortero%s%s"
+msgstr "^BG%s^K1 no vió su propia granada del Mortero%s%s"
#: qcsrc/common/notifications/all.inc:483
#, c-format
msgid "^BG%s^K1 blew themself up with their own Mortar%s%s"
-msgstr "^BG%s^K1 se exploto a si mismo con su propio Mortero%s%s"
+msgstr "^BG%s^K1 se explotó a sí mismo con su propio Mortero%s%s"
#: qcsrc/common/notifications/all.inc:484
#, c-format
msgid "^BG%s%s^K1 was sniped by ^BG%s^K1's Overkill Heavy Machine Gun%s%s"
msgstr ""
-"^BG%s%s^K1 fue baleado por la Ametralladora Pesada Overkill de ^BG%s^K1%s%s"
+"^BG%s%s^K1 fue arrebatado por la Ametralladora Pesada Overkill de ^BG%s^K1%s"
+"%s"
#: qcsrc/common/notifications/all.inc:485
#, c-format
"^BG%s%s^K1 was sawn in half by ^BG%s^K1's Overkill Rocket Propelled Chainsaw"
"%s%s"
msgstr ""
-"^BG%s%s^K1 fue aserrado por la mirad por la Motosierra Overkill Propulsada "
+"^BG%s%s^K1 fue aserrado por la mitad por la Motosierra Overkill Propulsada "
"por Cohetes de ^BG%s^K1%s%s"
#: qcsrc/common/notifications/all.inc:489
msgid ""
"^BG%s%s^K1 almost dodged ^BG%s^K1's Overkill Rocket Propelled Chainsaw%s%s"
msgstr ""
-"^BG%s%s^K1 casi esquivó la Motosierra Overkill Propulsada por Cohetes de ^BG"
+"^BG%s%s^K1 casi esquivó la Motosierra Overkill Propulsada por Cohetes d^BG"
"%s^K1%s%s"
#: qcsrc/common/notifications/all.inc:490
msgid ""
"^BG%s^K1 blew themself up with their Overkill Rocket Propelled Chainsaw%s%s"
msgstr ""
-"^BG%s^K1 se explotó a si mismo con su Motosierra Overkill Propulsada por "
+"^BG%s^K1 se explotó a sí mismo con su Motosierra Overkill Propulsada por "
"Cohetes%s%s"
#: qcsrc/common/notifications/all.inc:493
#: qcsrc/common/notifications/all.inc:494
#, c-format
msgid "^BG%s%s^K1 was sniped with a Rifle by ^BG%s^K1%s%s"
-msgstr "^BG%s%s^K1 fue baleado por ^BG%s^K1 con un Rifle%s%s"
+msgstr "^BG%s%s^K1 fue arrebatado por ^BG%s^K1 con un Rifle%s%s"
#: qcsrc/common/notifications/all.inc:495
#, c-format
msgid "^BG%s%s^K1 died in ^BG%s^K1's Rifle bullet hail%s%s"
-msgstr "^BG%s%s^K1 murio en la lluvia de balas de Rifle de ^BG%s^K1%s%s"
+msgstr "^BG%s%s^K1 murió en la lluvia de balas de Rifle de ^BG%s^K1%s%s"
#: qcsrc/common/notifications/all.inc:496
#, c-format
#: qcsrc/common/notifications/all.inc:498
#, c-format
msgid "^BG%s%s^K1 was pummeled by ^BG%s^K1's Seeker rockets%s%s"
-msgstr "^BG%s%s^K1 fue golpeado por los misiles Seeker de ^Bg%s^K1%s%s"
+msgstr "^BG%s%s^K1 fue golpeado por los misiles de Seeker de ^Bg%s^K1%s%s"
#: qcsrc/common/notifications/all.inc:499
#, c-format
msgid "^BG%s%s^K1 was tagged by ^BG%s^K1's Seeker%s%s"
-msgstr "^BG%s%s^K1 fue marcado por el Seeker de ^BG%s^K1%s%s"
+msgstr "^BG%s%s^K1 fue acertado por el Seeker de ^BG%s^K1%s%s"
#: qcsrc/common/notifications/all.inc:500
#, c-format
#: qcsrc/common/notifications/all.inc:528
msgid "^F4You are now alone!"
-msgstr "^F4¡Estás solo ahora!"
+msgstr "^F4¡Ahora estás solo!"
#: qcsrc/common/notifications/all.inc:530
msgid "^BGYou are attacking!"
-msgstr "^BGEstas atacando!"
+msgstr "^BG¡Estás atacando!"
#: qcsrc/common/notifications/all.inc:531
msgid "^BGYou are defending!"
-msgstr "^BGEstas defendiendo!"
+msgstr "^BG¡Estás defendiendo!"
#: qcsrc/common/notifications/all.inc:532
#, c-format
#: qcsrc/common/notifications/all.inc:534
msgid "^F4Begin!"
-msgstr "^F4Inicia!"
+msgstr "^F4¡Que empiece!"
#: qcsrc/common/notifications/all.inc:535
msgid "^F4Game starts in ^COUNT"
#: qcsrc/common/notifications/all.inc:536
msgid "^F4Round starts in ^COUNT"
-msgstr "^F4Ronda empieza en ^COUNT"
+msgstr "^F4La ronda empieza en ^COUNT"
#: qcsrc/common/notifications/all.inc:537
msgid "^F4Round cannot start"
-msgstr "^F4Ronda no puede empezar"
+msgstr "^F4La ronda no puede empezar"
#: qcsrc/common/notifications/all.inc:542
msgid "^F2Don't camp!"
-msgstr "^F2No acampes!"
+msgstr "^F2¡No acampes!"
#: qcsrc/common/notifications/all.inc:546
msgid ""
"^BGif you think you will succeed."
msgstr ""
"^BGAhora eres libre.\n"
-"^BGSientete en confianza de ^F2intentar capturar^BG la bandera denuevo\n"
-"^BGsi piensas que lo lograras."
+"^BGSiéntete en confianza de ^F2intentar capturar^BG la bandera de nuevo\n"
+"^BGsi piensas que lo lograrás."
#: qcsrc/common/notifications/all.inc:547
msgid "^BGThis flag is currently inactive"
"^BGfor ^F2too many unsuccessful attempts^BG to capture.\n"
"^BGMake some defensive scores before trying again."
msgstr ""
-"^BGAhora estas ^F1protegido^BG de la bandera(s)\n"
+"^BGAhora estás ^F1protegido^BG de la bandera(s)\n"
"^BGfpor ^F2demasiados intentos fallidos^BG de captura.\n"
-"^BGAnota algún punto defensivo antes de intentarlo otra vez."
+"^BGAcierta algún punto defensivo antes de intentarlo de nuevo."
#: qcsrc/common/notifications/all.inc:549
msgid "^BGYou captured the ^TC^TT^BG flag!"
-msgstr "^BGHas capturado la bandera ^TC^TT^BG!"
+msgstr "^BG¡Has capturado la bandera ^TC^TT^BG!"
#: qcsrc/common/notifications/all.inc:550
msgid "^BGYou captured the flag!"
#: qcsrc/common/notifications/all.inc:551
#, c-format
msgid "^BGToo many flag throws! Throwing disabled for %s."
-msgstr "^BGDemaciados tiros de bandera! No puedes arrojarla por %s"
+msgstr "^BG¡Demasiados tiros de bandera! Arrojamiento deshabilitado durante %s"
#: qcsrc/common/notifications/all.inc:552
#, c-format
#: qcsrc/common/notifications/all.inc:555
#, c-format
msgid "^BGYou received the flag from %s"
-msgstr "^BGHas recivido la bandera por parte de %s"
+msgstr "^BGHas recibido la bandera por parte de %s"
#: qcsrc/common/notifications/all.inc:556
#, c-format
msgid "^BGPress ^F2%s^BG to receive the flag from %s^BG"
-msgstr "^BGPresiona ^F2%s^BG para recibir la bandera de %s^BG"
+msgstr "^BGPulsa ^F2%s^BG para recibir la bandera de %s^BG"
#: qcsrc/common/notifications/all.inc:557
#, c-format
#: qcsrc/common/notifications/all.inc:560
msgid "^BGYou got the ^TC^TT^BG flag!"
-msgstr "^BGHas obtenido la bandera ^TC^TT^BG!"
+msgstr "^BG¡Has obtenido la bandera ^TC^TT^BG!"
#: qcsrc/common/notifications/all.inc:561
msgid "^BGYou got the flag!"
-msgstr "^BGHas obtenido la bandera ^TC^TT^BG!"
+msgstr "^BG¡Has obtenido la bandera ^TC^TT^BG!"
#: qcsrc/common/notifications/all.inc:562
#, c-format
msgid "^BGYou got your %steam^BG's flag, return it!"
-msgstr "^BG¡Tienes la bandera %s de tu equipo^BG, devuelvelo a la base!"
+msgstr "^BG¡Tienes la bandera de tu %sequipo^BG, regrésala a la base!"
#: qcsrc/common/notifications/all.inc:563
#, c-format
msgid "^BGYou got the %senemy^BG's flag, return it!"
-msgstr "^BG¡Tienes la bandera %s de tu enemigo^BG, devuelvelo a la base!"
+msgstr "^BG¡Tienes la bandera de tu %senemigo^BG, regrésala a la base!"
#: qcsrc/common/notifications/all.inc:564
#, c-format
msgid "^BGThe %senemy^BG got your flag! Retrieve it!"
-msgstr "^BGEL %senemigo^BG tiene tu bandera! Recuperala!"
+msgstr "^BG¡El %senemigo^BG tiene tu bandera! ¡Recupérala!"
#: qcsrc/common/notifications/all.inc:565
#, c-format
msgid "^BGThe %senemy (^BG%s%s)^BG got your flag! Retrieve it!"
-msgstr "^BGEl %senemigo (^BG%s%s)^BG tiene tu bandera! Recuperala!"
+msgstr "^BG¡El %senemigo (^BG%s%s)^BG tiene tu bandera! ¡Recupérala!"
#: qcsrc/common/notifications/all.inc:566
#, c-format
msgid "^BGThe %senemy^BG got the flag! Retrieve it!"
-msgstr "^BG¡El enemigo %s^BG tiene la bandera! ¡Recuperalo!"
+msgstr "^BG¡El enemigo %s^BG tiene la bandera! ¡Recupérala!"
#: qcsrc/common/notifications/all.inc:567
#, c-format
msgid "^BGThe %senemy (^BG%s%s)^BG got the flag! Retrieve it!"
-msgstr "^BG¡El enemigo %s (^BG%s%s)^BG tiene la bandera! ¡Recuperalo!"
+msgstr "^BG¡El enemigo %s (^BG%s%s)^BG tiene la bandera! ¡Recupérala!"
#: qcsrc/common/notifications/all.inc:568
#, c-format
msgid "^BGThe %senemy^BG got their flag! Retrieve it!"
-msgstr "^BG¡El enemigo %s^BG tiene su bandera! ¡Recuperalo!"
+msgstr "^BG¡El enemigo %s^BG tiene su bandera! ¡Recupérala!"
#: qcsrc/common/notifications/all.inc:569
#, c-format
msgid "^BGThe %senemy (^BG%s%s)^BG got their flag! Retrieve it!"
-msgstr "^BG¡El enemigo %s (^BG%s%s)^BG tiene su bandera! ¡Recuperalo!"
+msgstr "^BG¡El enemigo %s (^BG%s%s)^BG tiene su bandera! ¡Recupérala!"
#: qcsrc/common/notifications/all.inc:570
#, c-format
msgid "^BGYour %steam mate^BG got the ^TC^TT^BG flag! Protect them!"
-msgstr "^BG¡Tu compañero %s^BG tiene la bandera ^TC^TT^BG! ¡Protegelos!"
+msgstr "^BG¡Tu %scompañero^BG tiene la bandera ^TC^TT^BG! ¡Protégelo!"
#: qcsrc/common/notifications/all.inc:571
#, c-format
msgid "^BGYour %steam mate (^BG%s%s)^BG got the ^TC^TT^BG flag! Protect them!"
-msgstr "^BGTu %scompañero (^BG%s%s)^BG tiene la bandera ^TC^TT^BG! Protegelo!"
+msgstr ""
+"^BG¡Tu %scompañero (^BG%s%s)^BG tiene la bandera ^TC^TT^BG! ¡Protégelo!"
#: qcsrc/common/notifications/all.inc:572
#, c-format
msgid "^BGYour %steam mate^BG got the flag! Protect them!"
-msgstr "^BGTu %scompañero ^BG tiene la bandera! Protegelo!"
+msgstr "^BG¡Tu %scompañero^BG tiene la bandera! ¡Protégelo!"
#: qcsrc/common/notifications/all.inc:573
#, c-format
msgid "^BGYour %steam mate (^BG%s%s)^BG got the flag! Protect them!"
-msgstr "^BGTu %scompañero (^BG%s%s)^BG tiene la bandera! Protegelo!"
+msgstr "^BG¡Tu %scompañero (^BG%s%s)^BG tiene la bandera! ¡Protégelo!"
#: qcsrc/common/notifications/all.inc:574
msgid "^BGEnemies can now see you on radar!"
#: qcsrc/common/notifications/all.inc:575
msgid "^BGYou returned the ^TC^TT^BG flag!"
-msgstr "^BGHas regresado la bandera ^TC^TT^BG!"
+msgstr "^BG¡Has regresado la bandera ^TC^TT^BG!"
#: qcsrc/common/notifications/all.inc:576
msgid "^BGStalemate! Enemies can now see you on radar!"
-msgstr "^BGEstancamiento! Los enemigos ahora te pueden ven en su radar!"
+msgstr "^BG¡Estancamiento! ¡Los enemigos ahora te pueden ven en su radar!"
#: qcsrc/common/notifications/all.inc:577
msgid "^BGStalemate! Flag carriers can now be seen by enemies on radar!"
msgstr ""
-"^BGEstancamiento! Ahora puedes ver los portadores de bandera enemigos en tu "
-"radar!"
+"^BG¡Estancamiento! ¡Ahora puedes ver los portadores de bandera enemigos en "
+"el radar!"
#: qcsrc/common/notifications/all.inc:581
#, c-format
#: qcsrc/common/notifications/all.inc:602
#, c-format
msgid "^K1%sYou were scored against by ^BG%s"
-msgstr "^K1%ssFuiste anotado en contra por ^BG%s"
+msgstr "^K1%ssFuiste anotado por ^BG%s"
#: qcsrc/common/notifications/all.inc:590
#, c-format
#: qcsrc/common/notifications/all.inc:601
#, c-format
msgid "^K1%sYou were frozen by ^BG%s"
-msgstr "^K1%sFuiste congelado por ^BG%s"
+msgstr "^K1%sHas sido congelado por ^BG%s"
#: qcsrc/common/notifications/all.inc:608
#, c-format
msgid "^K1%sYou typefragged ^BG%s"
-msgstr "^K1%sEliminaste a ^BG%s mientras escribia"
+msgstr "^K1%sEliminaste a ^BG%s mientras tecleaba"
#: qcsrc/common/notifications/all.inc:609
#, c-format
#: qcsrc/common/notifications/all.inc:610
#, c-format
msgid "^K1%sYou were typefragged by ^BG%s"
-msgstr "^K1%sFuiste eliminado mientras escribias por ^BG%s"
+msgstr "^K1%sFuiste eliminado por ^BG%s mientras tecleabas"
#: qcsrc/common/notifications/all.inc:611
#, c-format
msgid "^K1%sYou were scored against by ^BG%s^K1 while typing"
-msgstr "^K1%sFuiste eliminado mientras escribias por ^BG%s^K1"
+msgstr "^K1%sFuiste eliminado por ^BG%s^K1 mientras tecleabas"
#: qcsrc/common/notifications/all.inc:617
#, c-format
msgid "^BGPress ^F2%s^BG again to toss the nade!"
-msgstr "^BG¡Presiona ^F2%s^BG otra vez para tirar la granada!"
+msgstr "^BG¡Pulsa ^F2%s^BG otra vez para tirar la granada!"
#: qcsrc/common/notifications/all.inc:618
msgid "^F2You got a ^K1BONUS GRENADE^F2!"
-msgstr "^F2Recibiste una ^K1GRANADA DE BONIFICACIÓN^F2!"
+msgstr "^F2¡Recibiste una ^K1GRANADA DE BONIFICACIÓN^F2!"
#: qcsrc/common/notifications/all.inc:620
#, c-format
#: qcsrc/common/notifications/all.inc:621
msgid "^K1Don't go against your team mates!"
-msgstr "^K1No te vayas contra tus compañeros!"
+msgstr "^K1¡No te vayas contra tus compañeros!"
#: qcsrc/common/notifications/all.inc:621
msgid "^K1Don't shoot your team mates!"
-msgstr "^K1No dispares a tus compañeros!"
+msgstr "^K1¡No dispares a tus compañeros!"
#: qcsrc/common/notifications/all.inc:622
msgid "^K1Die camper!"
-msgstr "^K1Muere campero!"
+msgstr "^K1¡Muere, campista!"
#: qcsrc/common/notifications/all.inc:622
msgid "^K1Reconsider your tactics, camper!"
-msgstr "^K1Reconsidera tus tacticas, campero!"
+msgstr "^K1¡Reconsidera tus tácticas, campero!"
#: qcsrc/common/notifications/all.inc:623
msgid "^K1You unfairly eliminated yourself!"
-msgstr "^K1Te has eliminado injustamente a ti mismo!"
+msgstr "^K1¡Te has eliminado injustamente a ti mismo!"
#: qcsrc/common/notifications/all.inc:624
#, c-format
#: qcsrc/common/notifications/all.inc:625
msgid "^K1You couldn't catch your breath!"
-msgstr "^K1No pudiste recuperar tu aliento!"
+msgstr "^K1¡No pudiste recuperar tu aliento!"
#: qcsrc/common/notifications/all.inc:626
msgid "^K1You hit the ground with a crunch!"
-msgstr "^K1Golpeaste la tierra con un crujido!"
+msgstr "^K1¡Chocaste contra el suelo con un crujido!"
#: qcsrc/common/notifications/all.inc:627
msgid "^K1You felt a little too hot!"
-msgstr "^K1Te sentiste un poco muy caliente!"
+msgstr "^K1¡Te sentiste un poco caliente!"
#: qcsrc/common/notifications/all.inc:627
msgid "^K1You got a little bit too crispy!"
-msgstr "^K1 te volviste un poco muy crujiente!"
+msgstr "^K1¡Te volviste un poco crujiente!"
#: qcsrc/common/notifications/all.inc:628
msgid "^K1You killed your own dumb self!"
-msgstr "^K1Te mataste a ti mismso!"
+msgstr "^K1¡Te mataste a ti mismo!"
#: qcsrc/common/notifications/all.inc:628
msgid "^K1You need to be more careful!"
-msgstr "^K1Debes ser mas cuidadoso!"
+msgstr "^K1¡Tienes que ser más cuidadoso!"
#: qcsrc/common/notifications/all.inc:629
msgid "^K1You couldn't stand the heat!"
-msgstr "^K1No pudiste soportar el calor!"
+msgstr "^K1¡No pudiste soportar el calor!"
#: qcsrc/common/notifications/all.inc:630
msgid "^K1You need to watch out for monsters!"
-msgstr "^K1Tienes que tener cuidado de los monstruos!"
+msgstr "^K1¡Tienes que tener cuidado de los monstruos!"
#: qcsrc/common/notifications/all.inc:630
msgid "^K1You were killed by a monster!"
-msgstr "^K1¡Un monstruo te ha matado!"
+msgstr "^K1¡Fuiste asesinado por un monstruo!"
#: qcsrc/common/notifications/all.inc:631
msgid "^K1Tastes like chicken!"
-msgstr "^K1Sabe a pollo!"
+msgstr "^K1¡Sabe a pollo!"
#: qcsrc/common/notifications/all.inc:631
msgid "^K1You forgot to put the pin back in!"
-msgstr "^K1¡Se te olvido poner el alfiler en su lugar!"
+msgstr "^K1¡Se te olvidó poner el alfiler en su lugar!"
#: qcsrc/common/notifications/all.inc:632
msgid "^K1Hanging around a napalm explosion is bad!"
-msgstr "^K1¡Dar vueltas alrededor de una explosion de napalm es malo!"
+msgstr "^K1¡Dar vueltas alrededor de una explosión de napalm es malo!"
#: qcsrc/common/notifications/all.inc:633
msgid "^K1You felt a little chilly!"
#: qcsrc/common/notifications/all.inc:635
msgid "^K1You are respawning for running out of ammo..."
-msgstr "^K1Esta reapareciendo por haberte acabado tus municiones..."
+msgstr "^K1Estás reapareciendo por haber gastado tus municiones..."
#: qcsrc/common/notifications/all.inc:635
msgid "^K1You were killed for running out of ammo..."
-msgstr "^K1Fuiste eliminado por acabarte tus municiones..."
+msgstr "^K1Fuiste eliminado por gastar tus municiones..."
#: qcsrc/common/notifications/all.inc:636
msgid "^K1You grew too old without taking your medicine"
#: 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!"
-msgstr "^K1Te volviste una estrella fugaz!"
+msgstr "^K1¡Te has convertido una estrella fugaz!"
#: qcsrc/common/notifications/all.inc:638
msgid "^K1You melted away in slime!"
-msgstr "^K1Te derretiste entre la baba!"
+msgstr "^K1¡Te derretiste en el limo!"
#: qcsrc/common/notifications/all.inc:639
msgid "^K1You committed suicide!"
-msgstr "^K1Te has suicidado!"
+msgstr "^K1¡Te has suicidado!"
#: qcsrc/common/notifications/all.inc:639
msgid "^K1You ended it all!"
-msgstr "^K1Lo acabaste todo!"
+msgstr "^K1¡Lo terminaste todo!"
#: qcsrc/common/notifications/all.inc:640
msgid "^K1You got stuck in a swamp!"
-msgstr "^K1Te atoraste en un pantano!"
+msgstr "^K1¡Te quedaste atrapado en un pantano!"
#: qcsrc/common/notifications/all.inc:641
#, c-format
msgid "^BGYou are now on: %s"
-msgstr "^BGEstas bajo: %s"
+msgstr "^BGEstás bajo: %s"
#: qcsrc/common/notifications/all.inc:642
msgid "^K1You died in an accident!"
-msgstr "^K1Moriste en una accidente!"
+msgstr "^K1¡Moriste en un accidente!"
#: qcsrc/common/notifications/all.inc:643
msgid "^K1You had an unfortunate run in with a turret!"
-msgstr "^K1Tuviste un encuentro desafortunadon con una torreta!"
+msgstr "^K1¡Tuviste un encuentro desafortunado con una torreta!"
#: qcsrc/common/notifications/all.inc:643
msgid "^K1You were fragged by a turret!"
-msgstr "^K1Fuiste eliminado por una torreta!"
+msgstr "^K1¡Fuiste eliminado por una torreta!"
#: qcsrc/common/notifications/all.inc:644
msgid "^K1You had an unfortunate run in with an eWheel turret!"
-msgstr "^K1Tuviste un encuentro desafortunadon con una torreta eWheel!"
+msgstr "^K1¡Tuviste un encuentro desafortunado con una torreta eWheel!"
#: qcsrc/common/notifications/all.inc:644
msgid "^K1You were fragged by an eWheel turret!"
-msgstr "^K1Fuiste eliminado por una torreta eWheel!"
+msgstr "^K1¡Fuiste eliminado por una torreta eWheel!"
#: qcsrc/common/notifications/all.inc:645
msgid "^K1You had an unfortunate run in with a Walker turret!"
-msgstr "^K1Tuviste un encuentro desafortunadon con una torreta Walker!"
+msgstr "^K1¡Tuviste un encuentro desafortunado con una torreta Walker!"
#: qcsrc/common/notifications/all.inc:645
msgid "^K1You were fragged by a Walker turret!"
-msgstr "^K1Fuiste eliminado por una torreta Walker!"
+msgstr "^K1¡Fuiste eliminado por una torreta Walker!"
#: qcsrc/common/notifications/all.inc:646
msgid "^K1You got caught in the blast of a Bumblebee explosion!"
-msgstr "^K1Fuiste atrapado en el estallido de una explosion de un Bumblebee!"
+msgstr "^K1¡Fuiste atrapado en el estallido de la explosión de un Bumblebee!"
#: qcsrc/common/notifications/all.inc:647
msgid "^K1You were crushed by a vehicle!"
-msgstr "^K1Fuiste aplastado por un vehiculo!"
+msgstr "^K1¡Fuiste aplastado por un vehículo!"
#: qcsrc/common/notifications/all.inc:648
msgid "^K1You were caught in a Raptor cluster bomb!"
-msgstr "^K1Fuiste atrapado en la bomba de un Raptor!"
+msgstr "^K1¡Fuiste atrapado en la bomba de un Raptor!"
#: qcsrc/common/notifications/all.inc:649
msgid "^K1You got caught in the blast of a Raptor explosion!"
-msgstr "^K1Fuiste atrapado en el estallido de una explosion de Raptor!"
+msgstr "^K1¡Fuiste atrapado en el estallido de una explosión de Raptor!"
#: qcsrc/common/notifications/all.inc:650
msgid "^K1You got caught in the blast of a Spiderbot explosion!"
-msgstr "^K1Fuiste atrapado en el estallido de una explosion de Spiderbot!"
+msgstr "^K1¡Fuiste atrapado en el estallido de una explosión del Robot Araña!"
#: qcsrc/common/notifications/all.inc:651
msgid "^K1You were blasted to bits by a Spiderbot rocket!"
-msgstr "^K1Fuiste despedazado por un misil de Spiderbot!"
+msgstr "^K1¡Fuiste despedazado por un misil del Robot Araña!"
#: qcsrc/common/notifications/all.inc:652
msgid "^K1You got caught in the blast of a Racer explosion!"
-msgstr "^K1Fuiste atrapado en el estallido de una explosion de un Racer!"
+msgstr "^K1¡Fuiste atrapado en el estallido de una explosión de un Racer!"
#: qcsrc/common/notifications/all.inc:653
msgid "^K1You couldn't find shelter from a Racer rocket!"
-msgstr "^K1No pudiste resguardarte de el misil del Racer!"
+msgstr "^K1¡No pudiste refugiarte del misil del Racer!"
#: qcsrc/common/notifications/all.inc:654
msgid "^K1Watch your step!"
-msgstr "^K1Ciudado donde pisas!"
+msgstr "^K1¡Cuidado por dónde pisas!"
#: qcsrc/common/notifications/all.inc:656
#, c-format
msgid "^K1Moron! You fragged ^BG%s^K1, a team mate!"
-msgstr "^K1Idiota! Has eliminado a ^BG%s^K1, un compañero!"
+msgstr "^K1¡Imbécil! ¡Has eliminado a ^BG%s^K1, un compañero tuyo!"
#: qcsrc/common/notifications/all.inc:656
#, c-format
msgid "^K1Moron! You went against ^BG%s^K1, a team mate!"
-msgstr "^K1Idiota! te fuiste en contra de ^BG%s^K1, un compañero!"
+msgstr "^K1¡Imbécil! ¡Fuiste en contra de ^BG%s^K1, un compañero tuyo!"
#: qcsrc/common/notifications/all.inc:657
#, c-format
msgid "^K1You were fragged by ^BG%s^K1, a team mate"
-msgstr "^K1Has sido eliminado por ^BG%s^K1, un compañero"
+msgstr "^K1Has sido eliminado por ^BG%s^K1, un compañero tuyo"
#: qcsrc/common/notifications/all.inc:657
#, c-format
msgid "^K1You were scored against by ^BG%s^K1, a team mate"
-msgstr "^K1Tu compañero ^BG%s^K1, te ha eliminado"
+msgstr "^K1Has sido acertado contra ^BG%s^K1, un compañero tuyo"
#: qcsrc/common/notifications/all.inc:659
msgid ""
"^K1Stop idling!\n"
"^BGDisconnecting in ^COUNT..."
msgstr ""
-"^K1Deja de estar inactivo!\n"
-"^BGDesconectando en ^COUNT"
+"^K1¡Deja de estar inactivo!\n"
+"^BGDesconectando en ^COUNT..."
#: qcsrc/common/notifications/all.inc:661
#, c-format
#: qcsrc/common/notifications/all.inc:662
#, c-format
msgid "^BGYou also need %s^BG!"
-msgstr "^BG¡Tambien necesitas %s^BG!"
+msgstr "^BG¡También necesitas %s^BG!"
#: qcsrc/common/notifications/all.inc:663
msgid "^BGDoor unlocked!"
-msgstr "^BGPuerta desbloqueada!"
+msgstr "^BG¡Puerta desbloqueada!"
#: qcsrc/common/notifications/all.inc:665
#, c-format
msgid "^F2Extra lives taken: ^K1%s"
-msgstr ""
+msgstr "^F2Vidas extra tomadas: ^K1%s"
#: qcsrc/common/notifications/all.inc:667
#, c-format
#: qcsrc/common/notifications/all.inc:670
#, c-format
msgid "^K3You were automatically revived after %s seconds"
-msgstr ""
+msgstr "^K3Fuiste revivido automáticamente después de %s segundos"
#: qcsrc/common/notifications/all.inc:672
msgid "^BGThe generator is under attack!"
-msgstr "^BG¡El generador esta bajo ataque!"
+msgstr "^BG¡El generador está bajo ataque!"
#: qcsrc/common/notifications/all.inc:674
msgid "^TC^TT^BG team loses the round"
#: qcsrc/common/notifications/all.inc:678
msgid "^K1You froze yourself"
-msgstr "^K1Te congelaste solo"
+msgstr "^K1Te congelaste a ti mismo"
#: qcsrc/common/notifications/all.inc:679
msgid "^K1Round already started, you spawn as frozen"
-msgstr "^K1Ronda inicio previamente, apareceras congelado"
+msgstr "^K1Ronda previamente iniciada, aparecerás congelado"
#: qcsrc/common/notifications/all.inc:681
#, c-format
msgid "^K1A %s has arrived!"
-msgstr "^K1A %s ha llegado!"
+msgstr "^K1¡Un %s ha llegado!"
#: qcsrc/common/notifications/all.inc:685
msgid "^BGYou got the ^F1Fuel regenerator"
#: qcsrc/common/notifications/all.inc:686
msgid "^BGYou got the ^F1Jetpack"
-msgstr "^BGHas obtenido el ^F1Jetpack"
+msgstr "^BGHas obtenido la ^F1Mochila propulsora"
#: qcsrc/common/notifications/all.inc:694
msgid ""
"^K1No spawnpoints available!\n"
"Hope your team can fix it..."
msgstr ""
-"^K1No hay espacio disponible para aparecer\n"
-"Confia en que tu equipo lo pueda arreglar..."
+"^K1¡No hay espacio disponible para aparecer!\n"
+"Confía en que tu equipo lo pueda arreglar..."
#: qcsrc/common/notifications/all.inc:695
msgid ""
"The player limit reached maximum capacity."
msgstr ""
"^K1No puedes unirte al juego en este momento.\n"
-"La capacidad maxima de jugadores ha sido alacanzada."
+"La capacidad máxima de jugadores ha sido alacanzada."
#: 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 ""
-"^BGEliminar a otros mientras no tienes la pelota no te consigue puntos!"
+msgstr "^BG¡Eliminar a otros mientras no tienes la pelota no da puntos!"
#: qcsrc/common/notifications/all.inc:702
msgid ""
"^BGAll keys are in your team's hands!\n"
"Help the key carriers to meet!"
msgstr ""
-"^BGTodas las llaves estan en possesion de to equipo!\n"
-"Ayuda a que los portadores de las llaves se puedan unir!"
+"^BG¡Todas las llaves están en posesión de tu equipo!\n"
+"¡Ayuda a que los portadores de las llaves se puedan unir!"
#: qcsrc/common/notifications/all.inc:703
msgid ""
"^BGAll keys are in ^TC^TT team^BG's hands!\n"
"Interfere ^F4NOW^BG!"
msgstr ""
-"^BGtTodas las llaves estan en manos del equipo ^TC^TT^BG!\n"
-"Interfiere ^F4AHORA^BG!"
+"^BG¡Todas las llaves están en manos del equipo ^TC^TT^BG!\n"
+"¡Interfiere ^F4AHORA^BG!"
#: qcsrc/common/notifications/all.inc:704
msgid ""
"^BGAll keys are in your team's hands!\n"
"Meet the other key carriers ^F4NOW^BG!"
msgstr ""
-"^BGTodas las llaves en manos de tu equipo!\n"
-"Encuentra a los otros portadores de llaves ^F4AHORA^BG!"
+"^BG¡Todas las llaves están en manos de tu equipo!\n"
+"¡Encuentra a los otros portadores de llaves ^F4AHORA^BG!"
#: qcsrc/common/notifications/all.inc:705
msgid "^F4Round will start in ^COUNT"
-msgstr "^F4La ronda iniciara en ^COUNT"
+msgstr "^F4La ronda iniciará en ^COUNT"
#: qcsrc/common/notifications/all.inc:706
msgid "^BGScanning frequency range..."
-msgstr "^BGEscaneando rango de frequencia..."
+msgstr "^BGEscaneando rango de frecuencia..."
#: qcsrc/common/notifications/all.inc:707
msgid "^BGYou are starting with the ^TC^TT Key"
-msgstr "^BGEstas empezando con la llave ^TC^TT"
+msgstr "^BGEstás empezando con la Llave ^TC^TT"
#: qcsrc/common/notifications/all.inc:709
msgid "^BGYou have no lives left, you must wait until the next match"
-msgstr "^BGNo tienes mas vidas, debes esperar hasta la siguiente partida"
+msgstr "^BGNo tienes más vidas, debes esperar hasta la siguiente partida"
#: qcsrc/common/notifications/all.inc:711
#, c-format
#: qcsrc/common/notifications/all.inc:715
msgid "^F4^COUNT^BG left to find some ammo!"
-msgstr "^F4^COUNT^BG restante para encontrar municiones!"
+msgstr "^F4¡^COUNT^BG restante para encontrar algunas municiones!"
#: qcsrc/common/notifications/all.inc:716
msgid "^BGGet some ammo or you'll be dead in ^F4^COUNT^BG!"
-msgstr "^BGConsigue municiones or moriras en ^F4^COUNT^BG!"
+msgstr "^BG¡Consigue algunas municiones o morirás en ^F4^COUNT^BG!"
#: qcsrc/common/notifications/all.inc:716
msgid "^BGGet some ammo! ^F4^COUNT^BG left!"
-msgstr "^BGConsigue municiones! Te queda ^F4^COUNT^BG!"
+msgstr "^BG¡Consigue algunas municiones! ¡Te queda ^F4^COUNT^BG!"
#: qcsrc/common/notifications/all.inc:717
#, c-format
#: qcsrc/common/notifications/all.inc:719 qcsrc/menu/xonotic/campaign.qc:244
#, c-format
msgid "Level %s: "
-msgstr ""
+msgstr "Nivel %s: "
#: qcsrc/common/notifications/all.inc:719
#, c-format
msgid "^BGPress ^F2%s^BG to enter the game"
-msgstr ""
+msgstr "^BGPulsa ^F2%s^BG para entrar en el juego"
#: qcsrc/common/notifications/all.inc:722
#, c-format
#: qcsrc/common/notifications/all.inc:725
#, c-format
msgid "^BGYou captured %s^BG control point"
-msgstr "^BGHas capturado el punto de control %s^BG"
+msgstr "^BGHas capturado el punto de control de %s^BG"
#: qcsrc/common/notifications/all.inc:726
msgid "^BGYou captured a control point"
-msgstr ""
+msgstr "^BGHas capturado un punto de control"
#: qcsrc/common/notifications/all.inc:727
#, c-format
msgid "^TC^TT^BG team captured %s^BG control point"
-msgstr "El equipo ^TC^TT^BG capturó el punto de control %s^BG"
+msgstr "El equipo ^TC^TT^BG capturó el punto de control de %s^BG"
#: qcsrc/common/notifications/all.inc:728
msgid "^TC^TT^BG team captured a control point"
-msgstr ""
+msgstr "El equipo ^TC^TT^BG capturó un punto de control"
#: qcsrc/common/notifications/all.inc:729
msgid "^BGThis control point currently cannot be captured"
"^BGThe enemy generator cannot be destroyed yet\n"
"^F2Capture some control points to unshield it"
msgstr ""
-"^BGEl generador enemigo no puede ser destruído ahora\n"
+"^BGEl generador enemigo no puede ser destruido ahora\n"
"^F2Captura puntos de control para desprotegerlo"
#: qcsrc/common/notifications/all.inc:731
"^K1Your generator is NOT shielded!\n"
"^BGRe-capture control points to shield it!"
msgstr ""
-"^K1¡Tu generador NO esta protegido!\n"
-"^BG¡Recaptura puntos de control para protegerlo!"
+"^K1¡Tu generador NO está protegido!\n"
+"^BG¡Vuelve a capturar puntos de control para protegerlo!"
#: qcsrc/common/notifications/all.inc:733
#, c-format
msgid "^BGPress ^F2%s^BG to teleport"
-msgstr "^BGPresiona ^F2%s^BG para teletransportarse"
+msgstr "^BGPulsa ^F2%s^BG para teletransportarse"
#: qcsrc/common/notifications/all.inc:734
#, c-format
"^F2Now playing ^F4OVERTIME^F2!\n"
"Keep fragging until we have a winner!"
msgstr ""
-"^F2Ahora jugando en ^F4TIEMPO EXTRA^F2!\n"
-"Sigue eliminando hasta que tengamos un ganador!"
+"^F2¡Ahora jugando en ^F4TIEMPO EXTRA^F2!\n"
+"¡Sigue eliminando hasta que tengamos un ganador!"
#: qcsrc/common/notifications/all.inc:736
msgid ""
"^F2Now playing ^F4OVERTIME^F2!\n"
"Keep scoring until we have a winner!"
msgstr ""
-"^F2Ahora jugando en ^F4TIEMPO EXTRA^F2!\n"
-"Sigue acertando hasta que tengamos un ganador!"
+"^F2¡Ahora jugando en ^F4TIEMPO EXTRA^F2!\n"
+"¡Sigue acertando hasta que tengamos un ganador!"
#: qcsrc/common/notifications/all.inc:737
msgid ""
"The more control points your team holds,\n"
"the faster the enemy generator decays"
msgstr ""
-"^F2Ahora jugando en ^F4OVERTIME^F2!\n"
+"^F2¡Ahora jugando en ^F4OVERTIME^F2!\n"
"\n"
"Los generadores están decayendo.\n"
-"Cuanto mas puntos de control tenga tu equipo,\n"
-"mas rápido decaerá el generador enemigo"
+"Cuánto más puntos de control tenga tu equipo,\n"
+"más rápido decaerá el generador enemigo"
#: qcsrc/common/notifications/all.inc:738
#, c-format
"^F2Now playing ^F4OVERTIME^F2!\n"
"^BGAdded ^F4%s^BG to the game!"
msgstr ""
-"^F2Ahora jugando en ^F4TIEMPO EXTRA^F2!\n"
-"^BGSe ha añadido ^F4%s^BG al juego!"
+"^F2¡Ahora jugando en ^F4TIEMPO EXTRA^F2!\n"
+"^BG¡Se ha añadido ^F4%s^BG al juego!"
#: qcsrc/common/notifications/all.inc:740
msgid "^K1In^BG-portal created"
#: qcsrc/common/notifications/all.inc:744
msgid "^F2Strength infuses your weapons with devastating power"
-msgstr "^F2Strength infunde tus armas con poder devastador"
+msgstr "^F2La fuerza infunde tus armas con poder devastador"
#: qcsrc/common/notifications/all.inc:745
msgid "^F2Strength has worn off"
-msgstr "^F2Strength se ha agotado"
+msgstr "^F2La fuerza se ha agotado"
#: qcsrc/common/notifications/all.inc:747
msgid "^F2Shield surrounds you"
#: qcsrc/common/notifications/all.inc:748
msgid "^F2Shield has worn off"
-msgstr "^F2Shield se ha agotado"
+msgstr "^F2El escudo se ha agotado"
#: qcsrc/common/notifications/all.inc:750
msgid "^F2You are on speed"
#: qcsrc/common/notifications/all.inc:751
msgid "^F2Speed has worn off"
-msgstr "^F2Speed se ha agotado"
+msgstr "^F2La velocidad se ha agotado"
#: qcsrc/common/notifications/all.inc:753
msgid "^F2You are invisible"
#: qcsrc/common/notifications/all.inc:754
msgid "^F2Invisibility has worn off"
-msgstr "^F2Invisibility se ha agotado"
+msgstr "^F2La invisibilidad se ha agotado"
#: qcsrc/common/notifications/all.inc:756
msgid "^F2The race is over, finish your lap!"
-msgstr "^F2La carrera se ha terminado, completa tu vuelta!"
+msgstr "^F2¡La carrera se ha terminado, completa tu vuelta!"
#: qcsrc/common/notifications/all.inc:758
msgid "^BGSequence completed!"
-msgstr "^BG¡Sequencia completada!"
+msgstr "^BG¡Secuencia completada!"
#: qcsrc/common/notifications/all.inc:759
msgid "^BGThere are more to go..."
-msgstr "^BGHacen falta mas para continuar..."
+msgstr "^BGHacen falta más para continuar..."
#: qcsrc/common/notifications/all.inc:760
#, c-format
#: qcsrc/common/notifications/all.inc:774
msgid "^K1Cannot join given minigame session!"
-msgstr "^K1¡Imposible unirse dado la sesión del minijuego!"
+msgstr "^K1¡No se puede unir a la sesión del minijuego que se ha dado!"
#: qcsrc/common/notifications/all.inc:776
#, c-format
msgid "^BGPress ^F2%s^BG to enter/exit the vehicle"
-msgstr "^BGPress ^F2%s^BG para entrar/salir del vehículo"
+msgstr "^BGPulsa ^F2%s^BG para entrar/salir del vehículo"
#: qcsrc/common/notifications/all.inc:777
#, c-format
msgid "^BGPress ^F2%s^BG to enter the vehicle gunner"
-msgstr "^BGPresiona ^F2%s^BG para entrar en el artillero del vehículo"
+msgstr "^BGPulsa ^F2%s^BG para entrar en el artillero del vehículo"
#: qcsrc/common/notifications/all.inc:778
#, c-format
msgid "^BGPress ^F2%s^BG to steal this vehicle"
-msgstr "^BGPresiona ^F2%s^BG para robar este vehículo"
+msgstr "^BGPulsa ^F2%s^BG para robar este vehículo"
#: qcsrc/common/notifications/all.inc:779
msgid ""
"^F2The enemy is stealing one of your vehicles!\n"
"^F4Stop them!"
msgstr ""
-"^F2¡El enemigo esta robando uno de tus vehículos!\n"
-"^F4¡Detenlos!"
+"^F2¡El enemigo está robando uno de tus vehículos!\n"
+"^F4¡Deténganlos!"
#: qcsrc/common/notifications/all.inc:780
msgid "^F2Intruder detected, disabling shields!"
-msgstr "^F2Intruso detectado, desactivando escudos!"
+msgstr "^F2¡Intruso detectado, desactivando escudos!"
#: qcsrc/common/notifications/all.qh:198
msgid "Notification dump command only works with cl_cmd and sv_cmd."
-msgstr "El comando de despliegue solo funciona con cl_cmd y sv_cmd."
+msgstr ""
+"El comando de volcado de notificaciones sólo funciona con cl_cmd y sv_cmd."
#: qcsrc/common/notifications/all.qh:408 qcsrc/common/notifications/all.qh:409
#, c-format
#: qcsrc/common/notifications/all.qh:455
#, c-format
msgid "%s^K1 made a TRIPLE FRAG! %s^BG"
-msgstr "%s^K1 ha hecho una ELIMINACION TRIPLE! %s^BG"
+msgstr "¡%s^K1 ha hecho una ELIMINACIÓN TRIPLE! %s^BG"
#: qcsrc/common/notifications/all.qh:455
#, c-format
msgid "%s^K1 made a TRIPLE SCORE! %s^BG"
-msgstr "%s^K1 ha hecho una ELIMINACION TRIPLE! %s^BG"
+msgstr "¡%s^K1 ha hecho TRIPLE ACIERTO! %s^BG"
#: qcsrc/common/notifications/all.qh:455
msgid "TRIPLE FRAG! "
-msgstr "ELIMINACION TRIPLE!"
+msgstr "¡ELIMINACIÓN TRIPLE!"
#: qcsrc/common/notifications/all.qh:456
#, c-format
msgid "%s^K1 made FIVE SCORES IN A ROW! %s^BG"
-msgstr "%s^K1 hizo QUINCE ANOTACIONES SEGUIDAS! %s^BG"
+msgstr "¡%s^K1 hizo CINCO ACIERTOS SEGUIDOS! %s^BG"
#: qcsrc/common/notifications/all.qh:456
#, c-format
msgid "%s^K1 unlocked RAGE! %s^BG"
-msgstr "%s^K1 desbloqueo FURIA! %s^BG"
+msgstr "¡%s^K1 desbloqueó la FURIA! %s^BG"
#: qcsrc/common/notifications/all.qh:456
msgid "RAGE! "
-msgstr "FURIA!"
+msgstr "¡FURIA!"
#: qcsrc/common/notifications/all.qh:457
#, c-format
msgid "%s^K1 made TEN SCORES IN A ROW! %s^BG"
-msgstr "%s^K1 elimino a DIEZ JUGADORES SEGUIDOS! %s^BG"
+msgstr "¡%s^K1 eliminó a DIEZ ACIERTOS SEGUIDOS! %s^BG"
#: qcsrc/common/notifications/all.qh:457
#, c-format
msgid "%s^K1 started a MASSACRE! %s^BG"
-msgstr "%s^K1 ha empezado una MASSACRE! %s^BG"
+msgstr "¡%s^K1 ha empezado una MASACRE! %s^BG"
#: qcsrc/common/notifications/all.qh:457
msgid "MASSACRE! "
-msgstr "MASSACRE!"
+msgstr "¡MASACRE!"
#: qcsrc/common/notifications/all.qh:458
#, c-format
msgid "%s^K1 executed MAYHEM! %s^BG"
-msgstr "%s^K1 ha ejecutado un ALBOROTO! %s^BG"
+msgstr "¡%s^K1 ha ejecutado un CAOS! %s^BG"
#: qcsrc/common/notifications/all.qh:458
#, c-format
msgid "%s^K1 made FIFTEEN SCORES IN A ROW! %s^BG"
-msgstr "%s^K1 ha hecho QUINCE ELIMINACIONES SEGUIDAS! %s^BG"
+msgstr "¡%s^K1 ha hecho QUINCE ACIERTOS SEGUIDOS! %s^BG"
#: qcsrc/common/notifications/all.qh:458
msgid "MAYHEM! "
-msgstr "ALBOROTO!"
+msgstr "¡CAOS!"
#: qcsrc/common/notifications/all.qh:459
#, c-format
msgid "%s^K1 is a BERSERKER! %s^BG"
-msgstr "%s^K1 es un BERSERKER! %s^BG"
+msgstr "¡%s^K1 es un BERSERKER! %s^BG"
#: qcsrc/common/notifications/all.qh:459
#, c-format
msgid "%s^K1 made TWENTY SCORES IN A ROW! %s^BG"
-msgstr "%s^K1 ha hecho VIENTE ELIMINACIONES SEGUIDAS! %s^BG"
+msgstr "¡%s^K1 ha hecho VEINTE ACIERTOS SEGUIDOS! %s^BG"
#: qcsrc/common/notifications/all.qh:459
msgid "BERSERKER! "
-msgstr "BERSERKER!"
+msgstr "¡BERSERKER! "
#: qcsrc/common/notifications/all.qh:460
#, c-format
msgid "%s^K1 inflicts CARNAGE! %s^BG"
-msgstr "%s^K1 ha hecho una MATANZA! %s^BG"
+msgstr "¡%s^K1 ha hecho una CARNICERÍA! %s^BG"
#: qcsrc/common/notifications/all.qh:460
#, c-format
msgid "%s^K1 made TWENTY FIVE SCORES IN A ROW! %s^BG"
-msgstr "%s^K1 ha hecho VEINTE Y CINCO ELIMINACIONES SEGUIDAS! %s^BG"
+msgstr "¡%s^K1 ha hecho VENTICINCO ACIERTOS SEGUIDOS! %s^BG"
#: qcsrc/common/notifications/all.qh:460
msgid "CARNAGE! "
-msgstr "MATANZA!"
+msgstr "¡CARNICERÍA!"
#: qcsrc/common/notifications/all.qh:461
#, c-format
msgid "%s^K1 made THIRTY SCORES IN A ROW! %s^BG"
-msgstr "%s^K1 ha hecho TREINTA ELIMINACIONES SEGUIDAS! %s^BG"
+msgstr "¡%s^K1 ha hecho TREINTA ACIERTOS SEGUIDOS! %s^BG"
#: qcsrc/common/notifications/all.qh:461
#, c-format
msgid "%s^K1 unleashes ARMAGEDDON! %s^BG"
-msgstr "%s^K1 destata el ARMAGEDDON! %s^BG"
+msgstr "¡%s^K1 desata el ARMAGEDÓN! %s^BG"
#: qcsrc/common/notifications/all.qh:461
msgid "ARMAGEDDON! "
-msgstr "ARMAGEDDON!"
+msgstr "¡ARMAGEDÓN! "
#: qcsrc/common/notifications/all.qh:468
#, c-format
#: qcsrc/common/notifications/all.qh:470
#, c-format
msgid "%s(Ping ^F1%d^BG)"
-msgstr "%s(Latencia ^F1%d^BG)"
+msgstr "%s(Ping ^F1%d^BG)"
#: qcsrc/common/notifications/all.qh:477
#, c-format
"(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 anotaciones seguidas!"
+msgstr "¡%d aciertos seguidos! "
#: qcsrc/common/notifications/all.qh:512
#, c-format
msgid "%d frag spree! "
-msgstr "%d eliminaciones seguidas!"
+msgstr "¡%d eliminaciones seguidas! "
#: qcsrc/common/notifications/all.qh:525
msgid "First blood! "
-msgstr "Primera eliminacion!"
+msgstr "¡Primer asesinato! "
#: qcsrc/common/notifications/all.qh:525
msgid "First score! "
-msgstr "Primera anotacion!"
+msgstr "¡Primer acierto! "
#: qcsrc/common/notifications/all.qh:529
msgid "First casualty! "
-msgstr "Primera victima!"
+msgstr "¡Primera derrota! "
#: qcsrc/common/notifications/all.qh:529
msgid "First victim! "
-msgstr "Primera victima!"
+msgstr "¡Primera víctima! "
#: qcsrc/common/notifications/all.qh:570
#, c-format
msgid "%s^K1 has %d frags in a row! %s^BG"
-msgstr "%s^K1 tiene %d eliminaciones seguidas! %s^BG"
+msgstr "¡%s^K1 tiene %d eliminaciones seguidas! %s^BG"
#: qcsrc/common/notifications/all.qh:571
#, c-format
msgid "%s^K1 made %d scores in a row! %s^BG"
-msgstr "%s^K1 tiene %d eliminaciones seguidas! %s^BG"
+msgstr "¡%s^K1 tiene %d aciertos seguidos! %s^BG"
#: qcsrc/common/notifications/all.qh:589
#, c-format
msgid "%s^K1 drew first blood! %s^BG"
-msgstr "%s^K1 ha sido el primero en eliminar a alguien! %s^BG"
+msgstr "¡%s^K1 ha sido el primero en eliminar a alguien! %s^BG"
#: qcsrc/common/notifications/all.qh:590
#, c-format
msgid "%s^K1 got the first score! %s^BG"
-msgstr "%s^K1 fue el primero en eliminar a alguien! %s^BG"
+msgstr "¡%s^K1 fue el primero en acertar! %s^BG"
#: qcsrc/common/notifications/all.qh:606
#, c-format
msgid ", ending their %d frag spree"
-msgstr ", finalizando su cadena de %d eliminaciones"
+msgstr ", finalizando sus %d eliminaciones seguidas"
#: qcsrc/common/notifications/all.qh:607
#, c-format
msgid ", ending their %d score spree"
-msgstr ", finalizando su cadena de %d eliminaciones"
+msgstr ", finalizando sus %d aciertos seguidos"
#: qcsrc/common/notifications/all.qh:621
#, c-format
msgid ", losing their %d frag spree"
-msgstr ", perdiendo su cadena de %d eliminaciones"
+msgstr ", perdiendo sus %d eliminaciones seguidas"
#: qcsrc/common/notifications/all.qh:622
#, c-format
msgid ", losing their %d score spree"
-msgstr ", perdiendo su cadena de %d eliminaciones"
+msgstr ", perdiendo sus %d aciertos seguidos"
#: qcsrc/common/notifications/all.qh:647
#, c-format
#: qcsrc/common/turrets/all.qh:95
msgid "Turrets dump command only works with sv_cmd."
-msgstr "La orden de tirar torretas solo 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
msgid "%s under attack!"
-msgstr "%s bajo ataque!"
+msgstr "¡%s bajo ataque!"
#: qcsrc/common/turrets/turret.qh:11
msgid "Turret"
#: qcsrc/common/turrets/turret/hellion.qh:13
msgid "Hellion Missile Turret"
-msgstr "Torreta de Misiles Hellion"
+msgstr "Torreta de Misiles de Hellion"
#: qcsrc/common/turrets/turret/hellion_weapon.qh:7
msgid "Hellion"
#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:174
#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:187
msgid "Undisclosed"
-msgstr "No Revelar"
+msgstr "Desconocido"
#: qcsrc/common/util.qc:1439
msgid "<KEY NOT FOUND>"
#: qcsrc/common/util.qc:1477
msgid "APOSTROPHE"
-msgstr "APÓSTROFO"
+msgstr "APÓSTROFE"
#: qcsrc/common/util.qc:1478
msgid "BACKSLASH"
#: qcsrc/common/vehicles/cl_vehicles.qc:190
#, c-format
msgid "Press %s"
-msgstr "Presiona %s"
+msgstr "Pulsa %s"
#: qcsrc/common/vehicles/vehicle/bumblebee.qc:954
msgid "No right gunner!"
-msgstr "¡Sin artillero derecho!"
+msgstr "¡No hay artillero derecho!"
#: qcsrc/common/vehicles/vehicle/bumblebee.qc:960
msgid "No left gunner!"
-msgstr "¡Sin artillero izquierdo!"
+msgstr "¡No hay artillero izquierdo!"
#: qcsrc/common/vehicles/vehicle/bumblebee.qh:19
msgid "Bumblebee"
#: qcsrc/common/vehicles/vehicle/spiderbot.qh:19
msgid "Spiderbot"
-msgstr "Robot araña"
+msgstr "Robot Araña"
#: qcsrc/common/weapons/all.qh:76
msgid "Weapons dump command only works with sv_cmd."
-msgstr "Armas sueltas solo funcionan con el comando sv_cmd."
+msgstr "El comando de volcado de armas sólo funcionan con sv_cmd."
#: qcsrc/common/weapons/weapon/arc.qh:18
msgid "Arc"
#: qcsrc/common/weapons/weapon/devastator.qh:18
msgid "Devastator"
-msgstr "Devastadora"
+msgstr "Devastador"
#: qcsrc/common/weapons/weapon/electro.qh:18
msgid "Electro"
#: qcsrc/common/weapons/weapon/hook.qh:18
msgid "Grappling Hook"
-msgstr "Grappling Hook"
+msgstr "Gancho de agarre"
#: qcsrc/common/weapons/weapon/machinegun.qh:18
msgid "MachineGun"
#: qcsrc/common/weapons/weapon/tuba.qh:18
#, no-c-format
msgid "@!#%'n Tuba"
-msgstr "@!#%'n Tuba"
+msgstr "@!#%%'n Tuba"
#: qcsrc/common/weapons/weapon/vaporizer.qh:19
msgid "Vaporizer"
#: qcsrc/lib/counting.qh:27
#, c-format
msgid "CI_DEC^%s days"
-msgstr "%s dias"
+msgstr "%s días"
#: qcsrc/lib/counting.qh:30
#, c-format
msgid "CI_ZER^%d days"
-msgstr "%d dias"
+msgstr "%d días"
#: qcsrc/lib/counting.qh:31
#, c-format
msgid "CI_FIR^%d day"
-msgstr "%d dia"
+msgstr "%d día"
#: qcsrc/lib/counting.qh:32
#, c-format
msgid "CI_SEC^%d days"
-msgstr "%d dias"
+msgstr "%d días"
#: qcsrc/lib/counting.qh:33
#, c-format
msgid "CI_THI^%d days"
-msgstr "%d dias"
+msgstr "%d días"
#: qcsrc/lib/counting.qh:34
#, c-format
msgid "CI_MUL^%d days"
-msgstr "%d dias"
+msgstr "%d días"
#: qcsrc/lib/counting.qh:36
#, c-format
#: qcsrc/lib/oo.qh:324
msgid "No description"
-msgstr "Sin descripción"
+msgstr "No hay descripción"
#: qcsrc/lib/spawnfunc.qh:248
#, c-format
"Entity field %s.%s (%s) is not whitelisted. If you believe this is an error, "
"please file an issue."
msgstr ""
-"Entity field %s.%s (%s) no está en la lista. Si crees que esto es un error, "
-"por favor registre un problema."
+"Campo de entidad %s.%s (%s) no está en la lista. Si crees que esto es un "
+"error, por favor reporte el problema."
#: qcsrc/lib/string.qh:81
#, c-format
#: qcsrc/menu/command/menu_cmd.qc:48
msgid "Usage: menu_cmd command..., where possible commands are:"
-msgstr "Uso: menu_cmd orden..., las posibles órdenes son:"
+msgstr "Uso: menu_cmd comando..., los comandos posibles son:"
#: qcsrc/menu/command/menu_cmd.qc:49
msgid " sync - reloads all cvars on the current menu page"
-msgstr " sync - recarga todas las cvar en la página del menú actual"
+msgstr " sync - recarga todas las cvars en la página del menú actual"
#: qcsrc/menu/command/menu_cmd.qc:50
msgid " directmenu ITEM - select a menu item as main item"
#: qcsrc/menu/command/menu_cmd.qc:130
msgid "Invalid command. For a list of supported commands, try menu_cmd help."
msgstr ""
-"Orden no válida. Para obtener una lista de órdenes válidas, escribe menu_cmd "
-"help."
+"Comando inválido. Para obtener una lista de comandos válidos, escriba "
+"menu_cmd help."
#: qcsrc/menu/item/listbox.qc:413
#, c-format
msgid "Item %d"
-msgstr "Item %d"
+msgstr "Objeto %d"
#: qcsrc/menu/item/textslider.qc:11 qcsrc/menu/item/textslider.qc:12
#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:37
#: qcsrc/menu/xonotic/credits.qc:67
msgid "Level Design"
-msgstr "Diseño de Nivel"
+msgstr "Diseño de Niveles"
#: qcsrc/menu/xonotic/credits.qc:90
msgid "Music / Sound FX"
#: qcsrc/menu/xonotic/credits.qc:129
msgid "Engine Additions"
-msgstr "Añadidos del Motor"
+msgstr "Adiciones del Motor"
#: qcsrc/menu/xonotic/credits.qc:135
msgid "Compiler"
#: qcsrc/menu/xonotic/credits.qc:141
msgid "Other Active Contributors"
-msgstr "Otros contribudores activos"
+msgstr "Otros contribuidores activos"
#: qcsrc/menu/xonotic/credits.qc:148
msgid "Translators"
#: qcsrc/menu/xonotic/credits.qc:302
msgid "Ukrainian"
-msgstr "Ukraniano"
+msgstr "Ucraniano"
#: qcsrc/menu/xonotic/credits.qc:309
msgid "Past Contributors"
-msgstr "Contribudores en el pasado"
+msgstr "Contribuidores anteriores"
#: qcsrc/menu/xonotic/cvarlist.qc:73
msgid "forced to be saved to config.cfg"
#: qcsrc/menu/xonotic/dialog_disconnect.qc:16
msgid "Are you sure to disconnect from server?"
-msgstr ""
+msgstr "¿Estás seguro que quieres desconectarte del servidor?"
#: qcsrc/menu/xonotic/dialog_disconnect.qc:19
msgid "I would disconnect from server..."
-msgstr ""
+msgstr "Me desconectaría del servidor..."
#: qcsrc/menu/xonotic/dialog_disconnect.qc:22
msgid "I would play more!"
-msgstr ""
+msgstr "¡Me gustaría jugar más!"
#: qcsrc/menu/xonotic/dialog_disconnect.qh:6
#: qcsrc/menu/xonotic/dialog_multiplayer_media_demo_startconfirm.qh:6
#: qcsrc/menu/xonotic/dialog_disconnect.qh:7
msgid "Disconnect from the server you are connected to"
-msgstr ""
+msgstr "Desconectar del servidor al que está conectado"
#: qcsrc/menu/xonotic/dialog_firstrun.qc:39
msgid ""
"player name to get started. You can change these options later through the "
"menu system."
msgstr ""
-"Bienvenido/a a Xonotic, selecciona tu idioma e introduce tu apodo. Puedes "
+"Bienvenido/a a Xonotic, selecciona tu idioma e introduzca su apodo. Puedes "
"modificar estas opciones más tarde a través del menú de configuración."
#: qcsrc/menu/xonotic/dialog_firstrun.qc:45
#: 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 "Nombre con el cual aparecerás en el juego"
+msgstr "Nombre bajo el cual aparecerás en el juego"
#: qcsrc/menu/xonotic/dialog_firstrun.qc:69
msgid "Text language:"
-msgstr "Idioma:"
+msgstr "Texto del idioma:"
#: qcsrc/menu/xonotic/dialog_firstrun.qc:78
msgid "Allow player statistics to use your nickname at stats.xonotic.org?"
msgstr ""
-"Permitir que las estadísticas de jugador utilicen tu apodo en stats.xonotic."
+"¿Permitir que las estadísticas de jugador utilicen tu apodo en stats.xonotic."
"org?"
#: 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_ammo.qc:24
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:46
msgid "Noncurrent alpha:"
-msgstr "Alpha no actual:"
+msgstr "Transparencia no actual:"
#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.qc:28
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:50
#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qc:23
msgid "Fade time:"
-msgstr "Tiempo hasta desaparecer:"
+msgstr "Tiempo de desvanecimiento:"
#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qc:27
msgid "Flip messages order"
#: qcsrc/menu/xonotic/dialog_hudpanel_chat.qc:17
msgid "Chat entries:"
-msgstr "Mensajes:"
+msgstr "Entradas de chat:"
#: qcsrc/menu/xonotic/dialog_hudpanel_chat.qc:20
msgid "Chat size:"
#: 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_powerups.qc:27
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.qc:37
msgid "Inward"
-msgstr "Dentro"
+msgstr "Interior"
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:31
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:40
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.qc:29
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.qc:38
msgid "Outward"
-msgstr "Fuera"
+msgstr "Exterior"
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:34
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.qc:32
#: 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:"
-msgstr "Información de mensajes:"
+msgstr "Información de los mensajes:"
#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.qc:19
msgid "Flip align"
#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.qh:6
msgid "Info Messages Panel"
-msgstr "Panel de información de mensajes"
+msgstr "Panel de Información de los mensajes"
#: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:16
#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:15
#: qcsrc/menu/xonotic/util.qc:770 qcsrc/menu/xonotic/util.qc:786
#: qcsrc/menu/xonotic/util.qc:803
msgid "Disable"
-msgstr "Desactivar"
+msgstr "Deshabilitar"
#: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:17
#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.qc:15
#: 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"
#: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qh:6
msgid "Items Time Panel"
-msgstr "Panel de Tiempo de Items"
+msgstr "Panel de Tiempo de los Objetos"
#: qcsrc/menu/xonotic/dialog_hudpanel_modicons.qh:6
msgid "Mod Icons Panel"
-msgstr "Panel de Iconos de Mods"
+msgstr "Panel de Iconos de 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 "Mostrar también las notificaciones en la consola"
+msgstr "Imprimir también las notificaciones en la consola"
#: qcsrc/menu/xonotic/dialog_hudpanel_notification.qc:23
msgid "Flip notify order"
#: qcsrc/menu/xonotic/dialog_hudpanel_notification.qc:26
msgid "Entry lifetime:"
-msgstr "Mostrar durante: "
+msgstr "Mostrar durante:"
#: qcsrc/menu/xonotic/dialog_hudpanel_notification.qc:30
msgid "Entry fadetime:"
#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:18
msgid "Enable only in Race/CTS"
-msgstr "Habilitar solo en Race/CTS"
+msgstr "Habilitar sólo en Carrera/CTS"
#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:24
msgid "Status bar"
#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qh:6
msgid "Physics Panel"
-msgstr "Panel de la física"
+msgstr "Panel de Físicas"
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.qh:6
msgid "Powerups Panel"
-msgstr "Panel de poderes"
+msgstr "Panel de Poderes"
#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.qc:16
#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:17
#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.qh:6
msgid "Pressed Keys Panel"
-msgstr "Panel de teclas presionadas"
+msgstr "Panel de Teclas Pulsadas"
#: qcsrc/menu/xonotic/dialog_hudpanel_quickmenu.qh:6
msgid "Quick Menu Panel"
#: qcsrc/menu/xonotic/dialog_hudpanel_racetimer.qh:6
msgid "Race Timer Panel"
-msgstr "Panel del cronómetro de carrera"
+msgstr "Panel del Cronómetro de Carrera"
#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:16
msgid "Enable in team games"
#: qcsrc/menu/xonotic/dialog_hudpanel_timer.qh:6
msgid "Timer Panel"
-msgstr "Panel del reloj"
+msgstr "Panel del Reloj"
#: qcsrc/menu/xonotic/dialog_hudpanel_vote.qc:17
msgid "Alpha after voting:"
#: qcsrc/menu/xonotic/dialog_hudpanel_vote.qh:6
msgid "Vote Panel"
-msgstr "Panel de las votaciones"
+msgstr "Panel de las Votaciones"
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:22
msgid "Fade out after:"
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:66
msgid "Show Accuracy"
-msgstr "Mostrar precisión"
+msgstr "Mostrar Precisión"
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:67
msgid "Show Ammo"
-msgstr "Mostrar munición"
+msgstr "Mostrar Munición"
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:70
msgid "Ammo bar alpha:"
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qh:6
msgid "Weapons Panel"
-msgstr "Panel de las armas"
+msgstr "Panel de las Armas"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:19
msgid "HUD skins"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qh:6
msgid "Panel HUD Setup"
-msgstr "Configuración del panel HUD"
+msgstr "Configuración del Panel HUD"
#: qcsrc/menu/xonotic/dialog_monstertools.qc:13
msgid "Monster:"
"Play online, against your friends in LAN, view demos or change player "
"settings"
msgstr ""
-"Juega online, contra tus amigos en LAN, ver demos o cambia la configuración "
+"Juega online, contra tus amigos en LAN, ver demos o cambiar configuración "
"del jugador"
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:38
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:128
msgid "Specify how experienced the bots will be"
-msgstr "Especificar que experiencia tendran los bots"
+msgstr "Especificar que experiencia tendrán los bots"
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:129
msgid "Botlike"
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:156
msgid "Mutators and weapon arenas"
-msgstr "Mutators"
+msgstr "Mutadores y arenas de armas"
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:165
msgid "Maplist"
"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 aqui o presiona Ctrl-F para proveer una palabra clave para reducir "
-"la lista de mapas. Ctrl-Suprimir para despejar; Presione entrar cuando haya "
+"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.qc:184
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:185
msgid "Add the maps shown in the list to your selection"
-msgstr "Añade los mapas visibles en la lista a tu selección"
+msgstr "Añadir los mapas visibles en la lista a tu selección"
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:188
msgid "Remove shown"
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:206
msgid "Start Multiplayer!"
-msgstr "¡Jugar!"
+msgstr "¡Iniciar Modo Multijugador!"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.qc:50
msgid "Title:"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.qh:7
msgid "Map Information"
-msgstr "Información del mapa"
+msgstr "Información del Mapa"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:28
msgid "All Weapons Arena"
-msgstr "Arena con todas las armas"
+msgstr "Arena con todas las Armas"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:30
msgid "Most Weapons Arena"
-msgstr "Arena con la mayoría de las armas"
+msgstr "Arena con la mayoría de las Armas"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:46
#, c-format
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:71
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:298
msgid "No start weapons"
-msgstr "Empezar sin armas"
+msgstr "Iniciar sin armas"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:73
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:202
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:81
msgid "Melee only"
-msgstr "Solo cuerpo a cuerpo"
+msgstr "Sólo cuerpo a cuerpo"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:85
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:234
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:103
msgid "Wall jumping"
-msgstr "Saltar paredes"
+msgstr "Saltar muros"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:105
msgid "MUT^None"
"Enable dodging (quick acceleration in a given direction). Double-tap a "
"directional key to dodge"
msgstr ""
+"Habilitar esquivar (aceleración rápida en una dirección determinada). Toca "
+"dos veces una tecla direccional para esquivar"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:168
msgid "An explosion occurs when two players collide"
-msgstr ""
+msgstr "Una explosión ocurre cuando dos jugadores chocan"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:172
msgid "All players are almost invisible"
"Enable buff pickups (random bonuses like Medic, Invisible, etc.) on the maps "
"that support it"
msgstr ""
+"Habilitar la recolección de mejoras (mejoras aleatorias como Medicina, "
+"Invisible, etc.) en los mapas que lo admiten"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:181
msgid "Only possible to inflict damage on your enemy while they're airborne"
-msgstr "Solo es posible infligir daño a tus enemigos mientras estén en el aire"
+msgstr "Sólo es posible infligir daño a tus enemigos mientras estén en el aire"
#: 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 ""
"Amount of health below which players start bleeding out (health rots and "
"they can't jump)"
msgstr ""
+"Cantidad de salud por debajo de lo cual los jugadores comienzan a "
+"desangrarse (la salud se pudre y no pueden saltar)"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:199
msgid "Make things fall to the ground slower (percentage of normal gravity)"
msgstr ""
+"Hacer que las cosas caigan al suelo más despacio (porcentaje de gravedad "
+"normal)"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:208
msgid "Weapon & item mutators:"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:211
msgid "Grappling hook"
-msgstr "Gancho"
+msgstr "Gancho de agarre"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:212
msgid "Players spawn with the grappling hook. Press the 'hook' key to use it"
msgstr ""
+"Los jugadores aparecen con el gancho de agarre. Pulse la tecla 'gancho' para "
+"usarlo"
#: 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 ""
+"Los jugadores aparecen con la mochila propulsora. Toca dos veces 'saltar' o "
+"pulsa la tecla 'mochila propulsora' para usarlo"
#: 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 ""
+"Los proyectiles no pueden ser destruidos. Sin embargo, aún puedes explotar "
+"orbes de Electro con el disparo primario del arma Electro"
#: 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 ""
+"Algunas armas que aparecen serán reemplazadas aleatoriamente con nuevas "
+"armas: Heavy Laser Assault Cannon, Mine Layer, Rifle, T.A.G. Seeker"
#: 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 ""
+"Los cohetes de Devastador pueden detonarse instantáneamente (de lo "
+"contrario, hay un breve retraso). Esto permite a los jugadores disparar y "
+"detonar un cohete de Devastador mientras están en el aire para un fuerte "
+"impulso en el aire incluso mientras se mueven rápido."
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:235
msgid "Players will drop all weapons they possessed when they are killed"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:240
msgid "Weapons stay after they are picked up"
-msgstr "Las armas quedan despues de que son tomadas"
+msgstr "Las armas se quedan después de ser recogidas"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:245
msgid "Regular (no arena)"
-msgstr "Normal (no arena)"
+msgstr "Regular (sin arena)"
#: 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 ""
-"A los jugadores se les dará un conjunto de armas al aparecer como también "
-"munición ilimitada sin recoger armas"
+"A los jugadores se les dará un conjunto de armas al aparecer como munición "
+"ilimitada sin recoger armas"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:248
msgid "Weapon arenas:"
-msgstr "Armas de arena:"
+msgstr "Arenas de armas:"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:251
msgid "Custom weapons"
-msgstr "Armas customizadas"
+msgstr "Armas personalizadas"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:273
msgid "Most weapons"
"does not inflict any damage but is good for doing trickjumps."
msgstr ""
"Los jugadores recibirán una arma, la cual puede eliminar instantáneamente al "
-"oponente con un solo disparo. Si el jugador se queda sin munición, tiene 10 "
+"oponente con un sólo disparo. Si el jugador se queda sin munición, tiene 10 "
"segundos para encontrar munición, pero si no lo logra, morirá. El modo "
"disparo secundario no inflige ningún daño pero es bueno para hacer saltos."
"weapon. After some time, a countdown will start, after which everyone will "
"switch to another weapon."
msgstr ""
-"Xonotic sin items - en vez de recoger items, todos juegan con la misma arma. "
-"Despues de algún tiempo, comienza una cuenta regresiva, despues del cual "
-"todos juegan con otra arma."
+"Sin objetos Xonotic - en vez de recoger objetos, todos juegan con la misma "
+"arma. Después de algún tiempo, comienza una cuenta regresiva, después todos "
+"juegan con otra arma."
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:293
msgid "with blaster"
msgid ""
"Pause updating the server list to prevent servers from \"jumping around\""
msgstr ""
-"Pausa 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.qc:80
msgid "Show more information about the currently highlighted server"
-msgstr "Mostrar mas información sobre el actual servidor resaltado"
+msgstr "Mostrar más información sobre el servidor actual resaltado"
#: 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:139
msgid "Not supported (won't encrypt)"
-msgstr "No compatible (no se cifrará)"
+msgstr "No soportado (no se cifrará)"
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:143
msgid "Supported (will encrypt)"
-msgstr "Compatible (se cifrará)"
+msgstr "Soportado (se cifrará)"
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:145
msgid "Supported (won't encrypt)"
-msgstr "Compatible (no se cifrará)"
+msgstr "Soportado (no se cifrará)"
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:149
msgid "Requested (will encrypt)"
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:155
msgid "Required (can't connect)"
-msgstr "Necesario (no se puede conectar)"
+msgstr "Requerido (no se puede conectar)"
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:157
msgid "Required (will encrypt)"
-msgstr "Necesario (se cifrará)"
+msgstr "Requerido (se cifrará)"
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:161
msgid "Use the `crypto_aeslevel` cvar to change your preferences"
#: 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:"
#: qcsrc/menu/xonotic/dialog_multiplayer_media_demo.qc:58
msgid "Benchmark how fast your computer can run the highlighted demo"
-msgstr "Prueba cuan rápido tu computadora puede correr la demo seleccionada"
+msgstr "Prueba cuán rápido tu computadora puede correr la demo seleccionada"
#: qcsrc/menu/xonotic/dialog_multiplayer_media_demo.qc:62
msgid "DEMO^Play"
#: qcsrc/menu/xonotic/dialog_multiplayer_media_demo_startconfirm.qc:13
msgid "Playing a demo will disconnect you from the current match."
-msgstr "Jugar en demo te desconectará del juego actual"
+msgstr "Jugar una demo te desconectará de la partida actual"
#: 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 "¿Seguro que desea desconectarse?"
+msgstr "¿Seguro que desea desconectarse ahora?"
#: qcsrc/menu/xonotic/dialog_multiplayer_media_demo_timeconfirm.qc:13
msgid "Timing a demo will disconnect you from the current match."
-msgstr "Cronometrar un demo te desconectará del juego actual"
+msgstr "Cronometrar una demo te desconectará del juego actual"
#: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:37
msgid "MUSICPL^Add"
#: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:48
msgid "Reset default menu track"
-msgstr "Restablecer pista del menú"
+msgstr "Restablecer por defecto la pista del menú"
#: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:54
msgid "Playlist:"
#: qcsrc/menu/xonotic/dialog_multiplayer_media_screenshot.qc:41
msgid "Auto screenshot scoreboard"
-msgstr "Auto Captura de Pantalla del Tablero"
+msgstr "Captura de pantalla automática de la tabla de puntuaciones"
#: qcsrc/menu/xonotic/dialog_multiplayer_media_screenshot.qc:62
msgid "Open in the viewer"
-msgstr "Abrir en visualizador "
+msgstr "Abrir en el visualizador"
#: qcsrc/menu/xonotic/dialog_multiplayer_media_screenshot_viewer.qc:137
msgid "Reset"
-msgstr "Resetear"
+msgstr "Restablecer"
#: qcsrc/menu/xonotic/dialog_multiplayer_media_screenshot_viewer.qc:142
msgid "Previous"
#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:98
msgid "Glowing color"
-msgstr "Color brillante"
+msgstr "Color del brillo"
#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:108
msgid "Detail color"
-msgstr "Color de detalles"
+msgstr "Detalles del color"
#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:123
msgid "Statistics"
-msgstr "Estadísticas "
+msgstr "Estadísticas"
#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:127
msgid "Allow player statistics to track your client"
-msgstr "Permitir a la estadística de jugadores rastrear a su cliente"
+msgstr "Permitir que las estadísticas del jugador rastreen a su cliente"
#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:131
msgid "Allow player statistics to use your nickname"
-msgstr "Permitir a la estadística de jugadores usar su sobrenombre"
+msgstr "Permitir que las estadísticas del jugador usen tu apodo"
#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:136
msgid "Allow player statistics to rank you in leaderboards"
msgstr ""
+"Permitir que las estadísticas de jugadores te clasifiquen en las tablas de "
+"puntuaciones"
#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:152
msgid "Country"
#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:156
msgid "Select language..."
-msgstr "Selecciona lenguaje..."
+msgstr "Selecciona idioma..."
#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:172
msgid "Gender:"
-msgstr "Sexo:"
+msgstr "Género:"
#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:179
msgid "Gender"
#: qcsrc/menu/xonotic/dialog_quit.qc:11
msgid "Are you sure you want to quit?"
-msgstr "Estas seguro de querer salir?"
+msgstr "¿Estás seguro de que quieres salir?"
#: qcsrc/menu/xonotic/dialog_quit.qc:15
msgid "Back to work..."
#: qcsrc/menu/xonotic/dialog_quit.qc:17
msgid "I got some more fragging to do!"
-msgstr "Tengo algunos puntos más por hacer!"
+msgstr "¡Tengo algunos aciertos más por hacer!"
#: qcsrc/menu/xonotic/dialog_quit.qh:7
msgid "Quit the game"
#: 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_sandboxtools.qc:44
msgid "Set color main:"
-msgstr "Establecir color principal:"
+msgstr "Establecer color principal:"
#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:46
msgid "Set color glow:"
#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:50
msgid "Set frame:"
-msgstr "Establecer marco:"
+msgstr "Establecer fotograma:"
#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:54
msgid "Physical object properties for *:"
-msgstr "Propiedades fisicas del objeto *:"
+msgstr "Propiedades físicas del objeto para *:"
#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:56
msgid "Set material:"
#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:63
msgid "Non-solid"
-msgstr "No solido"
+msgstr "No sólido"
#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:64
msgid "Solid"
-msgstr "Solido"
+msgstr "Sólido"
#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:65
msgid "Set physics:"
-msgstr "Establecer fisica utilizada:"
+msgstr "Establecer físicas:"
#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:66
msgid "Static"
#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:67
msgid "Movable"
-msgstr "Movil"
+msgstr "Movible"
#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:68
msgid "Physical"
-msgstr "Fisico"
+msgstr "Físico"
#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:70
msgid "Set scale:"
#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:78
msgid "* object info"
-msgstr "* informacion de objeto"
+msgstr "* información del objeto"
#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:79
msgid "* mesh info"
-msgstr "* informacion de malla"
+msgstr "* información de la malla"
#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:80
msgid "* attachment info"
-msgstr "* informacion de accesorio"
+msgstr "* información del adjunto"
#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:81
msgid "Show help"
#: qcsrc/menu/xonotic/dialog_sandboxtools.qh:6
msgid "Sandbox Tools"
-msgstr "Herramientas de modo libre"
+msgstr "Herramientas de Sandbox"
#: qcsrc/menu/xonotic/dialog_settings.qc:18
msgid "Video"
-msgstr "Video"
+msgstr "Vídeo"
#: qcsrc/menu/xonotic/dialog_settings.qc:19
msgid "Effects"
#: qcsrc/menu/xonotic/dialog_settings.qc:20
msgid "Audio"
-msgstr "Sonido"
+msgstr "Audio"
#: qcsrc/menu/xonotic/dialog_settings.qc:22
msgid "Game"
#: qcsrc/menu/xonotic/dialog_settings.qc:23
msgid "Input"
-msgstr "Entrada"
+msgstr "Teclado/Ratón"
#: qcsrc/menu/xonotic/dialog_settings.qc:24
msgid "User"
#: qcsrc/menu/xonotic/dialog_settings.qh:6
msgid "Settings"
-msgstr "Configuración"
+msgstr "Ajustes"
#: qcsrc/menu/xonotic/dialog_settings.qh:7
msgid "Change the game settings"
-msgstr "Cambiar la configuración del juego"
+msgstr "Cambiar los ajustes del juego"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:29
msgid "Master:"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:35
msgid "Music:"
-msgstr "Musica:"
+msgstr "Música:"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:43
msgid "VOL^Ambient:"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:57
msgid "Items:"
-msgstr "Items:"
+msgstr "Objetos:"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:64
msgid "Pain:"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:99
msgid "New style sound attenuation"
-msgstr "Estilo nuevo de atenuacion de sonido"
+msgstr "Nuevo estilo de atenuación de sonido"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:102
msgid "Mute sounds when not active"
-msgstr "Apagar sonido cuando no este activo"
+msgstr "Apagar los sonidos cuando no esté activo"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:105
msgid "Frequency:"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:121
msgid "Number of channels for the sound output"
-msgstr "Número de canales para la salida del sonido"
+msgstr "Número de canales para la salida de sonido"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:122
msgid "Mono"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:123
msgid "Stereo"
-msgstr "Stereo"
+msgstr "Estéreo"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:124
msgid "2.1"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:134
msgid "Swap stereo output channels"
-msgstr "Intercambiar salidas de canales stereo "
+msgstr "Intercambiar canales de salida estéreo"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:135
msgid "Swap left/right channels"
-msgstr "Invertir canales izquierda o derecha"
+msgstr "Invertir canales izquierda/derecha"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:138
msgid "Headphone friendly mode"
"stereo separation a bit for headphones)"
msgstr ""
"Activar espacialización (mezcla ligeramente el canal derecho e izquierdo "
-"para disminuir la separación estereo un poco en los auriculares)"
+"para disminuir la separación estéreo un poco en los auriculares)"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:143
msgid "Hit indication sound"
-msgstr "Sonido indicador de impacto"
+msgstr "Sonido indicador de los golpes"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:144
msgid "Play a hit indicator sound when your shot hits an enemy"
msgstr ""
-"Reproduce un sonido indicador de anotacion 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_audio.qc:152
msgid "Play sounds when hovering over menu items too"
-msgstr ""
-"También reproducir sonidos cuando se mantenga el cursor sobre items del menú"
+msgstr "Reproducir sonidos cuando se mantenga el cursor sobre objetos del menú"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:156
msgid "Time announcer:"
-msgstr "Anunciador de tiempo:"
+msgstr "Tiempo del locutor:"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:158
msgid "WRN^Disabled"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:164
msgid "Automatic taunts:"
-msgstr "Mofas automáticas:"
+msgstr "Burlas automáticas:"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:166
msgid "Automatically taunt enemies after fragging them"
-msgstr "automáticamente burlarse del enemigo al anotar puntos"
+msgstr "Burlarse automáticamente de los enemigos al acertarlos"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:168
msgid "Sometimes"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:169
msgid "Often"
-msgstr "A Menudo"
+msgstr "A menudo"
#: 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 "Informacion de depuracion sobre sonidos"
+msgstr "Información de depuración sobre sonidos"
#: qcsrc/menu/xonotic/dialog_settings_bindings_reset.qc:11
msgid "Are you sure you want to reset all key bindings?"
-msgstr "¿Está seguro que desea reiniciar todas las asignaciones de teclas?"
+msgstr "¿Está seguro que desea restablecer todas las asignaciones de teclas?"
#: qcsrc/menu/xonotic/dialog_settings_bindings_reset.qh:6
msgid "Reset key bindings"
-msgstr "Reiniciar la asignación de teclas"
+msgstr "Restablecer la asignación de teclas"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:41
msgid "Quality preset:"
-msgstr "Predefinición de calidad:"
+msgstr "Ajustes preestablecidos de calidad:"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:45
msgid "PRE^OMG!"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:50
msgid "PRE^Medium"
-msgstr "Media"
+msgstr "Medio"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:52
msgid "PRE^Normal"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:54
msgid "PRE^High"
-msgstr "Alta"
+msgstr "Alto"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:56
msgid "PRE^Ultra"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:60
msgid "PRE^Ultimate"
-msgstr "Máxima"
+msgstr "Definitivo"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:65
msgid "Geometry detail:"
#: 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:"
-msgstr "Calidad del personaje:"
+msgstr "Calidad del jugador:"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:79
msgid "PDET^Low"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:115
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:120
msgid "Avoid lossy texture compression"
-msgstr "Evitar compresion de Textura con Pérdida"
+msgstr "Evitar compresión de textura con pérdida"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:129
msgid "Disable sky for performance and visibility"
-msgstr ""
+msgstr "Desactivar cielo para rendimiento y visibilidad"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:129
msgid "Show sky"
-msgstr ""
+msgstr "Mostrar cielo"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:132
msgid "Show surfaces"
"Disable textures completely for very slow hardware. This gives a huge "
"performance boost, but looks very ugly."
msgstr ""
-"Desactivar texturas completamente para hardware muy lento. Esto aumentara el "
+"Desactivar texturas completamente para hardware muy lento. Esto aumentará el "
"rendimiento en gran medida, pero se verá muy feo."
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:136
"Use high resolution lightmaps, which will look pretty but use up some extra "
"video memory"
msgstr ""
-"Use mapas de alta resolución, hara que se vea bien pero reducirá la memoria "
-"de vídeo"
+"Usar lightmaps de alta resolución, hará que se vea bien pero reducirá la "
+"memoria de vídeo"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:139
msgid "Deluxe mapping"
-msgstr "Mapeado Deluxe"
+msgstr "Mapeado de lujo"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:140
msgid "Use per-pixel lighting effects"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:146
msgid "Offset mapping"
-msgstr "Despl. de mapeado"
+msgstr "Desplazamiento de mapeado"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:147
msgid ""
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:149
msgid "Relief mapping"
-msgstr "Mapeado Relief"
+msgstr "Mapeado en relieve"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:150
msgid ""
"Reflection and refraction quality, has a huge impact on performance on maps "
"with reflecting surfaces"
msgstr ""
-"Calidad de refleccion y refracción, tiene un gran impacto en el rendimiento "
-"en mapas con superficies reflectantes"
+"Calidad del reflejo y refracción, tiene un gran impacto en el rendimiento en "
+"mapas con superficies reflectantes"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:157
msgid "Resolution of reflections/refractions"
-msgstr "Resolución de reflecciones/refracciones"
+msgstr "Resolución de reflejos/refracciones"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:158
msgid "Blurred"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:164
msgid "Decals"
-msgstr "Calcomanía"
+msgstr "Calcomanías"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:165
msgid "Enable decals (bullet holes and blood)"
-msgstr "Activar decals (agujeros de balas y sangre)"
+msgstr "Activar calcomanías (agujeros de balas y sangre)"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:166
msgid "Decals on models"
-msgstr "Marcas en los jugadores"
+msgstr "Calcomanías en los modelos"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:170
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:254
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:173
msgid "Decals further away than this will not be drawn"
-msgstr "Los decals que se alejen de esta distancia no se dibujarán"
+msgstr "Las calcomanías que se alejen de esta distancia no se dibujarán"
#: 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 "Tiempo en segundos antes de que los decals desaparezcan"
+msgstr "Tiempo en segundos antes de que las calcomanías desaparezcan"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:184
msgid "Damage effects:"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:195
msgid "Fake corona lighting"
-msgstr "Iluminacion por medio de coronas falsas"
+msgstr "Iluminación por medio de coronas falsas"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:196
msgid ""
"Note that this might have a big impact on performance."
msgstr ""
"Activar renderizado de la iluminación del mundo en tiempo real en mapas que "
-"lo soporten. Note que esto puede tener un gran impacto en el rendimiento."
+"lo soporten. Tenga en cuenta que esto puede tener un gran impacto en el "
+"rendimiento."
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:209
msgid "Enable rendering of shadows from realtime world lights"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:216
msgid "Soft shadows"
-msgstr "Sombras Suaves"
+msgstr "Sombras suaves"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:220
msgid "Fade corona according to visibility"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:234
msgid "Motion blur:"
-msgstr "Difuminado p/ movimiento:"
+msgstr "Difuminado de movimiento"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:240
msgid "Particles"
"when there's an obstacle between your gun and the target; Enemies: also "
"enlarge the crosshair when you would hit an enemy"
msgstr ""
-"Ninguno: no realizar pruebas de éxito para el punto de mira; TrueAim: "
+"Ninguno: no realizar pruebas de éxito para el punto de mira; Mira real: "
"difuminar el punto de mira cuando hay un obstáculo entre tu arma y el "
-"objetivo; Enemigos: tambien amplia el punto de mira cuando alcanzarías un "
+"objetivo; Enemigos: también amplia el punto de mira cuando alcanzarías un "
"enemigo"
#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:129
#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:136
msgid "Blur crosshair if the shot is obstructed"
-msgstr "Desenfocar punto de mira si el disparo es obstruído"
+msgstr "Desenfocar punto de mira si el disparo es obstruido"
#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:140
msgid "Enlarge crosshair if targeting an enemy"
#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:146
msgid "Animate crosshair when picking up an item"
-msgstr "Animar puntero al recoger un item"
+msgstr "Animar puntero al recoger un objeto"
#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qh:7
msgid "Crosshair"
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:53
msgid "Show accuracy underneath scoreboard"
-msgstr "Mostrar precisión debajo de la tabla de puntuación"
+msgstr "Mostrar precisión debajo de la tabla de puntuaciones"
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:55
msgid "Show team sizes:"
"Team size position: Off=do not show; Left=on the left side of the scoreboard "
"and move team scores to the right; Right=on the right of the scoreboard"
msgstr ""
-"Posición del tamaño de equipo: Off=no mostrar; Left=en la parte izquierda "
-"del marcador y mueve la puntuación del equipo a la derecha; Right=en la "
-"parte derecha del marcador"
+"Posición del tamaño de equipo: Desactivado=no mostrar; Izquierda=en la parte "
+"izquierda de la tabla de puntuaciones y mueve la puntuación del equipo a la "
+"derecha; Derecha=en la parte derecha de la tabla de puntuaciones"
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:64
msgid "Waypoints"
-msgstr "Puntos de paso"
+msgstr "Puntos de encuentro"
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:66
msgid "Display waypoint markers for objectives on the map"
-msgstr "Mostrar marcadores de puntos del camino para objetivos en el mapa"
+msgstr "Mostrar marcadores de puntos de encuentro para objetivos en el mapa"
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:67
msgid "Show various gametype specific waypoints"
-msgstr ""
-"Mostrar indicadores de ubicación/caminos específicos de diferentes tipos de "
-"juego"
+msgstr "Mostrar puntos de encuentro específicos de diferentes tipos de juego"
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:73
msgid "Control transparency of the waypoints"
-msgstr "Transparencia del control de los indicadores de ubicación/caminos"
+msgstr "Transparencia del control de los puntos de encuentro"
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:77
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:130
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:83
msgid "Edge offset:"
-msgstr "Dezplazamiento de borde:"
+msgstr "Desplazamiento de borde:"
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:91
msgid "Fade when near the crosshair"
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:95
msgid "Display names instead of icons"
-msgstr "Mostrar nombres en vez de íconos"
+msgstr "Mostrar nombres en vez de iconos"
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:100
msgid "Damage"
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:102
msgid "Overlay:"
-msgstr "Sangre en pantalla:"
+msgstr "Indicación de pantalla completa:"
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:105
msgid "Factor:"
-msgstr "Sangrado extra:"
+msgstr "Factor:"
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:110
msgid "Fade rate:"
-msgstr "Duración del sangrado:"
+msgstr "Tasa de desvanecimiento:"
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:118
msgid "Player Names"
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:154
msgid "Only when near crosshair"
-msgstr "Solo cuando cerca de apuntador"
+msgstr "Sólo cuando cerca de apuntador"
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:158
msgid "Display health and armor"
-msgstr "Desplegar vida y armadura"
+msgstr "Desplegar salud y armadura"
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:163
msgid "Damage overlay:"
#: qcsrc/menu/xonotic/dialog_settings_game_hudconfirm.qc:23
msgid "Do you wish to start a local game to set up the HUD?"
-msgstr "Deseas iniciar un juego local para configurar el HUD?"
+msgstr "¿Deseas iniciar un juego local para configurar el HUD?"
#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:24
msgid "Frag Information"
#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:26
msgid "Display information about killing sprees"
-msgstr "Mostrar informacion sobre rachas de asesinatos"
+msgstr "Mostrar información sobre rachas de asesinatos"
#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:29
msgid "Only display sprees if they are achievements"
-msgstr "Solo mostrar rachas de asesinatos si son logros"
+msgstr "Sólo mostrar rachas de asesinatos si son logros"
#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:34
msgid "Show spree information in centerprints"
-msgstr "Mostrar informacion de rachas en visualización central"
+msgstr "Mostrar información de rachas en visualización central"
#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:38
msgid "Show spree information in death messages"
#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:55
msgid "Print on a seperate line"
-msgstr "Imprimir en linea separada"
+msgstr "Imprimir en línea separada"
#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:58
msgid "Add extra frag information to centerprint when available"
#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:62
msgid "Add frag location to death messages when available"
msgstr ""
-"Añade localización de la eliminación en los mensajes de muertes cuando sea "
+"Añadir localización de la eliminación en los mensajes de muertes cuando sea "
"posible"
#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:65
#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:71
msgid "Display name of flag stealer in Capture The Flag"
-msgstr "Mostrar nombre de quien roba la bandera en CTF"
+msgstr "Mostrar nombre de quién roba la bandera en CTF"
#: 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:86
msgid "Powerup notifications"
-msgstr "Notificacion de poderes"
+msgstr "Notificaciones de poderes"
#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:89
msgid "Weapon centerprint notifications"
#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:51
msgid "Force player models to mine"
-msgstr "Forzar modelos de otros jugadores al mio"
+msgstr "Forzar modelos de otros jugadores al mío"
#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:53
msgid "Force player colors to mine"
-msgstr "Forzar colors de otros jugadores al mio"
+msgstr "Forzar colors de otros jugadores al mío"
#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:56
msgid "In non teamplay modes only"
-msgstr "Sólo no en modos de juego de equipo"
+msgstr "Sólo en modos de juego sin equipo"
#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:60
msgid "Body fading:"
-msgstr "Desvancimento de cuerpo:"
+msgstr "Desvanecimiento de cuerpo:"
#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:63
msgid "Gibs:"
-msgstr "Gibs:"
+msgstr "Vísceras:"
#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:65
msgid "GIBS^None"
#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:68
msgid "GIBS^Lots"
-msgstr "Abundante"
+msgstr "Montones"
#: qcsrc/menu/xonotic/dialog_settings_game_model.qh:7
msgid "Models"
#: qcsrc/menu/xonotic/dialog_settings_game_model.qh:8
msgid "Customize how players and items are displayed in game"
-msgstr "Personaliza como los jugadores y objetos aparecen en el juego"
+msgstr "Personaliza cómo los jugadores y objetos aparecen en el juego"
#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:26
msgid "1st person perspective"
-msgstr "Perspectiva en primera persona"
+msgstr "Perspectiva en 1ª persona"
#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:29
msgid "Slide to third person upon death"
#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:33
msgid "Smooth the view when landing from a jump"
-msgstr "Suavizar perspectiva al caer"
+msgstr "Suavizar perspectiva al aterrizar desde un salto"
#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:37
msgid "Smooth the view while crouching"
-msgstr "Suavizar perspectiva mientras este agachado "
+msgstr "Suavizar perspectiva al agachar"
#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:41
msgid "View waving while idle"
-msgstr "Agitar perspectiva mientras libre"
+msgstr "Agitar perspectiva al estar inactivo"
#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:45
msgid "View bobbing while walking around"
#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:53
msgid "Back distance"
-msgstr "Distancia hacia atras"
+msgstr "Distancia hacia atrás"
#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:59
msgid "Up distance"
#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:77
msgid "How big the zoom factor is when the zoom button is pressed"
-msgstr "Cuan grande es el factor de zoom cuando la tecla de zoom es presionada"
+msgstr "El tamaño del factor de zoom cuando la tecla de zoom es pulsada"
#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:80
msgid "ZOOM^Zoom speed:"
#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:82
msgid "How fast the view will be zoomed, disable to zoom instantly"
msgstr ""
-"Cuan rápido es la vista ampliada, deshabilitar para un zoom instantáneo"
+"La velocidad de la vista que será ampliada, deshabilitar para un zoom "
+"instantáneo"
#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:91
msgid "ZOOM^Instant"
-msgstr "Instantaneo"
+msgstr "Instantáneo"
#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:95
msgid "ZOOM^Zoom sensitivity:"
"How zoom changes sensitivity, from 0 (lower sensitivity) to 1 (no "
"sensitivity change)"
msgstr ""
-"Cuanto el zoom cambia la sensibilidad, desde 0 (baja sensibilidad) a 1 (sin "
+"El grado del zoom para la sensibilidad, desde 0 (baja sensibilidad) a 1 (sin "
"cambio de sensibilidad)"
#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:100
#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:119
msgid "Release zoom when you switch weapons"
-msgstr "Soltar acercamiento cuando cambia entre armas"
+msgstr "Soltar acercamiento cuando cambia de arma"
#: qcsrc/menu/xonotic/dialog_settings_game_view.qh:7
#: qcsrc/menu/xonotic/keybinder.qc:83
msgid ""
"Make use of the list above when cycling through weapons with the mouse wheel"
msgstr ""
-"Haz uso de la lista de abajo when cambia de arma con la rueda del raton"
+"Hacer uso de la lista de abajo cuando cambia de arma con la rueda del ratón"
#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:52
msgid "Cycle through only usable weapon selections"
-msgstr "Ciclar solamente a través de armas usables"
+msgstr "Cambiar solamente a través de armas usables"
#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:56
msgid "Auto switch weapons on pickup"
-msgstr "Cambiar de arma al recojer"
+msgstr "Cambiar automáticamente de arma al recoger"
#: 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 ""
-"Cambia automáticamente al arma recogida si es mejor que la que esta 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"
-msgstr "Soltar botones de ataque cuando cambia entre armas"
+msgstr "Soltar botones de ataque cuando cambia de arma"
#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:63
msgid "Draw 1st person weapon model"
-msgstr "Dibujar modelo de arma en primera persona"
+msgstr "Dibujar modelo de arma en 1ª persona"
#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:64
msgid "Draw the weapon model"
#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:77
msgid "Weapon model opacity:"
-msgstr ""
+msgstr "Opacidad del modelo de arma"
#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:91
msgid "Gun model swaying"
-msgstr "Meneo de arma "
+msgstr "Meneo del modelo de arma"
#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:96
msgid "Gun model bobbing"
-msgstr "Agitado de arma"
+msgstr "Agitación del modelo de arma"
#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qh:7
#: qcsrc/menu/xonotic/keybinder.qc:51
#: qcsrc/menu/xonotic/dialog_settings_input.qc:53
msgid "Reset all"
-msgstr "Reiniciar todo"
+msgstr "Restablecer todo"
#: qcsrc/menu/xonotic/dialog_settings_input.qc:58
msgid "Mouse"
#: qcsrc/menu/xonotic/dialog_settings_input.qc:64
msgid "Smooth aiming"
-msgstr "Apuntado suave"
+msgstr "Suavizar puntería"
#: qcsrc/menu/xonotic/dialog_settings_input.qc:65
msgid "Smoothes the mouse movement, but makes aiming slightly less responsive"
msgstr ""
-"Suaviza el movimiento del raton, pero hace menos sensible al apuntar al "
-"objetivo"
+"Suaviza el movimiento del ratón, pero hace que la puntería sea menos "
+"receptiva"
#: qcsrc/menu/xonotic/dialog_settings_input.qc:67
msgid "Invert aiming"
-msgstr "Invertir apuntado"
+msgstr "Invertir puntería"
#: qcsrc/menu/xonotic/dialog_settings_input.qc:68
msgid "Invert mouse movement on the Y-axis"
-msgstr "Invierte el movimiento del raton en el eje Y"
+msgstr "Invierte el movimiento del ratón en el eje Y"
#: qcsrc/menu/xonotic/dialog_settings_input.qc:70
msgid "Use system mouse positioning"
#: qcsrc/menu/xonotic/dialog_settings_input.qc:75
msgid "Enable built in mouse acceleration"
-msgstr "Habilitar aceleracion de raton integrada"
+msgstr "Habilitar aceleración de ratón integrada"
#: 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 "Deshabilitar aceleracion de raton por parte de sistema"
+msgstr "Deshabilitar aceleración de ratón por parte de sistema"
#: qcsrc/menu/xonotic/dialog_settings_input.qc:80
msgid "Make use of DGA mouse input"
-msgstr "Hace uso de la entrada DGA del raton"
+msgstr "Hacer uso de la entrada DGA del ratón"
#: qcsrc/menu/xonotic/dialog_settings_input.qc:94
msgid "Pressing \"enter console\" key also closes it"
-msgstr "Presionar la tecla \"abrir consola\" tambien la cierra"
+msgstr "Pulsar la tecla \"entrar en la consola\" y cerrarla"
#: qcsrc/menu/xonotic/dialog_settings_input.qc:95
msgid "Allow the console toggling bind to also close the console"
-msgstr "Permite el fijar un lazo de la consola para tambien cerrarla"
+msgstr "Permitir el atajo de la tecla de la consola para también cerrarla"
#: qcsrc/menu/xonotic/dialog_settings_input.qc:97
msgid "Automatically repeat jumping if holding jump"
msgstr ""
-"Repetir salto automaticamente si se mantiene presinado la tecla de brinco"
+"Repetir automáticamente el salto si se mantiene pulsado la tecla de saltar"
#: qcsrc/menu/xonotic/dialog_settings_input.qc:100
msgid "Jetpack on jump:"
-msgstr "Jetpack al brincar:"
+msgstr "Mochila propulsora al saltar:"
#: qcsrc/menu/xonotic/dialog_settings_input.qc:102
msgid "JPJUMP^Disabled"
#: qcsrc/menu/xonotic/dialog_settings_input.qc:103
msgid "Air only"
-msgstr "Solo aire"
+msgstr "Sólo aire"
#: qcsrc/menu/xonotic/dialog_settings_input.qc:104
msgid "JPJUMP^All"
#: qcsrc/menu/xonotic/dialog_settings_input_userbind.qc:31
msgid "Command when pressed:"
-msgstr "Comandar cuando se presiona:"
+msgstr "Comando cuando se pulsa:"
#: qcsrc/menu/xonotic/dialog_settings_input_userbind.qc:34
msgid "Command when released:"
-msgstr "Comandar cuando se suelta:"
+msgstr "Comando cuando se suelta:"
#: qcsrc/menu/xonotic/dialog_settings_input_userbind.qc:40
msgid "Cancel"
#: 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/dialog_settings_misc.qc:29
msgid "Client UDP port:"
-msgstr "Puerto UDP del Cliente:"
+msgstr "Puerto UDP del cliente:"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:31
msgid "Force client to use chosen port unless it is set to 0"
msgstr ""
-"Forzar al cliente a usar un puerto elegido a menos que se establezca en 0"
+"Forzar al cliente a usar un puerto elegido a menos que esté establecido a 0"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:34
msgid "Bandwidth:"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:36
msgid "Specify your network speed"
-msgstr "Especifica tu velocidad de tu conexión"
+msgstr "Especifica la velocidad de tu conexión"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:37
msgid "56k"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:70
msgid "Show a graph of packet sizes and other information"
-msgstr "Activar un gráfico de tamaño de paquetes y otra información"
+msgstr "Mostrar un gráfico de tamaño de paquetes y otra información"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:72
msgid "Client-side movement prediction"
-msgstr "Predicción de movimento de lado del cliente"
+msgstr "Predicción de movimento del lado del cliente"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:74
msgid "Movement error compensation"
-msgstr "Compensacion de errores de movimento"
+msgstr "Compensación de errores de movimento"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:78
msgid "Use encryption (AES) when available"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:81
msgid "Framerate"
-msgstr "Cuadros por segundo:"
+msgstr "Fotogramas por segundo:"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:83
msgid "Maximum:"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:109
msgid "Idle limit:"
-msgstr "Limite de inactividad:"
+msgstr "Límite de inactividad:"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:115
msgid "IDLFPS^Unlimited"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:122
msgid "Show frames per second"
-msgstr "Mostrar cuadros por segundo"
+msgstr "Mostrar fotogramas por segundo"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:123
msgid "Show your rendered frames per second"
-msgstr "Mostrar tus marcos/frames por segundo"
+msgstr "Mostrar fotogramas renderizados por segundo"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:128
msgid "Menu tooltips:"
-msgstr "Mostrar consejos en menu:"
+msgstr "Información sobre herramientas del menú:"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:130
msgid ""
"Menu tooltips: disabled, standard or advanced (also shows cvar or console "
"command bound to the menu item)"
msgstr ""
-"Tooltips del menú: deshabilitado, estándar o avanzado (también muestra cvar "
-"o comando de consola ligado al item del menú)"
+"Herramientas del menú: deshabilitado, estándar o avanzado (también muestra "
+"cvar o comando de consola ligado al item del menú)"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:131
msgid "TLTIP^Disabled"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:132
msgid "TLTIP^Standard"
-msgstr "Estandar"
+msgstr "Estándar"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:133
msgid "TLTIP^Advanced"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:145
msgid "Advanced settings where you can tweak every single variable of the game"
-msgstr "configuracion avanzada donde puedes ajustar cada variable del juego"
+msgstr "Configuración avanzada dónde puedes ajustar cada variable del juego"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:150
#: qcsrc/menu/xonotic/dialog_settings_misc_reset.qh:6
msgid "Factory reset"
-msgstr "Reiniciar a configuraciones de fábrica"
+msgstr "Restablecer ajustes de fábrica"
#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.qc:31
msgid "Cvar filter:"
-msgstr "Filtro de Cvar"
+msgstr "Filtro de cvar"
#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.qc:38
msgid "Modified cvars only"
-msgstr "Solo Cvars modificados"
+msgstr "Sólo cvars modificados"
#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.qc:45
msgid "Setting:"
#: qcsrc/menu/xonotic/dialog_settings_misc_reset.qc:11
msgid "Are you sure you want to reset all settings?"
-msgstr "¿Está seguro que desea reiniciar todas las configuraciones?"
+msgstr "¿Está seguro que desea restablecer todos los ajustes?"
#: qcsrc/menu/xonotic/dialog_settings_misc_reset.qc:13
msgid "This will create a backup config in your data directory"
-msgstr "Esto creará un respaldo de la configuración en el directorio data"
+msgstr ""
+"Esto creará una copia de seguridad de la configuración en el directorio data"
#: qcsrc/menu/xonotic/dialog_settings_user.qc:23
msgid "Menu Skins"
#: qcsrc/menu/xonotic/dialog_settings_user.qc:62
msgid "Text Language"
-msgstr "Texto del Lenguaje"
+msgstr "Texto del idioma"
#: qcsrc/menu/xonotic/dialog_settings_user.qc:67
msgid "Set language"
-msgstr "Definir Lenguaje:"
+msgstr "Elegir idioma"
#: qcsrc/menu/xonotic/dialog_settings_user.qc:72
msgid "Disable gore effects and harsh language"
-msgstr "Deshabilitar efectos de sangre y lenguage ofensivo"
+msgstr "Deshabilitar efectos sangrientos y lenguaje ofensivo"
#: qcsrc/menu/xonotic/dialog_settings_user.qc:73
msgid "Replace blood and gibs with content that does not have any gore effects"
-msgstr "Reemplazar sangre y tripas por cosas que no tengan nada de gore"
+msgstr ""
+"Reemplazar sangre y vísceras por contenido que no tenga nada de efectos "
+"sangrientos"
#: qcsrc/menu/xonotic/dialog_settings_user_languagewarning.qc:10
msgid "While connected language changes will be applied only to the menu,"
msgstr ""
-"Mientras estés conectado, los cambios de idioma se aplicarán solo al menú,"
+"Mientras esté conectado, los cambios de idioma se aplicarán sólo al menú,"
#: qcsrc/menu/xonotic/dialog_settings_user_languagewarning.qc:12
msgid "full language changes will take effect starting from the next game"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:37
msgid "Font/UI size:"
-msgstr "Tamaño de Font/UI:"
+msgstr "Tamaño de fuente/UI:"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:39
msgid "SZ^Unreadable"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:40
msgid "SZ^Tiny"
-msgstr "Minuscula"
+msgstr "Minúscula"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:41
msgid "SZ^Little"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:47
msgid "SZ^Colossal"
-msgstr "Colossal"
+msgstr "Colosal"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:51
msgid "Color depth:"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:53
msgid "How many bits per pixel (BPP) to render at, 32 is recommended"
-msgstr "Cuantos bits por pixel (BPP) para renderizar, 32 es lo recomendado"
+msgstr "Cuántos bits por pixel (BPP) para renderizar, se recomienda 32"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:54
msgid "16bit"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:59
msgid "Full screen"
-msgstr "Pantalla entera"
+msgstr "Pantalla completa"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:61
msgid "Vertical Synchronization"
-msgstr "Sincronizacion vertical"
+msgstr "Sincronización vertical"
#: 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 ""
-"Habilitar sincronización vertical para prevenir rasgaduras en la imagen, "
-"limitará los fps a la tasa de refresco del monitor"
+"Habilitar sincronización vertical para evitar el desgarro en la imagen, "
+"limitará los fotogramas por segundo a la tasa de actualización del monitor"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:67
msgid "Flip view horizontally"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:68
msgid "Poor man's left handed mode"
-msgstr "Invertir la imagen horizontalmente"
+msgstr "Modo zurdo"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:71
msgid "Anisotropy:"
"Enable antialiasing, which smooths the edges of 3D geometry. Note that it "
"might decrease performance by quite a lot"
msgstr ""
-"Activar antialiasing, el cual suaviza los bordes de la geometría 3D. Note "
-"que esto puede disminuir bastante el rendimiento"
+"Activar antialiasing, el cual suaviza los bordes de la geometría 3D. Tenga "
+"en cuenta que esto puede disminuir bastante el rendimiento"
#: 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 "Regulador de alta calidad"
+msgstr "Frame buffer de alta calidad"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:97
msgid "Depth first:"
"Eliminate overdraw by rendering a depth-only version of the scene before the "
"normal rendering starts"
msgstr ""
-"Eliminar sobre-dibujado renderizando una versión de profundidad de la escena "
-"antes de que comience la renderización normal"
+"Eliminar sobregiro renderizando una versión de profundidad de la escena "
+"antes de que inicie la renderización normal"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:100
msgid "DF^Disabled"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:101
msgid "DF^World"
-msgstr "Mundo"
+msgstr "Mapa"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:102
msgid "DF^All"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:109
msgid "Vertices, some Tris (compatible)"
-msgstr "Vértices, algunos triangulos (compatible)"
+msgstr "Vértices, algunos triángulos (compatible)"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:110
#: qcsrc/menu/xonotic/dialog_settings_video.qc:114
"Make use of Vertex Buffer Objects to store static geometry in video memory "
"for faster rendering"
msgstr ""
-"Haz uso de objetos de búfer de vertices para almacenar geometría estática en "
-"la memoria de video para acelerar el renderizado"
+"Hacer uso de objetos de búfer de vértices para almacenar geometría estática "
+"en la memoria de vídeo para acelerar el renderizado"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:113
msgid "Vertices"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:115
msgid "Vertices and Triangles"
-msgstr "Vertices y triangulos"
+msgstr "Vértices y triángulos"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:119
msgid "Brightness:"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:125
msgid "Brightness of white"
-msgstr "Brillo en blancos"
+msgstr "Brillo en blanco"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:127
msgid "Gamma:"
-msgstr "Gamma:"
+msgstr "Gama:"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:130
msgid ""
"Inverse gamma correction value, a brightness effect that does not affect "
"white or black"
msgstr ""
-"Valor de corrección de gama inverso, un efecto de brillo que no afecta a "
-"blancos o negros"
+"Valor de corrección de gama inverso, un efecto de brillo que no afecta al "
+"blanco o al negro"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:133
msgid "Contrast boost:"
-msgstr "Resaltador de contraste"
+msgstr "Aumento de contraste"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:136
msgid "By how much to multiply the contrast in dark areas"
-msgstr "Por cuanto multiplicar el contraste en areas oscuras"
+msgstr "Por cuánto multiplicar el contraste en áreas oscuras"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:139
msgid "Saturation:"
-msgstr "Saturacion de color:"
+msgstr "Saturación:"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:142
msgid ""
"Ambient lighting, if set too high it tends to make light on maps look dull "
"and flat"
msgstr ""
-"Iluminación del ambiente, si se configura demasiado alto, tiende a hacer que "
-"la luz en los mapas se vea aburrida y plana"
+"Iluminación del ambiente, si se establece demasiado alto, tiende a hacer que "
+"la luz en los mapas se vea tenue y plana"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:150
msgid "Intensity:"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:155
msgid "Wait for GPU to finish each frame"
-msgstr "Esperar a la GPU para terminar cada frame"
+msgstr "Esperar a que la GPU termine cada fotograma"
#: 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 ""
-"Hacer que la CPU espere a que la gpu termine cada marco, puede ayudar con "
-"algunas entradas extrañas o con el retraso de vídeo en algunas máquinas"
+"Hacer que la CPU espere a que la GPU termine cada fotograma, puede ayudar "
+"con algunas entradas extrañas o retrasos gráficos en algunas máquinas"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:158
msgid "Use OpenGL 2.0 shaders (GLSL)"
-msgstr "Usar shaders OpenGL2.0 (GLSL)"
+msgstr "Usar shaders OpenGL 2.0 (GLSL)"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:163
msgid "Psycho coloring (easter egg)"
-msgstr "Coloracion psicopata (secreto)"
+msgstr "Psico colores (secreto)"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:166
msgid "Trippy vertices (easter egg)"
-msgstr "Vertices drogados (secreto)"
+msgstr "Vértices alucinógenos (secreto)"
#: qcsrc/menu/xonotic/dialog_singleplayer.qc:109
msgid "Instant action! (random map with bots)"
-msgstr "¡Accion instantanea! (Mapa aleatorio con bots)"
+msgstr "¡Acción instantánea! (Mapa aleatorio con bots)"
#: qcsrc/menu/xonotic/dialog_singleplayer.qc:116
msgid "???"
#: qcsrc/menu/xonotic/dialog_singleplayer.qc:129
msgid "Campaign Difficulty:"
-msgstr "Dificultad de campaña:"
+msgstr "Dificultad de la campaña:"
#: qcsrc/menu/xonotic/dialog_singleplayer.qc:130
msgid "CSKL^Easy"
-msgstr "Facil"
+msgstr "Fácil"
#: qcsrc/menu/xonotic/dialog_singleplayer.qc:131
msgid "CSKL^Medium"
-msgstr "Mediano"
+msgstr "Medio"
#: qcsrc/menu/xonotic/dialog_singleplayer.qc:132
msgid "CSKL^Hard"
-msgstr "Dificil"
+msgstr "Difícil"
#: qcsrc/menu/xonotic/dialog_singleplayer.qc:134
msgid "Start Singleplayer!"
-msgstr "¡Comenzar!"
+msgstr "¡Iniciar Modo de un jugador!"
#: qcsrc/menu/xonotic/dialog_singleplayer.qh:6
msgid "Singleplayer"
-msgstr "Jugador"
+msgstr "Un jugador"
#: qcsrc/menu/xonotic/dialog_singleplayer.qh:7
msgid "Play the singleplayer campaign or instant action matches against bots"
msgstr ""
-"Empieza una campaña de un solo jugador o acción instantánea de batalla "
-"contra bots"
+"Jugar campaña de un sólo jugador o acción instantánea de batalla contra bots"
#: qcsrc/menu/xonotic/dialog_singleplayer_winner.qh:7
msgid "Winner"
-msgstr "Vencedor"
+msgstr "Ganador"
#: qcsrc/menu/xonotic/dialog_teamselect.qc:32
msgid "join 'best' team (auto-select)"
-msgstr "Ingresar 'mejor' equipo (selección automática)"
+msgstr "unirse al 'mejor' equipo (selección automática)"
#: qcsrc/menu/xonotic/dialog_teamselect.qc:33
msgid "Autoselect team (recommended)"
-msgstr "Auto seleccionar equipo (recomendado)"
+msgstr "Seleccionar equipo automáticamente (recomendado)"
#: qcsrc/menu/xonotic/dialog_teamselect.qc:37
msgid "red"
#: qcsrc/menu/xonotic/dialog_teamselect.qc:43
#: qcsrc/menu/xonotic/keybinder.qc:116
msgid "spectate"
-msgstr "espectador"
+msgstr "espectar"
#: qcsrc/menu/xonotic/dialog_teamselect.qh:7
msgid "Team Selection"
#: qcsrc/menu/xonotic/keybinder.qc:35
msgid "Moving"
-msgstr "Movimiento"
+msgstr "Mover"
#: qcsrc/menu/xonotic/keybinder.qc:36
msgid "forward"
#: qcsrc/menu/xonotic/keybinder.qc:43
msgid "jetpack"
-msgstr "jetpack"
+msgstr "mochila propulsora"
#: qcsrc/menu/xonotic/keybinder.qc:46
msgid "Attacking"
-msgstr "Ataque"
+msgstr "Atacar"
#: qcsrc/menu/xonotic/keybinder.qc:52
msgid "WEAPON^previous"
#: qcsrc/menu/xonotic/keybinder.qc:86
msgid "show scores"
-msgstr "mostrar puntaje"
+msgstr "mostrar puntaciones"
#: qcsrc/menu/xonotic/keybinder.qc:87
msgid "screen shot"
#: qcsrc/menu/xonotic/keybinder.qc:89
msgid "3rd person view"
-msgstr "Vista 3ª persona"
+msgstr "vista 3ª persona"
#: qcsrc/menu/xonotic/keybinder.qc:90
msgid "enter spectator mode"
#: qcsrc/menu/xonotic/keybinder.qc:93
msgid "Communication"
-msgstr ""
+msgstr "Comunicación"
#: qcsrc/menu/xonotic/keybinder.qc:94
msgid "public chat"
#: qcsrc/menu/xonotic/keybinder.qc:120
msgid "drop key/flag, exit vehicle"
-msgstr ""
+msgstr "caer llave/bandera, salir del vehículo"
#: qcsrc/menu/xonotic/keybinder.qc:121
msgid "suicide / respawn"
-msgstr ""
+msgstr "suicidar / reaparecer"
#: qcsrc/menu/xonotic/keybinder.qc:122
msgid "quick menu"
-msgstr "menu rápido"
+msgstr "menú rápido"
#: qcsrc/menu/xonotic/keybinder.qc:125
msgid "User defined"
#: qcsrc/menu/xonotic/keybinder.qc:132
msgid "Development"
-msgstr ""
+msgstr "Desarrollo"
#: qcsrc/menu/xonotic/keybinder.qc:133
msgid "sandbox menu"
-msgstr "menu sandbox"
+msgstr "menú sandbox"
#: qcsrc/menu/xonotic/keybinder.qc:134
msgid "drag object (sandbox)"
-msgstr ""
+msgstr "arrastrar objeto (sandbox)"
#: qcsrc/menu/xonotic/keybinder.qc:135
msgid "waypoint editor menu"
-msgstr ""
+msgstr "menú del editor de puntos de encuentro"
#: qcsrc/menu/xonotic/mainwindow.qc:96 qcsrc/menu/xonotic/mainwindow.qc:99
msgid "Do not press this button again!"
-msgstr "¡No vuelva a presionar este boton!"
+msgstr "¡No vuelva a pulsar este botón!"
#: qcsrc/menu/xonotic/maplist.qc:288
msgid ""
"Huh? Can't play this (m is NULL). Refiltering so this won't happen again."
msgstr ""
-"Huh? no puedes jugarlo (m es nulo). Reflitrando para que esto no vuelva a "
-"ocurrir."
+"¿Eh? No se puede jugar (m is NULL). Filtrando de nuevo para que esto no "
+"vuelva a ocurrir."
#: qcsrc/menu/xonotic/maplist.qc:296
#, c-format
"Huh? Can't play this (invalid game type). Refiltering so this won't happen "
"again."
msgstr ""
-"Huh? No puedes jugarlo (tipo de juego inválido). Reflitrado para que esto no "
-"vuelva a ocurrir."
+"¿Eh? No se puede jugar (tipo de juego inválido). Filtrando de nuevo para que "
+"esto no vuelva a ocurrir."
#: qcsrc/menu/xonotic/playerlist.qc:102 qcsrc/menu/xonotic/playerlist.qc:112
msgid "spectator"
#: qcsrc/menu/xonotic/serverlist.qc:256
msgid "SERVER^Remove favorite"
-msgstr ""
+msgstr "Eliminar favorito"
#: qcsrc/menu/xonotic/serverlist.qc:257
msgid "Remove the currently highlighted server from bookmarks"
-msgstr ""
+msgstr "Eliminar el servidor resaltado actual de los marcadores"
#: qcsrc/menu/xonotic/serverlist.qc:261
msgid "SERVER^Favorite"
-msgstr ""
+msgstr "Favorito"
#: qcsrc/menu/xonotic/serverlist.qc:262
msgid ""
"Bookmark the currently highlighted server so that it's faster to find in the "
"future"
msgstr ""
-"Marcar el actual servidor resaltado para que sea mas facil encontrarlo en un "
-"futuro"
+"Marcar el servidor resaltado actual para que sea más rápido de encontrar en "
+"el futuro"
#: qcsrc/menu/xonotic/serverlist.qc:733
msgid "Ping"
#: qcsrc/menu/xonotic/serverlist.qc:1020
#, c-format
msgid "mod: %s"
-msgstr "modo: %s"
+msgstr "mod: %s"
#: qcsrc/menu/xonotic/serverlist.qc:1022
#, 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>"
-msgstr "<TÃtulo>"
+msgstr "<TÃ\8dTULO>"
#: qcsrc/menu/xonotic/skinlist.qc:71
msgid "<AUTHOR>"
#: qcsrc/menu/xonotic/slider_decibels.qc:72
msgid "VOL^MAX"
-msgstr "MAXIMO"
+msgstr "MÁXIMO"
#: qcsrc/menu/xonotic/slider_decibels.qc:74
msgid "VOL^OFF"
#: qcsrc/menu/xonotic/slider_particles.qc:14
msgid "PART^OMG"
-msgstr "PARTE^OMG"
+msgstr "¡DIOS!"
#: qcsrc/menu/xonotic/slider_particles.qc:15
msgid "PART^Low"
-msgstr "PARTE^Bajo"
+msgstr "Bajo"
#: qcsrc/menu/xonotic/slider_particles.qc:16
msgid "PART^Medium"
-msgstr "PARTE^Medio"
+msgstr "Medio"
#: qcsrc/menu/xonotic/slider_particles.qc:17
#: qcsrc/menu/xonotic/slider_sbfadetime.qc:14
msgid "PART^Normal"
-msgstr "PARTE^Normal"
+msgstr "Normal"
#: qcsrc/menu/xonotic/slider_particles.qc:18
msgid "PART^High"
-msgstr "PARTE^Alto"
+msgstr "Alto"
#: qcsrc/menu/xonotic/slider_particles.qc:19
msgid "PART^Ultra"
-msgstr "PARTE^Ultra"
+msgstr "Ultra"
#: qcsrc/menu/xonotic/slider_particles.qc:20
msgid "PART^Ultimate"
-msgstr "PARTE^Último"
+msgstr "Definitivo"
#: qcsrc/menu/xonotic/slider_picmip.qc:13
msgid ""
"Change the sharpness of the textures. Lowering it will effectively reduce "
"texture memory usage, but make the textures appear very blurry."
msgstr ""
-"Cambiar la dureza de las texturas. Bajándolo efectivamente reducirá el uso "
+"Cambiar la dureza de las texturas. Bajándola, efectivamente reducirá el uso "
"de la memoria de la textura, pero hará que las texturas aparezcan muy "
"borrosas."
#: qcsrc/menu/xonotic/slider_sbfadetime.qc:13
msgid "PART^Slow"
-msgstr "PARTE^Lento"
+msgstr "Lento"
#: qcsrc/menu/xonotic/slider_sbfadetime.qc:15
msgid "PART^Fast"
-msgstr "PARTE^Rapido"
+msgstr "Rápido"
#: qcsrc/menu/xonotic/slider_sbfadetime.qc:16
msgid "PART^Instant"
-msgstr "PARTE^Instante"
+msgstr "Instante"
#: qcsrc/menu/xonotic/statslist.qc:29
msgid "January"
#: qcsrc/menu/xonotic/statslist.qc:37
msgid "September"
-msgstr "Sectiembre"
+msgstr "Septiembre"
#: qcsrc/menu/xonotic/statslist.qc:38
msgid "October"
#: qcsrc/menu/xonotic/statslist.qc:46
#, no-c-format
msgid "DATE^%m %d, %Y"
-msgstr ""
+msgstr "DATE^%m %d, %Y"
#: qcsrc/menu/xonotic/statslist.qc:97
msgid "Joined:"
#: qcsrc/menu/xonotic/statslist.qc:173
#, c-format
msgid "Kill ratio:"
-msgstr "Razón de asesinatos:"
+msgstr "Ratio de asesinatos:"
#: qcsrc/menu/xonotic/statslist.qc:208
msgid "ELO:"
#: qcsrc/menu/xonotic/util.qc:420
msgid "Update can be downloaded at:"
-msgstr "Actualización puede ser descargada en:"
+msgstr "La actualización puede ser descargada en:"
#: qcsrc/menu/xonotic/util.qc:528
msgid "Autogenerating mapinfo for newly added maps..."
-msgstr "Generación automática de información para mapas nuevos..."
+msgstr "Generación automática de información para mapas recién agregados..."
#: qcsrc/menu/xonotic/util.qc:566
#, c-format
msgid "Update to %s now!"
-msgstr "¡Actualizar para %s ahora!"
+msgstr "¡Actualiza a %s ahora!"
#: qcsrc/menu/xonotic/util.qc:650
msgid ""
"^1ERROR: Texture compression is required but not supported.\n"
"^1Expect visual problems."
msgstr ""
-"^1ERROR: Se requiere la compresion de texturas, pero no es soportada.\n"
+"^1ERROR: Se requiere la compresión de texturas, pero no soporta.\n"
"^1Pueden ocurrir posibles problemas visuales."
#: qcsrc/menu/xonotic/util.qc:780
"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-09 17:30+0000\n"
+"Last-Translator: Oi Suomi On! <oisuomion@protonmail.com>\n"
"Language-Team: Finnish (http://www.transifex.com/team-xonotic/xonotic/"
"language/fi/)\n"
"Language: fi\n"
#: qcsrc/client/hud/panel/quickmenu.qc:799
msgid "QMCMD^strength soon"
-msgstr ""
+msgstr "QMCMD^voimistus pian"
#: qcsrc/client/hud/panel/quickmenu.qc:800
msgid "QMCMD^free item %x^7 (l:%y^7)"
#: qcsrc/client/hud/panel/quickmenu.qc:836
msgid "QMCMD^Change spectator camera"
-msgstr ""
+msgstr "QMCMD^Muuta katselijakameraa"
#: qcsrc/client/hud/panel/quickmenu.qc:841
#: qcsrc/client/hud/panel/quickmenu.qc:845
#: qcsrc/client/hud/panel/quickmenu.qc:844
msgid "QMCMD^Wall collision"
-msgstr ""
+msgstr "QMCMD^Seinätörmäys"
#: qcsrc/client/hud/panel/quickmenu.qc:848
msgid "QMCMD^Fullscreen"
#: qcsrc/client/hud/panel/quickmenu.qc:865
msgid "QMCMD^Spectate a player"
-msgstr ""
+msgstr "QMCMD^Katsele pelaajaa"
#: qcsrc/client/hud/panel/racetimer.qc:59
#, c-format
#: qcsrc/common/mutators/mutator/buffs/buffs.qh:11
msgid "Buff"
-msgstr "Puhvi"
+msgstr "Tsemppi"
#: qcsrc/common/mutators/mutator/damagetext/ui_damagetext.qc:8
msgid "Damage text"
#: qcsrc/common/notifications/all.inc:265
#, c-format
msgid "^BG%s%s^K1 was killed by ^BG%s^K1's ^BG%s^K1 buff ^K1%s%s"
-msgstr "^BG%s%s^K1 tapettiin ^BG%s^K1's ^BG%s^K1 puhvilla ^K1%s%s"
+msgstr "^BG%s%s^K1 tapettiin ^BG%s^K1's ^BG%s^K1 tsempillä ^K1%s%s"
#: qcsrc/common/notifications/all.inc:265
#, c-format
msgid "^BG%s%s^K1 was scored against by ^BG%s^K1's ^BG%s^K1 buff ^K1%s%s"
-msgstr "^BG%s%s^K1 otettiin pisteitä pois ^BG%s^K1's ^BG%s^K1 puhvilla ^K1%s%s"
+msgstr ""
+"^BG%s%s^K1 otettiin pisteitä pois ^BG%s^K1's ^BG%s^K1 tsempillä ^K1%s%s"
#: qcsrc/common/notifications/all.inc:266
#, c-format
#: qcsrc/common/notifications/all.inc:358
#, c-format
msgid "^BG%s^K3 was automatically revived after %s seconds"
-msgstr ""
+msgstr "^BG%s^K3 elvytettiin automaattisesti %s sekunnin kuluttua"
#: qcsrc/common/notifications/all.inc:359
#, c-format
#: qcsrc/common/notifications/all.inc:368
#, c-format
msgid "^BG%s^BG got the %s^BG buff!"
-msgstr "^BG%s^BG sai %s^BG puhvin!"
+msgstr "^BG%s^BG sai %s^BG tsempin!"
#: qcsrc/common/notifications/all.inc:369
#, c-format
msgid "^BG%s^BG lost the %s^BG buff!"
-msgstr "^BG%s^BG menetti %s^BG puhvin!"
+msgstr "^BG%s^BG menetti %s^BG tsempin!"
#: qcsrc/common/notifications/all.inc:370
#: qcsrc/common/notifications/all.inc:683
#, c-format
msgid "^BGYou dropped the %s^BG buff!"
-msgstr "^BGSinä pudotit %s^BG puhvin!"
+msgstr "^BGSinä pudotit %s^BG tsempin!"
#: qcsrc/common/notifications/all.inc:371
#: qcsrc/common/notifications/all.inc:684
#, c-format
msgid "^BGYou got the %s^BG buff!"
-msgstr "^BGSinulla on %s^BG puhvi!"
+msgstr "^BGSinulla on %s^BG tsemppi!"
#: qcsrc/common/notifications/all.inc:373
#: qcsrc/common/notifications/all.inc:687
#: qcsrc/common/notifications/all.inc:403
#, c-format
msgid "^BG%s^BG captured a control point"
-msgstr ""
+msgstr "^BG%s^BG kaappasi hallintapisteen"
#: qcsrc/common/notifications/all.inc:404
#, c-format
#: qcsrc/common/notifications/all.inc:405
#, c-format
msgid "^TC^TT^BG team control point has been destroyed by %s"
-msgstr ""
+msgstr "^TC^TT^BG joukkueen hallintapiste on tuhottu täten %s"
#: qcsrc/common/notifications/all.inc:406
msgid "^TC^TT^BG generator has been destroyed"
#: qcsrc/common/notifications/all.inc:665
#, c-format
msgid "^F2Extra lives taken: ^K1%s"
-msgstr ""
+msgstr "^F2Lisäelämiä napattu: ^K1%s"
#: qcsrc/common/notifications/all.inc:667
#, c-format
#: qcsrc/common/notifications/all.inc:670
#, c-format
msgid "^K3You were automatically revived after %s seconds"
-msgstr ""
+msgstr "^K3Sinut elvytettiin automaattisesti %s sekunnissa"
#: qcsrc/common/notifications/all.inc:672
msgid "^BGThe generator is under attack!"
#: qcsrc/common/notifications/all.inc:719 qcsrc/menu/xonotic/campaign.qc:244
#, c-format
msgid "Level %s: "
-msgstr ""
+msgstr "Taso %s: "
#: qcsrc/common/notifications/all.inc:719
#, c-format
msgid "^BGPress ^F2%s^BG to enter the game"
-msgstr ""
+msgstr "^BGPaina ^F2%s^BG liittyäksesi peliin"
#: qcsrc/common/notifications/all.inc:722
#, c-format
#: qcsrc/common/notifications/all.inc:726
msgid "^BGYou captured a control point"
-msgstr ""
+msgstr "^BGSinä kaappasit hallintapisteen"
#: qcsrc/common/notifications/all.inc:727
#, c-format
#: qcsrc/common/notifications/all.inc:728
msgid "^TC^TT^BG team captured a control point"
-msgstr ""
+msgstr "^TC^TT^BG joukkue kaappasi hallintapisteen"
#: qcsrc/common/notifications/all.inc:729
msgid "^BGThis control point currently cannot be captured"
#: qcsrc/menu/xonotic/dialog_disconnect.qc:16
msgid "Are you sure to disconnect from server?"
-msgstr ""
+msgstr "Haluatko varmasti katkaista yhteyden palvelimelle?"
#: qcsrc/menu/xonotic/dialog_disconnect.qc:19
msgid "I would disconnect from server..."
-msgstr ""
+msgstr "Katkaisisin palvelinyhteyden..."
#: qcsrc/menu/xonotic/dialog_disconnect.qc:22
msgid "I would play more!"
-msgstr ""
+msgstr "Pelaisin lisää!"
#: qcsrc/menu/xonotic/dialog_disconnect.qh:6
#: qcsrc/menu/xonotic/dialog_multiplayer_media_demo_startconfirm.qh:6
#: qcsrc/menu/xonotic/dialog_disconnect.qh:7
msgid "Disconnect from the server you are connected to"
-msgstr ""
+msgstr "Katkaise yhteys palvelimeen johon olet yhdistettynä"
#: qcsrc/menu/xonotic/dialog_firstrun.qc:39
msgid ""
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:93
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:175
msgid "Buffs"
-msgstr "Puhvit"
+msgstr "Tsempit"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:95
msgid "Overkill"
"Enable dodging (quick acceleration in a given direction). Double-tap a "
"directional key to dodge"
msgstr ""
+"Kytke päälle väistöt (pikakiihdytys annettuun suuntaan). \n"
+"Kaksoistäppää nuolinäppäintä väistääksesi"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:168
msgid "An explosion occurs when two players collide"
-msgstr ""
+msgstr "Tapahtuu räjähdys kahden pelaajan törmätessä"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:172
msgid "All players are almost invisible"
"Enable buff pickups (random bonuses like Medic, Invisible, etc.) on the maps "
"that support it"
msgstr ""
+"Kytke tsemppipoimittavat päälle (satunnaisia lisäetuja kuten ensiapu, "
+"näkymättömyys, jne.) niitä tukevissa kartoissa"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:181
msgid "Only possible to inflict damage on your enemy while they're airborne"
"Amount of health below which players start bleeding out (health rots and "
"they can't jump)"
msgstr ""
+"Terveyden määrä jonka alittuessa pelaajat alkavat vuotamaan kuiviin (vointi "
+"repsahtaa eivätkä kykene hyppäämään)"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:199
msgid "Make things fall to the ground slower (percentage of normal gravity)"
msgstr ""
+"Aseta esineet putoamaan maahan hitaammin (prosenttimäärä perinteiseen "
+"painovoimaan nähden)"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:208
msgid "Weapon & item mutators:"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:212
msgid "Players spawn with the grappling hook. Press the 'hook' key to use it"
msgstr ""
+"Pelaajat syntyvät heittokoukun kera. Paina 'koukku' näppäintä sitä "
+"käyttääksesi "
#: 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 ""
+"Pelaajat syntyvät lentopakkauksen kera. Kaksoistäppää 'hyppy' tai paina "
+"'lentopakkaus' näppäintä sitä käyttääksesi"
#: 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 ""
+"Ammuksia ei voi tuhota. Voit, siltikin, räjäyttää sähköpalloja "
+"ensisijaisella sähkötulituksella "
#: 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 ""
+"Jotkut asesyntymät tullaan vaihtamaan satunnaisesti uusilla aseilla: Raskas-"
+"laser rynnäkkökanuuna, Miinanlevittäjä, Kivääri, T.A.G. Hakeutuja "
#: 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 ""
+"Hävittäjäraketit voidaan räjäyttää välittömästi (muutoin, ilmenee pieni "
+"viive). Tämä antaa pelaajalle mahdollisuuden ampua ja räjäyttää "
+"Hävittäjäraketin ilmassa ollessaan, tuottaakseen voimakkaan lisäpotkun "
+"keskikorkeudessa jopa liikkuessaan nopeasti"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:235
msgid "Players will drop all weapons they possessed when they are killed"
#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:136
msgid "Allow player statistics to rank you in leaderboards"
-msgstr ""
+msgstr "Anna lupa sijoittaa sinut pelaajatilastoissa "
#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:152
msgid "Country"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:129
msgid "Disable sky for performance and visibility"
-msgstr ""
+msgstr "Kytke taivas pois päältä suorituskyvyn ja näkyvyyden lisäämiseksi"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:129
msgid "Show sky"
-msgstr ""
+msgstr "Näytä taivas"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:132
msgid "Show surfaces"
#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:77
msgid "Weapon model opacity:"
-msgstr ""
+msgstr "Asemallin läpikuultavuus:"
#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:91
msgid "Gun model swaying"
#: qcsrc/menu/xonotic/keybinder.qc:93
msgid "Communication"
-msgstr ""
+msgstr "Keskustelu"
#: qcsrc/menu/xonotic/keybinder.qc:94
msgid "public chat"
#: qcsrc/menu/xonotic/keybinder.qc:120
msgid "drop key/flag, exit vehicle"
-msgstr ""
+msgstr "pudota avain/lippu, poistu ajoneuvosta"
#: qcsrc/menu/xonotic/keybinder.qc:121
msgid "suicide / respawn"
-msgstr ""
+msgstr "itsari / uudelleensynty"
#: qcsrc/menu/xonotic/keybinder.qc:122
msgid "quick menu"
#: qcsrc/menu/xonotic/keybinder.qc:132
msgid "Development"
-msgstr ""
+msgstr "Kehitys"
#: qcsrc/menu/xonotic/keybinder.qc:133
msgid "sandbox menu"
#: qcsrc/menu/xonotic/keybinder.qc:134
msgid "drag object (sandbox)"
-msgstr ""
+msgstr "raahaa kohde (hiekkalaatikko)"
#: qcsrc/menu/xonotic/keybinder.qc:135
msgid "waypoint editor menu"
-msgstr ""
+msgstr "välietapin muokkausvalikko"
#: qcsrc/menu/xonotic/mainwindow.qc:96 qcsrc/menu/xonotic/mainwindow.qc:99
msgid "Do not press this button again!"
#: qcsrc/menu/xonotic/serverlist.qc:256
msgid "SERVER^Remove favorite"
-msgstr ""
+msgstr "PALVELIN^Poista lemppari"
#: qcsrc/menu/xonotic/serverlist.qc:257
msgid "Remove the currently highlighted server from bookmarks"
-msgstr ""
+msgstr "Poista tämänhetkinen korostettu palvelin kirjanmerkeistä"
#: qcsrc/menu/xonotic/serverlist.qc:261
msgid "SERVER^Favorite"
-msgstr ""
+msgstr "PALVELIN^Lemppari"
#: qcsrc/menu/xonotic/serverlist.qc:262
msgid ""
#: qcsrc/menu/xonotic/statslist.qc:46
#, no-c-format
msgid "DATE^%m %d, %Y"
-msgstr ""
+msgstr "PÄIVÄYS^%k %d, %V"
#: qcsrc/menu/xonotic/statslist.qc:97
msgid "Joined:"
--- /dev/null
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Translators:
+# LegendGuard, 2020
+# LegendGuard, 2020
+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-07-30 22:37+0000\n"
+"Last-Translator: LegendGuard\n"
+"Language-Team: Galician (http://www.transifex.com/team-xonotic/xonotic/"
+"language/gl/)\n"
+"Language: gl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: qcsrc/client/hud/hud_config.qc:81
+#, c-format
+msgid "^2Successfully exported to %s! (Note: It's saved in data/data/)"
+msgstr ""
+
+#: qcsrc/client/hud/hud_config.qc:85
+#, c-format
+msgid "^1Couldn't write to %s"
+msgstr ""
+
+#: qcsrc/client/hud/panel/centerprint.qc:174
+#, c-format
+msgid "^3Countdown message at time %s, seconds left: ^COUNT"
+msgstr ""
+
+#: qcsrc/client/hud/panel/centerprint.qc:176
+#, c-format
+msgid ""
+"^1Multiline message at time %s that\n"
+"^1lasts longer than normal"
+msgstr ""
+
+#: qcsrc/client/hud/panel/centerprint.qc:178
+#, c-format
+msgid "Message at time %s"
+msgstr ""
+
+#: qcsrc/client/hud/panel/centerprint.qc:183
+msgid "Generic message"
+msgstr "Mensaxe xenérica"
+
+#: qcsrc/client/hud/panel/chat.qc:89
+msgid "^3Player^7: This is the chat area."
+msgstr "^3Xogador^7: Esta é a área de chat."
+
+#: qcsrc/client/hud/panel/engineinfo.qc:76
+#, c-format
+msgid "FPS: %.*f"
+msgstr "FPS: %.*f"
+
+#: qcsrc/client/hud/panel/infomessages.qc:95
+msgid "^1Observing"
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:97
+#, c-format
+msgid "^1Spectating: ^7%s"
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:108
+#, c-format
+msgid "^1Press ^3%s^1 to spectate"
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:108
+#: qcsrc/menu/xonotic/keybinder.qc:47
+msgid "primary fire"
+msgstr "tiro principal"
+
+#: qcsrc/client/hud/panel/infomessages.qc:110
+#, c-format
+msgid "^1Press ^3%s^1 or ^3%s^1 for next or previous player"
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:110
+#: qcsrc/client/hud/panel/infomessages.qc:114
+msgid "next weapon"
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:110
+#: qcsrc/client/hud/panel/infomessages.qc:114
+msgid "previous weapon"
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:114
+#, c-format
+msgid "^1Use ^3%s^1 or ^3%s^1 to change the speed"
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:116
+#, c-format
+msgid "^1Press ^3%s^1 to observe, ^3%s^1 to change camera mode"
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:116
+#: qcsrc/common/vehicles/cl_vehicles.qc:190
+msgid "drop weapon"
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:116
+#: qcsrc/menu/xonotic/keybinder.qc:48
+msgid "secondary fire"
+msgstr "tiro secundario"
+
+#: qcsrc/client/hud/panel/infomessages.qc:119
+#, c-format
+msgid "^1Press ^3%s^1 for gamemode info"
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:119
+#: qcsrc/menu/xonotic/keybinder.qc:103
+msgid "server info"
+msgstr "información do servidor"
+
+#: qcsrc/client/hud/panel/infomessages.qc:132
+msgid "^1Match has already begun"
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:134
+msgid "^1You have no more lives left"
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:136
+#: qcsrc/client/hud/panel/infomessages.qc:139
+#, c-format
+msgid "^1Press ^3%s^1 to join"
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:136
+#: qcsrc/client/hud/panel/infomessages.qc:139
+#: qcsrc/common/notifications/all.qh:430
+msgid "jump"
+msgstr "saltar"
+
+#: qcsrc/client/hud/panel/infomessages.qc:147
+#, c-format
+msgid "^1Game starts in ^3%d^1 seconds"
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:153
+msgid "^2Currently in ^1warmup^2 stage!"
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:168
+#, c-format
+msgid "%sPress ^3%s%s to end warmup"
+msgstr ""
+
+#: 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 "listo"
+
+#: qcsrc/client/hud/panel/infomessages.qc:170
+#, c-format
+msgid "%sPress ^3%s%s once you are ready"
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:175
+msgid "^2Waiting for others to ready up to end warmup..."
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:177
+msgid "^2Waiting for others to ready up..."
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:183
+#, c-format
+msgid "^2Press ^3%s^2 to end warmup"
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:204
+msgid "Teamnumbers are unbalanced!"
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:207
+#, c-format
+msgid " Press ^3%s%s to adjust"
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:207
+#: qcsrc/menu/xonotic/keybinder.qc:115
+msgid "team menu"
+msgstr "menú do equipo"
+
+#: qcsrc/client/hud/panel/infomessages.qc:217
+msgid "^1Spectating this player:"
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:217
+msgid "^1Spectating you:"
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:233
+msgid "^7Press ^3ESC ^7to show HUD options."
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:234
+msgid "^3Doubleclick ^7a panel for panel-specific options."
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:235
+msgid "^3CTRL ^7to disable collision testing, ^3SHIFT ^7and"
+msgstr ""
+
+#: qcsrc/client/hud/panel/infomessages.qc:236
+msgid "^3ALT ^7+ ^3ARROW KEYS ^7for fine adjustments."
+msgstr ""
+
+#: qcsrc/client/hud/panel/modicons.qc:183
+msgid "Personal best"
+msgstr ""
+
+#: qcsrc/client/hud/panel/modicons.qc:193
+msgid "Server best"
+msgstr ""
+
+#: 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 ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:597
+#: qcsrc/client/hud/panel/quickmenu.qc:599
+#, c-format
+msgid "Submenu%d"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:604
+#, c-format
+msgid "Command%d"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:630
+msgid "Continue..."
+msgstr "Continúa..."
+
+#: qcsrc/client/hud/panel/quickmenu.qc:787
+#: qcsrc/client/hud/panel/quickmenu.qc:794
+msgid "Chat"
+msgstr "Chat"
+
+#: qcsrc/client/hud/panel/quickmenu.qc:788
+msgid "QMCMD^Send public message to"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:789
+msgid "QMCMD^:-) / nice one"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:789
+msgid "QMCMD^nice one"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:790
+msgid "QMCMD^good game"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:791
+msgid "QMCMD^hi / good luck"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:791
+msgid "QMCMD^hi / good luck and have fun"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:793
+msgid "QMCMD^Send in English"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:798
+#: qcsrc/client/hud/panel/quickmenu.qc:814
+msgid "QMCMD^Team chat"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:799
+msgid "QMCMD^strength soon"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:800
+msgid "QMCMD^free item %x^7 (l:%y^7)"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:800
+msgid "QMCMD^free item, icon"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:801
+msgid "QMCMD^took item (l:%l^7)"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:801
+msgid "QMCMD^took item, icon"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:802
+msgid "QMCMD^negative"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:803
+msgid "QMCMD^positive"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:804
+msgid "QMCMD^need help (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:804
+msgid "QMCMD^need help, icon"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:805
+msgid "QMCMD^enemy seen (l:%y^7)"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:805
+msgid "QMCMD^enemy seen, icon"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:806
+msgid "QMCMD^flag seen (l:%y^7)"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:806
+msgid "QMCMD^flag seen, icon"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:807
+msgid "QMCMD^defending (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:807
+msgid "QMCMD^defending, icon"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:808
+msgid "QMCMD^roaming (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:808
+msgid "QMCMD^roaming, icon"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:809
+msgid "QMCMD^attacking (l:%l^7) (h:%h^7 a:%a^7 w:%w^7)"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:809
+msgid "QMCMD^attacking, icon"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:810
+msgid "QMCMD^killed flagcarrier (l:%y^7)"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:810
+msgid "QMCMD^killed flagcarrier, icon"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:811
+#, c-format
+msgid "QMCMD^dropped flag (l:%d^7)"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:811
+msgid "QMCMD^dropped flag, icon"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:812
+msgid "QMCMD^drop weapon, icon"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:812
+msgid "QMCMD^dropped weapon %w^7 (l:%l^7)"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:813
+msgid "QMCMD^drop flag/key, icon"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:813
+msgid "QMCMD^dropped flag/key %w^7 (l:%l^7)"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:817
+msgid "QMCMD^Send private message to"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:819
+#: qcsrc/client/hud/panel/quickmenu.qc:849
+msgid "QMCMD^Settings"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:820
+#: qcsrc/client/hud/panel/quickmenu.qc:827
+msgid "QMCMD^View/HUD settings"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:821
+msgid "QMCMD^3rd person view"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:822
+msgid "QMCMD^Player models like mine"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:823
+msgid "QMCMD^Names above players"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:824
+msgid "QMCMD^Crosshair per weapon"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:825
+msgid "QMCMD^FPS"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:826
+msgid "QMCMD^Net graph"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:829
+#: qcsrc/client/hud/panel/quickmenu.qc:832
+msgid "QMCMD^Sound settings"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:830
+msgid "QMCMD^Hit sound"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:831
+msgid "QMCMD^Chat sound"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:836
+msgid "QMCMD^Change spectator camera"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:841
+#: qcsrc/client/hud/panel/quickmenu.qc:845
+msgid "QMCMD^Observer camera"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:842
+msgid "QMCMD^Increase speed"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:843
+msgid "QMCMD^Decrease speed"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:844
+msgid "QMCMD^Wall collision"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:848
+msgid "QMCMD^Fullscreen"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:851
+#: qcsrc/client/hud/panel/quickmenu.qc:861
+msgid "QMCMD^Call a vote"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:852
+msgid "QMCMD^Restart the map"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:853
+msgid "QMCMD^End match"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:856
+msgid "QMCMD^Reduce match time"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:857
+msgid "QMCMD^Extend match time"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:860
+msgid "QMCMD^Shuffle teams"
+msgstr ""
+
+#: qcsrc/client/hud/panel/quickmenu.qc:865
+msgid "QMCMD^Spectate a player"
+msgstr ""
+
+#: qcsrc/client/hud/panel/racetimer.qc:59
+#, c-format
+msgid " (-%dL)"
+msgstr ""
+
+#: qcsrc/client/hud/panel/racetimer.qc:64
+#, c-format
+msgid " (+%dL)"
+msgstr ""
+
+#: qcsrc/client/hud/panel/racetimer.qc:83
+msgid "Start line"
+msgstr ""
+
+#: qcsrc/client/hud/panel/racetimer.qc:85
+#: qcsrc/client/hud/panel/racetimer.qc:89
+msgid "Finish line"
+msgstr ""
+
+#: qcsrc/client/hud/panel/racetimer.qc:87
+#: qcsrc/client/hud/panel/racetimer.qc:156
+#, c-format
+msgid "Intermediate %d"
+msgstr ""
+
+#: 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 ""
+
+#: qcsrc/client/hud/panel/racetimer.qc:159 qcsrc/client/main.qc:1102
+msgid "missing a checkpoint"
+msgstr ""
+
+#: qcsrc/client/hud/panel/radar.qc:386
+msgid "Click to select teleport destination"
+msgstr ""
+
+#: qcsrc/client/hud/panel/radar.qc:390
+msgid "Click to select spawn location"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:105
+msgid "Number of ball carrier kills"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:105
+msgid "SCO^bckills"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:106
+msgid "SCO^bctime"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:106
+msgid "Total amount of time holding the ball in Keepaway"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:107
+msgid "How often a flag (CTF) or a key (KeyHunt) was captured"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:107
+msgid "SCO^caps"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:108
+msgid "SCO^captime"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:108
+msgid "Time of fastest capture (CTF)"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:109
+msgid "Number of deaths"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:109
+msgid "SCO^deaths"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:110
+msgid "Number of keys destroyed by pushing them into void"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:110
+msgid "SCO^destroyed"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:111
+msgid "SCO^damage"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:111
+msgid "The total damage done"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:112
+msgid "SCO^dmgtaken"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:112
+msgid "The total damage taken"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:113
+msgid "Number of flag drops"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:113
+msgid "SCO^drops"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:114
+msgid "Player ELO"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:114
+msgid "SCO^elo"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:115
+msgid "SCO^fastest"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:115
+msgid "Time of fastest lap (Race/CTS)"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:116
+msgid "Number of faults committed"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:116
+msgid "SCO^faults"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:117
+msgid "Number of flag carrier kills"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:117
+msgid "SCO^fckills"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:118
+msgid "FPS"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:118
+msgid "SCO^fps"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:119
+msgid "Number of kills minus suicides"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:119
+msgid "SCO^frags"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:120
+msgid "Number of goals scored"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:120
+msgid "SCO^goals"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:121
+msgid "Number of keys carrier kills"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:121
+msgid "SCO^kckills"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:122
+msgid "SCO^k/d"
+msgstr ""
+
+#: 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 ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:123
+msgid "SCO^kdr"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:124
+msgid "SCO^kdratio"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:125
+msgid "Number of kills"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:125
+msgid "SCO^kills"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:126
+msgid "Number of laps finished (Race/CTS)"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:126
+msgid "SCO^laps"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:127
+msgid "Number of lives (LMS)"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:127
+msgid "SCO^lives"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:128
+msgid "Number of times a key was lost"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:128
+msgid "SCO^losses"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:129
+#: qcsrc/client/hud/panel/scoreboard.qc:130
+msgid "Player name"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:129
+msgid "SCO^name"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:130
+msgid "SCO^nick"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:131
+msgid "Number of objectives destroyed"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:131
+msgid "SCO^objectives"
+msgstr ""
+
+#: 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 ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:132
+msgid "SCO^pickups"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:133
+msgid "Ping time"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:133
+msgid "SCO^ping"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:134
+msgid "Packet loss"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:134
+msgid "SCO^pl"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:135
+msgid "Number of players pushed into void"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:135
+msgid "SCO^pushes"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:136
+msgid "Player rank"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:136
+msgid "SCO^rank"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:137
+msgid "Number of flag returns"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:137
+msgid "SCO^returns"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:138
+msgid "Number of revivals"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:138
+msgid "SCO^revivals"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:139
+msgid "Number of rounds won"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:139
+msgid "SCO^rounds won"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:140
+msgid "SCO^score"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:140
+msgid "Total score"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:141
+msgid "Number of suicides"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:141
+msgid "SCO^suicides"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:142
+msgid "Number of kills minus deaths"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:142
+msgid "SCO^sum"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:143
+msgid "Number of domination points taken (Domination)"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:143
+msgid "SCO^takes"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:144
+msgid "Number of teamkills"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:144
+msgid "SCO^teamkills"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:145
+msgid "Number of ticks (Domination)"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:145
+msgid "SCO^ticks"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:146
+msgid "SCO^time"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:146
+msgid "Total time raced (Race/CTS)"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:330
+msgid ""
+"You can modify the scoreboard using the ^2scoreboard_columns_set command."
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:331
+msgid "Usage:"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:333
+msgid "^2scoreboard_columns_set ^3field1 field2 ..."
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:334
+msgid ""
+"^2scoreboard_columns_set ^7without arguments reads the arguments from the "
+"cvar scoreboard_columns"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:335
+msgid ""
+" ^5Note: ^7scoreboard_columns_set without arguments is executed on every "
+"map start"
+msgstr ""
+
+#: 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 ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:337
+msgid "You can use a ^3|^7 to start the right-aligned fields."
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:338
+msgid "The following field names are recognized (case insensitive):"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:344
+msgid ""
+"Before a field you can put a + or - sign, then a comma separated list\n"
+"of game types, then a slash, to make the field show up only in these\n"
+"or in all but these game types. You can also specify 'all' as a\n"
+"field to show all fields available for the current game mode."
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:350
+msgid ""
+"The special game type names 'teams' and 'noteams' can be used to\n"
+"include/exclude ALL teams/noteams game modes."
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:354
+msgid "Example: scoreboard_columns_set name ping pl | +ctf/field3 -dm/field4"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:355
+msgid ""
+"will display name, ping and pl aligned to the left, and the fields\n"
+"right of the vertical bar aligned to the right."
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:357
+msgid ""
+"'field3' will only be shown in CTF, and 'field4' will be shown in all\n"
+"other gamemodes except DM."
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:621
+#: qcsrc/client/hud/panel/scoreboard.qc:628
+#: qcsrc/client/hud/panel/scoreboard.qc:680
+#: qcsrc/client/hud/panel/scoreboard.qc:691
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:46
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:47
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:121
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:164
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:169
+msgid "N/A"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:1206
+#, c-format
+msgid "Accuracy stats (average %d%%)"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:1354
+msgid "Map stats:"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:1384
+msgid "Monsters killed:"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:1391
+msgid "Secrets found:"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:1413
+msgid "Capture time rankings"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:1413
+msgid "Rankings"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:1631
+#, c-format
+msgid "^3%1.0f minutes"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:1640
+#: qcsrc/client/hud/panel/scoreboard.qc:1647
+#, c-format
+msgid "^5%s %s"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:1641
+#: qcsrc/client/hud/panel/scoreboard.qc:1648
+#: qcsrc/client/hud/panel/scoreboard.qc:1667
+#: qcsrc/client/hud/panel/scoreboard.qc:1674
+msgid "SCO^points"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:1666
+#: qcsrc/client/hud/panel/scoreboard.qc:1673
+#, c-format
+msgid "^2+%s %s"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:1684
+#, c-format
+msgid "^7Map: ^2%s"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:1823
+#, c-format
+msgid "Speed award: %d%s ^7(%s^7)"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:1827
+#, c-format
+msgid "All-time fastest: %d%s ^7(%s^7)"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:1843
+#, c-format
+msgid "Spectators"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:1870
+#, c-format
+msgid "^1Respawning in ^3%s^1..."
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:1880
+#, c-format
+msgid "You are dead, wait ^3%s^7 before respawning"
+msgstr ""
+
+#: qcsrc/client/hud/panel/scoreboard.qc:1889
+#, c-format
+msgid "You are dead, press ^2%s^7 to respawn"
+msgstr ""
+
+#: qcsrc/client/hud/panel/timer.qc:72
+msgid "WARMUP"
+msgstr ""
+
+#: qcsrc/client/hud/panel/vote.qc:33
+msgid "^1You must answer before entering hud configure mode"
+msgstr ""
+
+#: qcsrc/client/hud/panel/vote.qc:36
+msgid "^2Name ^7instead of \"^1Anonymous player^7\" in stats"
+msgstr ""
+
+#: qcsrc/client/hud/panel/vote.qc:122
+msgid "A vote has been called for:"
+msgstr ""
+
+#: qcsrc/client/hud/panel/vote.qc:124
+msgid "Allow servers to store and display your name?"
+msgstr ""
+
+#: qcsrc/client/hud/panel/vote.qc:128
+msgid "^1Configure the HUD"
+msgstr ""
+
+#: qcsrc/client/hud/panel/vote.qc:132
+#: qcsrc/menu/xonotic/dialog_disconnect.qc:19
+#: qcsrc/menu/xonotic/dialog_firstrun.qc:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_demo_startconfirm.qc:18
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_demo_timeconfirm.qc:18
+#: qcsrc/menu/xonotic/dialog_quit.qc:14
+#: qcsrc/menu/xonotic/dialog_settings_bindings_reset.qc:14
+#: qcsrc/menu/xonotic/dialog_settings_game_hudconfirm.qc:26
+#: qcsrc/menu/xonotic/dialog_settings_misc_reset.qc:16
+#: qcsrc/menu/xonotic/dialog_uid2name.qc:15
+msgid "Yes"
+msgstr ""
+
+#: qcsrc/client/hud/panel/vote.qc:134
+#: qcsrc/menu/xonotic/dialog_disconnect.qc:22
+#: qcsrc/menu/xonotic/dialog_firstrun.qc:83
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_demo_startconfirm.qc:21
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_demo_timeconfirm.qc:21
+#: qcsrc/menu/xonotic/dialog_quit.qc:16
+#: qcsrc/menu/xonotic/dialog_settings_bindings_reset.qc:17
+#: qcsrc/menu/xonotic/dialog_settings_game_hudconfirm.qc:29
+#: qcsrc/menu/xonotic/dialog_settings_misc_reset.qc:17
+#: qcsrc/menu/xonotic/dialog_uid2name.qc:17
+msgid "No"
+msgstr ""
+
+#: qcsrc/client/hud/panel/weapons.qc:584
+msgid "Out of ammo"
+msgstr ""
+
+#: qcsrc/client/hud/panel/weapons.qc:588
+msgid "Don't have"
+msgstr ""
+
+#: qcsrc/client/hud/panel/weapons.qc:592
+msgid "Unavailable"
+msgstr ""
+
+#: qcsrc/client/main.qc:1000
+msgid " qu/s"
+msgstr ""
+
+#: qcsrc/client/main.qc:1002
+msgid " m/s"
+msgstr ""
+
+#: qcsrc/client/main.qc:1004
+msgid " km/h"
+msgstr ""
+
+#: qcsrc/client/main.qc:1006
+msgid " mph"
+msgstr ""
+
+#: qcsrc/client/main.qc:1008
+msgid " knots"
+msgstr ""
+
+#: qcsrc/client/main.qc:1255
+#, c-format
+msgid "%s (not bound)"
+msgstr ""
+
+#: qcsrc/client/mapvoting.qc:59
+msgid " (1 vote)"
+msgstr ""
+
+#: qcsrc/client/mapvoting.qc:61
+#, c-format
+msgid " (%d votes)"
+msgstr ""
+
+#: qcsrc/client/mapvoting.qc:281
+msgid "Don't care"
+msgstr ""
+
+#: qcsrc/client/mapvoting.qc:382
+msgid "Decide the gametype"
+msgstr ""
+
+#: qcsrc/client/mapvoting.qc:382
+msgid "Vote for a map"
+msgstr ""
+
+#: qcsrc/client/mapvoting.qc:399
+#, c-format
+msgid "%d seconds left"
+msgstr ""
+
+#: qcsrc/client/mapvoting.qc:512
+msgid "mv_mapdownload: ^3You're not supposed to use this command on your own!"
+msgstr ""
+
+#: qcsrc/client/mapvoting.qc:522
+msgid "^1Error:^7 Couldn't find pak index."
+msgstr ""
+
+#: qcsrc/client/mapvoting.qc:531
+msgid "Requesting preview..."
+msgstr ""
+
+#: qcsrc/client/miscfunctions.qc:111
+msgid "Trying to remove a team which is not in the teamlist!"
+msgstr ""
+
+#: qcsrc/client/view.qc:939
+msgid "Nade timer"
+msgstr ""
+
+#: qcsrc/client/view.qc:944
+msgid "Capture progress"
+msgstr ""
+
+#: qcsrc/client/view.qc:949
+msgid "Revival progress"
+msgstr ""
+
+#: qcsrc/common/command/generic.qc:156
+msgid "error creating curl handle"
+msgstr ""
+
+#: qcsrc/common/command/generic.qc:412
+msgid "Notification restart command only works with cl_cmd and sv_cmd."
+msgstr ""
+
+#: qcsrc/common/gamemodes/gamemode/nexball/weapon.qh:7
+msgid "Ball Stealer"
+msgstr ""
+
+#: qcsrc/common/items/item/ammo.qh:66
+msgid "bullets"
+msgstr ""
+
+#: qcsrc/common/items/item/ammo.qh:96
+msgid "cells"
+msgstr ""
+
+#: qcsrc/common/items/item/ammo.qh:126
+msgid "plasma"
+msgstr ""
+
+#: qcsrc/common/items/item/ammo.qh:156
+msgid "rockets"
+msgstr ""
+
+#: qcsrc/common/items/item/ammo.qh:190
+msgid "shells"
+msgstr ""
+
+#: qcsrc/common/items/item/armor.qh:42
+msgid "Small armor"
+msgstr ""
+
+#: qcsrc/common/items/item/armor.qh:80
+msgid "Medium armor"
+msgstr ""
+
+#: qcsrc/common/items/item/armor.qh:118 qcsrc/common/items/item/armor.qh:121
+msgid "Big armor"
+msgstr ""
+
+#: qcsrc/common/items/item/armor.qh:158 qcsrc/common/items/item/armor.qh:161
+msgid "Mega armor"
+msgstr ""
+
+#: qcsrc/common/items/item/health.qh:42
+msgid "Small health"
+msgstr ""
+
+#: qcsrc/common/items/item/health.qh:80
+msgid "Medium health"
+msgstr ""
+
+#: qcsrc/common/items/item/health.qh:118 qcsrc/common/items/item/health.qh:121
+msgid "Big health"
+msgstr ""
+
+#: qcsrc/common/items/item/health.qh:158 qcsrc/common/items/item/health.qh:161
+msgid "Mega health"
+msgstr ""
+
+#: qcsrc/common/items/item/jetpack.qh:38 qcsrc/common/items/item/jetpack.qh:41
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:91
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:215
+msgid "Jetpack"
+msgstr ""
+
+#: qcsrc/common/items/item/jetpack.qh:71
+msgid "fuel"
+msgstr ""
+
+#: qcsrc/common/items/item/jetpack.qh:96
+msgid "Fuel regenerator"
+msgstr ""
+
+#: qcsrc/common/items/item/jetpack.qh:99
+msgid "Fuel regen"
+msgstr ""
+
+#: qcsrc/common/items/item/powerup.qh:43 qcsrc/common/items/item/powerup.qh:46
+msgid "Strength"
+msgstr ""
+
+#: qcsrc/common/items/item/powerup.qh:79 qcsrc/common/items/item/powerup.qh:82
+msgid "Shield"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qc:626
+#, no-c-format
+msgid "@!#%'n Tuba Throwing"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:72 qcsrc/common/mapinfo.qh:334
+#: qcsrc/common/mapinfo.qh:529
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:105
+msgid "Frag limit:"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:72 qcsrc/common/mapinfo.qh:334
+#: qcsrc/common/mapinfo.qh:529
+msgid "The amount of frags needed before the match will end"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:115
+msgid "Deathmatch"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:115
+msgid "Score as many frags as you can"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:128
+msgid "Last Man Standing"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:128
+msgid "Survive and kill until the enemies have no lives left"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:137
+msgid "Lives:"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:149
+msgid "Race"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:149
+msgid "Race against other players to the finish line"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:176
+msgid "Laps:"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:189
+msgid "Race CTS"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:189
+msgid "Race for fastest time."
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:206 qcsrc/common/mapinfo.qh:257
+#: qcsrc/common/mapinfo.qh:373 qcsrc/common/mapinfo.qh:416
+#: qcsrc/common/mapinfo.qh:442 qcsrc/common/mapinfo.qh:462
+#: qcsrc/common/mapinfo.qh:582
+msgid "Point limit:"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:219
+msgid "Help your team score the most frags against the enemy team"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:219
+msgid "Team Deathmatch"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:257 qcsrc/common/mapinfo.qh:373
+#: qcsrc/common/mapinfo.qh:416
+msgid "The amount of points needed before the match will end"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:271
+msgid "Capture the Flag"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:271
+msgid ""
+"Find and bring the enemy flag to your base to capture it, defend your base "
+"from the other team"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:289
+msgid "Capture limit:"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:289
+msgid "The amount of captures needed before the match will end"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:306
+msgid "Clan Arena"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:306
+msgid "Kill all enemy teammates to win the round"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:350
+msgid "Capture and defend all the control points to win"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:350
+msgid "Domination"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:388
+msgid "Gather all the keys to win the round"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:388
+msgid "Key Hunt"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:428
+msgid "Assault"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:428
+msgid ""
+"Destroy obstacles to find and destroy the enemy power core before time runs "
+"out"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:452
+msgid "Capture control points to reach and destroy the enemy generator"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:452
+msgid "Onslaught"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:474
+msgid "Nexball"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:474
+msgid "Shoot and kick the ball into the enemies goal, keep your goal clean"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:488
+msgid "Goals:"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:488
+msgid "The amount of goals needed before the match will end"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:501
+msgid "Freeze Tag"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:501
+msgid ""
+"Kill enemies to freeze them, stand next to frozen teammates to revive them; "
+"freeze all enemies to win"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:545
+msgid "Hold the ball to get points for kills"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:545
+msgid "Keepaway"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:560
+msgid "Invasion"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:560
+msgid "Survive against waves of monsters"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:590
+msgid "Duel"
+msgstr ""
+
+#: qcsrc/common/mapinfo.qh:590
+msgid "Fight in a one versus one arena battle to decide the winner"
+msgstr ""
+
+#: qcsrc/common/minigames/cl_minigames.qc:383
+msgid "It's your turn"
+msgstr ""
+
+#: qcsrc/common/minigames/cl_minigames_hud.qc:366
+#: qcsrc/menu/xonotic/dialog_quit.qh:6
+msgid "Quit"
+msgstr ""
+
+#: qcsrc/common/minigames/cl_minigames_hud.qc:371
+msgid "Invite"
+msgstr ""
+
+#: qcsrc/common/minigames/cl_minigames_hud.qc:410
+msgid "Current Game"
+msgstr ""
+
+#: qcsrc/common/minigames/cl_minigames_hud.qc:435
+msgid "Exit Menu"
+msgstr ""
+
+#: qcsrc/common/minigames/cl_minigames_hud.qc:447
+#: qcsrc/menu/xonotic/dialog_multiplayer.qc:16
+msgid "Create"
+msgstr ""
+
+#: qcsrc/common/minigames/cl_minigames_hud.qc:450
+msgid "Join"
+msgstr ""
+
+#: qcsrc/common/minigames/cl_minigames_hud.qc:526
+msgid "Minigames"
+msgstr ""
+
+#: qcsrc/common/minigames/cl_minigames_hud.qc:587
+msgid "Minigame message"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/bd.qc:2
+msgid "Bulldozer"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/bd.qc:1092
+#: qcsrc/common/minigames/minigame/ps.qc:421
+#: qcsrc/common/minigames/minigame/ps.qc:427
+msgid "Game over!"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/bd.qc:1095
+msgid "Well done! Click 'Next Level' to continue"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/bd.qc:1162
+msgid "Better luck next time!"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/bd.qc:1167
+msgid "Tubular! Press \"Next Level\" to continue!"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/bd.qc:1169
+msgid "Wicked! Press \"Next Level\" to continue!"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/bd.qc:1173
+msgid "Press the space bar to change your currently selected tile"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/bd.qc:1176
+msgid "Push the boulders onto the targets"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/bd.qc:1403
+msgid "Next Level"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/bd.qc:1404
+msgid "Restart"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/bd.qc:1405
+msgid "Editor"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/bd.qc:1406
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.qc:37
+msgid "Save"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/c4.qc:2
+msgid "Connect Four"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/c4.qc:311
+#: qcsrc/common/minigames/minigame/c4.qc:317
+#: qcsrc/common/minigames/minigame/nmm.qc:491
+#: qcsrc/common/minigames/minigame/nmm.qc:497
+#: qcsrc/common/minigames/minigame/pp.qc:362
+#: qcsrc/common/minigames/minigame/pp.qc:368
+#, c-format
+msgid "%s^7 won the game!"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/c4.qc:373
+#: qcsrc/common/minigames/minigame/pp.qc:438
+#: qcsrc/common/minigames/minigame/ttt.qc:319
+msgid "Draw"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/c4.qc:378
+#: qcsrc/common/minigames/minigame/nmm.qc:606
+#: qcsrc/common/minigames/minigame/pp.qc:444
+#: qcsrc/common/minigames/minigame/ttt.qc:326
+msgid "You lost the game!"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/c4.qc:379
+#: qcsrc/common/minigames/minigame/nmm.qc:607
+#: qcsrc/common/minigames/minigame/pp.qc:445
+#: qcsrc/common/minigames/minigame/ttt.qc:327
+msgid "You win!"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/c4.qc:383
+#: qcsrc/common/minigames/minigame/nmm.qc:611
+#: qcsrc/common/minigames/minigame/pp.qc:456
+#: qcsrc/common/minigames/minigame/ttt.qc:338
+msgid "Wait for your opponent to make their move"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/c4.qc:386
+#: qcsrc/common/minigames/minigame/nmm.qc:613
+#: qcsrc/common/minigames/minigame/pp.qc:459
+#: qcsrc/common/minigames/minigame/ttt.qc:341
+msgid "Click on the game board to place your piece"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/nmm.qc:7
+msgid "Nine Men's Morris"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/nmm.qc:615
+msgid ""
+"You can select one of your pieces to move it in one of the surrounding places"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/nmm.qc:617
+msgid "You can select one of your pieces to move it anywhere on the board"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/nmm.qc:619
+msgid "You can take one of the opponent's pieces"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/pong.qc:2
+msgid "Pong"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/pong.qc:589
+#: qcsrc/common/minigames/minigame/ttt.qc:299
+msgid "AI"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/pong.qc:606
+msgid "Press ^1Start Match^7 to start the match with the current players"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/pong.qc:679
+msgid "Start Match"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/pong.qc:680
+msgid "Add AI player"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/pong.qc:681
+msgid "Remove AI player"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/pp.qc:2
+msgid "Push-Pull"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/pp.qc:444
+#: qcsrc/common/minigames/minigame/ttt.qc:326
+msgid "Select \"^1Next Match^7\" on the menu for a rematch!"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/pp.qc:445
+#: qcsrc/common/minigames/minigame/pp.qc:451
+#: qcsrc/common/minigames/minigame/ttt.qc:327
+#: qcsrc/common/minigames/minigame/ttt.qc:333
+msgid "Select \"^1Next Match^7\" on the menu to start a new match!"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/pp.qc:452
+#: qcsrc/common/minigames/minigame/ttt.qc:334
+msgid "Wait for your opponent to confirm the rematch"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/pp.qc:587
+#: qcsrc/common/minigames/minigame/ttt.qc:671
+msgid "Next Match"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/ps.qc:2
+msgid "Peg Solitaire"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/ps.qc:414
+msgid "All pieces cleared!"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/ps.qc:416
+msgid "Remaining pieces:"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/ps.qc:481
+#, c-format
+msgid "Pieces left: %s"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/ps.qc:491
+msgid "No more valid moves"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/ps.qc:494
+msgid "Well done, you win!"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/ps.qc:497
+msgid "Jump a piece over another to capture it"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/ttt.qc:2
+msgid "Tic Tac Toe"
+msgstr ""
+
+#: qcsrc/common/minigames/minigame/ttt.qc:672
+msgid "Single Player"
+msgstr ""
+
+#: qcsrc/common/monsters/monster/mage.qh:17
+#: qcsrc/menu/xonotic/dialog_monstertools.qc:18
+msgid "Mage"
+msgstr ""
+
+#: qcsrc/common/monsters/monster/mage.qh:29
+msgid "Mage spike"
+msgstr ""
+
+#: qcsrc/common/monsters/monster/shambler.qh:17
+#: qcsrc/menu/xonotic/dialog_monstertools.qc:17
+msgid "Shambler"
+msgstr ""
+
+#: qcsrc/common/monsters/monster/spider.qh:17
+#: qcsrc/menu/xonotic/dialog_monstertools.qc:16
+msgid "Spider"
+msgstr ""
+
+#: qcsrc/common/monsters/monster/spider.qh:28
+msgid "Spider attack"
+msgstr ""
+
+#: qcsrc/common/monsters/monster/wyvern.qh:17
+#: qcsrc/menu/xonotic/dialog_monstertools.qc:19
+msgid "Wyvern"
+msgstr ""
+
+#: qcsrc/common/monsters/monster/wyvern.qh:28
+msgid "Wyvern attack"
+msgstr ""
+
+#: qcsrc/common/monsters/monster/zombie.qh:17
+#: qcsrc/menu/xonotic/dialog_monstertools.qc:15
+msgid "Zombie"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/buffs/all.inc:16
+msgid "Ammo"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/buffs/all.inc:25
+msgid "Resistance"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/buffs/all.inc:34
+#: qcsrc/common/mutators/mutator/instagib/items.qh:126
+#: qcsrc/common/mutators/mutator/instagib/items.qh:129
+msgid "Speed"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/buffs/all.inc:44
+msgid "Medic"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/buffs/all.inc:54
+msgid "Bash"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/buffs/all.inc:63
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:83
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:184
+msgid "Vampire"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/buffs/all.inc:71
+msgid "Disability"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/buffs/all.inc:79
+msgid "Vengeance"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/buffs/all.inc:87
+msgid "Jump"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/buffs/all.inc:96
+msgid "Invisible"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/buffs/all.inc:105
+msgid "Inferno"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/buffs/all.inc:113
+msgid "Swapper"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/buffs/all.inc:121
+msgid "Magnet"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/buffs/all.inc:129
+msgid "Luck"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/buffs/all.inc:137
+msgid "Flight"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/buffs/buffs.qh:11
+msgid "Buff"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/damagetext/ui_damagetext.qc:8
+msgid "Damage text"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/damagetext/ui_damagetext.qc:18
+msgid "Draw damage numbers"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/damagetext/ui_damagetext.qc:20
+msgid "Font size minimum:"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/damagetext/ui_damagetext.qc:25
+msgid "Font size maximum:"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/damagetext/ui_damagetext.qc:30
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:55
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:102
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:60
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:109
+#: qcsrc/menu/xonotic/util.qc:775
+msgid "Color:"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/damagetext/ui_damagetext.qc:36
+msgid "Draw damage numbers for friendly fire"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/instagib/items.qh:33
+msgid "Vaporizer ammo"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/instagib/items.qh:59
+#: qcsrc/common/mutators/mutator/instagib/items.qh:62
+msgid "Extra life"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/instagib/items.qh:91
+#: qcsrc/common/mutators/mutator/instagib/items.qh:94
+msgid "Invisibility"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/nades/nades.inc:18
+msgid "Napalm grenade"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/nades/nades.inc:26
+msgid "Ice grenade"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/nades/nades.inc:34
+msgid "Translocate grenade"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/nades/nades.inc:42
+msgid "Spawn grenade"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/nades/nades.inc:50
+msgid "Heal grenade"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/nades/nades.inc:58
+msgid "Monster grenade"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/nades/nades.inc:66
+msgid "Entrap grenade"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/nades/nades.inc:74
+msgid "Veil grenade"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/nades/nades.qh:33
+msgid "Grenade"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/overkill/okhmg.qh:20
+msgid "Overkill Heavy Machine Gun"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/overkill/okmachinegun.qh:18
+msgid "Overkill MachineGun"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/overkill/oknex.qh:19
+msgid "Overkill Nex"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/overkill/okrpc.qh:20
+msgid "Overkill Rocket Propelled Chainsaw"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/overkill/okshotgun.qh:18
+msgid "Overkill Shotgun"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:3
+msgid "Waypoint"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:4
+msgid "Help me!"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:5
+msgid "Here"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:6
+msgid "DANGER"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:8
+msgid "Frozen!"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:10
+msgid "Item"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:12
+msgid "Checkpoint"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:13
+#: qcsrc/common/mutators/mutator/waypoints/waypointsprites.qc:240
+msgid "Finish"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:14
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:15
+#: qcsrc/common/mutators/mutator/waypoints/waypointsprites.qc:240
+msgid "Start"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:17
+msgid "Defend"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:18
+msgid "Destroy"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:19
+msgid "Push"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:21
+msgid "Flag carrier"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:22
+msgid "Enemy carrier"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:23
+msgid "Dropped flag"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:24
+msgid "White base"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:25
+msgid "Red base"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:26
+msgid "Blue base"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:27
+msgid "Yellow base"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:28
+msgid "Pink base"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:29
+msgid "Return flag here"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:31
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:32
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:33
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:34
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:35
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:51
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:52
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:53
+msgid "Control point"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:37
+msgid "Dropped key"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:38
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:40
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:41
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:42
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:43
+msgid "Key carrier"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:39
+msgid "Run here"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:45
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:48
+msgid "Ball"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:46
+msgid "Ball carrier"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:49
+msgid "Goal"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:54
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:55
+msgid "Generator"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:57
+msgid "Weapon"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:59
+msgid "Monster"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:61
+msgid "Vehicle"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:62
+msgid "Intruder!"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/all.inc:64
+msgid "Tagged"
+msgstr ""
+
+#: qcsrc/common/mutators/mutator/waypoints/waypointsprites.qc:697
+#, c-format
+msgid "%s needing help!"
+msgstr ""
+
+#: qcsrc/common/net_notice.qc:90
+msgid "^1Server notices:"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:230
+msgid "^F4NOTE: ^BGSpectator chat is not sent to players during the match"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:232
+#, c-format
+msgid "^BG%s^BG captured the ^TC^TT^BG flag"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:233
+#, c-format
+msgid ""
+"^BG%s^BG captured the ^TC^TT^BG flag in ^F1%s^BG seconds, breaking ^BG"
+"%s^BG's previous record of ^F2%s^BG seconds"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:234
+#, c-format
+msgid "^BG%s^BG captured the flag"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:235
+#, c-format
+msgid "^BG%s^BG captured the ^TC^TT^BG flag in ^F1%s^BG seconds"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:236
+#, c-format
+msgid ""
+"^BG%s^BG captured the ^TC^TT^BG flag in ^F2%s^BG seconds, failing to break "
+"^BG%s^BG's previous record of ^F1%s^BG seconds"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:237
+msgid "^BGThe ^TC^TT^BG flag was returned to base by its owner"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:238
+msgid "^BGThe flag was returned by its owner"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:239
+msgid "^BGThe ^TC^TT^BG flag was destroyed and returned to base"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:240
+msgid "^BGThe flag was destroyed and returned to base"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:241
+msgid "^BGThe ^TC^TT^BG flag was dropped in the base and returned itself"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:242
+msgid "^BGThe flag was dropped in the base and returned itself"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:243
+msgid ""
+"^BGThe ^TC^TT^BG flag fell somewhere it couldn't be reached and returned to "
+"base"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:244
+msgid "^BGThe flag fell somewhere it couldn't be reached and returned to base"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:245
+#, c-format
+msgid ""
+"^BGThe ^TC^TT^BG flag became impatient after ^F1%.2f^BG seconds and returned "
+"itself"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:246
+#, c-format
+msgid ""
+"^BGThe flag became impatient after ^F1%.2f^BG seconds and returned itself"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:247
+msgid "^BGThe ^TC^TT^BG flag has returned to the base"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:248
+msgid "^BGThe flag has returned to the base"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:249
+#, c-format
+msgid "^BG%s^BG lost the ^TC^TT^BG flag"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:250
+#, c-format
+msgid "^BG%s^BG lost the flag"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:251
+#, c-format
+msgid "^BG%s^BG got the ^TC^TT^BG flag"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:252
+#, c-format
+msgid "^BG%s^BG got the flag"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:253
+#: qcsrc/common/notifications/all.inc:254
+#, c-format
+msgid "^BG%s^BG returned the ^TC^TT^BG flag"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:256
+#: qcsrc/common/notifications/all.inc:544
+#, c-format
+msgid "^F2Throwing coin... Result: %s^F2!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:258
+msgid "^BGYou don't have any fuel for the ^F1Jetpack"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:260
+msgid "^F2You lack a UID, superspec options will not be saved/restored"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:262
+msgid "^F1Round already started, you will join the game in the next round"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:263
+msgid "^F2You will spectate in the next round"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:265
+#, c-format
+msgid "^BG%s%s^K1 was killed by ^BG%s^K1's ^BG%s^K1 buff ^K1%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:265
+#, c-format
+msgid "^BG%s%s^K1 was scored against by ^BG%s^K1's ^BG%s^K1 buff ^K1%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:266
+#, c-format
+msgid "^BG%s%s^K1 was unfairly eliminated by ^BG%s^K1%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:267
+#, c-format
+msgid "^BG%s%s^K1 was drowned by ^BG%s^K1%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:268
+#, c-format
+msgid "^BG%s%s^K1 was grounded by ^BG%s^K1%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:269
+#, c-format
+msgid "^BG%s%s^K1 felt a little hot from ^BG%s^K1's fire^K1%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:269
+#, c-format
+msgid "^BG%s%s^K1 was burnt up into a crisp by ^BG%s^K1%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:270
+#, c-format
+msgid "^BG%s%s^K1 was cooked by ^BG%s^K1%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:271
+#, c-format
+msgid "^BG%s%s^K1 was pushed in front of a monster by ^BG%s^K1%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:272
+#, c-format
+msgid "^BG%s%s^K1 was blown up by ^BG%s^K1's Nade%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:273
+#, c-format
+msgid "^BG%s%s^K1 got too close to a napalm explosion%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:273
+#, c-format
+msgid "^BG%s%s^K1 was burned to death by ^BG%s^K1's Napalm Nade%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:274
+#, c-format
+msgid "^BG%s%s^K1 was blown up by ^BG%s^K1's Ice Nade%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:275
+#, c-format
+msgid "^BG%s%s^K1 was frozen to death by ^BG%s^K1's Ice Nade%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:276
+#, c-format
+msgid "^BG%s%s^K1 has not been healed by ^BG%s^K1's Healing Nade%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:277
+#, c-format
+msgid "^BG%s%s^K1 was shot into space by ^BG%s^K1%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:278
+#, c-format
+msgid "^BG%s%s^K1 was slimed by ^BG%s^K1%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:279
+#, c-format
+msgid "^BG%s%s^K1 was preserved by ^BG%s^K1%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:280
+#, c-format
+msgid "^BG%s%s^K1 tried to occupy ^BG%s^K1's teleport destination space%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:280
+#, c-format
+msgid "^BG%s%s^K1 was telefragged by ^BG%s^K1%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:281
+#, c-format
+msgid "^BG%s%s^K1 died in an accident with ^BG%s^K1%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:282
+#, c-format
+msgid ""
+"^BG%s%s^K1 got caught in the blast when ^BG%s^K1's Bumblebee exploded%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:283
+#, c-format
+msgid "^BG%s%s^K1 saw the pretty lights of ^BG%s^K1's Bumblebee gun%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:284
+#, c-format
+msgid "^BG%s%s^K1 was crushed by ^BG%s^K1%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:285
+#, c-format
+msgid "^BG%s%s^K1 was cluster bombed by ^BG%s^K1's Raptor%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:286
+#, c-format
+msgid "^BG%s%s^K1 couldn't resist ^BG%s^K1's purple blobs%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:287
+#, c-format
+msgid "^BG%s%s^K1 got caught in the blast when ^BG%s^K1's Raptor exploded%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:288
+#, c-format
+msgid ""
+"^BG%s%s^K1 got caught in the blast when ^BG%s^K1's Spiderbot exploded%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:289
+#, c-format
+msgid "^BG%s%s^K1 got shredded by ^BG%s^K1's Spiderbot%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:290
+#, c-format
+msgid "^BG%s%s^K1 was blasted to bits by ^BG%s^K1's Spiderbot%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:291
+#, c-format
+msgid "^BG%s%s^K1 got caught in the blast when ^BG%s^K1's Racer exploded%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:292
+#, c-format
+msgid "^BG%s%s^K1 was bolted down by ^BG%s^K1's Racer%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:293
+#, c-format
+msgid "^BG%s%s^K1 couldn't find shelter from ^BG%s^K1's Racer%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:294
+#, c-format
+msgid "^BG%s%s^K1 was thrown into a world of hurt by ^BG%s^K1%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:296
+#, c-format
+msgid "^BG%s^K1 was moved into the %s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:297
+#, c-format
+msgid "^BG%s^K1 became enemies with the Lord of Teamplay%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:298
+#, c-format
+msgid "^BG%s^K1 thought they found a nice camping ground%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:299
+#, c-format
+msgid "^BG%s^K1 unfairly eliminated themself%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:301
+#, c-format
+msgid "^BG%s^K1 couldn't catch their breath%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:301
+#, c-format
+msgid "^BG%s^K1 was in the water for too long%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:302
+#, c-format
+msgid "^BG%s^K1 hit the ground with a bit too much force%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:302
+#, c-format
+msgid "^BG%s^K1 hit the ground with a crunch%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:303
+#, c-format
+msgid "^BG%s^K1 became a bit too crispy%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:303
+#, c-format
+msgid "^BG%s^K1 felt a little hot%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:304
+#, c-format
+msgid "^BG%s^K1 died%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:305
+#, c-format
+msgid "^BG%s^K1 found a hot place%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:305
+#, c-format
+msgid "^BG%s^K1 turned into hot slag%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:306
+#, c-format
+msgid "^BG%s^K1 was exploded by a Mage%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:307
+#, c-format
+msgid "^BG%s^K1's innards became outwards by a Shambler%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:308
+#, c-format
+msgid "^BG%s^K1 was smashed by a Shambler%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:309
+#, c-format
+msgid "^BG%s^K1 was zapped to death by a Shambler%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:310
+#, c-format
+msgid "^BG%s^K1 was bitten by a Spider%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:311
+#, c-format
+msgid "^BG%s^K1 was fireballed by a Wyvern%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:312
+#, c-format
+msgid "^BG%s^K1 joins the Zombies%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:313
+#, c-format
+msgid "^BG%s^K1 was given kung fu lessons by a Zombie%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:314
+#: qcsrc/common/notifications/all.inc:316
+#, c-format
+msgid "^BG%s^K1 mastered the art of self-nading%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:315
+#, c-format
+msgid ""
+"^BG%s^K1 decided to take a look at the results of their napalm explosion%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:315
+#, c-format
+msgid "^BG%s^K1 was burned to death by their own Napalm Nade%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:317
+#, c-format
+msgid "^BG%s^K1 felt a little chilly%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:317
+#, c-format
+msgid "^BG%s^K1 was frozen to death by their own Ice Nade%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:318
+#, c-format
+msgid "^BG%s^K1's Healing Nade didn't quite heal them%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:319
+#, c-format
+msgid "^BG%s^K1 died%s%s. What's the point of living without ammo?"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:319
+#, c-format
+msgid "^BG%s^K1 ran out of ammo%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:320
+#, c-format
+msgid "^BG%s^K1 rotted away%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:321
+#, c-format
+msgid "^BG%s^K1 became a shooting star%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:322
+#, c-format
+msgid "^BG%s^K1 was slimed%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:323
+#, c-format
+msgid "^BG%s^K1 couldn't take it anymore%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:324
+#, c-format
+msgid "^BG%s^K1 is now preserved for centuries to come%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:325
+#, c-format
+msgid "^BG%s^K1 switched to the %s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:326
+#, c-format
+msgid "^BG%s^K1 died in an accident%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:327
+#, c-format
+msgid "^BG%s^K1 ran into a turret%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:328
+#, c-format
+msgid "^BG%s^K1 was blasted away by an eWheel turret%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:329
+#, c-format
+msgid "^BG%s^K1 got caught up in the FLAC turret fire%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:330
+#, c-format
+msgid "^BG%s^K1 was blasted away by a Hellion turret%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:331
+#, c-format
+msgid "^BG%s^K1 could not hide from the Hunter turret%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:332
+#, c-format
+msgid "^BG%s^K1 was riddled full of holes by a Machinegun turret%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:333
+#, c-format
+msgid "^BG%s^K1 got turned into smoldering gibs by an MLRS turret%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:334
+#, c-format
+msgid "^BG%s^K1 was phased out by a turret%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:335
+#, c-format
+msgid "^BG%s^K1 got served some superheated plasma from a turret%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:336
+#, c-format
+msgid "^BG%s^K1 was electrocuted by a Tesla turret%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:337
+#, c-format
+msgid "^BG%s^K1 got served a lead enrichment by a Walker turret%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:338
+#, c-format
+msgid "^BG%s^K1 was impaled by a Walker turret%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:339
+#, c-format
+msgid "^BG%s^K1 was blasted away by a Walker turret%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:340
+#, c-format
+msgid "^BG%s^K1 got caught in the blast of a Bumblebee explosion%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:341
+#, c-format
+msgid "^BG%s^K1 was crushed by a vehicle%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:342
+#, c-format
+msgid "^BG%s^K1 was caught in a Raptor cluster bomb%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:343
+#, c-format
+msgid "^BG%s^K1 got caught in the blast of a Raptor explosion%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:344
+#, c-format
+msgid "^BG%s^K1 got caught in the blast of a Spiderbot explosion%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:345
+#, c-format
+msgid "^BG%s^K1 was blasted to bits by a Spiderbot rocket%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:346
+#, c-format
+msgid "^BG%s^K1 got caught in the blast of a Racer explosion%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:347
+#, c-format
+msgid "^BG%s^K1 couldn't find shelter from a Racer rocket%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:350
+#, c-format
+msgid "^BG%s^K1 was betrayed by ^BG%s^K1%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:352
+#, c-format
+msgid "^BG%s^BG%s^BG (%s %s every %s seconds)"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:354
+#, c-format
+msgid "^BG%s^K1 was frozen by ^BG%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:355
+#, c-format
+msgid "^BG%s^K3 was revived by ^BG%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:356
+#, c-format
+msgid "^BG%s^K3 was revived by falling"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:357
+#, c-format
+msgid "^BG%s^K3 was revived by their Nade explosion"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:358
+#, c-format
+msgid "^BG%s^K3 was automatically revived after %s seconds"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:359
+#, c-format
+msgid "^BG%s^K1 froze themself"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:361
+#: qcsrc/common/notifications/all.inc:675
+msgid "^TC^TT^BG team wins the round"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:362
+#: qcsrc/common/notifications/all.inc:676
+#, c-format
+msgid "^BG%s^BG wins the round"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:363
+#: qcsrc/common/notifications/all.inc:539
+msgid "^BGRound tied"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:364
+#: qcsrc/common/notifications/all.inc:540
+msgid "^BGRound over, there's no winner"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:366
+#, c-format
+msgid "^BGGodmode saved you %s units of damage, cheater!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:368
+#, c-format
+msgid "^BG%s^BG got the %s^BG buff!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:369
+#, c-format
+msgid "^BG%s^BG lost the %s^BG buff!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:370
+#: qcsrc/common/notifications/all.inc:683
+#, c-format
+msgid "^BGYou dropped the %s^BG buff!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:371
+#: qcsrc/common/notifications/all.inc:684
+#, c-format
+msgid "^BGYou got the %s^BG buff!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:373
+#: qcsrc/common/notifications/all.inc:687
+#, c-format
+msgid "^BGYou do not have the ^F1%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:374
+#: qcsrc/common/notifications/all.inc:688
+#, c-format
+msgid "^BGYou dropped the ^F1%s^BG%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:375
+#: qcsrc/common/notifications/all.inc:689
+#, c-format
+msgid "^BGYou got the ^F1%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:376
+#: qcsrc/common/notifications/all.inc:690
+#, c-format
+msgid "^BGYou don't have enough ammo for the ^F1%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:377
+#: qcsrc/common/notifications/all.inc:691
+#, c-format
+msgid "^F1%s %s^BG is unable to fire, but its ^F1%s^BG can"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:378
+#: qcsrc/common/notifications/all.inc:692
+#, c-format
+msgid "^F1%s^BG is ^F4not available^BG on this map"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:380
+#, c-format
+msgid "^BG%s^BG is connecting..."
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:381
+#, c-format
+msgid "^BG%s^F3 connected"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:382
+#, c-format
+msgid "^BG%s^F3 is now playing"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:383
+#, c-format
+msgid "^BG%s^F3 is now playing on the ^TC^TT team"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:385
+#: qcsrc/common/notifications/all.inc:697
+#, c-format
+msgid "^BG%s^BG has dropped the ball!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:386
+#: qcsrc/common/notifications/all.inc:698
+#, c-format
+msgid "^BG%s^BG has picked up the ball!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:388
+#, c-format
+msgid "^BG%s^BG captured the keys for the ^TC^TT team"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:389
+#, c-format
+msgid "^BG%s^BG dropped the ^TC^TT Key"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:390
+#, c-format
+msgid "^BG%s^BG lost the ^TC^TT Key"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:391
+#, c-format
+msgid "^BG%s^BG pushed %s^BG causing the ^TC^TT Key ^BGdestruction"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:392
+#, c-format
+msgid "^BG%s^BG destroyed the ^TC^TT Key"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:393
+#, c-format
+msgid "^BG%s^BG picked up the ^TC^TT Key"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:395
+#, c-format
+msgid "^BG%s^F3 forfeited"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:396
+#, c-format
+msgid "^BG%s^F3 has no more lives left"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:398
+msgid "^BGMonsters are currently disabled"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:400
+msgid "^BGThe ^TC^TT^BG team held the ball for too long"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:402
+#, c-format
+msgid "^BG%s^BG captured %s^BG control point"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:403
+#, c-format
+msgid "^BG%s^BG captured a control point"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:404
+#, c-format
+msgid "^TC^TT^BG team %s^BG control point has been destroyed by %s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:405
+#, c-format
+msgid "^TC^TT^BG team control point has been destroyed by %s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:406
+msgid "^TC^TT^BG generator has been destroyed"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:407
+msgid "^TC^TT^BG generator spontaneously combusted due to overtime!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:409
+#, c-format
+msgid "^BG%s^K1 picked up Invisibility"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:410
+#, c-format
+msgid "^BG%s^K1 picked up Shield"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:411
+#, c-format
+msgid "^BG%s^K1 picked up Speed"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:412
+#, c-format
+msgid "^BG%s^K1 picked up Strength"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:414
+#, c-format
+msgid "^BG%s^F3 disconnected"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:415
+#, c-format
+msgid "^BG%s^F3 was kicked for idling"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:416
+msgid ""
+"^F2You were kicked from the server because you are a spectator and "
+"spectators aren't allowed at the moment."
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:417
+#, c-format
+msgid "^BG%s^F3 was kicked for excessive teamkilling"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:418
+#, c-format
+msgid "^BG%s^F3 is now spectating"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:420
+#, c-format
+msgid "^BG%s^BG has abandoned the race"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:421
+#, c-format
+msgid "^BG%s^BG couldn't break their %s%s^BG place record of %s%s %s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:422
+#, c-format
+msgid "^BG%s^BG couldn't break the %s%s^BG place record of %s%s %s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:423
+#, c-format
+msgid "^BG%s^BG has finished the race"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:424
+#, c-format
+msgid "^BG%s^BG broke %s^BG's %s%s^BG place record with %s%s %s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:425
+#, c-format
+msgid "^BG%s^BG improved their %s%s^BG place record with %s%s %s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:426
+#, c-format
+msgid ""
+"^BG%s^BG scored a new record with ^F2%s^BG, but unfortunately lacks a UID "
+"and will be lost."
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:427
+#, c-format
+msgid ""
+"^BG%s^BG scored a new record with ^F2%s^BG, but is anonymous and will be "
+"lost."
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:428
+#, c-format
+msgid "^BG%s^BG set the %s%s^BG place record with %s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:430
+#, c-format
+msgid ""
+"^F4You have been invited by ^BG%s^F4 to join their game of ^F2%s^F4 "
+"(^F1%s^F4)"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:432
+msgid "^TC^TT ^BGteam scores!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:434
+#, c-format
+msgid ""
+"^F2You have to become a player within the next %s, otherwise you will be "
+"kicked, because spectating isn't allowed at this time!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:436
+#, c-format
+msgid "^BG%s^K1 picked up a Superweapon"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:438
+msgid "^BGYou cannot change to a larger team"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:439
+msgid "^BGYou are not allowed to change teams"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:441
+#, c-format
+msgid ""
+"^F4NOTE: ^BGThe server is running ^F1Xonotic %s (beta)^BG, you have "
+"^F2Xonotic %s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:442
+#, c-format
+msgid ""
+"^F4NOTE: ^BGThe server is running ^F1Xonotic %s^BG, you have ^F2Xonotic %s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:443
+#, c-format
+msgid ""
+"^F4NOTE: ^F1Xonotic %s^BG is out, and you still have ^F2Xonotic %s^BG - get "
+"the update from ^F3http://www.xonotic.org/^BG!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:445
+#, c-format
+msgid "^F3SVQC Build information: ^F4%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:447
+#, c-format
+msgid ""
+"^BG%s%s^K1 died of ^BG%s^K1's great playing on the @!#%%'n Accordeon%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:448
+#, c-format
+msgid "^BG%s^K1 hurt their own ears with the @!#%%'n Accordeon%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:449
+#, c-format
+msgid "^BG%s%s^K1 was electrocuted by ^BG%s^K1's Arc%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:450
+#, c-format
+msgid "^BG%s%s^K1 was blasted by ^BG%s^K1's Arc bolts%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:451
+#, c-format
+msgid "^BG%s%s^K1 was shot to death by ^BG%s^K1's Blaster%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:452
+#, c-format
+msgid "^BG%s^K1 shot themself to hell with their Blaster%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:453
+#, c-format
+msgid "^BG%s%s^K1 felt the strong pull of ^BG%s^K1's Crylink%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:454
+#, c-format
+msgid "^BG%s^K1 felt the strong pull of their Crylink%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:455
+#, c-format
+msgid "^BG%s%s^K1 ate ^BG%s^K1's rocket%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:456
+#, c-format
+msgid "^BG%s%s^K1 got too close to ^BG%s^K1's rocket%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:457
+#, c-format
+msgid "^BG%s^K1 blew themself up with their Devastator%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:458
+#, c-format
+msgid "^BG%s%s^K1 was blasted by ^BG%s^K1's Electro bolt%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:459
+#, c-format
+msgid "^BG%s%s^K1 felt the electrifying air of ^BG%s^K1's Electro combo%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:460
+#, c-format
+msgid "^BG%s%s^K1 got too close to ^BG%s^K1's Electro orb%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:461
+#, c-format
+msgid "^BG%s^K1 played with Electro bolts%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:462
+#, c-format
+msgid "^BG%s^K1 could not remember where they put their Electro orb%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:463
+#, c-format
+msgid "^BG%s%s^K1 got too close to ^BG%s^K1's fireball%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:464
+#, c-format
+msgid "^BG%s%s^K1 got burnt by ^BG%s^K1's firemine%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:465
+#, c-format
+msgid "^BG%s^K1 should have used a smaller gun%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:466
+#, c-format
+msgid "^BG%s^K1 forgot about their firemine%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:467
+#, c-format
+msgid "^BG%s%s^K1 was pummeled by a burst of ^BG%s^K1's Hagar rockets%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:468
+#, c-format
+msgid "^BG%s%s^K1 was pummeled by ^BG%s^K1's Hagar rockets%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:469
+#, c-format
+msgid "^BG%s^K1 played with tiny Hagar rockets%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:470
+#, c-format
+msgid "^BG%s%s^K1 was cut down with ^BG%s^K1's HLAC%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:471
+#, c-format
+msgid "^BG%s^K1 got a little jumpy with their HLAC%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:472
+#, c-format
+msgid "^BG%s%s^K1 was caught in ^BG%s^K1's Hook gravity bomb%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:473
+#, c-format
+msgid ""
+"^BG%s%s^K1 died of ^BG%s^K1's great playing on the @!#%%'n Klein Bottle%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:474
+#, c-format
+msgid "^BG%s^K1 hurt their own ears with the @!#%%'n Klein Bottle%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:475
+#, c-format
+msgid "^BG%s%s^K1 was sniped by ^BG%s^K1's Machine Gun%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:476
+#, c-format
+msgid "^BG%s%s^K1 was riddled full of holes by ^BG%s^K1's Machine Gun%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:477
+#: qcsrc/common/notifications/all.inc:782
+#, c-format
+msgid "^BGYou cannot place more than ^F2%s^BG mines at a time"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:478
+#, c-format
+msgid "^BG%s%s^K1 got too close to ^BG%s^K1's mine%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:479
+#, c-format
+msgid "^BG%s^K1 forgot about their mine%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:480
+#, c-format
+msgid "^BG%s%s^K1 got too close to ^BG%s^K1's Mortar grenade%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:481
+#, c-format
+msgid "^BG%s%s^K1 ate ^BG%s^K1's Mortar grenade%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:482
+#, c-format
+msgid "^BG%s^K1 didn't see their own Mortar grenade%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:483
+#, c-format
+msgid "^BG%s^K1 blew themself up with their own Mortar%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:484
+#, c-format
+msgid "^BG%s%s^K1 was sniped by ^BG%s^K1's Overkill Heavy Machine Gun%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:485
+#, c-format
+msgid ""
+"^BG%s%s^K1 was torn to bits by ^BG%s^K1's Overkill Heavy Machine Gun%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:486
+#, c-format
+msgid ""
+"^BG%s%s^K1 was riddled full of holes by ^BG%s^K1's Overkill Machine Gun%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:487
+#, c-format
+msgid "^BG%s%s^K1 has been vaporized by ^BG%s^K1's Overkill Nex%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:488
+#, c-format
+msgid ""
+"^BG%s%s^K1 was sawn in half by ^BG%s^K1's Overkill Rocket Propelled Chainsaw"
+"%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:489
+#, c-format
+msgid ""
+"^BG%s%s^K1 almost dodged ^BG%s^K1's Overkill Rocket Propelled Chainsaw%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:490
+#, c-format
+msgid ""
+"^BG%s^K1 was sawn in half by their own Overkill Rocket Propelled Chainsaw%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:491
+#, c-format
+msgid ""
+"^BG%s^K1 blew themself up with their Overkill Rocket Propelled Chainsaw%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:493
+#, c-format
+msgid "^BG%s%s^K1 was gunned down by ^BG%s^K1's Overkill Shotgun%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:494
+#, c-format
+msgid "^BG%s%s^K1 was sniped with a Rifle by ^BG%s^K1%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:495
+#, c-format
+msgid "^BG%s%s^K1 died in ^BG%s^K1's Rifle bullet hail%s%s"
+msgstr ""
+
+#: 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 ""
+
+#: 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 ""
+
+#: qcsrc/common/notifications/all.inc:498
+#, c-format
+msgid "^BG%s%s^K1 was pummeled by ^BG%s^K1's Seeker rockets%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:499
+#, c-format
+msgid "^BG%s%s^K1 was tagged by ^BG%s^K1's Seeker%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:500
+#, c-format
+msgid "^BG%s^K1 played with tiny Seeker rockets%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:501
+#, c-format
+msgid "^BG%s%s^K1 was gunned down by ^BG%s^K1's Shockwave%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:502
+#, c-format
+msgid "^BG%s%s^K1 slapped ^BG%s^K1 around a bit with a large Shockwave%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:503
+#, c-format
+msgid "^BG%s%s^K1 was gunned down by ^BG%s^K1's Shotgun%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:504
+#, c-format
+msgid "^BG%s%s^K1 slapped ^BG%s^K1 around a bit with a large Shotgun%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:505
+#, c-format
+msgid "^BG%s^K1 is now thinking with portals%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:506
+#, c-format
+msgid "^BG%s%s^K1 died of ^BG%s^K1's great playing on the @!#%%'n Tuba%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:507
+#, c-format
+msgid "^BG%s^K1 hurt their own ears with the @!#%%'n Tuba%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:508
+#, c-format
+msgid "^BG%s%s^K1 has been sublimated by ^BG%s^K1's Vaporizer%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:509
+#, c-format
+msgid "^BG%s%s^K1 has been vaporized by ^BG%s^K1's Vortex%s%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:528
+msgid "^F4You are now alone!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:530
+msgid "^BGYou are attacking!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:531
+msgid "^BGYou are defending!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:532
+#, c-format
+msgid "^BGObjective destroyed in ^F4%s^BG!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:534
+msgid "^F4Begin!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:535
+msgid "^F4Game starts in ^COUNT"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:536
+msgid "^F4Round starts in ^COUNT"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:537
+msgid "^F4Round cannot start"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:542
+msgid "^F2Don't camp!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:546
+msgid ""
+"^BGYou are now free.\n"
+"^BGFeel free to ^F2try to capture^BG the flag again\n"
+"^BGif you think you will succeed."
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:547
+msgid "^BGThis flag is currently inactive"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:548
+msgid ""
+"^BGYou are now ^F1shielded^BG from the flag(s)\n"
+"^BGfor ^F2too many unsuccessful attempts^BG to capture.\n"
+"^BGMake some defensive scores before trying again."
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:549
+msgid "^BGYou captured the ^TC^TT^BG flag!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:550
+msgid "^BGYou captured the flag!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:551
+#, c-format
+msgid "^BGToo many flag throws! Throwing disabled for %s."
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:552
+#, c-format
+msgid "^BG%s^BG passed the ^TC^TT^BG flag to %s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:553
+#, c-format
+msgid "^BG%s^BG passed the flag to %s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:554
+#, c-format
+msgid "^BGYou received the ^TC^TT^BG flag from %s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:555
+#, c-format
+msgid "^BGYou received the flag from %s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:556
+#, c-format
+msgid "^BGPress ^F2%s^BG to receive the flag from %s^BG"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:557
+#, c-format
+msgid "^BGRequesting %s^BG to pass you the flag"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:558
+#, c-format
+msgid "^BGYou passed the ^TC^TT^BG flag to %s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:559
+#, c-format
+msgid "^BGYou passed the flag to %s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:560
+msgid "^BGYou got the ^TC^TT^BG flag!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:561
+msgid "^BGYou got the flag!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:562
+#, c-format
+msgid "^BGYou got your %steam^BG's flag, return it!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:563
+#, c-format
+msgid "^BGYou got the %senemy^BG's flag, return it!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:564
+#, c-format
+msgid "^BGThe %senemy^BG got your flag! Retrieve it!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:565
+#, c-format
+msgid "^BGThe %senemy (^BG%s%s)^BG got your flag! Retrieve it!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:566
+#, c-format
+msgid "^BGThe %senemy^BG got the flag! Retrieve it!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:567
+#, c-format
+msgid "^BGThe %senemy (^BG%s%s)^BG got the flag! Retrieve it!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:568
+#, c-format
+msgid "^BGThe %senemy^BG got their flag! Retrieve it!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:569
+#, c-format
+msgid "^BGThe %senemy (^BG%s%s)^BG got their flag! Retrieve it!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:570
+#, c-format
+msgid "^BGYour %steam mate^BG got the ^TC^TT^BG flag! Protect them!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:571
+#, c-format
+msgid "^BGYour %steam mate (^BG%s%s)^BG got the ^TC^TT^BG flag! Protect them!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:572
+#, c-format
+msgid "^BGYour %steam mate^BG got the flag! Protect them!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:573
+#, c-format
+msgid "^BGYour %steam mate (^BG%s%s)^BG got the flag! Protect them!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:574
+msgid "^BGEnemies can now see you on radar!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:575
+msgid "^BGYou returned the ^TC^TT^BG flag!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:576
+msgid "^BGStalemate! Enemies can now see you on radar!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:577
+msgid "^BGStalemate! Flag carriers can now be seen by enemies on radar!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:581
+#, c-format
+msgid "^K3%sYou fragged ^BG%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:582
+#: qcsrc/common/notifications/all.inc:591
+#: qcsrc/common/notifications/all.inc:600
+#, c-format
+msgid "^K3%sYou scored against ^BG%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:583
+#, c-format
+msgid "^K1%sYou were fragged by ^BG%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:584
+#: qcsrc/common/notifications/all.inc:593
+#: qcsrc/common/notifications/all.inc:602
+#, c-format
+msgid "^K1%sYou were scored against by ^BG%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:590
+#, c-format
+msgid "^K3%sYou burned ^BG%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:592
+#, c-format
+msgid "^K1%sYou were burned by ^BG%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:599
+#, c-format
+msgid "^K3%sYou froze ^BG%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:601
+#, c-format
+msgid "^K1%sYou were frozen by ^BG%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:608
+#, c-format
+msgid "^K1%sYou typefragged ^BG%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:609
+#, c-format
+msgid "^K1%sYou scored against ^BG%s^K1 while they were typing"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:610
+#, c-format
+msgid "^K1%sYou were typefragged by ^BG%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:611
+#, c-format
+msgid "^K1%sYou were scored against by ^BG%s^K1 while typing"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:617
+#, c-format
+msgid "^BGPress ^F2%s^BG again to toss the nade!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:618
+msgid "^F2You got a ^K1BONUS GRENADE^F2!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:620
+#, c-format
+msgid ""
+"^BGYou have been moved into a different team\n"
+"You are now on: %s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:621
+msgid "^K1Don't go against your team mates!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:621
+msgid "^K1Don't shoot your team mates!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:622
+msgid "^K1Die camper!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:622
+msgid "^K1Reconsider your tactics, camper!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:623
+msgid "^K1You unfairly eliminated yourself!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:624
+#, c-format
+msgid "^K1You were %s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:625
+msgid "^K1You couldn't catch your breath!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:626
+msgid "^K1You hit the ground with a crunch!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:627
+msgid "^K1You felt a little too hot!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:627
+msgid "^K1You got a little bit too crispy!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:628
+msgid "^K1You killed your own dumb self!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:628
+msgid "^K1You need to be more careful!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:629
+msgid "^K1You couldn't stand the heat!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:630
+msgid "^K1You need to watch out for monsters!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:630
+msgid "^K1You were killed by a monster!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:631
+msgid "^K1Tastes like chicken!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:631
+msgid "^K1You forgot to put the pin back in!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:632
+msgid "^K1Hanging around a napalm explosion is bad!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:633
+msgid "^K1You felt a little chilly!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:633
+msgid "^K1You got a little bit too cold!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:634
+msgid "^K1Your Healing Nade is a bit defective"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:635
+msgid "^K1You are respawning for running out of ammo..."
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:635
+msgid "^K1You were killed for running out of ammo..."
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:636
+msgid "^K1You grew too old without taking your medicine"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:636
+msgid "^K1You need to preserve your health"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:637
+msgid "^K1You became a shooting star!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:638
+msgid "^K1You melted away in slime!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:639
+msgid "^K1You committed suicide!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:639
+msgid "^K1You ended it all!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:640
+msgid "^K1You got stuck in a swamp!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:641
+#, c-format
+msgid "^BGYou are now on: %s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:642
+msgid "^K1You died in an accident!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:643
+msgid "^K1You had an unfortunate run in with a turret!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:643
+msgid "^K1You were fragged by a turret!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:644
+msgid "^K1You had an unfortunate run in with an eWheel turret!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:644
+msgid "^K1You were fragged by an eWheel turret!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:645
+msgid "^K1You had an unfortunate run in with a Walker turret!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:645
+msgid "^K1You were fragged by a Walker turret!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:646
+msgid "^K1You got caught in the blast of a Bumblebee explosion!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:647
+msgid "^K1You were crushed by a vehicle!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:648
+msgid "^K1You were caught in a Raptor cluster bomb!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:649
+msgid "^K1You got caught in the blast of a Raptor explosion!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:650
+msgid "^K1You got caught in the blast of a Spiderbot explosion!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:651
+msgid "^K1You were blasted to bits by a Spiderbot rocket!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:652
+msgid "^K1You got caught in the blast of a Racer explosion!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:653
+msgid "^K1You couldn't find shelter from a Racer rocket!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:654
+msgid "^K1Watch your step!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:656
+#, c-format
+msgid "^K1Moron! You fragged ^BG%s^K1, a team mate!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:656
+#, c-format
+msgid "^K1Moron! You went against ^BG%s^K1, a team mate!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:657
+#, c-format
+msgid "^K1You were fragged by ^BG%s^K1, a team mate"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:657
+#, c-format
+msgid "^K1You were scored against by ^BG%s^K1, a team mate"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:659
+msgid ""
+"^K1Stop idling!\n"
+"^BGDisconnecting in ^COUNT..."
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:661
+#, c-format
+msgid "^BGYou need %s^BG!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:662
+#, c-format
+msgid "^BGYou also need %s^BG!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:663
+msgid "^BGDoor unlocked!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:665
+#, c-format
+msgid "^F2Extra lives taken: ^K1%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:667
+#, c-format
+msgid "^K3You revived ^BG%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:668
+msgid "^K3You revived yourself"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:669
+#, c-format
+msgid "^K3You were revived by ^BG%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:670
+#, c-format
+msgid "^K3You were automatically revived after %s seconds"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:672
+msgid "^BGThe generator is under attack!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:674
+msgid "^TC^TT^BG team loses the round"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:678
+msgid "^K1You froze yourself"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:679
+msgid "^K1Round already started, you spawn as frozen"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:681
+#, c-format
+msgid "^K1A %s has arrived!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:685
+msgid "^BGYou got the ^F1Fuel regenerator"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:686
+msgid "^BGYou got the ^F1Jetpack"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:694
+msgid ""
+"^K1No spawnpoints available!\n"
+"Hope your team can fix it..."
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:695
+msgid ""
+"^K1You may not join the game at this time.\n"
+"The player limit reached maximum capacity."
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:699
+msgid "^BGYou picked up the ball"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:700
+msgid "^BGKilling people while you don't have the ball gives no points!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:702
+msgid ""
+"^BGAll keys are in your team's hands!\n"
+"Help the key carriers to meet!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:703
+msgid ""
+"^BGAll keys are in ^TC^TT team^BG's hands!\n"
+"Interfere ^F4NOW^BG!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:704
+msgid ""
+"^BGAll keys are in your team's hands!\n"
+"Meet the other key carriers ^F4NOW^BG!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:705
+msgid "^F4Round will start in ^COUNT"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:706
+msgid "^BGScanning frequency range..."
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:707
+msgid "^BGYou are starting with the ^TC^TT Key"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:709
+msgid "^BGYou have no lives left, you must wait until the next match"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:711
+#, c-format
+msgid ""
+"^BGWaiting for players to join...\n"
+"Need active players for: %s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:712
+#, c-format
+msgid "^BGWaiting for %s player(s) to join..."
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:714
+msgid "^BGYour weapon has been downgraded until you find some ammo!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:715
+msgid "^F4^COUNT^BG left to find some ammo!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:716
+msgid "^BGGet some ammo or you'll be dead in ^F4^COUNT^BG!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:716
+msgid "^BGGet some ammo! ^F4^COUNT^BG left!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:717
+#, c-format
+msgid "^F2Extra lives remaining: ^K1%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:719 qcsrc/menu/xonotic/campaign.qc:244
+#, c-format
+msgid "Level %s: "
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:719
+#, c-format
+msgid "^BGPress ^F2%s^BG to enter the game"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:722
+#, c-format
+msgid ""
+"^F2^COUNT^BG until weapon change...\n"
+"Next weapon: ^F1%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:723
+#, c-format
+msgid "^F2Active weapon: ^F1%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:725
+#, c-format
+msgid "^BGYou captured %s^BG control point"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:726
+msgid "^BGYou captured a control point"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:727
+#, c-format
+msgid "^TC^TT^BG team captured %s^BG control point"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:728
+msgid "^TC^TT^BG team captured a control point"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:729
+msgid "^BGThis control point currently cannot be captured"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:730
+msgid ""
+"^BGThe enemy generator cannot be destroyed yet\n"
+"^F2Capture some control points to unshield it"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:731
+msgid "^BGThe ^TCenemy^BG generator is no longer shielded!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:732
+msgid ""
+"^K1Your generator is NOT shielded!\n"
+"^BGRe-capture control points to shield it!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:733
+#, c-format
+msgid "^BGPress ^F2%s^BG to teleport"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:734
+#, c-format
+msgid "^BGTeleporting disabled for %s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:736
+msgid ""
+"^F2Now playing ^F4OVERTIME^F2!\n"
+"Keep fragging until we have a winner!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:736
+msgid ""
+"^F2Now playing ^F4OVERTIME^F2!\n"
+"Keep scoring until we have a winner!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:737
+msgid ""
+"^F2Now playing ^F4OVERTIME^F2!\n"
+"\n"
+"Generators are now decaying.\n"
+"The more control points your team holds,\n"
+"the faster the enemy generator decays"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:738
+#, c-format
+msgid ""
+"^F2Now playing ^F4OVERTIME^F2!\n"
+"^BGAdded ^F4%s^BG to the game!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:740
+msgid "^K1In^BG-portal created"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:741
+msgid "^F3Out^BG-portal created"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:742
+msgid "^F1Portal creation failed"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:744
+msgid "^F2Strength infuses your weapons with devastating power"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:745
+msgid "^F2Strength has worn off"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:747
+msgid "^F2Shield surrounds you"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:748
+msgid "^F2Shield has worn off"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:750
+msgid "^F2You are on speed"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:751
+msgid "^F2Speed has worn off"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:753
+msgid "^F2You are invisible"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:754
+msgid "^F2Invisibility has worn off"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:756
+msgid "^F2The race is over, finish your lap!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:758
+msgid "^BGSequence completed!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:759
+msgid "^BGThere are more to go..."
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:760
+#, c-format
+msgid "^BGOnly %s^BG more to go..."
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:762
+msgid "^F2Superweapons have broken down"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:763
+msgid "^F2Superweapons have been lost"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:764
+msgid "^F2You now have a superweapon"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:766
+msgid "^K1Changing to ^TC^TT^K1 in ^COUNT"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:767
+msgid "^K1Changing team in ^COUNT"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:768
+msgid "^K1Spectating in ^COUNT"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:769
+msgid "^K1Suicide in ^COUNT"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:771
+msgid "^F4Timeout begins in ^COUNT"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:772
+msgid "^F4Timeout ends in ^COUNT"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:774
+msgid "^K1Cannot join given minigame session!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:776
+#, c-format
+msgid "^BGPress ^F2%s^BG to enter/exit the vehicle"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:777
+#, c-format
+msgid "^BGPress ^F2%s^BG to enter the vehicle gunner"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:778
+#, c-format
+msgid "^BGPress ^F2%s^BG to steal this vehicle"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:779
+msgid ""
+"^F2The enemy is stealing one of your vehicles!\n"
+"^F4Stop them!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.inc:780
+msgid "^F2Intruder detected, disabling shields!"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:198
+msgid "Notification dump command only works with cl_cmd and sv_cmd."
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:408 qcsrc/common/notifications/all.qh:409
+#, c-format
+msgid " (near %s)"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:416 qcsrc/common/notifications/all.qh:417
+msgid "primary"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:416 qcsrc/common/notifications/all.qh:417
+msgid "secondary"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:419
+msgid "point"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:419
+msgid "points"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:428
+msgid "drop flag"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:429
+msgid "throw nade"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:455
+#, c-format
+msgid "%s^K1 made a TRIPLE FRAG! %s^BG"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:455
+#, c-format
+msgid "%s^K1 made a TRIPLE SCORE! %s^BG"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:455
+msgid "TRIPLE FRAG! "
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:456
+#, c-format
+msgid "%s^K1 made FIVE SCORES IN A ROW! %s^BG"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:456
+#, c-format
+msgid "%s^K1 unlocked RAGE! %s^BG"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:456
+msgid "RAGE! "
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:457
+#, c-format
+msgid "%s^K1 made TEN SCORES IN A ROW! %s^BG"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:457
+#, c-format
+msgid "%s^K1 started a MASSACRE! %s^BG"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:457
+msgid "MASSACRE! "
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:458
+#, c-format
+msgid "%s^K1 executed MAYHEM! %s^BG"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:458
+#, c-format
+msgid "%s^K1 made FIFTEEN SCORES IN A ROW! %s^BG"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:458
+msgid "MAYHEM! "
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:459
+#, c-format
+msgid "%s^K1 is a BERSERKER! %s^BG"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:459
+#, c-format
+msgid "%s^K1 made TWENTY SCORES IN A ROW! %s^BG"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:459
+msgid "BERSERKER! "
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:460
+#, c-format
+msgid "%s^K1 inflicts CARNAGE! %s^BG"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:460
+#, c-format
+msgid "%s^K1 made TWENTY FIVE SCORES IN A ROW! %s^BG"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:460
+msgid "CARNAGE! "
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:461
+#, c-format
+msgid "%s^K1 made THIRTY SCORES IN A ROW! %s^BG"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:461
+#, c-format
+msgid "%s^K1 unleashes ARMAGEDDON! %s^BG"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:461
+msgid "ARMAGEDDON! "
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:468
+#, c-format
+msgid "%s(^F1Bot^BG)"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:470
+#, c-format
+msgid "%s(Ping ^F1%d^BG)"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:477
+#, c-format
+msgid ""
+"\n"
+"(Health ^1%d^BG / Armor ^2%d^BG)%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:479
+#, c-format
+msgid ""
+"\n"
+"(^F4Dead^BG)%s"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:500 qcsrc/common/notifications/all.qh:513
+#, c-format
+msgid "%d score spree! "
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:512
+#, c-format
+msgid "%d frag spree! "
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:525
+msgid "First blood! "
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:525
+msgid "First score! "
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:529
+msgid "First casualty! "
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:529
+msgid "First victim! "
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:570
+#, c-format
+msgid "%s^K1 has %d frags in a row! %s^BG"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:571
+#, c-format
+msgid "%s^K1 made %d scores in a row! %s^BG"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:589
+#, c-format
+msgid "%s^K1 drew first blood! %s^BG"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:590
+#, c-format
+msgid "%s^K1 got the first score! %s^BG"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:606
+#, c-format
+msgid ", ending their %d frag spree"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:607
+#, c-format
+msgid ", ending their %d score spree"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:621
+#, c-format
+msgid ", losing their %d frag spree"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:622
+#, c-format
+msgid ", losing their %d score spree"
+msgstr ""
+
+#: qcsrc/common/notifications/all.qh:647
+#, c-format
+msgid " with %d %s"
+msgstr ""
+
+#: qcsrc/common/teams.qh:31
+msgid "TEAM^Red"
+msgstr ""
+
+#: qcsrc/common/teams.qh:32
+msgid "TEAM^Blue"
+msgstr ""
+
+#: qcsrc/common/teams.qh:33
+msgid "TEAM^Yellow"
+msgstr ""
+
+#: qcsrc/common/teams.qh:34
+msgid "TEAM^Pink"
+msgstr ""
+
+#: qcsrc/common/teams.qh:35
+msgid "Team"
+msgstr ""
+
+#: qcsrc/common/teams.qh:36
+msgid "Neutral"
+msgstr ""
+
+#: qcsrc/common/teams.qh:39
+msgid "KEY^Red"
+msgstr ""
+
+#: qcsrc/common/teams.qh:40
+msgid "KEY^Blue"
+msgstr ""
+
+#: qcsrc/common/teams.qh:41
+msgid "KEY^Yellow"
+msgstr ""
+
+#: qcsrc/common/teams.qh:42
+msgid "KEY^Pink"
+msgstr ""
+
+#: qcsrc/common/teams.qh:43
+msgid "FLAG^Red"
+msgstr ""
+
+#: qcsrc/common/teams.qh:44
+msgid "FLAG^Blue"
+msgstr ""
+
+#: qcsrc/common/teams.qh:45
+msgid "FLAG^Yellow"
+msgstr ""
+
+#: qcsrc/common/teams.qh:46
+msgid "FLAG^Pink"
+msgstr ""
+
+#: qcsrc/common/teams.qh:47
+msgid "GENERATOR^Red"
+msgstr ""
+
+#: qcsrc/common/teams.qh:48
+msgid "GENERATOR^Blue"
+msgstr ""
+
+#: qcsrc/common/teams.qh:49
+msgid "GENERATOR^Yellow"
+msgstr ""
+
+#: qcsrc/common/teams.qh:50
+msgid "GENERATOR^Pink"
+msgstr ""
+
+#: qcsrc/common/turrets/all.qh:95
+msgid "Turrets dump command only works with sv_cmd."
+msgstr ""
+
+#: qcsrc/common/turrets/cl_turrets.qc:125
+#, c-format
+msgid "%s under attack!"
+msgstr ""
+
+#: qcsrc/common/turrets/turret.qh:11
+msgid "Turret"
+msgstr ""
+
+#: qcsrc/common/turrets/turret/ewheel.qh:15
+msgid "eWheel Turret"
+msgstr ""
+
+#: qcsrc/common/turrets/turret/ewheel_weapon.qh:7
+msgid "eWheel"
+msgstr ""
+
+#: qcsrc/common/turrets/turret/flac.qh:13
+msgid "FLAC Cannon"
+msgstr ""
+
+#: qcsrc/common/turrets/turret/flac_weapon.qh:7
+msgid "FLAC"
+msgstr ""
+
+#: qcsrc/common/turrets/turret/fusionreactor.qh:11
+msgid "Fusion Reactor"
+msgstr ""
+
+#: qcsrc/common/turrets/turret/hellion.qh:13
+msgid "Hellion Missile Turret"
+msgstr ""
+
+#: qcsrc/common/turrets/turret/hellion_weapon.qh:7
+msgid "Hellion"
+msgstr ""
+
+#: qcsrc/common/turrets/turret/hk.qh:15
+msgid "Hunter-Killer Turret"
+msgstr ""
+
+#: qcsrc/common/turrets/turret/hk_weapon.qh:7
+msgid "Hunter-Killer"
+msgstr ""
+
+#: qcsrc/common/turrets/turret/machinegun.qh:13
+msgid "Machinegun Turret"
+msgstr ""
+
+#: qcsrc/common/turrets/turret/machinegun_weapon.qh:7
+msgid "Machinegun"
+msgstr ""
+
+#: qcsrc/common/turrets/turret/mlrs.qh:13
+msgid "MLRS Turret"
+msgstr ""
+
+#: qcsrc/common/turrets/turret/mlrs_weapon.qh:7
+msgid "MLRS"
+msgstr ""
+
+#: qcsrc/common/turrets/turret/phaser.qh:13
+msgid "Phaser Cannon"
+msgstr ""
+
+#: qcsrc/common/turrets/turret/phaser_weapon.qh:7
+msgid "Phaser"
+msgstr ""
+
+#: qcsrc/common/turrets/turret/plasma.qh:13
+msgid "Plasma Cannon"
+msgstr ""
+
+#: qcsrc/common/turrets/turret/plasma_dual.qh:8
+msgid "Dual plasma"
+msgstr ""
+
+#: qcsrc/common/turrets/turret/plasma_dual.qh:20
+msgid "Dual Plasma Cannon"
+msgstr ""
+
+#: qcsrc/common/turrets/turret/plasma_weapon.qh:7
+msgid "Plasma"
+msgstr ""
+
+#: qcsrc/common/turrets/turret/tesla.qh:13
+#: qcsrc/common/turrets/turret/tesla_weapon.qh:7
+msgid "Tesla Coil"
+msgstr ""
+
+#: qcsrc/common/turrets/turret/walker.qh:15
+msgid "Walker Turret"
+msgstr ""
+
+#: qcsrc/common/turrets/turret/walker_weapon.qh:7
+msgid "Walker"
+msgstr ""
+
+#: qcsrc/common/util.qc:1390
+#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:176
+#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:186
+msgid "Male"
+msgstr ""
+
+#: qcsrc/common/util.qc:1391
+#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:175
+#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:185
+msgid "Female"
+msgstr ""
+
+#: qcsrc/common/util.qc:1392
+#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:174
+#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:187
+msgid "Undisclosed"
+msgstr ""
+
+#: qcsrc/common/util.qc:1439
+msgid "<KEY NOT FOUND>"
+msgstr ""
+
+#: qcsrc/common/util.qc:1440
+msgid "<UNKNOWN KEYNUM>"
+msgstr ""
+
+#: qcsrc/common/util.qc:1445
+msgid "TAB"
+msgstr ""
+
+#: qcsrc/common/util.qc:1446 qcsrc/common/util.qc:1517
+#, c-format
+msgid "ENTER"
+msgstr ""
+
+#: qcsrc/common/util.qc:1447
+msgid "ESCAPE"
+msgstr ""
+
+#: qcsrc/common/util.qc:1448
+msgid "SPACE"
+msgstr ""
+
+#: qcsrc/common/util.qc:1450
+msgid "BACKSPACE"
+msgstr ""
+
+#: qcsrc/common/util.qc:1451 qcsrc/common/util.qc:1508
+#, c-format
+msgid "UPARROW"
+msgstr ""
+
+#: qcsrc/common/util.qc:1452 qcsrc/common/util.qc:1503
+#, c-format
+msgid "DOWNARROW"
+msgstr ""
+
+#: qcsrc/common/util.qc:1453 qcsrc/common/util.qc:1505
+#, c-format
+msgid "LEFTARROW"
+msgstr ""
+
+#: qcsrc/common/util.qc:1454 qcsrc/common/util.qc:1506
+#, c-format
+msgid "RIGHTARROW"
+msgstr ""
+
+#: qcsrc/common/util.qc:1456
+msgid "ALT"
+msgstr ""
+
+#: qcsrc/common/util.qc:1457
+msgid "CTRL"
+msgstr ""
+
+#: qcsrc/common/util.qc:1458
+msgid "SHIFT"
+msgstr ""
+
+#: qcsrc/common/util.qc:1460 qcsrc/common/util.qc:1501
+#, c-format
+msgid "INS"
+msgstr ""
+
+#: qcsrc/common/util.qc:1461 qcsrc/common/util.qc:1511
+#, c-format
+msgid "DEL"
+msgstr ""
+
+#: qcsrc/common/util.qc:1462 qcsrc/common/util.qc:1504
+#, c-format
+msgid "PGDN"
+msgstr ""
+
+#: qcsrc/common/util.qc:1463 qcsrc/common/util.qc:1509
+#, c-format
+msgid "PGUP"
+msgstr ""
+
+#: qcsrc/common/util.qc:1464 qcsrc/common/util.qc:1507
+#, c-format
+msgid "HOME"
+msgstr ""
+
+#: qcsrc/common/util.qc:1465 qcsrc/common/util.qc:1502
+#, c-format
+msgid "END"
+msgstr ""
+
+#: qcsrc/common/util.qc:1467
+msgid "PAUSE"
+msgstr ""
+
+#: qcsrc/common/util.qc:1469
+msgid "NUMLOCK"
+msgstr ""
+
+#: qcsrc/common/util.qc:1470
+msgid "CAPSLOCK"
+msgstr ""
+
+#: qcsrc/common/util.qc:1471
+msgid "SCROLLOCK"
+msgstr ""
+
+#: qcsrc/common/util.qc:1473
+msgid "SEMICOLON"
+msgstr ""
+
+#: qcsrc/common/util.qc:1474
+msgid "TILDE"
+msgstr ""
+
+#: qcsrc/common/util.qc:1475
+msgid "BACKQUOTE"
+msgstr ""
+
+#: qcsrc/common/util.qc:1476
+msgid "QUOTE"
+msgstr ""
+
+#: qcsrc/common/util.qc:1477
+msgid "APOSTROPHE"
+msgstr ""
+
+#: qcsrc/common/util.qc:1478
+msgid "BACKSLASH"
+msgstr ""
+
+#: qcsrc/common/util.qc:1486
+#, c-format
+msgid "F%d"
+msgstr ""
+
+#: qcsrc/common/util.qc:1496
+#, c-format
+msgid "KP_%d"
+msgstr ""
+
+#: qcsrc/common/util.qc:1501 qcsrc/common/util.qc:1502
+#: qcsrc/common/util.qc:1503 qcsrc/common/util.qc:1504
+#: qcsrc/common/util.qc:1505 qcsrc/common/util.qc:1506
+#: qcsrc/common/util.qc:1507 qcsrc/common/util.qc:1508
+#: qcsrc/common/util.qc:1509 qcsrc/common/util.qc:1510
+#: qcsrc/common/util.qc:1511 qcsrc/common/util.qc:1512
+#: qcsrc/common/util.qc:1513 qcsrc/common/util.qc:1514
+#: qcsrc/common/util.qc:1515 qcsrc/common/util.qc:1516
+#: qcsrc/common/util.qc:1517 qcsrc/common/util.qc:1518
+#, c-format
+msgid "KP_%s"
+msgstr ""
+
+#: qcsrc/common/util.qc:1510
+#, c-format
+msgid "PERIOD"
+msgstr ""
+
+#: qcsrc/common/util.qc:1512
+#, c-format
+msgid "DIVIDE"
+msgstr ""
+
+#: qcsrc/common/util.qc:1513
+#, c-format
+msgid "SLASH"
+msgstr ""
+
+#: qcsrc/common/util.qc:1514
+#, c-format
+msgid "MULTIPLY"
+msgstr ""
+
+#: qcsrc/common/util.qc:1515
+#, c-format
+msgid "MINUS"
+msgstr ""
+
+#: qcsrc/common/util.qc:1516
+#, c-format
+msgid "PLUS"
+msgstr ""
+
+#: qcsrc/common/util.qc:1518
+#, c-format
+msgid "EQUALS"
+msgstr ""
+
+#: qcsrc/common/util.qc:1523
+msgid "PRINTSCREEN"
+msgstr ""
+
+#: qcsrc/common/util.qc:1526
+#, c-format
+msgid "MOUSE%d"
+msgstr ""
+
+#: qcsrc/common/util.qc:1528
+msgid "MWHEELUP"
+msgstr ""
+
+#: qcsrc/common/util.qc:1529
+msgid "MWHEELDOWN"
+msgstr ""
+
+#: qcsrc/common/util.qc:1532
+#, c-format
+msgid "JOY%d"
+msgstr ""
+
+#: qcsrc/common/util.qc:1535
+#, c-format
+msgid "AUX%d"
+msgstr ""
+
+#: qcsrc/common/util.qc:1542
+#, c-format
+msgid "DPAD_UP"
+msgstr ""
+
+#: qcsrc/common/util.qc:1542 qcsrc/common/util.qc:1543
+#: qcsrc/common/util.qc:1544 qcsrc/common/util.qc:1545
+#: qcsrc/common/util.qc:1546 qcsrc/common/util.qc:1547
+#: qcsrc/common/util.qc:1548 qcsrc/common/util.qc:1549
+#: qcsrc/common/util.qc:1550 qcsrc/common/util.qc:1551
+#: qcsrc/common/util.qc:1552 qcsrc/common/util.qc:1553
+#: qcsrc/common/util.qc:1554 qcsrc/common/util.qc:1555
+#: qcsrc/common/util.qc:1556 qcsrc/common/util.qc:1557
+#: qcsrc/common/util.qc:1558 qcsrc/common/util.qc:1559
+#: qcsrc/common/util.qc:1560 qcsrc/common/util.qc:1561
+#, c-format
+msgid "X360_%s"
+msgstr ""
+
+#: qcsrc/common/util.qc:1543
+#, c-format
+msgid "DPAD_DOWN"
+msgstr ""
+
+#: qcsrc/common/util.qc:1544
+#, c-format
+msgid "DPAD_LEFT"
+msgstr ""
+
+#: qcsrc/common/util.qc:1545
+#, c-format
+msgid "DPAD_RIGHT"
+msgstr ""
+
+#: qcsrc/common/util.qc:1546
+#, c-format
+msgid "START"
+msgstr ""
+
+#: qcsrc/common/util.qc:1547
+#, c-format
+msgid "BACK"
+msgstr ""
+
+#: qcsrc/common/util.qc:1548
+#, c-format
+msgid "LEFT_THUMB"
+msgstr ""
+
+#: qcsrc/common/util.qc:1549
+#, c-format
+msgid "RIGHT_THUMB"
+msgstr ""
+
+#: qcsrc/common/util.qc:1550
+#, c-format
+msgid "LEFT_SHOULDER"
+msgstr ""
+
+#: qcsrc/common/util.qc:1551
+#, c-format
+msgid "RIGHT_SHOULDER"
+msgstr ""
+
+#: qcsrc/common/util.qc:1552
+#, c-format
+msgid "LEFT_TRIGGER"
+msgstr ""
+
+#: qcsrc/common/util.qc:1553
+#, c-format
+msgid "RIGHT_TRIGGER"
+msgstr ""
+
+#: qcsrc/common/util.qc:1554
+#, c-format
+msgid "LEFT_THUMB_UP"
+msgstr ""
+
+#: qcsrc/common/util.qc:1555
+#, c-format
+msgid "LEFT_THUMB_DOWN"
+msgstr ""
+
+#: qcsrc/common/util.qc:1556
+#, c-format
+msgid "LEFT_THUMB_LEFT"
+msgstr ""
+
+#: qcsrc/common/util.qc:1557
+#, c-format
+msgid "LEFT_THUMB_RIGHT"
+msgstr ""
+
+#: qcsrc/common/util.qc:1558
+#, c-format
+msgid "RIGHT_THUMB_UP"
+msgstr ""
+
+#: qcsrc/common/util.qc:1559
+#, c-format
+msgid "RIGHT_THUMB_DOWN"
+msgstr ""
+
+#: qcsrc/common/util.qc:1560
+#, c-format
+msgid "RIGHT_THUMB_LEFT"
+msgstr ""
+
+#: qcsrc/common/util.qc:1561
+#, c-format
+msgid "RIGHT_THUMB_RIGHT"
+msgstr ""
+
+#: qcsrc/common/util.qc:1571 qcsrc/common/util.qc:1572
+#: qcsrc/common/util.qc:1573 qcsrc/common/util.qc:1574
+#, c-format
+msgid "JOY_%s"
+msgstr ""
+
+#: qcsrc/common/util.qc:1571
+#, c-format
+msgid "UP"
+msgstr ""
+
+#: qcsrc/common/util.qc:1572
+#, c-format
+msgid "DOWN"
+msgstr ""
+
+#: qcsrc/common/util.qc:1573
+#, c-format
+msgid "LEFT"
+msgstr ""
+
+#: qcsrc/common/util.qc:1574
+#, c-format
+msgid "RIGHT"
+msgstr ""
+
+#: qcsrc/common/util.qc:1580
+#, c-format
+msgid "MIDINOTE%d"
+msgstr ""
+
+#: qcsrc/common/vehicles/cl_vehicles.qc:190
+#, c-format
+msgid "Press %s"
+msgstr ""
+
+#: qcsrc/common/vehicles/vehicle/bumblebee.qc:954
+msgid "No right gunner!"
+msgstr ""
+
+#: qcsrc/common/vehicles/vehicle/bumblebee.qc:960
+msgid "No left gunner!"
+msgstr ""
+
+#: qcsrc/common/vehicles/vehicle/bumblebee.qh:19
+msgid "Bumblebee"
+msgstr ""
+
+#: qcsrc/common/vehicles/vehicle/racer.qh:19
+msgid "Racer"
+msgstr ""
+
+#: qcsrc/common/vehicles/vehicle/racer_weapon.qh:9
+msgid "Racer cannon"
+msgstr ""
+
+#: qcsrc/common/vehicles/vehicle/raptor.qh:19
+msgid "Raptor"
+msgstr ""
+
+#: qcsrc/common/vehicles/vehicle/raptor_weapons.qh:9
+msgid "Raptor cannon"
+msgstr ""
+
+#: qcsrc/common/vehicles/vehicle/raptor_weapons.qh:17
+msgid "Raptor bomb"
+msgstr ""
+
+#: qcsrc/common/vehicles/vehicle/raptor_weapons.qh:25
+msgid "Raptor flare"
+msgstr ""
+
+#: qcsrc/common/vehicles/vehicle/spiderbot.qh:19
+msgid "Spiderbot"
+msgstr ""
+
+#: qcsrc/common/weapons/all.qh:76
+msgid "Weapons dump command only works with sv_cmd."
+msgstr ""
+
+#: qcsrc/common/weapons/weapon/arc.qh:18
+msgid "Arc"
+msgstr ""
+
+#: qcsrc/common/weapons/weapon/blaster.qh:18
+msgid "Blaster"
+msgstr ""
+
+#: qcsrc/common/weapons/weapon/crylink.qh:18
+msgid "Crylink"
+msgstr ""
+
+#: qcsrc/common/weapons/weapon/devastator.qh:18
+msgid "Devastator"
+msgstr ""
+
+#: qcsrc/common/weapons/weapon/electro.qh:18
+msgid "Electro"
+msgstr ""
+
+#: qcsrc/common/weapons/weapon/fireball.qh:18
+msgid "Fireball"
+msgstr ""
+
+#: qcsrc/common/weapons/weapon/hagar.qh:18
+msgid "Hagar"
+msgstr ""
+
+#: qcsrc/common/weapons/weapon/hlac.qh:18
+msgid "Heavy Laser Assault Cannon"
+msgstr ""
+
+#: qcsrc/common/weapons/weapon/hook.qh:18
+msgid "Grappling Hook"
+msgstr ""
+
+#: qcsrc/common/weapons/weapon/machinegun.qh:18
+msgid "MachineGun"
+msgstr ""
+
+#: qcsrc/common/weapons/weapon/minelayer.qh:18
+msgid "Mine Layer"
+msgstr ""
+
+#: qcsrc/common/weapons/weapon/mortar.qh:18
+msgid "Mortar"
+msgstr ""
+
+#: qcsrc/common/weapons/weapon/porto.qh:18
+msgid "Port-O-Launch"
+msgstr ""
+
+#: qcsrc/common/weapons/weapon/rifle.qh:19
+msgid "Rifle"
+msgstr ""
+
+#: qcsrc/common/weapons/weapon/seeker.qh:18
+msgid "T.A.G. Seeker"
+msgstr ""
+
+#: qcsrc/common/weapons/weapon/shockwave.qh:18
+msgid "Shockwave"
+msgstr ""
+
+#: qcsrc/common/weapons/weapon/shotgun.qh:18
+msgid "Shotgun"
+msgstr ""
+
+#: qcsrc/common/weapons/weapon/tuba.qh:18
+#, no-c-format
+msgid "@!#%'n Tuba"
+msgstr ""
+
+#: qcsrc/common/weapons/weapon/vaporizer.qh:19
+msgid "Vaporizer"
+msgstr ""
+
+#: qcsrc/common/weapons/weapon/vortex.qh:19
+msgid "Vortex"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:9
+#, c-format
+msgid "CI_DEC^%s years"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:12
+#, c-format
+msgid "CI_ZER^%d years"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:13
+#, c-format
+msgid "CI_FIR^%d year"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:14
+#, c-format
+msgid "CI_SEC^%d years"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:15
+#, c-format
+msgid "CI_THI^%d years"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:16
+#, c-format
+msgid "CI_MUL^%d years"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:18
+#, c-format
+msgid "CI_DEC^%s weeks"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:21
+#, c-format
+msgid "CI_ZER^%d weeks"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:22
+#, c-format
+msgid "CI_FIR^%d week"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:23
+#, c-format
+msgid "CI_SEC^%d weeks"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:24
+#, c-format
+msgid "CI_THI^%d weeks"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:25
+#, c-format
+msgid "CI_MUL^%d weeks"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:27
+#, c-format
+msgid "CI_DEC^%s days"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:30
+#, c-format
+msgid "CI_ZER^%d days"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:31
+#, c-format
+msgid "CI_FIR^%d day"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:32
+#, c-format
+msgid "CI_SEC^%d days"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:33
+#, c-format
+msgid "CI_THI^%d days"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:34
+#, c-format
+msgid "CI_MUL^%d days"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:36
+#, c-format
+msgid "CI_DEC^%s hours"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:39
+#, c-format
+msgid "CI_ZER^%d hours"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:40
+#, c-format
+msgid "CI_FIR^%d hour"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:41
+#, c-format
+msgid "CI_SEC^%d hours"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:42
+#, c-format
+msgid "CI_THI^%d hours"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:43
+#, c-format
+msgid "CI_MUL^%d hours"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:46
+#, c-format
+msgid "CI_DEC^%s minutes"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:49
+#, c-format
+msgid "CI_ZER^%d minutes"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:50
+#, c-format
+msgid "CI_FIR^%d minute"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:51
+#, c-format
+msgid "CI_SEC^%d minutes"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:52
+#, c-format
+msgid "CI_THI^%d minutes"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:53
+#, c-format
+msgid "CI_MUL^%d minutes"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:55
+#, c-format
+msgid "CI_DEC^%s seconds"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:58
+#, c-format
+msgid "CI_ZER^%d seconds"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:59
+#, c-format
+msgid "CI_FIR^%d second"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:60
+#, c-format
+msgid "CI_SEC^%d seconds"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:61
+#, c-format
+msgid "CI_THI^%d seconds"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:62
+#, c-format
+msgid "CI_MUL^%d seconds"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:79
+#, c-format
+msgid "%dst"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:80
+#, c-format
+msgid "%dnd"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:81
+#, c-format
+msgid "%drd"
+msgstr ""
+
+#: qcsrc/lib/counting.qh:85
+#, c-format
+msgid "%dth"
+msgstr ""
+
+#: qcsrc/lib/oo.qh:324
+msgid "No description"
+msgstr ""
+
+#: qcsrc/lib/spawnfunc.qh:248
+#, c-format
+msgid ""
+"Entity field %s.%s (%s) is not whitelisted. If you believe this is an error, "
+"please file an issue."
+msgstr ""
+
+#: qcsrc/lib/string.qh:81
+#, c-format
+msgid "%d days, %02d:%02d:%02d"
+msgstr ""
+
+#: qcsrc/lib/string.qh:82
+#, c-format
+msgid "%02d:%02d:%02d"
+msgstr ""
+
+#: qcsrc/menu/command/menu_cmd.qc:48
+msgid "Usage: menu_cmd command..., where possible commands are:"
+msgstr ""
+
+#: qcsrc/menu/command/menu_cmd.qc:49
+msgid " sync - reloads all cvars on the current menu page"
+msgstr ""
+
+#: qcsrc/menu/command/menu_cmd.qc:50
+msgid " directmenu ITEM - select a menu item as main item"
+msgstr ""
+
+#: qcsrc/menu/command/menu_cmd.qc:51
+msgid " dumptree - dump the state of the menu as a tree to the console"
+msgstr ""
+
+#: qcsrc/menu/command/menu_cmd.qc:81
+msgid "Available options:"
+msgstr ""
+
+#: qcsrc/menu/command/menu_cmd.qc:130
+msgid "Invalid command. For a list of supported commands, try menu_cmd help."
+msgstr ""
+
+#: qcsrc/menu/item/listbox.qc:413
+#, c-format
+msgid "Item %d"
+msgstr ""
+
+#: qcsrc/menu/item/textslider.qc:11 qcsrc/menu/item/textslider.qc:12
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:37
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:68
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:115
+msgid "Custom"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:4
+msgid "Core Team"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:15
+msgid "Extended Team"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:46
+msgid "Website"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:51
+msgid "Stats"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:55
+msgid "Art"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:63
+msgid "Animation"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:67
+msgid "Level Design"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:90
+msgid "Music / Sound FX"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:106
+msgid "Game Code"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:114
+msgid "Marketing / PR"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:120
+msgid "Legal"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:125
+msgid "Game Engine"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:129
+msgid "Engine Additions"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:135
+msgid "Compiler"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:141
+msgid "Other Active Contributors"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:148
+msgid "Translators"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:150
+msgid "Asturian"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:155
+msgid "Belarusian"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:158
+msgid "Bulgarian"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:165
+msgid "Chinese (China)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:171
+msgid "Chinese (Taiwan)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:176
+msgid "Cornish"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:179
+msgid "Czech"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:184
+msgid "Dutch"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:191
+msgid "English (Australia)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:196
+msgid "Finnish"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:201
+msgid "French"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:209
+msgid "German"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:220
+msgid "Greek"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:226
+msgid "Hungarian"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:230
+msgid "Irish"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:233
+msgid "Italian"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:239
+msgid "Kazakh"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:242
+msgid "Korean"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:246
+msgid "Polish"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:254
+msgid "Portuguese"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:260
+msgid "Romanian"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:267
+msgid "Russian"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:278
+msgid "Scottish Gaelic"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:281
+msgid "Serbian"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:287
+msgid "Spanish"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:298
+msgid "Swedish"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:302
+msgid "Ukrainian"
+msgstr ""
+
+#: qcsrc/menu/xonotic/credits.qc:309
+msgid "Past Contributors"
+msgstr ""
+
+#: qcsrc/menu/xonotic/cvarlist.qc:73
+msgid "forced to be saved to config.cfg"
+msgstr ""
+
+#: qcsrc/menu/xonotic/cvarlist.qc:79 qcsrc/menu/xonotic/cvarlist.qc:89
+msgid "will not be saved"
+msgstr ""
+
+#: qcsrc/menu/xonotic/cvarlist.qc:84
+msgid "will be saved to config.cfg"
+msgstr ""
+
+#: qcsrc/menu/xonotic/cvarlist.qc:93
+msgid "private"
+msgstr ""
+
+#: qcsrc/menu/xonotic/cvarlist.qc:95
+msgid "engine setting"
+msgstr ""
+
+#: qcsrc/menu/xonotic/cvarlist.qc:97
+msgid "read only"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_credits.qc:13
+#: qcsrc/menu/xonotic/dialog_monstertools.qc:38
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:303
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:85
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.qc:75
+#: qcsrc/menu/xonotic/dialog_singleplayer_winner.qc:14
+msgid "OK"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_credits.qh:7
+msgid "Credits"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_credits.qh:8
+msgid "The Xonotic credits"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_disconnect.qc:16
+msgid "Are you sure to disconnect from server?"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_disconnect.qc:19
+msgid "I would disconnect from server..."
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_disconnect.qc:22
+msgid "I would play more!"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_disconnect.qh:6
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_demo_startconfirm.qh:6
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_demo_timeconfirm.qh:6
+msgid "Disconnect"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_disconnect.qh:7
+msgid "Disconnect from the server you are connected to"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_firstrun.qc:39
+msgid ""
+"Welcome to Xonotic, please select your language preference and enter your "
+"player name to get started. You can change these options later through the "
+"menu system."
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_firstrun.qc:45
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.qc:28
+msgid "Name:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_firstrun.qc:53
+#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:62
+msgid "Name under which you will appear in the game"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_firstrun.qc:69
+msgid "Text language:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_firstrun.qc:78
+msgid "Allow player statistics to use your nickname at stats.xonotic.org?"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_firstrun.qc:84
+msgid "Undecided"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_firstrun.qc:88
+msgid "Save settings"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_firstrun.qh:6
+msgid "Welcome"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.qc:18
+msgid "Ammunition display:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.qc:21
+msgid "Show only current ammo type"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.qc:24
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:46
+msgid "Noncurrent alpha:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.qc:28
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:50
+msgid "Noncurrent scale:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.qc:32
+#: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:24
+msgid "Align icon:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.qc:33
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qc:32
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:25
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:37
+#: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:25
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.qc:23
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.qc:35
+#: qcsrc/menu/xonotic/dialog_hudpanel_quickmenu.qc:21
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:57
+msgid "Left"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.qc:34
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qc:34
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:27
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:38
+#: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:26
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.qc:25
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.qc:36
+#: qcsrc/menu/xonotic/dialog_hudpanel_quickmenu.qc:23
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:59
+msgid "Right"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.qh:6
+msgid "Ammo Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qc:19
+msgid "Message duration:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qc:23
+msgid "Fade time:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qc:27
+msgid "Flip messages order"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qc:29
+#: qcsrc/menu/xonotic/dialog_hudpanel_quickmenu.qc:18
+msgid "Text alignment:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qc:33
+#: qcsrc/menu/xonotic/dialog_hudpanel_quickmenu.qc:22
+#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:70
+msgid "Center"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qc:37
+msgid "Font scale:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qh:6
+msgid "Centerprint Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.qc:17
+msgid "Chat entries:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.qc:20
+msgid "Chat size:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.qc:24
+msgid "Chat lifetime:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.qc:28
+msgid "Chat beep sound"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.qh:6
+msgid "Chat Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.qc:16
+msgid "Engine info:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.qc:19
+msgid "Use an averaging algorithm for fps"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.qh:6
+msgid "Engine Info Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:17
+msgid "Combine health and armor"
+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 ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:21
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.qc:19
+msgid "Status bar alignment:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:29
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:39
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.qc:27
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.qc:37
+msgid "Inward"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:31
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:40
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.qc:29
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.qc:38
+msgid "Outward"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:34
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.qc:32
+msgid "Icon alignment:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:42
+msgid "Flip health and armor positions"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qh:6
+msgid "Health/Armor Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.qc:16
+msgid "Info messages:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.qc:19
+msgid "Flip align"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.qh:6
+msgid "Info Messages Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:16
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:15
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.qc:14
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:15
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:50
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:62
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:77
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:116
+#: qcsrc/menu/xonotic/util.qc:770 qcsrc/menu/xonotic/util.qc:786
+#: qcsrc/menu/xonotic/util.qc:803
+msgid "Disable"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:17
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.qc:15
+msgid "Enable spectating"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:18
+msgid "Enable even playing in warmup"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:29
+msgid "Reduced"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:32
+msgid "Text/icon ratio:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:35
+msgid "Hide spawned items"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:37
+msgid "Hide big armor and health"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:39
+msgid "Dynamic size"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qh:6
+msgid "Items Time Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_modicons.qh:6
+msgid "Mod Icons Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.qc:17
+msgid "Notifications:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.qc:20
+msgid "Also print notifications to the console"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.qc:23
+msgid "Flip notify order"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.qc:26
+msgid "Entry lifetime:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.qc:30
+msgid "Entry fadetime:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.qh:6
+msgid "Notification Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:16
+#: qcsrc/menu/xonotic/util.qc:758
+msgid "Enable"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:17
+msgid "Enable even observing"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:18
+msgid "Enable only in Race/CTS"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:24
+msgid "Status bar"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:26
+#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:67
+msgid "Left align"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:27
+#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:73
+msgid "Right align"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:28
+msgid "Inward align"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:29
+msgid "Outward align"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:33
+msgid "Flip speed/acceleration positions"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:37
+msgid "Speed:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:38
+msgid "Include vertical speed"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:49
+msgid "Speed unit:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:51
+msgid "qu/s"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:52
+msgid "m/s"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:53
+msgid "km/h"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:54
+msgid "mph"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:55
+msgid "knots"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:57
+msgid "Show"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:60
+msgid "Top speed"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:66
+msgid "Acceleration:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:67
+msgid "Include vertical acceleration"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qh:6
+msgid "Physics Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.qh:6
+msgid "Powerups Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.qc:16
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:17
+msgid "Always enable"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.qc:23
+msgid "Forced aspect:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.qh:6
+msgid "Pressed Keys Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_quickmenu.qh:6
+msgid "Quick Menu Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_racetimer.qh:6
+msgid "Race Timer Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:16
+msgid "Enable in team games"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:23
+msgid "Radar:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:26
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:68
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:107
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:54
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:87
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:103
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:45
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:70
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:124
+#: qcsrc/menu/xonotic/util.qc:792
+msgid "Alpha:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:30
+msgid "Rotation:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:32
+msgid "Forward"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:33
+msgid "West"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:34
+msgid "South"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:35
+msgid "East"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:36
+msgid "North"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:40
+msgid "Scale:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:44
+msgid "Zoom mode:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:46
+msgid "Zoomed in"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:47
+msgid "Zoomed out"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:48
+msgid "Always zoomed"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:49
+msgid "Never zoomed"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qh:6
+msgid "Radar Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.qc:17
+msgid "Score:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.qc:20
+msgid "Rankings:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.qc:21
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:58
+msgid "Off"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.qc:22
+msgid "And me"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.qc:23
+msgid "Pure"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.qh:6
+msgid "Score Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_timer.qc:16
+msgid "Timer:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_timer.qc:19
+msgid "Show elapsed time"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_timer.qh:6
+msgid "Timer Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_vote.qc:17
+msgid "Alpha after voting:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_vote.qh:6
+msgid "Vote Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:22
+msgid "Fade out after:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:24
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:167
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:145
+#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:55
+msgid "Never"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:26
+#, c-format
+msgid "%ds"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:30
+msgid "Fade effect:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:33
+msgid "EF^None"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:34
+msgid "Alpha"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:35
+msgid "Slide"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:36
+msgid "EF^Both"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:40
+msgid "Weapon icons:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:43
+msgid "Show only owned weapons"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:54
+msgid "Show weapon ID as:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:55
+msgid "SHOWAS^None"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:56
+msgid "Number"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:57
+msgid "Bind"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:60
+msgid "Weapon ID scale:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:66
+msgid "Show Accuracy"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:67
+msgid "Show Ammo"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:70
+msgid "Ammo bar alpha:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:76
+msgid "Ammo bar color:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qh:6
+msgid "Weapons Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:19
+msgid "HUD skins"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:22
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:173
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:32
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_demo.qc:42
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:25
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_screenshot.qc:33
+msgid "Filter:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:30
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:54
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_demo.qc:49
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_screenshot.qc:43
+msgid "Refresh"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:33
+#: qcsrc/menu/xonotic/dialog_settings_user.qc:28
+msgid "Set skin"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:37
+msgid "Save current skin"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:46
+msgid "Panel background defaults:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:48
+#: qcsrc/menu/xonotic/util.qc:767
+msgid "Background:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:60
+#: qcsrc/menu/xonotic/util.qc:783
+msgid "Border size:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:75
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:114
+msgid "Team color:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:83
+#: qcsrc/menu/xonotic/util.qc:809
+msgid "Test team color in configure mode"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:86
+#: qcsrc/menu/xonotic/util.qc:812
+msgid "Padding:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:93
+msgid "HUD Dock:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:95
+msgid "DOCK^Disabled"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:96
+msgid "DOCK^Small"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:97
+msgid "DOCK^Medium"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:98
+msgid "DOCK^Large"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:121
+msgid "Grid settings:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:124
+msgid "Snap panels to grid"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:127
+msgid "Grid size:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:129
+msgid "X:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:136
+msgid "Y:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:145
+msgid "Exit setup"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qh:6
+msgid "Panel HUD Setup"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_monstertools.qc:13
+msgid "Monster:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_monstertools.qc:22
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:20
+msgid "Spawn"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_monstertools.qc:23
+msgid "Remove"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_monstertools.qc:25
+msgid "Move target:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_monstertools.qc:26
+msgid "Follow"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_monstertools.qc:27
+msgid "Wander"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_monstertools.qc:28
+msgid "Spawnpoint"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_monstertools.qc:29
+msgid "No moving"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_monstertools.qc:31
+msgid "Colors:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_monstertools.qc:33
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:39
+msgid "Set skin:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_monstertools.qh:6
+msgid "Monster Tools"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.qc:14
+msgid "Servers"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.qc:15
+msgid "Find servers to play on"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.qc:17
+msgid "Host your own game"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.qc:18
+msgid "Media"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.qc:19
+msgid "Profile"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.qh:6
+msgid "Multiplayer"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer.qh:7
+msgid ""
+"Play online, against your friends in LAN, view demos or change player "
+"settings"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:38
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:111
+#: qcsrc/menu/xonotic/skinlist.qc:88 qcsrc/menu/xonotic/util.qc:769
+#: qcsrc/menu/xonotic/util.qc:785 qcsrc/menu/xonotic/util.qc:794
+#: qcsrc/menu/xonotic/util.qc:802 qcsrc/menu/xonotic/util.qc:814
+msgid "Default"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:40
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:60
+msgid "Unlimited"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:74
+msgid "Gametype"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:79
+msgid "Time limit:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:81
+msgid "Timelimit in minutes that when hit, will end the match"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:82
+#, c-format
+msgid "%d minutes"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:83
+msgid "TIMLIM^Default"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:84
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:159
+msgid "1 minute"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:101
+msgid "TIMLIM^Infinite"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:109
+msgid "Teams:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:112
+msgid "2 teams"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:113
+msgid "3 teams"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:114
+msgid "4 teams"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:117
+msgid "Player slots:"
+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 ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:121
+msgid "Number of bots:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:123
+msgid "Amount of bots on your server"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:125
+msgid "Bot skill:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:128
+msgid "Specify how experienced the bots will be"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:129
+msgid "Botlike"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:130
+msgid "Beginner"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:131
+msgid "You will win"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:132
+msgid "You can win"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:133
+msgid "You might win"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:134
+msgid "Advanced"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:135
+msgid "Expert"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:136
+msgid "Pro"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:137
+msgid "Assassin"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:138
+msgid "Unhuman"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:139
+msgid "Godlike"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:155
+msgid "Mutators..."
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:156
+msgid "Mutators and weapon arenas"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:165
+msgid "Maplist"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:175
+msgid ""
+"Click here or Ctrl-F to provide a keyword to narrow down the map list. Ctrl-"
+"Delete to clear; Enter when done."
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:184
+msgid "Add shown"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:185
+msgid "Add the maps shown in the list to your selection"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:188
+msgid "Remove shown"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:189
+msgid "Remove the maps shown in the list from your selection"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:194
+msgid "Add all"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:195
+msgid "Add every available map to your selection"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:198
+msgid "Remove all"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:199
+msgid "Remove all the maps from your selection"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:206
+msgid "Start Multiplayer!"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.qc:50
+msgid "Title:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.qc:56
+msgid "Author:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.qc:62
+msgid "Game types:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.qc:85
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:257
+msgid "Close"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.qc:88
+msgid "MAP^Play"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.qh:7
+msgid "Map Information"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:28
+msgid "All Weapons Arena"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:30
+msgid "Most Weapons Arena"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:46
+#, c-format
+msgid "%s Arena"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:57
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:163
+msgid "Dodging"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:59
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:283
+msgid "InstaGib"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:61
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:224
+msgid "New Toys"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:63
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:288
+msgid "NIX"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:65
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:229
+msgid "Rocket Flying"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:67
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:219
+msgid "Invincible Projectiles"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:71
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:298
+msgid "No start weapons"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:73
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:202
+msgid "Low gravity"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:75
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:171
+msgid "Cloaked"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:77
+msgid "Hook"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:79
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:180
+msgid "Midair"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:81
+msgid "Melee only"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:85
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:234
+msgid "Piñata"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:87
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:239
+msgid "Weapons stay"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:89
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:191
+msgid "Blood loss"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:93
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:175
+msgid "Buffs"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:95
+msgid "Overkill"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:97
+msgid "No powerups"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:99
+msgid "Powerups"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:101
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:167
+msgid "Touch explode"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:103
+msgid "Wall jumping"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:105
+msgid "MUT^None"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:160
+msgid "Gameplay mutators:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:164
+msgid ""
+"Enable dodging (quick acceleration in a given direction). Double-tap a "
+"directional key to dodge"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:168
+msgid "An explosion occurs when two players collide"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:172
+msgid "All players are almost invisible"
+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 ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:185
+msgid "Damage done to your enemy gets added to your own health"
+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 ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:199
+msgid "Make things fall to the ground slower (percentage of normal gravity)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:208
+msgid "Weapon & item mutators:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:211
+msgid "Grappling hook"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:212
+msgid "Players spawn with the grappling hook. Press the 'hook' key to use it"
+msgstr ""
+
+#: 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 ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:230
+msgid ""
+"Devastator rockets can be detonated instantly (otherwise, there's a short "
+"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 ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:240
+msgid "Weapons stay after they are picked up"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:245
+msgid "Regular (no arena)"
+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 ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:248
+msgid "Weapon arenas:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:251
+msgid "Custom weapons"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:273
+msgid "Most weapons"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:277
+msgid "All weapons"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:280
+msgid "Special arenas:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:284
+msgid ""
+"Players will be given only one weapon, which can instantly kill the opponent "
+"with a single shot. If the player runs out of ammo, he will have 10 seconds "
+"to find some or if he fails to do so, face death. The secondary fire mode "
+"does not inflict any damage but is good for doing trickjumps."
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:289
+msgid ""
+"No items Xonotic - instead of pickup items, everyone plays with the same "
+"weapon. After some time, a countdown will start, after which everyone will "
+"switch to another weapon."
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:293
+msgid "with blaster"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:294
+msgid "Always carry the blaster as an additional weapon in Nix"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qh:9
+msgid "Mutators"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:39
+msgid "SRVS^Categories"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:42
+msgid "SRVS^Empty"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:43
+msgid "Show empty servers"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:47
+msgid "SRVS^Full"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:48
+msgid "Show full servers that have no slots available"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:52
+msgid "Pause"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:53
+msgid ""
+"Pause updating the server list to prevent servers from \"jumping around\""
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:54
+msgid "Reload the server list"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:68
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:184
+msgid "Address:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:79
+msgid "Info..."
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:80
+msgid "Show more information about the currently highlighted server"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:92
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:264
+msgid "Join!"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:114
+#: qcsrc/menu/xonotic/serverlist.qc:1020
+msgid "MOD^Default"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:121
+#, c-format
+msgid "%d modified"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:121
+msgid "Official"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:129
+msgid "N/A (auth library missing, can't connect)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:131
+msgid "N/A (auth library missing)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:137
+msgid "Not supported (can't connect)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:139
+msgid "Not supported (won't encrypt)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:143
+msgid "Supported (will encrypt)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:145
+msgid "Supported (won't encrypt)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:149
+msgid "Requested (will encrypt)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:151
+msgid "Requested (won't encrypt)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:155
+msgid "Required (can't connect)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:157
+msgid "Required (will encrypt)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:161
+msgid "Use the `crypto_aeslevel` cvar to change your preferences"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:178
+msgid "Hostname:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:192
+msgid "Gametype:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:197
+msgid "Map:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:202
+msgid "Mod:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:207
+msgid "Version:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:212
+msgid "Settings:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:219
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:251
+msgid "Players:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:224
+msgid "Bots:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:229
+msgid "Free slots:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:235
+msgid "Encryption:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:240
+msgid "ID:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:245
+msgid "Key:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qh:7
+msgid "Server Information"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media.qc:25
+msgid "Demos"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media.qc:26
+msgid "Screenshots"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media.qc:27
+msgid "Music Player"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_demo.qc:48
+msgid "Auto record demos"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_demo.qc:57
+msgid "Timedemo"
+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 ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_demo_startconfirm.qc:13
+msgid "Playing a demo will disconnect you from the current match."
+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 ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_demo_timeconfirm.qc:13
+msgid "Timing a demo will disconnect you from the current match."
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:37
+msgid "MUSICPL^Add"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:40
+msgid "MUSICPL^Add all"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:44
+msgid "Set as menu track"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:48
+msgid "Reset default menu track"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:54
+msgid "Playlist:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:55
+msgid "Random order"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:60
+msgid "MUSICPL^Stop"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:63
+msgid "MUSICPL^Play"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:66
+msgid "MUSICPL^Pause"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:69
+msgid "MUSICPL^Prev"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:72
+msgid "MUSICPL^Next"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:76
+msgid "MUSICPL^Remove"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:79
+msgid "MUSICPL^Remove all"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_screenshot.qc:41
+msgid "Auto screenshot scoreboard"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_screenshot.qc:62
+msgid "Open in the viewer"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_screenshot_viewer.qc:137
+msgid "Reset"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_screenshot_viewer.qc:142
+msgid "Previous"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_screenshot_viewer.qc:145
+msgid "Next"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_media_screenshot_viewer.qc:150
+msgid "Slide show"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:38
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:21
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:37
+#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:26
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:21
+msgid "Apply immediately"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:50
+msgid "Name"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:79
+msgid "Model"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:98
+msgid "Glowing color"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:108
+msgid "Detail color"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:123
+msgid "Statistics"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:127
+msgid "Allow player statistics to track your client"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:131
+msgid "Allow player statistics to use your nickname"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:136
+msgid "Allow player statistics to rank you in leaderboards"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:152
+msgid "Country"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:156
+msgid "Select language..."
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:172
+msgid "Gender:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:179
+msgid "Gender"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_quit.qc:11
+msgid "Are you sure you want to quit?"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_quit.qc:15
+msgid "Back to work..."
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_quit.qc:17
+msgid "I got some more fragging to do!"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_quit.qh:7
+msgid "Quit the game"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:15
+msgid "Model:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:21
+msgid "Remove *"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:23
+msgid "Copy *"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:24
+msgid "Paste"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:26
+msgid "Bone:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:31
+msgid "Set * as child"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:32
+msgid "Attach to *"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:34
+msgid "Detach from *"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:37
+msgid "Visual object properties for *:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:41
+msgid "Set alpha:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:44
+msgid "Set color main:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:46
+msgid "Set color glow:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:50
+msgid "Set frame:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:54
+msgid "Physical object properties for *:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:56
+msgid "Set material:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:62
+msgid "Set solidity:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:63
+msgid "Non-solid"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:64
+msgid "Solid"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:65
+msgid "Set physics:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:66
+msgid "Static"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:67
+msgid "Movable"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:68
+msgid "Physical"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:70
+msgid "Set scale:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:72
+msgid "Set force:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:76
+msgid "Claim *"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:78
+msgid "* object info"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:79
+msgid "* mesh info"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:80
+msgid "* attachment info"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:81
+msgid "Show help"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:82
+msgid "* is the object you are facing"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_sandboxtools.qh:6
+msgid "Sandbox Tools"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings.qc:18
+msgid "Video"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings.qc:19
+msgid "Effects"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings.qc:20
+msgid "Audio"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings.qc:22
+msgid "Game"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings.qc:23
+msgid "Input"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings.qc:24
+msgid "User"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings.qc:25
+#: qcsrc/menu/xonotic/keybinder.qc:119
+msgid "Misc"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings.qh:6
+msgid "Settings"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings.qh:7
+msgid "Change the game settings"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:29
+msgid "Master:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:35
+msgid "Music:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:43
+msgid "VOL^Ambient:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:50
+msgid "Info:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:57
+msgid "Items:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:64
+msgid "Pain:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:71
+msgid "Player:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:78
+msgid "Shots:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:85
+msgid "Voice:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:93
+msgid "Weapons:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:99
+msgid "New style sound attenuation"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:102
+msgid "Mute sounds when not active"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:105
+msgid "Frequency:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:107
+msgid "Sound output frequency"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:108
+msgid "8 kHz"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:109
+msgid "11.025 kHz"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:110
+msgid "16 kHz"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:111
+msgid "22.05 kHz"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:112
+msgid "24 kHz"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:113
+msgid "32 kHz"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:114
+msgid "44.1 kHz"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:115
+msgid "48 kHz"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:119
+msgid "Channels:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:121
+msgid "Number of channels for the sound output"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:122
+msgid "Mono"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:123
+msgid "Stereo"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:124
+msgid "2.1"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:125
+msgid "4"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:126
+msgid "5"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:127
+msgid "5.1"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:128
+msgid "6.1"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:129
+msgid "7.1"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:134
+msgid "Swap stereo output channels"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:135
+msgid "Swap left/right channels"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:138
+msgid "Headphone friendly mode"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:139
+msgid ""
+"Enable spatialization (blend the right and left channel slightly to decrease "
+"stereo separation a bit for headphones)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:143
+msgid "Hit indication sound"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:144
+msgid "Play a hit indicator sound when your shot hits an enemy"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:147
+msgid "Chat message sound"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:149
+msgid "Menu sounds"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:150
+msgid "Play sounds when clicking menu items"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:151
+msgid "Focus sounds"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:152
+msgid "Play sounds when hovering over menu items too"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:156
+msgid "Time announcer:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:158
+msgid "WRN^Disabled"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:160
+msgid "5 minutes"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:161
+msgid "WRN^Both"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:164
+msgid "Automatic taunts:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:166
+msgid "Automatically taunt enemies after fragging them"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:168
+msgid "Sometimes"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:169
+msgid "Often"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:170
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:147
+#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:57
+msgid "Always"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_audio.qc:176
+msgid "Debug info about sounds"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_bindings_reset.qc:11
+msgid "Are you sure you want to reset all key bindings?"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_bindings_reset.qh:6
+msgid "Reset key bindings"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:41
+msgid "Quality preset:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:45
+msgid "PRE^OMG!"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:48
+msgid "PRE^Low"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:50
+msgid "PRE^Medium"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:52
+msgid "PRE^Normal"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:54
+msgid "PRE^High"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:56
+msgid "PRE^Ultra"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:60
+msgid "PRE^Ultimate"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:65
+msgid "Geometry detail:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:67
+msgid "Change the smoothness of the curves on the map"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:68
+msgid "DET^Lowest"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:69
+msgid "DET^Low"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:70
+msgid "DET^Normal"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:71
+msgid "DET^Good"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:72
+msgid "DET^Best"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:73
+msgid "DET^Insane"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:77
+msgid "Player detail:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:79
+msgid "PDET^Low"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:80
+msgid "PDET^Medium"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:81
+msgid "PDET^Normal"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:82
+msgid "PDET^Good"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:83
+msgid "PDET^Best"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:87
+msgid "Texture resolution:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:91
+msgid "RES^Leet"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:92
+msgid "RES^Lowest"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:93
+msgid "RES^Very low"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:94
+msgid "RES^Low"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:95
+msgid "RES^Normal"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:96
+msgid "RES^Good"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:97
+msgid "RES^Best"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:110
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:115
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:120
+msgid "Avoid lossy texture compression"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:129
+msgid "Disable sky for performance and visibility"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:129
+msgid "Show sky"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:132
+msgid "Show surfaces"
+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 ""
+
+#: 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 ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:140
+msgid "Use per-pixel lighting effects"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:142
+msgid "Gloss"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:143
+msgid "Enable the use of glossmaps on textures supporting it"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:146
+msgid "Offset mapping"
+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 ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:149
+msgid "Relief mapping"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:150
+msgid ""
+"Higher quality offset mapping, which also has a huge impact on performance"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:153
+msgid "Reflections:"
+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 ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:158
+msgid "Blurred"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:159
+msgid "REFL^Good"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:160
+msgid "Sharp"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:164
+msgid "Decals"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:165
+msgid "Enable decals (bullet holes and blood)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:166
+msgid "Decals on models"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:170
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:254
+msgid "Distance:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:173
+msgid "Decals further away than this will not be drawn"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:177
+msgid "Time:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:180
+msgid "Time in seconds before decals fade away"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:184
+msgid "Damage effects:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:186
+msgid "DMGFX^Disabled"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:187
+msgid "Skeletal"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:188
+msgid "DMGFX^All"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:192
+msgid "No dynamic lighting"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:193
+msgid "Enable corona flares around certain lights"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:195
+msgid "Fake corona lighting"
+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 ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:200
+msgid "Enable rendering of dynamic lights such as explosions and rocket lights"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:202
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:208
+msgid "Shadows"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:203
+msgid "Enable rendering of shadows from dynamic lights"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:206
+msgid "Realtime world lighting"
+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 ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:213
+msgid "Use normal maps"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:214
+msgid "Enable use of directional shading on textures"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:216
+msgid "Soft shadows"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:220
+msgid "Fade corona according to visibility"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:221
+msgid "Fade coronas according to visibility"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:225
+msgid "Bloom"
+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 ""
+
+#: 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 ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:234
+msgid "Motion blur:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:240
+msgid "Particles"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:241
+msgid "Spawnpoint effects"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:242
+msgid "Particles effects at all spawn points and whenever a player spawns"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:247
+msgid "Quality:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:250
+#: qcsrc/menu/xonotic/slider_particles.qc:13
+msgid ""
+"Multiplier for amount of particles. Less means less particles, which in turn "
+"gives for better performance"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.qc:257
+msgid "Particles further away than this will not be drawn"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:31
+msgid "No crosshair"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:33
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:62
+msgid "Per weapon"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:34
+msgid ""
+"Set a different crosshair for each weapon, good if you play without weapon "
+"models"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:48
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:81
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:97
+msgid "Size:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:64
+msgid "By health"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:76
+msgid "Use rings to indicate weapon status"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:93
+msgid "Enable center crosshair dot"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:111
+msgid "Use normal crosshair color"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:122
+msgid "Smooth effects of crosshairs"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:125
+msgid "Hit testing:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:128
+msgid ""
+"None: do not do hit tests for the crosshair; TrueAim: blur the crosshair "
+"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"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:130
+msgid "HTTST^TrueAim"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:131
+msgid "HTTST^Enemies"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:136
+msgid "Blur crosshair if the shot is obstructed"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:140
+msgid "Enlarge crosshair if targeting an enemy"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:143
+msgid "Animate crosshair when hitting an enemy"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:146
+msgid "Animate crosshair when picking up an item"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qh:7
+msgid "Crosshair"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:43
+msgid "Scoreboard"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:48
+msgid "Fading speed:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:51
+msgid "Enable rows / columns highlighting"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:53
+msgid "Show accuracy underneath scoreboard"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:55
+msgid "Show team sizes:"
+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 ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:66
+msgid "Display waypoint markers for objectives on the map"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:67
+msgid "Show various gametype specific waypoints"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:73
+msgid "Control transparency of the waypoints"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:77
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:130
+msgid "Fontsize:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:83
+msgid "Edge offset:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:91
+msgid "Fade when near the crosshair"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:95
+msgid "Display names instead of icons"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:100
+msgid "Damage"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:102
+msgid "Overlay:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:105
+msgid "Factor:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:110
+msgid "Fade rate:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:118
+msgid "Player Names"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:120
+msgid "Show names above players"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:136
+msgid "Max distance:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:142
+msgid "Decolorize:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:146
+#: qcsrc/menu/xonotic/keybinder.qc:113
+msgid "Teamplay"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:154
+msgid "Only when near crosshair"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:158
+msgid "Display health and armor"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:163
+msgid "Damage overlay:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:166
+msgid "Dynamic HUD"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:167
+msgid "HUD moves around following player's movement"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:169
+msgid "Shake the HUD when hurt"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:173
+#: qcsrc/menu/xonotic/dialog_settings_game_hudconfirm.qh:6
+msgid "Enter HUD editor"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hud.qh:7
+msgid "HUD"
+msgstr ""
+
+#: 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 ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_hudconfirm.qc:23
+msgid "Do you wish to start a local game to set up the HUD?"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:24
+msgid "Frag Information"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:26
+msgid "Display information about killing sprees"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:29
+msgid "Only display sprees if they are achievements"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:34
+msgid "Show spree information in centerprints"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:38
+msgid "Show spree information in death messages"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:43
+msgid "Sprees in info messages:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:46
+msgid "SPREES^Disabled"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:47
+msgid "Target"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:48
+msgid "Attacker"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:49
+msgid "SPREES^Both"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:55
+msgid "Print on a seperate line"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:58
+msgid "Add extra frag information to centerprint when available"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:62
+msgid "Add frag location to death messages when available"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:65
+msgid "Gamemode Settings"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:67
+msgid "Display capture times in Capture The Flag"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:71
+msgid "Display name of flag stealer in Capture The Flag"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:76
+#: qcsrc/menu/xonotic/dialog_settings_input.qc:92
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:126
+msgid "Other"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:78
+msgid "Display console messages in the top left corner"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:80
+msgid "Display all info messages in the chatbox"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:82
+msgid "Display player statuses in the chatbox"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:86
+msgid "Powerup notifications"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:89
+msgid "Weapon centerprint notifications"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:92
+msgid "Weapon info message notifications"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:96
+msgid "Announcers"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:98
+msgid "Respawn countdown sounds"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:101
+msgid "Killstreak sounds"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:104
+msgid "Achievement sounds"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_messages.qh:7
+msgid "Messages"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:30
+msgid "Items"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:32
+msgid "Use simple 2D images instead of item models"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:34
+msgid "Unavailable alpha:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:37
+msgid "Unavailable color:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:39
+msgid "GHOITEMS^Black"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:40
+msgid "GHOITEMS^Dark"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:41
+msgid "GHOITEMS^Tinted"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:42
+msgid "GHOITEMS^Normal"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:43
+msgid "GHOITEMS^Blue"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:49
+#: qcsrc/menu/xonotic/serverlist.qc:737
+msgid "Players"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:51
+msgid "Force player models to mine"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:53
+msgid "Force player colors to mine"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:56
+msgid "In non teamplay modes only"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:60
+msgid "Body fading:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:63
+msgid "Gibs:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:65
+msgid "GIBS^None"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:66
+msgid "GIBS^Few"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:67
+msgid "GIBS^Many"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:68
+msgid "GIBS^Lots"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_model.qh:7
+msgid "Models"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_model.qh:8
+msgid "Customize how players and items are displayed in game"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:26
+msgid "1st person perspective"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:29
+msgid "Slide to third person upon death"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:33
+msgid "Smooth the view when landing from a jump"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:37
+msgid "Smooth the view while crouching"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:41
+msgid "View waving while idle"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:45
+msgid "View bobbing while walking around"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:50
+msgid "3rd person perspective"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:53
+msgid "Back distance"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:59
+msgid "Up distance"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:65
+msgid "Allow passing through walls while spectating"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:69
+msgid "Field of view:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:71
+msgid "Field of vision in degrees"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:75
+msgid "ZOOM^Zoom factor:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:77
+msgid "How big the zoom factor is when the zoom button is pressed"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:80
+msgid "ZOOM^Zoom speed:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:82
+msgid "How fast the view will be zoomed, disable to zoom instantly"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:91
+msgid "ZOOM^Instant"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:95
+msgid "ZOOM^Zoom sensitivity:"
+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 ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:100
+msgid "Velocity zoom"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:101
+msgid "Forward movement only"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:105
+msgid "VZOOM^Factor"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:112
+msgid "Display reticle 2D overlay while zooming"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:115
+msgid "Release zoom when you die or respawn"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:119
+msgid "Release zoom when you switch weapons"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_view.qh:7
+#: qcsrc/menu/xonotic/keybinder.qc:83
+msgid "View"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:33
+msgid "Weapon Priority List (* = mutator weapon)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:39
+msgid "Up"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:43
+msgid "Down"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:49
+msgid "Use priority list for weapon cycling"
+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 ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:52
+msgid "Cycle through only usable weapon selections"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:56
+msgid "Auto switch weapons on pickup"
+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 ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:60
+msgid "Release attack buttons when you switch weapons"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:63
+msgid "Draw 1st person weapon model"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:64
+msgid "Draw the weapon model"
+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 ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:77
+msgid "Weapon model opacity:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:91
+msgid "Gun model swaying"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:96
+msgid "Gun model bobbing"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qh:7
+#: qcsrc/menu/xonotic/keybinder.qc:51
+msgid "Weapons"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.qc:34
+msgid "Key Bindings"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.qc:38
+msgid "Change key..."
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.qc:42
+msgid "Edit..."
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.qc:48
+msgid "Clear"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.qc:53
+msgid "Reset all"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.qc:58
+msgid "Mouse"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.qc:60
+msgid "Sensitivity:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.qc:62
+msgid "Mouse speed multiplier"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.qc:64
+msgid "Smooth aiming"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.qc:65
+msgid "Smoothes the mouse movement, but makes aiming slightly less responsive"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.qc:67
+msgid "Invert aiming"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.qc:68
+msgid "Invert mouse movement on the Y-axis"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.qc:70
+msgid "Use system mouse positioning"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.qc:75
+msgid "Enable built in mouse acceleration"
+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 ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.qc:80
+msgid "Make use of DGA mouse input"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.qc:94
+msgid "Pressing \"enter console\" key also closes it"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.qc:95
+msgid "Allow the console toggling bind to also close the console"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.qc:97
+msgid "Automatically repeat jumping if holding jump"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.qc:100
+msgid "Jetpack on jump:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.qc:102
+msgid "JPJUMP^Disabled"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.qc:103
+msgid "Air only"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input.qc:104
+msgid "JPJUMP^All"
+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 ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.qc:31
+msgid "Command when pressed:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.qc:34
+msgid "Command when released:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.qc:40
+msgid "Cancel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.qh:7
+msgid "User defined key bind"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:11
+#, c-format
+msgid "%d fps"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:12
+#, c-format
+msgid "%d KB/s"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:13
+#, c-format
+msgid "%d MB/s"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:27
+msgid "Network"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:29
+msgid "Client UDP port:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:31
+msgid "Force client to use chosen port unless it is set to 0"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:34
+msgid "Bandwidth:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:36
+msgid "Specify your network speed"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:37
+msgid "56k"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:38
+msgid "ISDN"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:39
+msgid "Slow ADSL"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:40
+msgid "Fast ADSL"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:41
+msgid "Broadband"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:44
+msgid "Server queries/s:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:48
+msgid "Downloads:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:50
+msgid "Maximum number of concurrent HTTP/FTP downloads"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:52
+msgid "Download speed:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:65
+msgid "Local latency:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:69
+msgid "Show netgraph"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:70
+msgid "Show a graph of packet sizes and other information"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:72
+msgid "Client-side movement prediction"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:74
+msgid "Movement error compensation"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:78
+msgid "Use encryption (AES) when available"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:81
+msgid "Framerate"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:83
+msgid "Maximum:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:93
+msgid "MAXFPS^Unlimited"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:96
+msgid "Target:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:98
+msgid "TRGT^Disabled"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:109
+msgid "Idle limit:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:115
+msgid "IDLFPS^Unlimited"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:119
+msgid "Save processing time for other apps"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:122
+msgid "Show frames per second"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:123
+msgid "Show your rendered frames per second"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:128
+msgid "Menu tooltips:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:130
+msgid ""
+"Menu tooltips: disabled, standard or advanced (also shows cvar or console "
+"command bound to the menu item)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:131
+msgid "TLTIP^Disabled"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:132
+msgid "TLTIP^Standard"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:133
+msgid "TLTIP^Advanced"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:136
+msgid "Show current date and time"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:137
+msgid "Show current date and time of day, useful on screenshots"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:140
+msgid "Enable developer mode"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:144
+msgid "Advanced settings..."
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:145
+msgid "Advanced settings where you can tweak every single variable of the game"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc.qc:150
+#: qcsrc/menu/xonotic/dialog_settings_misc_reset.qh:6
+msgid "Factory reset"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.qc:31
+msgid "Cvar filter:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.qc:38
+msgid "Modified cvars only"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.qc:45
+msgid "Setting:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.qc:49
+msgid "Type:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.qc:53
+msgid "Value:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.qc:70
+msgid "Description:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.qh:7
+msgid "Advanced settings"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_reset.qc:11
+msgid "Are you sure you want to reset all settings?"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_misc_reset.qc:13
+msgid "This will create a backup config in your data directory"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_user.qc:23
+msgid "Menu Skins"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_user.qc:62
+msgid "Text Language"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_user.qc:67
+msgid "Set language"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_user.qc:72
+msgid "Disable gore effects and harsh language"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_user.qc:73
+msgid "Replace blood and gibs with content that does not have any gore effects"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_user_languagewarning.qc:10
+msgid "While connected language changes will be applied only to the menu,"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_user_languagewarning.qc:12
+msgid "full language changes will take effect starting from the next game"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_user_languagewarning.qc:16
+msgid "Disconnect now"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_user_languagewarning.qc:17
+msgid "Switch language"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_user_languagewarning.qh:6
+msgid "Warning"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:33
+msgid "Resolution:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:37
+msgid "Font/UI size:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:39
+msgid "SZ^Unreadable"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:40
+msgid "SZ^Tiny"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:41
+msgid "SZ^Little"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:42
+msgid "SZ^Small"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:43
+msgid "SZ^Medium"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:44
+msgid "SZ^Large"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:45
+msgid "SZ^Huge"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:46
+msgid "SZ^Gigantic"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:47
+msgid "SZ^Colossal"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:51
+msgid "Color depth:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:53
+msgid "How many bits per pixel (BPP) to render at, 32 is recommended"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:54
+msgid "16bit"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:55
+msgid "32bit"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:59
+msgid "Full screen"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:61
+msgid "Vertical Synchronization"
+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 ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:67
+msgid "Flip view horizontally"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:68
+msgid "Poor man's left handed mode"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:71
+msgid "Anisotropy:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:73
+msgid "Anisotropic filtering quality"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:74
+msgid "ANISO^Disabled"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:75
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:86
+msgid "2x"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:76
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:87
+msgid "4x"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:77
+msgid "8x"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:78
+msgid "16x"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:81
+msgid "Antialiasing:"
+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 ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:85
+msgid "AA^Disabled"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:92
+msgid "High-quality frame buffer"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:97
+msgid "Depth first:"
+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"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:101
+msgid "DF^World"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:102
+msgid "DF^All"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:105
+msgid "Vertex Buffer Objects (VBOs)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:108
+msgid "VBO^Off"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:109
+msgid "Vertices, some Tris (compatible)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:110
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:114
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:116
+msgid ""
+"Make use of Vertex Buffer Objects to store static geometry in video memory "
+"for faster rendering"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:113
+msgid "Vertices"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:115
+msgid "Vertices and Triangles"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:119
+msgid "Brightness:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:121
+msgid "Brightness of black"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:123
+msgid "Contrast:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:125
+msgid "Brightness of white"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:127
+msgid "Gamma:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:130
+msgid ""
+"Inverse gamma correction value, a brightness effect that does not affect "
+"white or black"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:133
+msgid "Contrast boost:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:136
+msgid "By how much to multiply the contrast in dark areas"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:139
+msgid "Saturation:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:142
+msgid ""
+"Saturation adjustment (0 = grayscale, 1 = normal, 2 = oversaturated), "
+"requires GLSL color control"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:146
+msgid "LIT^Ambient:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:148
+msgid ""
+"Ambient lighting, if set too high it tends to make light on maps look dull "
+"and flat"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:150
+msgid "Intensity:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:152
+msgid "Global rendering brightness"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:155
+msgid "Wait for GPU to finish each frame"
+msgstr ""
+
+#: 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 ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:158
+msgid "Use OpenGL 2.0 shaders (GLSL)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:163
+msgid "Psycho coloring (easter egg)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_video.qc:166
+msgid "Trippy vertices (easter egg)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.qc:109
+msgid "Instant action! (random map with bots)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.qc:116
+msgid "???"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.qc:129
+msgid "Campaign Difficulty:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.qc:130
+msgid "CSKL^Easy"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.qc:131
+msgid "CSKL^Medium"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.qc:132
+msgid "CSKL^Hard"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.qc:134
+msgid "Start Singleplayer!"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.qh:6
+msgid "Singleplayer"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_singleplayer.qh:7
+msgid "Play the singleplayer campaign or instant action matches against bots"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_singleplayer_winner.qh:7
+msgid "Winner"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_teamselect.qc:32
+msgid "join 'best' team (auto-select)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_teamselect.qc:33
+msgid "Autoselect team (recommended)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_teamselect.qc:37
+msgid "red"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_teamselect.qc:38
+msgid "blue"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_teamselect.qc:39
+msgid "yellow"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_teamselect.qc:40
+msgid "pink"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_teamselect.qc:43
+#: qcsrc/menu/xonotic/keybinder.qc:116
+msgid "spectate"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_teamselect.qh:7
+msgid "Team Selection"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_uid2name.qc:10
+msgid "Allow player statistics to use your nickname?"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_uid2name.qc:12
+msgid "Answering \"No\" you will appear as \"Anonymous player\""
+msgstr ""
+
+#: qcsrc/menu/xonotic/gametypelist.qc:87
+msgid "teamplay"
+msgstr ""
+
+#: qcsrc/menu/xonotic/gametypelist.qc:89
+msgid "free for all"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:35
+msgid "Moving"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:36
+msgid "forward"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:37
+msgid "backpedal"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:38
+msgid "strafe left"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:39
+msgid "strafe right"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:40
+msgid "jump / swim"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:41
+msgid "crouch / sink"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:42
+msgid "off-hand hook"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:43
+msgid "jetpack"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:46
+msgid "Attacking"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:52
+msgid "WEAPON^previous"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:53
+msgid "WEAPON^next"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:54
+msgid "WEAPON^previously used"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:55
+msgid "WEAPON^best"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:56
+msgid "reload"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:57
+msgid "drop weapon / throw nade"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:84
+msgid "hold zoom"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:85
+msgid "toggle zoom"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:86
+msgid "show scores"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:87
+msgid "screen shot"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:88
+msgid "maximize radar"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:89
+msgid "3rd person view"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:90
+msgid "enter spectator mode"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:93
+msgid "Communication"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:94
+msgid "public chat"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:95
+msgid "team chat"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:96
+msgid "show chat history"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:97
+msgid "vote YES"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:98
+msgid "vote NO"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:102
+msgid "Client"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:106 qcsrc/menu/xonotic/keybinder.qc:108
+msgid "enter console"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:109
+msgid "disconnect"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:110
+msgid "quit"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:114
+msgid "auto-join team"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:120
+msgid "drop key/flag, exit vehicle"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:121
+msgid "suicide / respawn"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:122
+msgid "quick menu"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:125
+msgid "User defined"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:132
+msgid "Development"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:133
+msgid "sandbox menu"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:134
+msgid "drag object (sandbox)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/keybinder.qc:135
+msgid "waypoint editor menu"
+msgstr ""
+
+#: qcsrc/menu/xonotic/mainwindow.qc:96 qcsrc/menu/xonotic/mainwindow.qc:99
+msgid "Do not press this button again!"
+msgstr ""
+
+#: qcsrc/menu/xonotic/maplist.qc:288
+msgid ""
+"Huh? Can't play this (m is NULL). Refiltering so this won't happen again."
+msgstr ""
+
+#: qcsrc/menu/xonotic/maplist.qc:296
+#, c-format
+msgid "%s's Xonotic Server"
+msgstr ""
+
+#: qcsrc/menu/xonotic/maplist.qc:301
+msgid ""
+"Huh? Can't play this (invalid game type). Refiltering so this won't happen "
+"again."
+msgstr ""
+
+#: qcsrc/menu/xonotic/playerlist.qc:102 qcsrc/menu/xonotic/playerlist.qc:112
+msgid "spectator"
+msgstr ""
+
+#: qcsrc/menu/xonotic/playermodel.qc:161
+msgid "<no model found>"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.qc:256
+msgid "SERVER^Remove favorite"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.qc:257
+msgid "Remove the currently highlighted server from bookmarks"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.qc:261
+msgid "SERVER^Favorite"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.qc:262
+msgid ""
+"Bookmark the currently highlighted server so that it's faster to find in the "
+"future"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.qc:733
+msgid "Ping"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.qc:734
+msgid "Hostname"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.qc:735
+msgid "Map"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.qc:736
+msgid "Type"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.qc:1019
+#, c-format
+msgid "AES level %d"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.qc:1019
+msgid "ENC^none"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.qc:1019
+msgid "encryption:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.qc:1020
+#, c-format
+msgid "mod: %s"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.qc:1022
+#, c-format
+msgid "modified settings"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.qc:1022
+#, c-format
+msgid "official settings"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.qc:1024
+msgid "stats disabled"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.qc:1024
+msgid "stats enabled"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.qh:152
+msgid "SLCAT^Favorites"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.qh:153
+msgid "SLCAT^Recommended"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.qh:154
+msgid "SLCAT^Normal Servers"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.qh:155
+msgid "SLCAT^Servers"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.qh:156
+msgid "SLCAT^Competitive Mode"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.qh:157
+msgid "SLCAT^Modified Servers"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.qh:158
+msgid "SLCAT^Overkill"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.qh:159
+msgid "SLCAT^InstaGib"
+msgstr ""
+
+#: qcsrc/menu/xonotic/serverlist.qh:160
+msgid "SLCAT^Defrag Mode"
+msgstr ""
+
+#: qcsrc/menu/xonotic/skinlist.qc:70
+msgid "<TITLE>"
+msgstr ""
+
+#: qcsrc/menu/xonotic/skinlist.qc:71
+msgid "<AUTHOR>"
+msgstr ""
+
+#: qcsrc/menu/xonotic/slider_decibels.qc:72
+msgid "VOL^MAX"
+msgstr ""
+
+#: qcsrc/menu/xonotic/slider_decibels.qc:74
+msgid "VOL^OFF"
+msgstr ""
+
+#: qcsrc/menu/xonotic/slider_decibels.qc:82
+#, c-format
+msgid "%s dB"
+msgstr ""
+
+#: qcsrc/menu/xonotic/slider_particles.qc:14
+msgid "PART^OMG"
+msgstr ""
+
+#: qcsrc/menu/xonotic/slider_particles.qc:15
+msgid "PART^Low"
+msgstr ""
+
+#: qcsrc/menu/xonotic/slider_particles.qc:16
+msgid "PART^Medium"
+msgstr ""
+
+#: qcsrc/menu/xonotic/slider_particles.qc:17
+#: qcsrc/menu/xonotic/slider_sbfadetime.qc:14
+msgid "PART^Normal"
+msgstr ""
+
+#: qcsrc/menu/xonotic/slider_particles.qc:18
+msgid "PART^High"
+msgstr ""
+
+#: qcsrc/menu/xonotic/slider_particles.qc:19
+msgid "PART^Ultra"
+msgstr ""
+
+#: qcsrc/menu/xonotic/slider_particles.qc:20
+msgid "PART^Ultimate"
+msgstr ""
+
+#: qcsrc/menu/xonotic/slider_picmip.qc:13
+msgid ""
+"Change the sharpness of the textures. Lowering it will effectively reduce "
+"texture memory usage, but make the textures appear very blurry."
+msgstr ""
+
+#: qcsrc/menu/xonotic/slider_resolution.qc:115
+msgid "Screen resolution"
+msgstr ""
+
+#: qcsrc/menu/xonotic/slider_sbfadetime.qc:13
+msgid "PART^Slow"
+msgstr ""
+
+#: qcsrc/menu/xonotic/slider_sbfadetime.qc:15
+msgid "PART^Fast"
+msgstr ""
+
+#: qcsrc/menu/xonotic/slider_sbfadetime.qc:16
+msgid "PART^Instant"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:29
+msgid "January"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:30
+msgid "February"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:31
+msgid "March"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:32
+msgid "April"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:33
+msgid "May"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:34
+msgid "June"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:35
+msgid "July"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:36
+msgid "August"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:37
+msgid "September"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:38
+msgid "October"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:39
+msgid "November"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:40
+msgid "December"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:46
+#, no-c-format
+msgid "DATE^%m %d, %Y"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:97
+msgid "Joined:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:104
+msgid "Last match:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:111
+msgid "Time played:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:118 qcsrc/menu/xonotic/statslist.qc:231
+msgid "Favorite map:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:150 qcsrc/menu/xonotic/statslist.qc:202
+#: qcsrc/menu/xonotic/statslist.qc:245
+#, c-format
+msgid "Matches:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:155
+#, c-format
+msgid "Wins/Losses:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:156
+#, c-format
+msgid "Win percentage:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:167
+#, c-format
+msgid "Kills/Deaths:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:173
+#, c-format
+msgid "Kill ratio:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:208
+msgid "ELO:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:215
+msgid "Rank:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:222
+msgid "Percentile:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/statslist.qc:247
+#, c-format
+msgid "%d (unranked)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/util.qc:420
+msgid "Update can be downloaded at:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/util.qc:528
+msgid "Autogenerating mapinfo for newly added maps..."
+msgstr ""
+
+#: qcsrc/menu/xonotic/util.qc:566
+#, c-format
+msgid "Update to %s now!"
+msgstr ""
+
+#: qcsrc/menu/xonotic/util.qc:650
+msgid ""
+"^1ERROR: Texture compression is required but not supported.\n"
+"^1Expect visual problems."
+msgstr ""
+
+#: qcsrc/menu/xonotic/util.qc:780
+msgid "Use default"
+msgstr ""
+
+#: qcsrc/menu/xonotic/util.qc:800
+msgid "Team Color:"
+msgstr ""
#
# Translators:
# Antoni Das <Antonidas159@gmail.com>, 2017
+# LegendGuard, 2020
+# LegendGuard, 2020
# Lento <securemailfor28-xonotic@yahoo.co.jp>, 2015
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-17 03:18+0000\n"
-"Last-Translator: Space Ace <scocasso@hotmail.com>\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"
"Language: ja_JP\n"
#: qcsrc/client/hud/hud_config.qc:81
#, c-format
msgid "^2Successfully exported to %s! (Note: It's saved in data/data/)"
-msgstr "^2%sへの書き出すに成功! (註: data/data/ に保存さる)"
+msgstr "^2%s への書き出すに成功! (註: data/data/ に保存されました)"
#: qcsrc/client/hud/hud_config.qc:85
#, c-format
#: qcsrc/client/hud/panel/centerprint.qc:174
#, c-format
msgid "^3Countdown message at time %s, seconds left: ^COUNT"
-msgstr ""
+msgstr "^3時刻%s秒読みメッセージ, 残り秒: ^COUNT"
#: qcsrc/client/hud/panel/centerprint.qc:176
#, c-format
"^1Multiline message at time %s that\n"
"^1lasts longer than normal"
msgstr ""
+"^1複数行メッセージで時刻 %s が、\n"
+"^1通常よりも長く続きます"
#: qcsrc/client/hud/panel/centerprint.qc:178
#, c-format
msgid "Message at time %s"
-msgstr ""
+msgstr "時刻 %s でメッセージ"
#: qcsrc/client/hud/panel/centerprint.qc:183
msgid "Generic message"
-msgstr ""
+msgstr "一般的なメッセージ"
#: qcsrc/client/hud/panel/chat.qc:89
msgid "^3Player^7: This is the chat area."
-msgstr ""
+msgstr "^3選手^7: ここがチャット面積."
#: qcsrc/client/hud/panel/engineinfo.qc:76
#, c-format
msgid "FPS: %.*f"
-msgstr ""
+msgstr "FPS: %.*f"
#: qcsrc/client/hud/panel/infomessages.qc:95
msgid "^1Observing"
-msgstr ""
+msgstr "^1観察中"
#: qcsrc/client/hud/panel/infomessages.qc:97
#, c-format
msgid "^1Spectating: ^7%s"
-msgstr ""
+msgstr "^1観戦中: ^7%s"
#: qcsrc/client/hud/panel/infomessages.qc:108
#, c-format
msgid "^1Press ^3%s^1 to spectate"
-msgstr ""
+msgstr "観戦するために ^3%s ^1を押して"
#: qcsrc/client/hud/panel/infomessages.qc:108
#: qcsrc/menu/xonotic/keybinder.qc:47
msgid "primary fire"
-msgstr "一次撃つ"
+msgstr "一次射撃"
#: qcsrc/client/hud/panel/infomessages.qc:110
#, c-format
msgid "^1Press ^3%s^1 or ^3%s^1 for next or previous player"
-msgstr ""
+msgstr "^1次または前の選手を表示されるために ^3%s ^1または ^3%s ^1を押して"
#: qcsrc/client/hud/panel/infomessages.qc:110
#: qcsrc/client/hud/panel/infomessages.qc:114
#: qcsrc/client/hud/panel/infomessages.qc:110
#: qcsrc/client/hud/panel/infomessages.qc:114
msgid "previous weapon"
-msgstr "前の兵器"
+msgstr "前の武器"
#: qcsrc/client/hud/panel/infomessages.qc:114
#, c-format
msgid "^1Use ^3%s^1 or ^3%s^1 to change the speed"
-msgstr ""
+msgstr "^3%s ^1または ^3%s ^1を使用して速度を変更する"
#: qcsrc/client/hud/panel/infomessages.qc:116
#, c-format
msgid "^1Press ^3%s^1 to observe, ^3%s^1 to change camera mode"
msgstr ""
+"^1観戦するために ^3%s ^1を押して、カメラモードを変更するために ^3%s ^1を押し"
+"て"
#: qcsrc/client/hud/panel/infomessages.qc:116
#: qcsrc/common/vehicles/cl_vehicles.qc:190
msgid "drop weapon"
-msgstr "兵器を落と"
+msgstr "武器を落とす"
#: qcsrc/client/hud/panel/infomessages.qc:116
#: qcsrc/menu/xonotic/keybinder.qc:48
msgid "secondary fire"
-msgstr "二次撃つ"
+msgstr "二次射撃"
#: qcsrc/client/hud/panel/infomessages.qc:119
#, c-format
msgid "^1Press ^3%s^1 for gamemode info"
-msgstr ""
+msgstr "^1ゲームモード情報が表示されるために ^3%s ^1を押して"
#: qcsrc/client/hud/panel/infomessages.qc:119
#: qcsrc/menu/xonotic/keybinder.qc:103
msgid "server info"
-msgstr ""
+msgstr "サーバー情報"
#: qcsrc/client/hud/panel/infomessages.qc:132
msgid "^1Match has already begun"
-msgstr ""
+msgstr "^1試合はすでに開始しています"
#: qcsrc/client/hud/panel/infomessages.qc:134
msgid "^1You have no more lives left"
-msgstr ""
+msgstr "^1あなたは命を使い果たです"
#: 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 "^1参加するために ^3%s ^1を押して"
#: qcsrc/client/hud/panel/infomessages.qc:136
#: 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
msgid "^1Game starts in ^3%d^1 seconds"
-msgstr ""
+msgstr "^1ゲームは ^3%d ^1秒で始まります"
#: qcsrc/client/hud/panel/infomessages.qc:153
msgid "^2Currently in ^1warmup^2 stage!"
-msgstr "^2現在、^1準備運動^2の段階に入っています!"
+msgstr "^2現在、^1準備運動 ^2の段階に入っています!"
#: qcsrc/client/hud/panel/infomessages.qc:168
#, c-format
msgid "%sPress ^3%s%s to end warmup"
-msgstr "%s^3%s%sを押して準備運動を終了します"
+msgstr "%s準備運動を終了するために ^3%s%s を押して"
#: qcsrc/client/hud/panel/infomessages.qc:168
#: qcsrc/client/hud/panel/infomessages.qc:170
#: qcsrc/client/hud/panel/infomessages.qc:170
#, c-format
msgid "%sPress ^3%s%s once you are ready"
-msgstr "%s準備ができたら^3%s%sを押します"
+msgstr "%s準備ができたら ^3%s%s を押して"
#: qcsrc/client/hud/panel/infomessages.qc:175
msgid "^2Waiting for others to ready up to end warmup..."
-msgstr "^2準備演習が終了する前に、全員の準備ができるまで待ちます..."
+msgstr "^2準備演習が終了する前に、全員の準備ができるまで待ち中..."
#: qcsrc/client/hud/panel/infomessages.qc:177
msgid "^2Waiting for others to ready up..."
-msgstr "^2全員の準備ができるまで待ちます..."
+msgstr "^2全員の準備ができるまで待ち中..."
#: qcsrc/client/hud/panel/infomessages.qc:183
#, c-format
msgid "^2Press ^3%s^2 to end warmup"
-msgstr "^2^3%s^2を押して準備運動を終了します"
+msgstr "^2準備運動を終了するために ^2^3%s ^2を押して"
#: qcsrc/client/hud/panel/infomessages.qc:204
msgid "Teamnumbers are unbalanced!"
-msgstr ""
+msgstr "チーム番号はアンバランスです!"
#: qcsrc/client/hud/panel/infomessages.qc:207
#, c-format
msgid " Press ^3%s%s to adjust"
-msgstr ""
+msgstr " 調整するために ^3%s%s を押して"
#: qcsrc/client/hud/panel/infomessages.qc:207
#: qcsrc/menu/xonotic/keybinder.qc:115
msgid "team menu"
-msgstr ""
+msgstr "チームメニュー"
#: qcsrc/client/hud/panel/infomessages.qc:217
msgid "^1Spectating this player:"
-msgstr ""
+msgstr "^1この選手を観戦中:"
#: qcsrc/client/hud/panel/infomessages.qc:217
msgid "^1Spectating you:"
-msgstr ""
+msgstr "^1あなたを観戦中:"
#: qcsrc/client/hud/panel/infomessages.qc:233
msgid "^7Press ^3ESC ^7to show HUD options."
-msgstr ""
+msgstr "^7HUDオプションを表示するために ^3ESC ^7を押して。"
#: qcsrc/client/hud/panel/infomessages.qc:234
msgid "^3Doubleclick ^7a panel for panel-specific options."
-msgstr ""
+msgstr "^7パネル固有のオプションのパネルを^3ダブルクリックする。"
#: qcsrc/client/hud/panel/infomessages.qc:235
msgid "^3CTRL ^7to disable collision testing, ^3SHIFT ^7and"
-msgstr ""
+msgstr "^3CTRL ^7で衝突テストを無効にし、^3SHIFT ^7と"
#: qcsrc/client/hud/panel/infomessages.qc:236
msgid "^3ALT ^7+ ^3ARROW KEYS ^7for fine adjustments."
-msgstr ""
+msgstr "^3ALT ^7+ ^3ARROW KEYS ^7で微調整する。"
#: qcsrc/client/hud/panel/modicons.qc:183
msgid "Personal best"
-msgstr ""
+msgstr "自己最高"
#: qcsrc/client/hud/panel/modicons.qc:193
msgid "Server best"
-msgstr ""
+msgstr "最高のサーバー"
#: 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 "選手 %d"
#: qcsrc/client/hud/panel/quickmenu.qc:597
#: qcsrc/client/hud/panel/quickmenu.qc:599
#, c-format
msgid "Submenu%d"
-msgstr ""
+msgstr "サブメニュー%d"
#: qcsrc/client/hud/panel/quickmenu.qc:604
#, c-format
msgid "Command%d"
-msgstr ""
+msgstr "コマンド%d"
#: qcsrc/client/hud/panel/quickmenu.qc:630
msgid "Continue..."
-msgstr ""
+msgstr "続ける..."
#: qcsrc/client/hud/panel/quickmenu.qc:787
#: qcsrc/client/hud/panel/quickmenu.qc:794
msgid "Chat"
-msgstr ""
+msgstr "チャット"
#: qcsrc/client/hud/panel/quickmenu.qc:788
msgid "QMCMD^Send public message to"
-msgstr ""
+msgstr "QMCMD^公開メッセージを送信する:"
#: qcsrc/client/hud/panel/quickmenu.qc:789
msgid "QMCMD^:-) / nice one"
-msgstr ""
+msgstr "QMCMD^(^‿^) / ナイス"
#: qcsrc/client/hud/panel/quickmenu.qc:789
msgid "QMCMD^nice one"
-msgstr ""
+msgstr "QMCMD^ナイス"
#: qcsrc/client/hud/panel/quickmenu.qc:790
msgid "QMCMD^good game"
-msgstr ""
+msgstr "よくやった"
#: qcsrc/client/hud/panel/quickmenu.qc:791
msgid "QMCMD^hi / good luck"
-msgstr ""
+msgstr "QMCMD^よー / 楽しんでね"
#: qcsrc/client/hud/panel/quickmenu.qc:791
msgid "QMCMD^hi / good luck and have fun"
-msgstr ""
+msgstr "QMCMD^よー / 頑張って楽しんでね"
#: qcsrc/client/hud/panel/quickmenu.qc:793
msgid "QMCMD^Send in English"
-msgstr ""
+msgstr "QMCMD^英語で送る"
#: qcsrc/client/hud/panel/quickmenu.qc:798
#: qcsrc/client/hud/panel/quickmenu.qc:814
msgid "QMCMD^Team chat"
-msgstr ""
+msgstr "QMCD^チームチャット"
#: qcsrc/client/hud/panel/quickmenu.qc:799
msgid "QMCMD^strength soon"
-msgstr ""
+msgstr "QMCMD^間もなく力"
#: qcsrc/client/hud/panel/quickmenu.qc:800
msgid "QMCMD^free item %x^7 (l:%y^7)"
-msgstr ""
+msgstr "QMCMD^無料アイテム %x^7 (l:%y^7)"
#: qcsrc/client/hud/panel/quickmenu.qc:800
msgid "QMCMD^free item, icon"
-msgstr ""
+msgstr "QMCMD^無料アイテム、アイコン"
#: qcsrc/client/hud/panel/quickmenu.qc:801
msgid "QMCMD^took item (l:%l^7)"
-msgstr ""
+msgstr "QMCMD^アイテムを取った (l:%l^7)"
#: qcsrc/client/hud/panel/quickmenu.qc:801
msgid "QMCMD^took item, icon"
-msgstr ""
+msgstr "QMCMD^アイテムを取った、アイコン"
#: qcsrc/client/hud/panel/quickmenu.qc:802
msgid "QMCMD^negative"
-msgstr ""
+msgstr "QMCMD^陰性"
#: qcsrc/client/hud/panel/quickmenu.qc:803
msgid "QMCMD^positive"
-msgstr ""
+msgstr "QMCMD^陽性"
#: 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^助けが必要 (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^助けが必要、アイコン"
#: qcsrc/client/hud/panel/quickmenu.qc:805
msgid "QMCMD^enemy seen (l:%y^7)"
-msgstr ""
+msgstr "QMCMD^敵が見えました (l:%y^7)"
#: qcsrc/client/hud/panel/quickmenu.qc:805
msgid "QMCMD^enemy seen, icon"
-msgstr ""
+msgstr "QMCMD^敵が見えました、アイコン"
#: qcsrc/client/hud/panel/quickmenu.qc:806
msgid "QMCMD^flag seen (l:%y^7)"
-msgstr ""
+msgstr "QMCMD^旗が見えました (l:%y^7)"
#: qcsrc/client/hud/panel/quickmenu.qc:806
msgid "QMCMD^flag seen, icon"
-msgstr ""
+msgstr "QMCMD^旗が見えました、アイコン"
#: 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^守り中 (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^守り中、アイコン"
#: 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^動き中 (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^動き中、アイコン"
#: 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^攻撃中 (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^攻撃中、アイコン"
#: qcsrc/client/hud/panel/quickmenu.qc:810
msgid "QMCMD^killed flagcarrier (l:%y^7)"
-msgstr ""
+msgstr "QMCMD^殺された旗持ち (l:%y^7)"
#: qcsrc/client/hud/panel/quickmenu.qc:810
msgid "QMCMD^killed flagcarrier, icon"
-msgstr ""
+msgstr "QMCMD^殺された旗持ち、アイコン"
#: qcsrc/client/hud/panel/quickmenu.qc:811
#, c-format
msgid "QMCMD^dropped flag (l:%d^7)"
-msgstr ""
+msgstr "QMCMD^旗を落とした (l:%d^7)"
#: qcsrc/client/hud/panel/quickmenu.qc:811
msgid "QMCMD^dropped flag, icon"
-msgstr ""
+msgstr "QMCMD^旗を落とした、アイコン"
#: qcsrc/client/hud/panel/quickmenu.qc:812
msgid "QMCMD^drop weapon, icon"
-msgstr ""
+msgstr "QMCMD^武器を落とす、アイコン"
#: qcsrc/client/hud/panel/quickmenu.qc:812
msgid "QMCMD^dropped weapon %w^7 (l:%l^7)"
-msgstr ""
+msgstr "QMCMD^武器を落とした、アイコン"
#: qcsrc/client/hud/panel/quickmenu.qc:813
msgid "QMCMD^drop flag/key, icon"
-msgstr ""
+msgstr "QMCMD^旗/鍵を落とす、アイコン"
#: qcsrc/client/hud/panel/quickmenu.qc:813
msgid "QMCMD^dropped flag/key %w^7 (l:%l^7)"
-msgstr ""
+msgstr "QMCMD^旗/鍵を落とした %w^7 (l:%l^7)"
#: qcsrc/client/hud/panel/quickmenu.qc:817
msgid "QMCMD^Send private message to"
-msgstr ""
+msgstr "QMCMD^非公開のメッセージを送信する"
#: qcsrc/client/hud/panel/quickmenu.qc:819
#: qcsrc/client/hud/panel/quickmenu.qc:849
msgid "QMCMD^Settings"
-msgstr ""
+msgstr "QMCMD^設定"
#: qcsrc/client/hud/panel/quickmenu.qc:820
#: qcsrc/client/hud/panel/quickmenu.qc:827
msgid "QMCMD^View/HUD settings"
-msgstr ""
+msgstr "QMCMD^ビュー / HUD設定"
#: qcsrc/client/hud/panel/quickmenu.qc:821
msgid "QMCMD^3rd person view"
-msgstr ""
+msgstr "QMCMD^三人称視点"
#: qcsrc/client/hud/panel/quickmenu.qc:822
msgid "QMCMD^Player models like mine"
-msgstr ""
+msgstr "QMCMD^私のような選手モデルを表示する"
#: qcsrc/client/hud/panel/quickmenu.qc:823
msgid "QMCMD^Names above players"
-msgstr ""
+msgstr "QMCMD^上に選手の名前"
#: qcsrc/client/hud/panel/quickmenu.qc:824
msgid "QMCMD^Crosshair per weapon"
-msgstr ""
+msgstr "QMCMD^武器ごとの十字線"
#: 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^ネットグラフ"
#: qcsrc/client/hud/panel/quickmenu.qc:829
#: qcsrc/client/hud/panel/quickmenu.qc:832
msgid "QMCMD^Sound settings"
-msgstr ""
+msgstr "QMCMD^サウンド設定"
#: qcsrc/client/hud/panel/quickmenu.qc:830
msgid "QMCMD^Hit sound"
-msgstr ""
+msgstr "QMCMD^衝撃のサウンド"
#: qcsrc/client/hud/panel/quickmenu.qc:831
msgid "QMCMD^Chat sound"
-msgstr ""
+msgstr "QMCMD^チャットのサウンド"
#: qcsrc/client/hud/panel/quickmenu.qc:836
msgid "QMCMD^Change spectator camera"
-msgstr ""
+msgstr "QMCMD^観客のカメラを変更する"
#: qcsrc/client/hud/panel/quickmenu.qc:841
#: qcsrc/client/hud/panel/quickmenu.qc:845
msgid "QMCMD^Observer camera"
-msgstr ""
+msgstr "QMCMD^観客のカメラ"
#: qcsrc/client/hud/panel/quickmenu.qc:842
msgid "QMCMD^Increase speed"
-msgstr ""
+msgstr "QMCMD^速度を上げる"
#: qcsrc/client/hud/panel/quickmenu.qc:843
msgid "QMCMD^Decrease speed"
-msgstr ""
+msgstr "QMCMD^速度を下げる"
#: qcsrc/client/hud/panel/quickmenu.qc:844
msgid "QMCMD^Wall collision"
-msgstr ""
+msgstr "QMCMD^壁衝突"
#: qcsrc/client/hud/panel/quickmenu.qc:848
msgid "QMCMD^Fullscreen"
-msgstr ""
+msgstr "QMCMD^全画面"
#: qcsrc/client/hud/panel/quickmenu.qc:851
#: qcsrc/client/hud/panel/quickmenu.qc:861
msgid "QMCMD^Call a vote"
-msgstr ""
+msgstr "QMCMD^投票を呼び出す"
#: qcsrc/client/hud/panel/quickmenu.qc:852
msgid "QMCMD^Restart the map"
-msgstr ""
+msgstr "QMCMD^マップを再起動する"
#: qcsrc/client/hud/panel/quickmenu.qc:853
msgid "QMCMD^End match"
-msgstr ""
+msgstr "QMCMD^試合終了"
#: qcsrc/client/hud/panel/quickmenu.qc:856
msgid "QMCMD^Reduce match time"
-msgstr ""
+msgstr "QMCMD^試合時刻を下げる"
#: qcsrc/client/hud/panel/quickmenu.qc:857
msgid "QMCMD^Extend match time"
-msgstr ""
+msgstr "QMCMD^試合時刻を拡張する"
#: qcsrc/client/hud/panel/quickmenu.qc:860
msgid "QMCMD^Shuffle teams"
-msgstr ""
+msgstr "QMCMD^チームをシャッフルする"
#: qcsrc/client/hud/panel/quickmenu.qc:865
msgid "QMCMD^Spectate a player"
-msgstr ""
+msgstr "QMCMD^選手を観戦する"
#: 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 "スタート"
#: qcsrc/client/hud/panel/racetimer.qc:85
#: qcsrc/client/hud/panel/racetimer.qc:89
msgid "Finish line"
-msgstr "ã\82´ã\83¼ã\83«"
+msgstr "ã\83\95ã\82£ã\83\8bã\83\83ã\82·ã\83¥ã\83©ã\82¤ã\83³"
#: qcsrc/client/hud/panel/racetimer.qc:87
#: qcsrc/client/hud/panel/racetimer.qc:156
#, c-format
msgid "Intermediate %d"
-msgstr ""
+msgstr "中間 %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 "ペナルティ: %.1f (%s)"
#: qcsrc/client/hud/panel/racetimer.qc:159 qcsrc/client/main.qc:1102
msgid "missing a checkpoint"
-msgstr ""
+msgstr "必要: 1通過点"
#: qcsrc/client/hud/panel/radar.qc:386
msgid "Click to select teleport destination"
-msgstr ""
+msgstr "クリックしてテレポートの宛先を選択する"
#: qcsrc/client/hud/panel/radar.qc:390
msgid "Click to select spawn location"
-msgstr ""
+msgstr "クリックして現れる場所を選択する"
#: qcsrc/client/hud/panel/scoreboard.qc:105
msgid "Number of ball carrier kills"
-msgstr ""
+msgstr "ボール持ちキル数"
#: qcsrc/client/hud/panel/scoreboard.qc:105
msgid "SCO^bckills"
-msgstr ""
+msgstr "ボール持ちキル数"
#: qcsrc/client/hud/panel/scoreboard.qc:106
msgid "SCO^bctime"
-msgstr ""
+msgstr "ボール持ち時刻"
#: qcsrc/client/hud/panel/scoreboard.qc:106
msgid "Total amount of time holding the ball in Keepaway"
-msgstr ""
+msgstr "キープアウェイでボールを保持している時刻の合計の量"
#: qcsrc/client/hud/panel/scoreboard.qc:107
msgid "How often a flag (CTF) or a key (KeyHunt) was captured"
-msgstr ""
+msgstr "旗 (CTF) または鍵 (KeyHunt) が取った頻度"
#: qcsrc/client/hud/panel/scoreboard.qc:107
msgid "SCO^caps"
-msgstr ""
+msgstr "取れ数"
#: qcsrc/client/hud/panel/scoreboard.qc:108
msgid "SCO^captime"
-msgstr ""
+msgstr "取れ時刻"
#: qcsrc/client/hud/panel/scoreboard.qc:108
msgid "Time of fastest capture (CTF)"
-msgstr ""
+msgstr "最速の取れ時刻 (CTF)"
#: qcsrc/client/hud/panel/scoreboard.qc:109
msgid "Number of deaths"
-msgstr ""
+msgstr "デス数"
#: qcsrc/client/hud/panel/scoreboard.qc:109
msgid "SCO^deaths"
-msgstr ""
+msgstr "デス数"
#: qcsrc/client/hud/panel/scoreboard.qc:110
msgid "Number of keys destroyed by pushing them into void"
-msgstr ""
+msgstr "ボイドに押し込まれたことによって破壊された鍵の数"
#: qcsrc/client/hud/panel/scoreboard.qc:110
msgid "SCO^destroyed"
-msgstr ""
+msgstr "破壊された"
#: qcsrc/client/hud/panel/scoreboard.qc:111
msgid "SCO^damage"
-msgstr ""
+msgstr "ダメージ"
#: qcsrc/client/hud/panel/scoreboard.qc:111
msgid "The total damage done"
-msgstr ""
+msgstr "合計ダメージ"
#: qcsrc/client/hud/panel/scoreboard.qc:112
msgid "SCO^dmgtaken"
-msgstr ""
+msgstr "受けたダメージ"
#: qcsrc/client/hud/panel/scoreboard.qc:112
msgid "The total damage taken"
-msgstr ""
+msgstr "受けたダメージ合計"
#: qcsrc/client/hud/panel/scoreboard.qc:113
msgid "Number of flag drops"
-msgstr ""
+msgstr "旗が落ちた数"
#: qcsrc/client/hud/panel/scoreboard.qc:113
msgid "SCO^drops"
-msgstr ""
+msgstr "旗が落ちた"
#: qcsrc/client/hud/panel/scoreboard.qc:114
msgid "Player ELO"
-msgstr ""
+msgstr "選手ELO"
#: 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 "最速"
#: qcsrc/client/hud/panel/scoreboard.qc:115
msgid "Time of fastest lap (Race/CTS)"
-msgstr ""
+msgstr "最速のラップ時刻 (レース / CTS)"
#: qcsrc/client/hud/panel/scoreboard.qc:116
msgid "Number of faults committed"
-msgstr ""
+msgstr "犯したフォールトの数"
#: qcsrc/client/hud/panel/scoreboard.qc:116
msgid "SCO^faults"
-msgstr ""
+msgstr "フォールト"
#: qcsrc/client/hud/panel/scoreboard.qc:117
msgid "Number of flag carrier kills"
-msgstr ""
+msgstr "旗持ちキル数"
#: qcsrc/client/hud/panel/scoreboard.qc:117
msgid "SCO^fckills"
-msgstr ""
+msgstr "旗持ちキル数"
#: 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 "キル数 - 自殺数 = "
#: qcsrc/client/hud/panel/scoreboard.qc:119
msgid "SCO^frags"
-msgstr ""
+msgstr "削除数"
#: qcsrc/client/hud/panel/scoreboard.qc:120
msgid "Number of goals scored"
-msgstr ""
+msgstr "得点したゴール数"
#: qcsrc/client/hud/panel/scoreboard.qc:120
msgid "SCO^goals"
-msgstr ""
+msgstr "ゴール"
#: qcsrc/client/hud/panel/scoreboard.qc:121
msgid "Number of keys carrier kills"
-msgstr ""
+msgstr "鍵持ちキル数"
#: qcsrc/client/hud/panel/scoreboard.qc:121
msgid "SCO^kckills"
-msgstr ""
+msgstr "鍵持ちキル数"
#: qcsrc/client/hud/panel/scoreboard.qc:122
msgid "SCO^k/d"
-msgstr ""
+msgstr "殺/死"
#: 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 "キル・デス率"
#: qcsrc/client/hud/panel/scoreboard.qc:123
msgid "SCO^kdr"
-msgstr ""
+msgstr "殺死害率"
#: qcsrc/client/hud/panel/scoreboard.qc:124
msgid "SCO^kdratio"
-msgstr ""
+msgstr "キル・デス率"
#: qcsrc/client/hud/panel/scoreboard.qc:125
msgid "Number of kills"
-msgstr ""
+msgstr "キル数"
#: qcsrc/client/hud/panel/scoreboard.qc:125
msgid "SCO^kills"
-msgstr ""
+msgstr "キル数"
#: qcsrc/client/hud/panel/scoreboard.qc:126
msgid "Number of laps finished (Race/CTS)"
-msgstr ""
+msgstr "終了したラップ数 (レース / CTS)"
#: qcsrc/client/hud/panel/scoreboard.qc:126
msgid "SCO^laps"
-msgstr ""
+msgstr "ラップ"
#: qcsrc/client/hud/panel/scoreboard.qc:127
msgid "Number of lives (LMS)"
-msgstr ""
+msgstr "命の数 (LMS)"
#: qcsrc/client/hud/panel/scoreboard.qc:127
msgid "SCO^lives"
-msgstr ""
+msgstr "命"
#: qcsrc/client/hud/panel/scoreboard.qc:128
msgid "Number of times a key was lost"
-msgstr ""
+msgstr "鍵が失われた回数"
#: qcsrc/client/hud/panel/scoreboard.qc:128
msgid "SCO^losses"
-msgstr ""
+msgstr "失われた数"
#: qcsrc/client/hud/panel/scoreboard.qc:129
#: qcsrc/client/hud/panel/scoreboard.qc:130
msgid "Player name"
-msgstr ""
+msgstr "選手名"
#: qcsrc/client/hud/panel/scoreboard.qc:129
msgid "SCO^name"
-msgstr ""
+msgstr "名前"
#: qcsrc/client/hud/panel/scoreboard.qc:130
msgid "SCO^nick"
-msgstr ""
+msgstr "ニック"
#: qcsrc/client/hud/panel/scoreboard.qc:131
msgid "Number of objectives destroyed"
-msgstr ""
+msgstr "破壊された目的数"
#: qcsrc/client/hud/panel/scoreboard.qc:131
msgid "SCO^objectives"
-msgstr ""
+msgstr "目的"
#: 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 ""
+"旗 (CTF) または鍵 (KeyHunt) またはボール (Keepaway) が取り上げされた頻度"
#: qcsrc/client/hud/panel/scoreboard.qc:132
msgid "SCO^pickups"
-msgstr ""
+msgstr "取り上げた"
#: qcsrc/client/hud/panel/scoreboard.qc:133
msgid "Ping time"
-msgstr ""
+msgstr "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 "失われたパケットの数"
#: 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 "ボイドに押し込まれた選手の数"
#: qcsrc/client/hud/panel/scoreboard.qc:135
msgid "SCO^pushes"
-msgstr ""
+msgstr "押し込まれた"
#: qcsrc/client/hud/panel/scoreboard.qc:136
msgid "Player rank"
-msgstr ""
+msgstr "選手ランク"
#: qcsrc/client/hud/panel/scoreboard.qc:136
msgid "SCO^rank"
-msgstr ""
+msgstr "ランク"
#: qcsrc/client/hud/panel/scoreboard.qc:137
msgid "Number of flag returns"
-msgstr ""
+msgstr "返された旗の数"
#: qcsrc/client/hud/panel/scoreboard.qc:137
msgid "SCO^returns"
-msgstr ""
+msgstr "返された旗"
#: qcsrc/client/hud/panel/scoreboard.qc:138
msgid "Number of revivals"
-msgstr ""
+msgstr "復活された者数"
#: qcsrc/client/hud/panel/scoreboard.qc:138
msgid "SCO^revivals"
-msgstr ""
+msgstr "復活された者"
#: 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"
-msgstr ""
+msgstr "勝ったラウンド"
#: qcsrc/client/hud/panel/scoreboard.qc:140
msgid "SCO^score"
-msgstr ""
+msgstr "得点"
#: qcsrc/client/hud/panel/scoreboard.qc:140
msgid "Total score"
-msgstr ""
+msgstr "合計得点"
#: qcsrc/client/hud/panel/scoreboard.qc:141
msgid "Number of suicides"
-msgstr ""
+msgstr "自殺数"
#: qcsrc/client/hud/panel/scoreboard.qc:141
msgid "SCO^suicides"
-msgstr ""
+msgstr "自殺"
#: qcsrc/client/hud/panel/scoreboard.qc:142
msgid "Number of kills minus deaths"
-msgstr ""
+msgstr "キル数 - デス数 = "
#: qcsrc/client/hud/panel/scoreboard.qc:142
msgid "SCO^sum"
-msgstr ""
+msgstr "和"
#: qcsrc/client/hud/panel/scoreboard.qc:143
msgid "Number of domination points taken (Domination)"
-msgstr ""
+msgstr "獲得したドミネートのポイントの数 (Domination)"
#: qcsrc/client/hud/panel/scoreboard.qc:143
msgid "SCO^takes"
-msgstr ""
+msgstr "獲得した"
#: qcsrc/client/hud/panel/scoreboard.qc:144
msgid "Number of teamkills"
-msgstr ""
+msgstr "チームメイトキル数"
#: qcsrc/client/hud/panel/scoreboard.qc:144
msgid "SCO^teamkills"
-msgstr ""
+msgstr "チームメイトキル数"
#: qcsrc/client/hud/panel/scoreboard.qc:145
msgid "Number of ticks (Domination)"
-msgstr ""
+msgstr "ティック数 (Domination)"
#: qcsrc/client/hud/panel/scoreboard.qc:145
msgid "SCO^ticks"
-msgstr ""
+msgstr "ティック"
#: qcsrc/client/hud/panel/scoreboard.qc:146
msgid "SCO^time"
-msgstr ""
+msgstr "時刻"
#: qcsrc/client/hud/panel/scoreboard.qc:146
msgid "Total time raced (Race/CTS)"
-msgstr ""
+msgstr "合計レース時刻 (レース / CTS)"
#: qcsrc/client/hud/panel/scoreboard.qc:330
msgid ""
"You can modify the scoreboard using the ^2scoreboard_columns_set command."
-msgstr ""
+msgstr "^2scoreboard_columns_set ^7コマンドを使用して得点表を変更できる。"
#: qcsrc/client/hud/panel/scoreboard.qc:331
msgid "Usage:"
-msgstr ""
+msgstr "使用方法:"
#: 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 ^7引数なしで、 cvar scoreboard_columns から引数を読"
+"み取る。"
#: qcsrc/client/hud/panel/scoreboard.qc:335
msgid ""
" ^5Note: ^7scoreboard_columns_set without arguments is executed on every "
"map start"
msgstr ""
+" ^5注:引数なしの ^7scoreboard_columns_set は、マップの開始時に毎回実行する"
#: 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 ^7デフォルトのレイアウトをロード"
+"し、それを cvar scoreboard_columns に展開して編集できるようにする"
#: qcsrc/client/hud/panel/scoreboard.qc:337
msgid "You can use a ^3|^7 to start the right-aligned fields."
-msgstr ""
+msgstr "^3 | ^7を使用して、右揃えのフィールドを開始できする。"
#: qcsrc/client/hud/panel/scoreboard.qc:338
msgid "The following field names are recognized (case insensitive):"
-msgstr ""
+msgstr "次のフィールド名が認識される (大文字と区別は区別されない):"
#: qcsrc/client/hud/panel/scoreboard.qc:344
msgid ""
"or in all but these game types. You can also specify 'all' as a\n"
"field to show all fields available for the current game mode."
msgstr ""
+"フィールドの前に + または - 記号、次にカンマで区切られたゲームタイプのリス"
+"ト、\n"
+"次にスラッシュを配置して、フィールドをこれらにのみ表示することができます。ま"
+"たは、\n"
+"これらのゲームタイプ以外の全て。また、フィールドとして「全」を指定して、\n"
+"現在のゲームモードで使用可能な全てのフィールドを表示することもできます。"
#: qcsrc/client/hud/panel/scoreboard.qc:350
msgid ""
"The special game type names 'teams' and 'noteams' can be used to\n"
"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"
-msgstr ""
+msgstr "例: scoreboard_columns_set name ping pl | +ctf/field3 -dm/field4"
#: qcsrc/client/hud/panel/scoreboard.qc:355
msgid ""
"will display name, ping and pl aligned to the left, and the fields\n"
"right of the vertical bar aligned to the right."
-msgstr ""
+msgstr "名前、ping、pl が左に、垂直バーの右側のフィールドが右に表示されます。"
#: qcsrc/client/hud/panel/scoreboard.qc:357
msgid ""
"'field3' will only be shown in CTF, and 'field4' will be shown in all\n"
"other gamemodes except DM."
msgstr ""
+"'field3' はCTFでのみ表示され、'field4' は DM を除く他の全てのゲームモードで表"
+"示される。"
#: qcsrc/client/hud/panel/scoreboard.qc:621
#: qcsrc/client/hud/panel/scoreboard.qc:628
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:164
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:169
msgid "N/A"
-msgstr ""
+msgstr "N/A"
#: qcsrc/client/hud/panel/scoreboard.qc:1206
#, c-format
msgid "Accuracy stats (average %d%%)"
-msgstr ""
+msgstr "精度状態(平均 %d%%)"
#: qcsrc/client/hud/panel/scoreboard.qc:1354
msgid "Map stats:"
-msgstr ""
+msgstr "マップ状態:"
#: qcsrc/client/hud/panel/scoreboard.qc:1384
msgid "Monsters killed:"
-msgstr ""
+msgstr "モンスターキル数:"
#: qcsrc/client/hud/panel/scoreboard.qc:1391
msgid "Secrets found:"
-msgstr ""
+msgstr "見つかった秘密:"
#: qcsrc/client/hud/panel/scoreboard.qc:1413
msgid "Capture time rankings"
-msgstr ""
+msgstr "取れ時刻ランキング"
#: qcsrc/client/hud/panel/scoreboard.qc:1413
msgid "Rankings"
-msgstr ""
+msgstr "ランキング"
#: qcsrc/client/hud/panel/scoreboard.qc:1631
#, c-format
msgid "^3%1.0f minutes"
-msgstr ""
+msgstr "^3%1.0f 分"
#: qcsrc/client/hud/panel/scoreboard.qc:1640
#: qcsrc/client/hud/panel/scoreboard.qc:1647
#, c-format
msgid "^5%s %s"
-msgstr ""
+msgstr "^5%s %s"
#: qcsrc/client/hud/panel/scoreboard.qc:1641
#: qcsrc/client/hud/panel/scoreboard.qc:1648
#: qcsrc/client/hud/panel/scoreboard.qc:1667
#: qcsrc/client/hud/panel/scoreboard.qc:1674
msgid "SCO^points"
-msgstr ""
+msgstr "点"
#: qcsrc/client/hud/panel/scoreboard.qc:1666
#: qcsrc/client/hud/panel/scoreboard.qc:1673
#, c-format
msgid "^2+%s %s"
-msgstr ""
+msgstr "^2+%s %s"
#: qcsrc/client/hud/panel/scoreboard.qc:1684
#, c-format
msgid "^7Map: ^2%s"
-msgstr ""
+msgstr "^7マップ: ^2%s"
#: qcsrc/client/hud/panel/scoreboard.qc:1823
#, c-format
msgid "Speed award: %d%s ^7(%s^7)"
-msgstr ""
+msgstr "速度の賞: %d%s ^7(%s^7)"
#: qcsrc/client/hud/panel/scoreboard.qc:1827
#, c-format
msgid "All-time fastest: %d%s ^7(%s^7)"
-msgstr ""
+msgstr "史上最速: %d%s ^7(%s^7)"
#: qcsrc/client/hud/panel/scoreboard.qc:1843
#, c-format
msgid "Spectators"
-msgstr ""
+msgstr "観客"
#: qcsrc/client/hud/panel/scoreboard.qc:1870
#, c-format
msgid "^1Respawning in ^3%s^1..."
-msgstr ""
+msgstr "^3%s^1 後に再び現れ中..."
#: qcsrc/client/hud/panel/scoreboard.qc:1880
#, c-format
msgid "You are dead, wait ^3%s^7 before respawning"
-msgstr ""
+msgstr "あなたは死んだ、再び現れる前に ^3%s ^7待ってください"
#: qcsrc/client/hud/panel/scoreboard.qc:1889
#, c-format
msgid "You are dead, press ^2%s^7 to respawn"
-msgstr ""
+msgstr "あなたは死んだ、^2%s ^7を押して再び現れてください"
#: qcsrc/client/hud/panel/timer.qc:72
msgid "WARMUP"
-msgstr ""
+msgstr "準備"
#: qcsrc/client/hud/panel/vote.qc:33
msgid "^1You must answer before entering hud configure mode"
-msgstr ""
+msgstr "^1HUD構成モードに入る前に回答する必要があります"
#: qcsrc/client/hud/panel/vote.qc:36
msgid "^2Name ^7instead of \"^1Anonymous player^7\" in stats"
-msgstr ""
+msgstr "統計では \"^1Anonymous player^7\" ではなく ^2名前"
#: qcsrc/client/hud/panel/vote.qc:122
msgid "A vote has been called for:"
-msgstr ""
+msgstr "投票が求められた:"
#: qcsrc/client/hud/panel/vote.qc:124
msgid "Allow servers to store and display your name?"
-msgstr ""
+msgstr "サーバーにあなたの名前の保存と表示を許可しますか?"
#: qcsrc/client/hud/panel/vote.qc:128
msgid "^1Configure the HUD"
-msgstr ""
+msgstr "^1HUDを構成する"
#: qcsrc/client/hud/panel/vote.qc:132
#: qcsrc/menu/xonotic/dialog_disconnect.qc:19
#: qcsrc/menu/xonotic/dialog_settings_misc_reset.qc:16
#: qcsrc/menu/xonotic/dialog_uid2name.qc:15
msgid "Yes"
-msgstr ""
+msgstr "はい"
#: qcsrc/client/hud/panel/vote.qc:134
#: qcsrc/menu/xonotic/dialog_disconnect.qc:22
#: qcsrc/menu/xonotic/dialog_settings_misc_reset.qc:17
#: qcsrc/menu/xonotic/dialog_uid2name.qc:17
msgid "No"
-msgstr ""
+msgstr "いいえ"
#: qcsrc/client/hud/panel/weapons.qc:584
msgid "Out of ammo"
#: qcsrc/client/hud/panel/weapons.qc:588
msgid "Don't have"
-msgstr ""
+msgstr "ない"
#: qcsrc/client/hud/panel/weapons.qc:592
msgid "Unavailable"
-msgstr ""
+msgstr "無利用"
#: qcsrc/client/main.qc:1000
msgid " qu/s"
-msgstr ""
+msgstr " qu/s"
#: qcsrc/client/main.qc:1002
msgid " m/s"
-msgstr ""
+msgstr " ミリ秒"
#: qcsrc/client/main.qc:1004
msgid " km/h"
-msgstr ""
+msgstr " 時速キロ"
#: qcsrc/client/main.qc:1006
msgid " mph"
-msgstr ""
+msgstr " 時速マイル"
#: qcsrc/client/main.qc:1008
msgid " knots"
-msgstr ""
+msgstr " ノット"
#: qcsrc/client/main.qc:1255
#, c-format
msgid "%s (not bound)"
-msgstr ""
+msgstr "%s (割り当てられていない)"
#: qcsrc/client/mapvoting.qc:59
msgid " (1 vote)"
-msgstr ""
+msgstr " (1 票)"
#: qcsrc/client/mapvoting.qc:61
#, c-format
msgid " (%d votes)"
-msgstr ""
+msgstr " (%d 票)"
#: qcsrc/client/mapvoting.qc:281
msgid "Don't care"
-msgstr ""
+msgstr "構わない"
#: qcsrc/client/mapvoting.qc:382
msgid "Decide the gametype"
-msgstr ""
+msgstr "ゲームモードを決める"
#: qcsrc/client/mapvoting.qc:382
msgid "Vote for a map"
-msgstr ""
+msgstr "マップに投票する"
#: qcsrc/client/mapvoting.qc:399
#, c-format
msgid "%d seconds left"
-msgstr ""
+msgstr "残り %d 秒"
#: qcsrc/client/mapvoting.qc:512
msgid "mv_mapdownload: ^3You're not supposed to use this command on your own!"
-msgstr ""
+msgstr "mv_mapdownload: ^3このコマンドを自分で使用しないでください!"
#: qcsrc/client/mapvoting.qc:522
msgid "^1Error:^7 Couldn't find pak index."
-msgstr ""
+msgstr "^1ERROR:^7 pak index が見つかりませんでした。"
#: qcsrc/client/mapvoting.qc:531
msgid "Requesting preview..."
-msgstr ""
+msgstr "プレビューをリクエスト中..."
#: qcsrc/client/miscfunctions.qc:111
msgid "Trying to remove a team which is not in the teamlist!"
-msgstr ""
+msgstr "チームリストにないチームを削除しようとしています!"
#: qcsrc/client/view.qc:939
msgid "Nade timer"
-msgstr ""
+msgstr "手榴弾タイマー"
#: qcsrc/client/view.qc:944
msgid "Capture progress"
-msgstr ""
+msgstr "取れ進歩"
#: qcsrc/client/view.qc:949
msgid "Revival progress"
#: qcsrc/common/command/generic.qc:156
msgid "error creating curl handle"
-msgstr ""
+msgstr "error creating curl handle"
#: qcsrc/common/command/generic.qc:412
msgid "Notification restart command only works with cl_cmd and sv_cmd."
-msgstr ""
+msgstr "通知再起動コマンドは、cl_cmd および sv_cmd でのみ機能します。"
#: qcsrc/common/gamemodes/gamemode/nexball/weapon.qh:7
msgid "Ball Stealer"
-msgstr ""
+msgstr "ボールスティーラー"
#: qcsrc/common/items/item/ammo.qh:66
msgid "bullets"
-msgstr ""
+msgstr "弾丸"
#: qcsrc/common/items/item/ammo.qh:96
msgid "cells"
-msgstr ""
+msgstr "セル"
#: qcsrc/common/items/item/ammo.qh:126
msgid "plasma"
-msgstr ""
+msgstr "プラズマ"
#: qcsrc/common/items/item/ammo.qh:156
msgid "rockets"
-msgstr ""
+msgstr "ロケット"
#: qcsrc/common/items/item/ammo.qh:190
msgid "shells"
-msgstr ""
+msgstr "シェル"
#: qcsrc/common/items/item/armor.qh:42
msgid "Small armor"
-msgstr ""
+msgstr "小さな鎧"
#: qcsrc/common/items/item/armor.qh:80
msgid "Medium armor"
-msgstr ""
+msgstr "中程度の鎧"
#: qcsrc/common/items/item/armor.qh:118 qcsrc/common/items/item/armor.qh:121
msgid "Big armor"
-msgstr ""
+msgstr "大きな鎧"
#: qcsrc/common/items/item/armor.qh:158 qcsrc/common/items/item/armor.qh:161
msgid "Mega armor"
-msgstr ""
+msgstr "メガ鎧"
#: qcsrc/common/items/item/health.qh:42
msgid "Small health"
-msgstr ""
+msgstr "小さな健康"
#: qcsrc/common/items/item/health.qh:80
msgid "Medium health"
-msgstr ""
+msgstr "中程度の健康"
#: qcsrc/common/items/item/health.qh:118 qcsrc/common/items/item/health.qh:121
msgid "Big health"
-msgstr ""
+msgstr "大きな健康"
#: qcsrc/common/items/item/health.qh:158 qcsrc/common/items/item/health.qh:161
msgid "Mega health"
-msgstr ""
+msgstr "メガ健康"
#: qcsrc/common/items/item/jetpack.qh:38 qcsrc/common/items/item/jetpack.qh:41
#: 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"
-msgstr ""
+msgstr "燃料再生器"
#: qcsrc/common/items/item/jetpack.qh:99
msgid "Fuel regen"
-msgstr ""
+msgstr "燃料再生"
#: qcsrc/common/items/item/powerup.qh:43 qcsrc/common/items/item/powerup.qh:46
msgid "Strength"
-msgstr ""
+msgstr "力"
#: qcsrc/common/items/item/powerup.qh:79 qcsrc/common/items/item/powerup.qh:82
msgid "Shield"
-msgstr ""
+msgstr "寿"
#: qcsrc/common/mapinfo.qc:626
#, no-c-format
msgid "@!#%'n Tuba Throwing"
-msgstr ""
+msgstr "@!#%'nチューバ投げ"
#: qcsrc/common/mapinfo.qh:72 qcsrc/common/mapinfo.qh:334
#: qcsrc/common/mapinfo.qh:529
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:105
msgid "Frag limit:"
-msgstr ""
+msgstr "削除制限:"
#: qcsrc/common/mapinfo.qh:72 qcsrc/common/mapinfo.qh:334
#: qcsrc/common/mapinfo.qh:529
msgid "The amount of frags needed before the match will end"
-msgstr ""
+msgstr "試合が終了する前に必要な削除の量"
#: qcsrc/common/mapinfo.qh:115
msgid "Deathmatch"
-msgstr ""
+msgstr "デスマッチ (DM)"
#: qcsrc/common/mapinfo.qh:115
msgid "Score as many frags as you can"
-msgstr ""
+msgstr "できるだけ多くの削除を得点して"
#: qcsrc/common/mapinfo.qh:128
msgid "Last Man Standing"
-msgstr ""
+msgstr "ラストマンスタンディング (LMS)"
#: qcsrc/common/mapinfo.qh:128
msgid "Survive and kill until the enemies have no lives left"
-msgstr ""
+msgstr "敵の命がなくなるまで生き残って、殺して"
#: qcsrc/common/mapinfo.qh:137
msgid "Lives:"
-msgstr ""
+msgstr "命数:"
#: qcsrc/common/mapinfo.qh:149
msgid "Race"
-msgstr ""
+msgstr "レース"
#: qcsrc/common/mapinfo.qh:149
msgid "Race against other players to the finish line"
-msgstr ""
+msgstr "フィニッシュラインに他の選手とのレース"
#: qcsrc/common/mapinfo.qh:176
msgid "Laps:"
-msgstr ""
+msgstr "ラップ数:"
#: qcsrc/common/mapinfo.qh:189
msgid "Race CTS"
-msgstr ""
+msgstr "レース (CTS)"
#: qcsrc/common/mapinfo.qh:189
msgid "Race for fastest time."
-msgstr ""
+msgstr "最高の時刻のためのレース。"
#: qcsrc/common/mapinfo.qh:206 qcsrc/common/mapinfo.qh:257
#: qcsrc/common/mapinfo.qh:373 qcsrc/common/mapinfo.qh:416
#: qcsrc/common/mapinfo.qh:442 qcsrc/common/mapinfo.qh:462
#: qcsrc/common/mapinfo.qh:582
msgid "Point limit:"
-msgstr ""
+msgstr "ポイント制限:"
#: qcsrc/common/mapinfo.qh:219
msgid "Help your team score the most frags against the enemy team"
-msgstr ""
+msgstr "あなたのチームが敵チームに対して最も多くの削除を獲得するのを助けて"
#: qcsrc/common/mapinfo.qh:219
msgid "Team Deathmatch"
-msgstr ""
+msgstr "チームデスマッチ (TDM)"
#: qcsrc/common/mapinfo.qh:257 qcsrc/common/mapinfo.qh:373
#: qcsrc/common/mapinfo.qh:416
msgid "The amount of points needed before the match will end"
-msgstr ""
+msgstr "試合が終了する前に必要なポイントの量"
#: qcsrc/common/mapinfo.qh:271
msgid "Capture the Flag"
-msgstr ""
+msgstr "キャプチャー・ザ・フラッグ (CTF)"
#: qcsrc/common/mapinfo.qh:271
msgid ""
"Find and bring the enemy flag to your base to capture it, defend your base "
"from the other team"
msgstr ""
+"敵の旗を見つけて基地に持ってきて、それを取れて、他のチームから基地を守って"
#: qcsrc/common/mapinfo.qh:289
msgid "Capture limit:"
-msgstr ""
+msgstr "取れ制限:"
#: qcsrc/common/mapinfo.qh:289
msgid "The amount of captures needed before the match will end"
-msgstr ""
+msgstr "試合が終了する前に必要な取れの量"
#: qcsrc/common/mapinfo.qh:306
msgid "Clan Arena"
-msgstr ""
+msgstr "クランアリーナ (CA)"
#: qcsrc/common/mapinfo.qh:306
msgid "Kill all enemy teammates to win the round"
-msgstr ""
+msgstr "ラウンドに勝つために全ての敵チームメイトを殺して"
#: qcsrc/common/mapinfo.qh:350
msgid "Capture and defend all the control points to win"
-msgstr ""
+msgstr "勝つために全てのコントロールポイントを取れて、防御して"
#: qcsrc/common/mapinfo.qh:350
msgid "Domination"
-msgstr ""
+msgstr "ドミネート (Domination)"
#: qcsrc/common/mapinfo.qh:388
msgid "Gather all the keys to win the round"
-msgstr ""
+msgstr "ラウンドに勝つための全ての鍵を集まる"
#: qcsrc/common/mapinfo.qh:388
msgid "Key Hunt"
-msgstr ""
+msgstr "鍵の狩猟 (KeyHunt)"
#: qcsrc/common/mapinfo.qh:428
msgid "Assault"
-msgstr ""
+msgstr "突撃 (Assault)"
#: qcsrc/common/mapinfo.qh:428
msgid ""
"Destroy obstacles to find and destroy the enemy power core before time runs "
"out"
msgstr ""
+"時刻がなくなる前に敵のパワーコアを見つけて破壊するために障害物を破壊して"
#: qcsrc/common/mapinfo.qh:452
msgid "Capture control points to reach and destroy the enemy generator"
-msgstr ""
+msgstr "コントロールポイントを取れて、敵のジェネレーターに到達して破壊して"
#: qcsrc/common/mapinfo.qh:452
msgid "Onslaught"
-msgstr ""
+msgstr "猛攻撃 (Onslaught)"
#: qcsrc/common/mapinfo.qh:474
msgid "Nexball"
-msgstr ""
+msgstr "ネクスボール (Nexball)"
#: qcsrc/common/mapinfo.qh:474
msgid "Shoot and kick the ball into the enemies goal, keep your goal clean"
-msgstr ""
+msgstr "ボールを撃って敵のゴールに蹴り込んで、あなたのゴールを清潔にして"
#: qcsrc/common/mapinfo.qh:488
msgid "Goals:"
-msgstr ""
+msgstr "ゴール:"
#: qcsrc/common/mapinfo.qh:488
msgid "The amount of goals needed before the match will end"
-msgstr ""
+msgstr "試合が終了する前に必要なゴールの量"
#: qcsrc/common/mapinfo.qh:501
msgid "Freeze Tag"
-msgstr ""
+msgstr "フリーズタグ (FT)"
#: qcsrc/common/mapinfo.qh:501
msgid ""
"Kill enemies to freeze them, stand next to frozen teammates to revive them; "
"freeze all enemies to win"
msgstr ""
+"敵を冷凍してために殺して、チームメイトを復活させるために冷凍したチームメイト"
+"の隣に立って;勝つために全ての敵を冷凍して"
#: qcsrc/common/mapinfo.qh:545
msgid "Hold the ball to get points for kills"
-msgstr ""
+msgstr "殺された者のポイントを獲得するためにボールを保持して"
#: qcsrc/common/mapinfo.qh:545
msgid "Keepaway"
-msgstr ""
+msgstr "キープアウェイ (Keepaway)"
#: qcsrc/common/mapinfo.qh:560
msgid "Invasion"
-msgstr ""
+msgstr "侵入"
#: qcsrc/common/mapinfo.qh:560
msgid "Survive against waves of monsters"
-msgstr ""
+msgstr "モンスターの波に対して生き残って"
#: qcsrc/common/mapinfo.qh:590
msgid "Duel"
-msgstr ""
+msgstr "決闘"
#: qcsrc/common/mapinfo.qh:590
msgid "Fight in a one versus one arena battle to decide the winner"
-msgstr ""
+msgstr "勝者を決定しために一対一のアリーナバトルで戦って"
#: qcsrc/common/minigames/cl_minigames.qc:383
msgid "It's your turn"
-msgstr ""
+msgstr "あなたのターン"
#: qcsrc/common/minigames/cl_minigames_hud.qc:366
#: qcsrc/menu/xonotic/dialog_quit.qh:6
msgid "Quit"
-msgstr ""
+msgstr "終了する"
#: qcsrc/common/minigames/cl_minigames_hud.qc:371
msgid "Invite"
-msgstr ""
+msgstr "招待する"
#: qcsrc/common/minigames/cl_minigames_hud.qc:410
msgid "Current Game"
-msgstr ""
+msgstr "現在のゲーム"
#: qcsrc/common/minigames/cl_minigames_hud.qc:435
msgid "Exit Menu"
-msgstr ""
+msgstr "終了メニュー"
#: qcsrc/common/minigames/cl_minigames_hud.qc:447
#: qcsrc/menu/xonotic/dialog_multiplayer.qc:16
msgid "Create"
-msgstr ""
+msgstr "作成する"
#: qcsrc/common/minigames/cl_minigames_hud.qc:450
msgid "Join"
-msgstr ""
+msgstr "参加する"
#: qcsrc/common/minigames/cl_minigames_hud.qc:526
msgid "Minigames"
-msgstr ""
+msgstr "ミニゲーム"
#: qcsrc/common/minigames/cl_minigames_hud.qc:587
msgid "Minigame message"
-msgstr ""
+msgstr "ミニゲームメッセージ"
#: qcsrc/common/minigames/minigame/bd.qc:2
msgid "Bulldozer"
-msgstr ""
+msgstr "ブルドーザー"
#: qcsrc/common/minigames/minigame/bd.qc:1092
#: qcsrc/common/minigames/minigame/ps.qc:421
#: qcsrc/common/minigames/minigame/ps.qc:427
msgid "Game over!"
-msgstr ""
+msgstr "ゲームオーバー!"
#: qcsrc/common/minigames/minigame/bd.qc:1095
msgid "Well done! Click 'Next Level' to continue"
-msgstr ""
+msgstr "よくやった! 「次のレベル」をクリックして続行する"
#: qcsrc/common/minigames/minigame/bd.qc:1162
msgid "Better luck next time!"
-msgstr ""
+msgstr "次回は頑張って!"
#: qcsrc/common/minigames/minigame/bd.qc:1167
msgid "Tubular! Press \"Next Level\" to continue!"
-msgstr ""
+msgstr "管状! 「次のレベル」を押して続行して!"
#: qcsrc/common/minigames/minigame/bd.qc:1169
msgid "Wicked! Press \"Next Level\" to continue!"
-msgstr ""
+msgstr "邪悪! 「次のレベル」を押して続行して!"
#: qcsrc/common/minigames/minigame/bd.qc:1173
msgid "Press the space bar to change your currently selected tile"
-msgstr ""
+msgstr "現在選択されているタイルを変更するためにスペースバーを押して"
#: qcsrc/common/minigames/minigame/bd.qc:1176
msgid "Push the boulders onto the targets"
-msgstr ""
+msgstr "岩を目標に押し込んで"
#: qcsrc/common/minigames/minigame/bd.qc:1403
msgid "Next Level"
-msgstr ""
+msgstr "次のレベル"
#: qcsrc/common/minigames/minigame/bd.qc:1404
msgid "Restart"
-msgstr ""
+msgstr "再起動する"
#: qcsrc/common/minigames/minigame/bd.qc:1405
msgid "Editor"
-msgstr ""
+msgstr "編集"
#: qcsrc/common/minigames/minigame/bd.qc:1406
#: qcsrc/menu/xonotic/dialog_settings_input_userbind.qc:37
msgid "Save"
-msgstr ""
+msgstr "セーブ"
#: qcsrc/common/minigames/minigame/c4.qc:2
msgid "Connect Four"
-msgstr ""
+msgstr "四目並べ"
#: qcsrc/common/minigames/minigame/c4.qc:311
#: qcsrc/common/minigames/minigame/c4.qc:317
#: qcsrc/common/minigames/minigame/pp.qc:368
#, c-format
msgid "%s^7 won the game!"
-msgstr ""
+msgstr "%s^7 がゲームに勝利した!"
#: qcsrc/common/minigames/minigame/c4.qc:373
#: qcsrc/common/minigames/minigame/pp.qc:438
#: qcsrc/common/minigames/minigame/ttt.qc:319
msgid "Draw"
-msgstr ""
+msgstr "ドロー"
#: qcsrc/common/minigames/minigame/c4.qc:378
#: qcsrc/common/minigames/minigame/nmm.qc:606
#: qcsrc/common/minigames/minigame/pp.qc:444
#: qcsrc/common/minigames/minigame/ttt.qc:326
msgid "You lost the game!"
-msgstr ""
+msgstr "あなたはゲームに負けた!"
#: qcsrc/common/minigames/minigame/c4.qc:379
#: qcsrc/common/minigames/minigame/nmm.qc:607
#: qcsrc/common/minigames/minigame/pp.qc:445
#: qcsrc/common/minigames/minigame/ttt.qc:327
msgid "You win!"
-msgstr ""
+msgstr "あなたが勝つ!"
#: qcsrc/common/minigames/minigame/c4.qc:383
#: qcsrc/common/minigames/minigame/nmm.qc:611
#: qcsrc/common/minigames/minigame/pp.qc:456
#: qcsrc/common/minigames/minigame/ttt.qc:338
msgid "Wait for your opponent to make their move"
-msgstr ""
+msgstr "対戦相手の動きを待って"
#: qcsrc/common/minigames/minigame/c4.qc:386
#: qcsrc/common/minigames/minigame/nmm.qc:613
#: qcsrc/common/minigames/minigame/pp.qc:459
#: qcsrc/common/minigames/minigame/ttt.qc:341
msgid "Click on the game board to place your piece"
-msgstr ""
+msgstr "駒を配置しためにゲームボードをクリックして"
#: qcsrc/common/minigames/minigame/nmm.qc:7
msgid "Nine Men's Morris"
-msgstr ""
+msgstr "ナイン・メンズ・モリス"
#: qcsrc/common/minigames/minigame/nmm.qc:615
msgid ""
"You can select one of your pieces to move it in one of the surrounding places"
-msgstr ""
+msgstr "駒の一つを選択して、周囲のいずれかの場所に移動できます"
#: qcsrc/common/minigames/minigame/nmm.qc:617
msgid "You can select one of your pieces to move it anywhere on the board"
msgstr ""
+"盤上のどこにでもそれを移動するためにあなたの駒の一つを選択することができます"
#: qcsrc/common/minigames/minigame/nmm.qc:619
msgid "You can take one of the opponent's pieces"
-msgstr ""
+msgstr "対戦相手の駒の一つを取ることができます"
#: qcsrc/common/minigames/minigame/pong.qc:2
msgid "Pong"
-msgstr ""
+msgstr "ポン"
#: qcsrc/common/minigames/minigame/pong.qc:589
#: qcsrc/common/minigames/minigame/ttt.qc:299
msgid "AI"
-msgstr ""
+msgstr "AI"
#: qcsrc/common/minigames/minigame/pong.qc:606
msgid "Press ^1Start Match^7 to start the match with the current players"
-msgstr ""
+msgstr "現在の選手との試合を開始するには、「^1試合開始^7」を押して"
#: qcsrc/common/minigames/minigame/pong.qc:679
msgid "Start Match"
-msgstr ""
+msgstr "試合を開始"
#: qcsrc/common/minigames/minigame/pong.qc:680
msgid "Add AI player"
-msgstr ""
+msgstr "AI選手を追加する"
#: qcsrc/common/minigames/minigame/pong.qc:681
msgid "Remove AI player"
-msgstr ""
+msgstr "AI選手を削除する"
#: qcsrc/common/minigames/minigame/pp.qc:2
msgid "Push-Pull"
-msgstr ""
+msgstr "プッシュプル"
#: qcsrc/common/minigames/minigame/pp.qc:444
#: qcsrc/common/minigames/minigame/ttt.qc:326
msgid "Select \"^1Next Match^7\" on the menu for a rematch!"
-msgstr ""
+msgstr "再戦するのにメニューの「^1次の試合^7」を選択して!"
#: qcsrc/common/minigames/minigame/pp.qc:445
#: qcsrc/common/minigames/minigame/pp.qc:451
#: qcsrc/common/minigames/minigame/ttt.qc:327
#: qcsrc/common/minigames/minigame/ttt.qc:333
msgid "Select \"^1Next Match^7\" on the menu to start a new match!"
-msgstr ""
+msgstr "新しい試合を始めるのにメニューの「^1次の試合^7」を選択して!"
#: qcsrc/common/minigames/minigame/pp.qc:452
#: qcsrc/common/minigames/minigame/ttt.qc:334
msgid "Wait for your opponent to confirm the rematch"
-msgstr ""
+msgstr "対戦相手が再戦を確認するのを待って"
#: qcsrc/common/minigames/minigame/pp.qc:587
#: qcsrc/common/minigames/minigame/ttt.qc:671
msgid "Next Match"
-msgstr ""
+msgstr "次の試合"
#: qcsrc/common/minigames/minigame/ps.qc:2
msgid "Peg Solitaire"
-msgstr ""
+msgstr "ペグ・ソリテール"
#: qcsrc/common/minigames/minigame/ps.qc:414
msgid "All pieces cleared!"
-msgstr ""
+msgstr "全ての駒をクリアした!"
#: qcsrc/common/minigames/minigame/ps.qc:416
msgid "Remaining pieces:"
-msgstr ""
+msgstr "残りの駒:"
#: qcsrc/common/minigames/minigame/ps.qc:481
#, c-format
msgid "Pieces left: %s"
-msgstr ""
+msgstr "残りの駒: %s"
#: qcsrc/common/minigames/minigame/ps.qc:491
msgid "No more valid moves"
-msgstr ""
+msgstr "もっと有効な動きがない"
#: qcsrc/common/minigames/minigame/ps.qc:494
msgid "Well done, you win!"
-msgstr ""
+msgstr "よくやった、あなたは勝った!"
#: qcsrc/common/minigames/minigame/ps.qc:497
msgid "Jump a piece over another to capture it"
-msgstr ""
+msgstr "取れるために駒を別の駒の上に飛び越えて"
#: qcsrc/common/minigames/minigame/ttt.qc:2
msgid "Tic Tac Toe"
-msgstr ""
+msgstr "三目並べ"
#: qcsrc/common/minigames/minigame/ttt.qc:672
msgid "Single Player"
-msgstr ""
+msgstr "シングルプレーヤー"
#: qcsrc/common/monsters/monster/mage.qh:17
#: qcsrc/menu/xonotic/dialog_monstertools.qc:18
msgid "Mage"
-msgstr ""
+msgstr "魔法使い"
#: qcsrc/common/monsters/monster/mage.qh:29
msgid "Mage spike"
-msgstr ""
+msgstr "魔法使いのスパイク"
#: qcsrc/common/monsters/monster/shambler.qh:17
#: qcsrc/menu/xonotic/dialog_monstertools.qc:17
msgid "Shambler"
-msgstr ""
+msgstr "シャンブラー"
#: qcsrc/common/monsters/monster/spider.qh:17
#: qcsrc/menu/xonotic/dialog_monstertools.qc:16
msgid "Spider"
-msgstr ""
+msgstr "蜘蛛"
#: qcsrc/common/monsters/monster/spider.qh:28
msgid "Spider attack"
-msgstr ""
+msgstr "蜘蛛の攻撃"
#: qcsrc/common/monsters/monster/wyvern.qh:17
#: qcsrc/menu/xonotic/dialog_monstertools.qc:19
msgid "Wyvern"
-msgstr ""
+msgstr "ワイバーン"
#: qcsrc/common/monsters/monster/wyvern.qh:28
msgid "Wyvern attack"
-msgstr ""
+msgstr "ワイバーンの攻撃"
#: qcsrc/common/monsters/monster/zombie.qh:17
#: qcsrc/menu/xonotic/dialog_monstertools.qc:15
msgid "Zombie"
-msgstr ""
+msgstr "ゾンビ"
#: qcsrc/common/mutators/mutator/buffs/all.inc:16
msgid "Ammo"
-msgstr ""
+msgstr "弾薬"
#: qcsrc/common/mutators/mutator/buffs/all.inc:25
msgid "Resistance"
-msgstr ""
+msgstr "抵抗"
#: qcsrc/common/mutators/mutator/buffs/all.inc:34
#: qcsrc/common/mutators/mutator/instagib/items.qh:126
#: qcsrc/common/mutators/mutator/instagib/items.qh:129
msgid "Speed"
-msgstr ""
+msgstr "速度"
#: qcsrc/common/mutators/mutator/buffs/all.inc:44
msgid "Medic"
-msgstr ""
+msgstr "再生"
#: qcsrc/common/mutators/mutator/buffs/all.inc:54
msgid "Bash"
-msgstr ""
+msgstr "打撃"
#: qcsrc/common/mutators/mutator/buffs/all.inc:63
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:83
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:184
msgid "Vampire"
-msgstr ""
+msgstr "吸血"
#: qcsrc/common/mutators/mutator/buffs/all.inc:71
msgid "Disability"
-msgstr ""
+msgstr "障害"
#: qcsrc/common/mutators/mutator/buffs/all.inc:79
msgid "Vengeance"
-msgstr ""
+msgstr "復讐"
#: qcsrc/common/mutators/mutator/buffs/all.inc:87
msgid "Jump"
-msgstr ""
+msgstr "ジャンプ"
#: qcsrc/common/mutators/mutator/buffs/all.inc:96
msgid "Invisible"
-msgstr ""
+msgstr "不可視"
#: qcsrc/common/mutators/mutator/buffs/all.inc:105
msgid "Inferno"
-msgstr ""
+msgstr "焦熱地獄"
#: qcsrc/common/mutators/mutator/buffs/all.inc:113
msgid "Swapper"
-msgstr ""
+msgstr "スワッパー"
#: qcsrc/common/mutators/mutator/buffs/all.inc:121
msgid "Magnet"
-msgstr ""
+msgstr "磁石"
#: qcsrc/common/mutators/mutator/buffs/all.inc:129
msgid "Luck"
-msgstr ""
+msgstr "運"
#: qcsrc/common/mutators/mutator/buffs/all.inc:137
msgid "Flight"
-msgstr ""
+msgstr "飛翔"
#: qcsrc/common/mutators/mutator/buffs/buffs.qh:11
msgid "Buff"
-msgstr ""
+msgstr "バフ"
#: qcsrc/common/mutators/mutator/damagetext/ui_damagetext.qc:8
msgid "Damage text"
-msgstr ""
+msgstr "ダメージテキスト"
#: qcsrc/common/mutators/mutator/damagetext/ui_damagetext.qc:18
msgid "Draw damage numbers"
-msgstr ""
+msgstr "ダメージ数を描く"
#: qcsrc/common/mutators/mutator/damagetext/ui_damagetext.qc:20
msgid "Font size minimum:"
-msgstr ""
+msgstr "最小フォントサイズ:"
#: qcsrc/common/mutators/mutator/damagetext/ui_damagetext.qc:25
msgid "Font size maximum:"
-msgstr ""
+msgstr "最大フォントサイズ:"
#: qcsrc/common/mutators/mutator/damagetext/ui_damagetext.qc:30
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:55
#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:109
#: qcsrc/menu/xonotic/util.qc:775
msgid "Color:"
-msgstr ""
+msgstr "カラー:"
#: qcsrc/common/mutators/mutator/damagetext/ui_damagetext.qc:36
msgid "Draw damage numbers for friendly fire"
-msgstr ""
+msgstr "同士打ちためにダメージ量を描く"
#: qcsrc/common/mutators/mutator/instagib/items.qh:33
msgid "Vaporizer ammo"
-msgstr ""
+msgstr "気化器の弾薬"
#: qcsrc/common/mutators/mutator/instagib/items.qh:59
#: qcsrc/common/mutators/mutator/instagib/items.qh:62
msgid "Extra life"
-msgstr ""
+msgstr "余分な命"
#: qcsrc/common/mutators/mutator/instagib/items.qh:91
#: qcsrc/common/mutators/mutator/instagib/items.qh:94
msgid "Invisibility"
-msgstr ""
+msgstr "不可視"
#: qcsrc/common/mutators/mutator/nades/nades.inc:18
msgid "Napalm grenade"
-msgstr ""
+msgstr "ナパーム手榴弾"
#: qcsrc/common/mutators/mutator/nades/nades.inc:26
msgid "Ice grenade"
-msgstr ""
+msgstr "氷手榴弾"
#: qcsrc/common/mutators/mutator/nades/nades.inc:34
msgid "Translocate grenade"
-msgstr ""
+msgstr "転座手榴弾"
#: qcsrc/common/mutators/mutator/nades/nades.inc:42
msgid "Spawn grenade"
-msgstr ""
+msgstr "出現手榴弾"
#: qcsrc/common/mutators/mutator/nades/nades.inc:50
msgid "Heal grenade"
-msgstr ""
+msgstr "癒し手榴弾"
#: qcsrc/common/mutators/mutator/nades/nades.inc:58
msgid "Monster grenade"
-msgstr ""
+msgstr "モンスター手榴弾"
#: qcsrc/common/mutators/mutator/nades/nades.inc:66
msgid "Entrap grenade"
-msgstr ""
+msgstr "閉じ込め手榴弾"
#: qcsrc/common/mutators/mutator/nades/nades.inc:74
msgid "Veil grenade"
-msgstr ""
+msgstr "ベール手榴弾"
#: qcsrc/common/mutators/mutator/nades/nades.qh:33
msgid "Grenade"
-msgstr ""
+msgstr "手榴弾"
#: qcsrc/common/mutators/mutator/overkill/okhmg.qh:20
msgid "Overkill Heavy Machine Gun"
-msgstr ""
+msgstr "オーバーキル重機関銃"
#: qcsrc/common/mutators/mutator/overkill/okmachinegun.qh:18
msgid "Overkill MachineGun"
-msgstr ""
+msgstr "オーバーキル機関銃"
#: qcsrc/common/mutators/mutator/overkill/oknex.qh:19
msgid "Overkill Nex"
-msgstr ""
+msgstr "オーバーキルネクス"
#: qcsrc/common/mutators/mutator/overkill/okrpc.qh:20
msgid "Overkill Rocket Propelled Chainsaw"
-msgstr ""
+msgstr "オーバーキルロケット推進チェーンソー"
#: qcsrc/common/mutators/mutator/overkill/okshotgun.qh:18
msgid "Overkill Shotgun"
-msgstr ""
+msgstr "オーバーキルショットガン"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:3
msgid "Waypoint"
-msgstr ""
+msgstr "ウェイポイント"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:4
msgid "Help me!"
-msgstr ""
+msgstr "助けて!"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:5
msgid "Here"
-msgstr ""
+msgstr "ここに"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:6
msgid "DANGER"
-msgstr ""
+msgstr "危険"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:8
msgid "Frozen!"
-msgstr ""
+msgstr "冷凍した!"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:10
msgid "Item"
-msgstr ""
+msgstr "アイテム"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:12
msgid "Checkpoint"
-msgstr ""
+msgstr "通過点"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:13
#: qcsrc/common/mutators/mutator/waypoints/waypointsprites.qc:240
msgid "Finish"
-msgstr ""
+msgstr "終了"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:14
#: qcsrc/common/mutators/mutator/waypoints/all.inc:15
#: qcsrc/common/mutators/mutator/waypoints/waypointsprites.qc:240
msgid "Start"
-msgstr ""
+msgstr "開始"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:17
msgid "Defend"
-msgstr ""
+msgstr "守る"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:18
msgid "Destroy"
-msgstr ""
+msgstr "破壊する"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:19
msgid "Push"
-msgstr ""
+msgstr "押す"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:21
msgid "Flag carrier"
-msgstr ""
+msgstr "旗持ち"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:22
msgid "Enemy carrier"
-msgstr ""
+msgstr "敵持ち"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:23
msgid "Dropped flag"
-msgstr ""
+msgstr "落ちた旗"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:24
msgid "White base"
-msgstr ""
+msgstr "白い基地"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:25
msgid "Red base"
-msgstr ""
+msgstr "赤い基地"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:26
msgid "Blue base"
-msgstr ""
+msgstr "青い基地"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:27
msgid "Yellow base"
-msgstr ""
+msgstr "黄色い基地"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:28
msgid "Pink base"
-msgstr ""
+msgstr "ピンク基地"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:29
msgid "Return flag here"
-msgstr ""
+msgstr "ここに旗を返して"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:31
#: qcsrc/common/mutators/mutator/waypoints/all.inc:32
#: qcsrc/common/mutators/mutator/waypoints/all.inc:52
#: qcsrc/common/mutators/mutator/waypoints/all.inc:53
msgid "Control point"
-msgstr ""
+msgstr "コントロールポイント"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:37
msgid "Dropped key"
-msgstr ""
+msgstr "落ちた鍵"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:38
#: qcsrc/common/mutators/mutator/waypoints/all.inc:40
#: qcsrc/common/mutators/mutator/waypoints/all.inc:42
#: qcsrc/common/mutators/mutator/waypoints/all.inc:43
msgid "Key carrier"
-msgstr ""
+msgstr "鍵持ち"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:39
msgid "Run here"
-msgstr ""
+msgstr "ここに走って"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:45
#: qcsrc/common/mutators/mutator/waypoints/all.inc:48
msgid "Ball"
-msgstr ""
+msgstr "ボール"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:46
msgid "Ball carrier"
-msgstr ""
+msgstr "ボール持ち"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:49
msgid "Goal"
-msgstr ""
+msgstr "目的 / ゴール"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:54
#: qcsrc/common/mutators/mutator/waypoints/all.inc:55
msgid "Generator"
-msgstr ""
+msgstr "発生器"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:57
msgid "Weapon"
-msgstr ""
+msgstr "武器"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:59
msgid "Monster"
-msgstr ""
+msgstr "モンスター"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:61
msgid "Vehicle"
-msgstr ""
+msgstr "乗り物"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:62
msgid "Intruder!"
-msgstr ""
+msgstr "侵入者!"
#: qcsrc/common/mutators/mutator/waypoints/all.inc:64
msgid "Tagged"
-msgstr ""
+msgstr "タグ付った"
#: qcsrc/common/mutators/mutator/waypoints/waypointsprites.qc:697
#, c-format
msgid "%s needing help!"
-msgstr ""
+msgstr "%s は助けが必要だ!"
#: qcsrc/common/net_notice.qc:90
msgid "^1Server notices:"
-msgstr ""
+msgstr "^1サーバー告知:"
#: qcsrc/common/notifications/all.inc:230
msgid "^F4NOTE: ^BGSpectator chat is not sent to players during the match"
-msgstr ""
+msgstr "^F4注: ^BG観戦チャットは試合中に選手に送信されません"
#: qcsrc/common/notifications/all.inc:232
#, c-format
msgid "^BG%s^BG captured the ^TC^TT^BG flag"
-msgstr ""
+msgstr "^BG%s^BG が ^TC^TT^BG 旗を取れた"
#: qcsrc/common/notifications/all.inc:233
#, c-format
"^BG%s^BG captured the ^TC^TT^BG flag in ^F1%s^BG seconds, breaking ^BG"
"%s^BG's previous record of ^F2%s^BG seconds"
msgstr ""
+"^BG%s^BG が ^F1%s^BG 秒で ^TC^TT^BG 旗を取れたし、^BG%s^BG の以前の記録であ"
+"る ^F2%s^BG 秒を破った"
#: qcsrc/common/notifications/all.inc:234
#, c-format
msgid "^BG%s^BG captured the flag"
-msgstr ""
+msgstr "^BG%s^BG が旗を取れた"
#: qcsrc/common/notifications/all.inc:235
#, c-format
msgid "^BG%s^BG captured the ^TC^TT^BG flag in ^F1%s^BG seconds"
-msgstr ""
+msgstr "^BG%s^BG が ^F1%s^BG 秒で ^TC^TT^BG 旗を取れた"
#: qcsrc/common/notifications/all.inc:236
#, c-format
"^BG%s^BG captured the ^TC^TT^BG flag in ^F2%s^BG seconds, failing to break "
"^BG%s^BG's previous record of ^F1%s^BG seconds"
msgstr ""
+"^BG%s^BG が ^F2%s^BG 秒で ^TC^TT^BG 旗を取れたし、^BG%s^BG の以前の ^F1%s^BG "
+"秒という記録を破ることに失敗した"
#: qcsrc/common/notifications/all.inc:237
msgid "^BGThe ^TC^TT^BG flag was returned to base by its owner"
-msgstr ""
+msgstr "^BG ^TC^TT^BG 旗は所有者によって基地に戻された"
#: qcsrc/common/notifications/all.inc:238
msgid "^BGThe flag was returned by its owner"
-msgstr ""
+msgstr "^BG旗はその所有者によって返された"
#: qcsrc/common/notifications/all.inc:239
msgid "^BGThe ^TC^TT^BG flag was destroyed and returned to base"
-msgstr ""
+msgstr "^BG ^TC^TT^BG 旗が破壊され、基地に戻った"
#: qcsrc/common/notifications/all.inc:240
msgid "^BGThe flag was destroyed and returned to base"
-msgstr ""
+msgstr "^BG旗が破壊され、基地に戻った"
#: qcsrc/common/notifications/all.inc:241
msgid "^BGThe ^TC^TT^BG flag was dropped in the base and returned itself"
-msgstr ""
+msgstr "^BG ^TC^TT^BG 旗が基地に落ちされ、それ自体を返した"
#: qcsrc/common/notifications/all.inc:242
msgid "^BGThe flag was dropped in the base and returned itself"
-msgstr ""
+msgstr "^BG旗が基地に落ちされ、それ自体を返した"
#: qcsrc/common/notifications/all.inc:243
msgid ""
"^BGThe ^TC^TT^BG flag fell somewhere it couldn't be reached and returned to "
"base"
-msgstr ""
+msgstr "^BG ^TC^TT^BG 旗は到達できなかった場所に落ち、基地に戻った"
#: qcsrc/common/notifications/all.inc:244
msgid "^BGThe flag fell somewhere it couldn't be reached and returned to base"
-msgstr ""
+msgstr "^BG旗は到達できなかった場所に落ち、基地に戻った"
#: qcsrc/common/notifications/all.inc:245
#, c-format
msgid ""
"^BGThe ^TC^TT^BG flag became impatient after ^F1%.2f^BG seconds and returned "
"itself"
-msgstr ""
+msgstr "^BG ^TC^TT^BG 旗は ^F1%.2f^BG 秒後に焦って、自分自身を返した"
#: qcsrc/common/notifications/all.inc:246
#, c-format
msgid ""
"^BGThe flag became impatient after ^F1%.2f^BG seconds and returned itself"
-msgstr ""
+msgstr "^BG旗は ^F1%.2f^BG 秒後に焦って、自分自身を返した"
#: qcsrc/common/notifications/all.inc:247
msgid "^BGThe ^TC^TT^BG flag has returned to the base"
-msgstr ""
+msgstr "^BG ^TC^TT^BG 旗が基地に戻った"
#: qcsrc/common/notifications/all.inc:248
msgid "^BGThe flag has returned to the base"
-msgstr ""
+msgstr "^BG旗が基地に戻った"
#: qcsrc/common/notifications/all.inc:249
#, c-format
msgid "^BG%s^BG lost the ^TC^TT^BG flag"
-msgstr ""
+msgstr "^BG%s^BG が ^TC^TT^BG 旗を失った"
#: qcsrc/common/notifications/all.inc:250
#, c-format
msgid "^BG%s^BG lost the flag"
-msgstr ""
+msgstr "^BG%s^BG が旗を失った"
#: qcsrc/common/notifications/all.inc:251
#, c-format
msgid "^BG%s^BG got the ^TC^TT^BG flag"
-msgstr ""
+msgstr "^BG%s^BG が ^TC^TT^BG 旗を手に入れた"
#: qcsrc/common/notifications/all.inc:252
#, c-format
msgid "^BG%s^BG got the flag"
-msgstr ""
+msgstr "^BG%s^BG が旗を手に入れた"
#: qcsrc/common/notifications/all.inc:253
#: qcsrc/common/notifications/all.inc:254
#, c-format
msgid "^BG%s^BG returned the ^TC^TT^BG flag"
-msgstr ""
+msgstr "BG%s^BG が ^TC^TT^BG 旗を返した"
#: qcsrc/common/notifications/all.inc:256
#: qcsrc/common/notifications/all.inc:544
#, c-format
msgid "^F2Throwing coin... Result: %s^F2!"
-msgstr ""
+msgstr "^F2硬貨を投げ中... 結果: %s^F2!"
#: qcsrc/common/notifications/all.inc:258
msgid "^BGYou don't have any fuel for the ^F1Jetpack"
-msgstr ""
+msgstr "^BGあなたは^F1ジェットパックの燃料がありません"
#: qcsrc/common/notifications/all.inc:260
msgid "^F2You lack a UID, superspec options will not be saved/restored"
msgstr ""
+"^F2あなたはUIDがないし、スーパースペックオプションは保存 / 復元されません"
#: qcsrc/common/notifications/all.inc:262
msgid "^F1Round already started, you will join the game in the next round"
-msgstr ""
+msgstr "^F1ラウンドはすでに始まっていて、次のラウンドでゲームに参加します"
#: qcsrc/common/notifications/all.inc:263
msgid "^F2You will spectate in the next round"
-msgstr ""
+msgstr "^F2次のラウンドで観戦します"
#: qcsrc/common/notifications/all.inc:265
#, c-format
msgid "^BG%s%s^K1 was killed by ^BG%s^K1's ^BG%s^K1 buff ^K1%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 は ^BG%s^K1 ^BG%s^K1 のバフの ^K1%s%s によって殺された"
#: qcsrc/common/notifications/all.inc:265
#, c-format
msgid "^BG%s%s^K1 was scored against by ^BG%s^K1's ^BG%s^K1 buff ^K1%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 は ^BG%s^K1 の ^BG%s^K1 のバフの ^K1%s%s によって得点された"
#: qcsrc/common/notifications/all.inc:266
#, c-format
msgid "^BG%s%s^K1 was unfairly eliminated by ^BG%s^K1%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 は ^BG%s^K1%s%s によって不当に削除された"
#: qcsrc/common/notifications/all.inc:267
#, c-format
msgid "^BG%s%s^K1 was drowned by ^BG%s^K1%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 は ^BG%s^K1%s%s によって溺死した"
#: qcsrc/common/notifications/all.inc:268
#, c-format
msgid "^BG%s%s^K1 was grounded by ^BG%s^K1%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 は ^BG%s^K1%s%s によって接地された"
#: qcsrc/common/notifications/all.inc:269
#, c-format
msgid "^BG%s%s^K1 felt a little hot from ^BG%s^K1's fire^K1%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 は ^BG%s^K1 の^K1%s%s火から少し熱く感じた"
#: qcsrc/common/notifications/all.inc:269
#, c-format
msgid "^BG%s%s^K1 was burnt up into a crisp by ^BG%s^K1%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 は ^BG%s^K1%s%s で焼き揚げた"
#: qcsrc/common/notifications/all.inc:270
#, c-format
msgid "^BG%s%s^K1 was cooked by ^BG%s^K1%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 は ^BG%s^K1%s%s によって煮れた"
#: qcsrc/common/notifications/all.inc:271
#, c-format
msgid "^BG%s%s^K1 was pushed in front of a monster by ^BG%s^K1%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 が ^BG%s^K1%s%s によってモンスターの前に押された"
#: qcsrc/common/notifications/all.inc:272
#, c-format
msgid "^BG%s%s^K1 was blown up by ^BG%s^K1's Nade%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 は ^BG%s^K1 の手榴弾%s%sによって爆破された"
#: qcsrc/common/notifications/all.inc:273
#, c-format
msgid "^BG%s%s^K1 got too close to a napalm explosion%s%s"
-msgstr ""
+msgstr "BG%s%s^K1 がナパームの爆発%s%sに近づきすぎた"
#: qcsrc/common/notifications/all.inc:273
#, c-format
msgid "^BG%s%s^K1 was burned to death by ^BG%s^K1's Napalm Nade%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 は ^BG%s^K1 のナパーム手榴弾%s%sによって焼死された"
#: qcsrc/common/notifications/all.inc:274
#, c-format
msgid "^BG%s%s^K1 was blown up by ^BG%s^K1's Ice Nade%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 は ^BG%s^K1 の氷手榴弾%s%sによって爆破された"
#: qcsrc/common/notifications/all.inc:275
#, c-format
msgid "^BG%s%s^K1 was frozen to death by ^BG%s^K1's Ice Nade%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 は ^BG%s^K1 の氷手榴弾%s%sにより冷凍死された"
#: qcsrc/common/notifications/all.inc:276
#, c-format
msgid "^BG%s%s^K1 has not been healed by ^BG%s^K1's Healing Nade%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 は ^BG%s^K1 の治癒手榴弾%s%sによって癒されなかった"
#: qcsrc/common/notifications/all.inc:277
#, c-format
msgid "^BG%s%s^K1 was shot into space by ^BG%s^K1%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 が ^BG%s^K1%s%s によって宇宙に発砲された"
#: qcsrc/common/notifications/all.inc:278
#, c-format
msgid "^BG%s%s^K1 was slimed by ^BG%s^K1%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 は ^BG%s^K1%s%s によって肉が落たれた"
#: qcsrc/common/notifications/all.inc:279
#, c-format
msgid "^BG%s%s^K1 was preserved by ^BG%s^K1%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 は ^BG%s^K1%s%s によって保持された"
#: qcsrc/common/notifications/all.inc:280
#, c-format
msgid "^BG%s%s^K1 tried to occupy ^BG%s^K1's teleport destination space%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 は ^BG%s^K1 のテレポート先スペース%s%sを占有しようとした"
#: qcsrc/common/notifications/all.inc:280
#, c-format
msgid "^BG%s%s^K1 was telefragged by ^BG%s^K1%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 は ^BG%s^K1%s%s によってテレ削除された"
#: qcsrc/common/notifications/all.inc:281
#, c-format
msgid "^BG%s%s^K1 died in an accident with ^BG%s^K1%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 は ^BG%s^K1%s%s の事故で死亡した"
#: qcsrc/common/notifications/all.inc:282
#, c-format
msgid ""
"^BG%s%s^K1 got caught in the blast when ^BG%s^K1's Bumblebee exploded%s%s"
msgstr ""
+"BG%s%s^K1 は ^BG%s^K1 のバンブルビーが爆発した%s%sときに爆風に巻き込まれた"
#: qcsrc/common/notifications/all.inc:283
#, c-format
msgid "^BG%s%s^K1 saw the pretty lights of ^BG%s^K1's Bumblebee gun%s%s"
msgstr ""
+"^BG%s%s^K1 は ^BG%s^K1 のバンブルビーガン%s%sのかわいらしいライトを見た"
#: qcsrc/common/notifications/all.inc:284
#, c-format
msgid "^BG%s%s^K1 was crushed by ^BG%s^K1%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 は ^BG%s^K1%s%s によって粉砕された"
#: qcsrc/common/notifications/all.inc:285
#, c-format
msgid "^BG%s%s^K1 was cluster bombed by ^BG%s^K1's Raptor%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 は ^BG%s^K1 のラプター%s%sによってクラスター爆撃された"
#: qcsrc/common/notifications/all.inc:286
#, c-format
msgid "^BG%s%s^K1 couldn't resist ^BG%s^K1's purple blobs%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 は ^BG%s^K1 の紫色のブロブ%s%sに抵抗できなかった"
#: qcsrc/common/notifications/all.inc:287
#, c-format
msgid "^BG%s%s^K1 got caught in the blast when ^BG%s^K1's Raptor exploded%s%s"
msgstr ""
+"^BG%s^K1 のラプターが爆発させた%s%sとき、^BG%s%s^K1 が爆風に巻き込まれた"
#: qcsrc/common/notifications/all.inc:288
#, c-format
msgid ""
"^BG%s%s^K1 got caught in the blast when ^BG%s^K1's Spiderbot exploded%s%s"
msgstr ""
+"^BG%s%s^K1 は ^BG%s^K1 のスパイダーボットが爆発させた%s%sときに爆風に巻き込ま"
+"れた"
#: qcsrc/common/notifications/all.inc:289
#, c-format
msgid "^BG%s%s^K1 got shredded by ^BG%s^K1's Spiderbot%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 は ^BG%s^K1 のスパイダーボット%s%sによって細断された"
#: qcsrc/common/notifications/all.inc:290
#, c-format
msgid "^BG%s%s^K1 was blasted to bits by ^BG%s^K1's Spiderbot%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 は ^BG%s^K1 のスパイダーボット%s%sによって爆破された"
#: qcsrc/common/notifications/all.inc:291
#, c-format
msgid "^BG%s%s^K1 got caught in the blast when ^BG%s^K1's Racer exploded%s%s"
-msgstr ""
+msgstr "^BG%s%sK1^ のレーサーが爆発した%s%sとき、^BG%s^K1 が爆風に巻き込まれた"
#: qcsrc/common/notifications/all.inc:292
#, c-format
msgid "^BG%s%s^K1 was bolted down by ^BG%s^K1's Racer%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 は ^BG%s^K1 のレーサー%s%sによってねじ込まれた"
#: qcsrc/common/notifications/all.inc:293
#, c-format
msgid "^BG%s%s^K1 couldn't find shelter from ^BG%s^K1's Racer%s%s"
msgstr ""
+"^BG%s%s^K1 は ^BG%s^K1 のレーサー%s%sからの避難所を見つけることができなかった"
#: qcsrc/common/notifications/all.inc:294
#, c-format
msgid "^BG%s%s^K1 was thrown into a world of hurt by ^BG%s^K1%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 は ^BG%s^K1%s%s によって痛みの世界に投げ込まれた"
#: qcsrc/common/notifications/all.inc:296
#, c-format
msgid "^BG%s^K1 was moved into the %s%s"
-msgstr ""
+msgstr "^BG%s^K1 は %s%s に移動された"
#: qcsrc/common/notifications/all.inc:297
#, c-format
msgid "^BG%s^K1 became enemies with the Lord of Teamplay%s%s"
-msgstr ""
+msgstr "^BG%s^K1 はチームプレイの主%s%sの敵になった"
#: qcsrc/common/notifications/all.inc:298
#, c-format
msgid "^BG%s^K1 thought they found a nice camping ground%s%s"
-msgstr ""
+msgstr "^BG%s^K1 は素晴らしいキャンピング場%s%sを見つけたと思った"
#: qcsrc/common/notifications/all.inc:299
#, c-format
msgid "^BG%s^K1 unfairly eliminated themself%s%s"
-msgstr ""
+msgstr "^BG%s^K1 が不当に自分自身%s%sを削除した"
#: qcsrc/common/notifications/all.inc:301
#, c-format
msgid "^BG%s^K1 couldn't catch their breath%s%s"
-msgstr ""
+msgstr "^BG%s^K1 は息%s%sを呑めなかった"
#: qcsrc/common/notifications/all.inc:301
#, c-format
msgid "^BG%s^K1 was in the water for too long%s%s"
-msgstr ""
+msgstr "^BG%s^K1 は水中に長時間%s%sあった"
#: qcsrc/common/notifications/all.inc:302
#, c-format
msgid "^BG%s^K1 hit the ground with a bit too much force%s%s"
-msgstr ""
+msgstr "^BG%s^K1 は少しの力%s%sで着陸した"
#: qcsrc/common/notifications/all.inc:302
#, c-format
msgid "^BG%s^K1 hit the ground with a crunch%s%s"
-msgstr ""
+msgstr "^BG%s^K1 はクランチ%s%sで地面を打ちた"
#: qcsrc/common/notifications/all.inc:303
#, c-format
msgid "^BG%s^K1 became a bit too crispy%s%s"
-msgstr ""
+msgstr "^BG%s^K1 が少しパリパリ%s%sになりすぎた"
#: qcsrc/common/notifications/all.inc:303
#, c-format
msgid "^BG%s^K1 felt a little hot%s%s"
-msgstr ""
+msgstr "^BG%s^K1 は少し暑い%s%sを感じた"
#: qcsrc/common/notifications/all.inc:304
#, c-format
msgid "^BG%s^K1 died%s%s"
-msgstr ""
+msgstr "^BG%s^K1 が死んだ%s%s"
#: qcsrc/common/notifications/all.inc:305
#, c-format
msgid "^BG%s^K1 found a hot place%s%s"
-msgstr ""
+msgstr "^BG%s^K1 は暑いな場所%s%sを見つけた"
#: qcsrc/common/notifications/all.inc:305
#, c-format
msgid "^BG%s^K1 turned into hot slag%s%s"
-msgstr ""
+msgstr "^BG%s^K1 が暑いスラグ%s%sに変わった"
#: qcsrc/common/notifications/all.inc:306
#, c-format
msgid "^BG%s^K1 was exploded by a Mage%s%s"
-msgstr ""
+msgstr "^BG%s^K1 は魔法使い%s%sによって爆発された"
#: qcsrc/common/notifications/all.inc:307
#, c-format
msgid "^BG%s^K1's innards became outwards by a Shambler%s%s"
-msgstr ""
+msgstr "^BG%s^K1 の内部がシャンブラー%s%sによって外側になった"
#: qcsrc/common/notifications/all.inc:308
#, c-format
msgid "^BG%s^K1 was smashed by a Shambler%s%s"
-msgstr ""
+msgstr "^BG%s^K1 はシャンブラー%s%sによって砕かられた"
#: qcsrc/common/notifications/all.inc:309
#, c-format
msgid "^BG%s^K1 was zapped to death by a Shambler%s%s"
-msgstr ""
+msgstr "^BG%s^K1 はシャンブラー%s%sによって感電死なれた"
#: qcsrc/common/notifications/all.inc:310
#, c-format
msgid "^BG%s^K1 was bitten by a Spider%s%s"
-msgstr ""
+msgstr "^BG%s^K1 は蜘蛛%s%sに噛まられた"
#: qcsrc/common/notifications/all.inc:311
#, c-format
msgid "^BG%s^K1 was fireballed by a Wyvern%s%s"
-msgstr ""
+msgstr "^BG%s^K1 はワイバーン%s%sによって攻撃された"
#: qcsrc/common/notifications/all.inc:312
#, c-format
msgid "^BG%s^K1 joins the Zombies%s%s"
-msgstr ""
+msgstr "^BG%s^K1 がゾンビ%s%sに参加した"
#: qcsrc/common/notifications/all.inc:313
#, c-format
msgid "^BG%s^K1 was given kung fu lessons by a Zombie%s%s"
-msgstr ""
+msgstr "^BG%s^K1 はゾンビ%s%sから功夫授業を受けられた"
#: qcsrc/common/notifications/all.inc:314
#: qcsrc/common/notifications/all.inc:316
#, c-format
msgid "^BG%s^K1 mastered the art of self-nading%s%s"
-msgstr ""
+msgstr "^BG%s^K1 は手榴弾で自己破壊%s%sの技術を習得した"
#: qcsrc/common/notifications/all.inc:315
#, c-format
msgid ""
"^BG%s^K1 decided to take a look at the results of their napalm explosion%s%s"
-msgstr ""
+msgstr "^BG%s^K1 はナパーム弾の爆発%s%sの結果を見てみることにした"
#: qcsrc/common/notifications/all.inc:315
#, c-format
msgid "^BG%s^K1 was burned to death by their own Napalm Nade%s%s"
-msgstr ""
+msgstr "^BG%s^K1 は自分のナパーム手榴弾%s%sによって燃された"
#: qcsrc/common/notifications/all.inc:317
#, c-format
msgid "^BG%s^K1 felt a little chilly%s%s"
-msgstr ""
+msgstr "^BG%s^K1 は少し肌寒く%s%s感じた"
#: qcsrc/common/notifications/all.inc:317
#, c-format
msgid "^BG%s^K1 was frozen to death by their own Ice Nade%s%s"
-msgstr ""
+msgstr "^BG%s^K1 は自分の氷手榴弾%s%sによって冷凍死された"
#: qcsrc/common/notifications/all.inc:318
#, c-format
msgid "^BG%s^K1's Healing Nade didn't quite heal them%s%s"
-msgstr ""
+msgstr "^BG%s^K1 の治癒手榴弾はそれら%s%sを完全には癒しなかった"
#: qcsrc/common/notifications/all.inc:319
#, c-format
msgid "^BG%s^K1 died%s%s. What's the point of living without ammo?"
-msgstr ""
+msgstr "^BG%s^K1 が死んだ%s%s。弾薬なしで生きる意味は何だの?"
#: qcsrc/common/notifications/all.inc:319
#, c-format
msgid "^BG%s^K1 ran out of ammo%s%s"
-msgstr ""
+msgstr "^BG%s^K1 の弾薬%s%sが切った"
#: qcsrc/common/notifications/all.inc:320
#, c-format
msgid "^BG%s^K1 rotted away%s%s"
-msgstr ""
+msgstr "^BG%s^K1 は腐敗した%s%s"
#: qcsrc/common/notifications/all.inc:321
#, c-format
msgid "^BG%s^K1 became a shooting star%s%s"
-msgstr ""
+msgstr "^BG%s^K1 が流れ星%s%sになった"
#: qcsrc/common/notifications/all.inc:322
#, c-format
msgid "^BG%s^K1 was slimed%s%s"
-msgstr ""
+msgstr "^BG%s^K1 が肉が落たれた%s%s"
#: qcsrc/common/notifications/all.inc:323
#, c-format
msgid "^BG%s^K1 couldn't take it anymore%s%s"
-msgstr ""
+msgstr "^BG%s^K1 はもうそれ%s%sを取ることができなかった"
#: qcsrc/common/notifications/all.inc:324
#, c-format
msgid "^BG%s^K1 is now preserved for centuries to come%s%s"
-msgstr ""
+msgstr "^BG%s^K1 は何世紀もの間保存された%s%s"
#: qcsrc/common/notifications/all.inc:325
#, c-format
msgid "^BG%s^K1 switched to the %s%s"
-msgstr ""
+msgstr "^BG%s^K1 が %s%s に切り替えられた"
#: qcsrc/common/notifications/all.inc:326
#, c-format
msgid "^BG%s^K1 died in an accident%s%s"
-msgstr ""
+msgstr "^BG%s^K1 が事故%s%sで死んだ"
#: qcsrc/common/notifications/all.inc:327
#, c-format
msgid "^BG%s^K1 ran into a turret%s%s"
-msgstr ""
+msgstr "^BG%s^K1 が砲塔%s%sに遭遇した"
#: qcsrc/common/notifications/all.inc:328
#, c-format
msgid "^BG%s^K1 was blasted away by an eWheel turret%s%s"
-msgstr ""
+msgstr "^BG%s^K1 はeWheel砲塔%s%sによって爆破された"
#: qcsrc/common/notifications/all.inc:329
#, c-format
msgid "^BG%s^K1 got caught up in the FLAC turret fire%s%s"
-msgstr ""
+msgstr "^BG%s^K1 がFLAC砲塔の火事%s%sに巻き込まれた"
#: qcsrc/common/notifications/all.inc:330
#, c-format
msgid "^BG%s^K1 was blasted away by a Hellion turret%s%s"
-msgstr ""
+msgstr "^BG%s^K1 はヘリオン砲塔%s%sによって爆破された"
#: qcsrc/common/notifications/all.inc:331
#, c-format
msgid "^BG%s^K1 could not hide from the Hunter turret%s%s"
-msgstr ""
+msgstr "^BG%s^K1 はハンター砲塔%s%sから隠すことができなかった"
#: qcsrc/common/notifications/all.inc:332
#, c-format
msgid "^BG%s^K1 was riddled full of holes by a Machinegun turret%s%s"
-msgstr ""
+msgstr "^BG%s^K1 はマシンガン砲塔%s%sによって穴があふれていた"
#: qcsrc/common/notifications/all.inc:333
#, c-format
msgid "^BG%s^K1 got turned into smoldering gibs by an MLRS turret%s%s"
-msgstr ""
+msgstr "^BG%s^K1 はMLRS砲塔%s%sによって喫煙片に変わった"
#: qcsrc/common/notifications/all.inc:334
#, c-format
msgid "^BG%s^K1 was phased out by a turret%s%s"
-msgstr ""
+msgstr "^BG%s^K1 は砲塔%s%sによって削除された"
#: qcsrc/common/notifications/all.inc:335
#, c-format
msgid "^BG%s^K1 got served some superheated plasma from a turret%s%s"
-msgstr ""
+msgstr "^BG%s^K1 が砲塔%s%sから過熱プラズマを注いだ"
#: qcsrc/common/notifications/all.inc:336
#, c-format
msgid "^BG%s^K1 was electrocuted by a Tesla turret%s%s"
-msgstr ""
+msgstr "^BG%s^K1 はテスラの砲塔%s%sによって感電死された"
#: qcsrc/common/notifications/all.inc:337
#, c-format
msgid "^BG%s^K1 got served a lead enrichment by a Walker turret%s%s"
-msgstr ""
+msgstr "^BG%s^K1 はウォーカー砲塔%s%sから鉛強化を受けた"
#: qcsrc/common/notifications/all.inc:338
#, c-format
msgid "^BG%s^K1 was impaled by a Walker turret%s%s"
-msgstr ""
+msgstr "^BG%s^K1 はウォーカー砲塔%s%sによって釘付けされた"
#: qcsrc/common/notifications/all.inc:339
#, c-format
msgid "^BG%s^K1 was blasted away by a Walker turret%s%s"
-msgstr ""
+msgstr "^BG%s^K1 はウォーカー砲塔%s%sによって爆破された"
#: qcsrc/common/notifications/all.inc:340
#, c-format
msgid "^BG%s^K1 got caught in the blast of a Bumblebee explosion%s%s"
-msgstr ""
+msgstr "^BG%s^K1 はバンブルビー爆発%s%sの爆風に巻き込まれた"
#: qcsrc/common/notifications/all.inc:341
#, c-format
msgid "^BG%s^K1 was crushed by a vehicle%s%s"
-msgstr ""
+msgstr "^BG%s^K1 は乗り物%s%sによって粉砕された"
#: qcsrc/common/notifications/all.inc:342
#, c-format
msgid "^BG%s^K1 was caught in a Raptor cluster bomb%s%s"
-msgstr ""
+msgstr "^BG%s^K1 はラプターのクラスター爆弾%s%sに捕まられた"
#: qcsrc/common/notifications/all.inc:343
#, c-format
msgid "^BG%s^K1 got caught in the blast of a Raptor explosion%s%s"
-msgstr ""
+msgstr "^BG%s^K1 はラプター爆発%s%sの爆風に巻き込まれた"
#: qcsrc/common/notifications/all.inc:344
#, c-format
msgid "^BG%s^K1 got caught in the blast of a Spiderbot explosion%s%s"
-msgstr ""
+msgstr "^BG%s^K1 は蜘蛛ボットの爆発%s%sの爆風に巻き込まれた"
#: qcsrc/common/notifications/all.inc:345
#, c-format
msgid "^BG%s^K1 was blasted to bits by a Spiderbot rocket%s%s"
-msgstr ""
+msgstr "^BG%s^K1 は蜘蛛ボットロケット%s%sによって爆破された"
#: qcsrc/common/notifications/all.inc:346
#, c-format
msgid "^BG%s^K1 got caught in the blast of a Racer explosion%s%s"
-msgstr ""
+msgstr "^BG%s^K1 はレーサー爆発%s%sの爆風に巻き込まれた"
#: qcsrc/common/notifications/all.inc:347
#, c-format
msgid "^BG%s^K1 couldn't find shelter from a Racer rocket%s%s"
msgstr ""
+"^BG%s^K1 はレーサーロケット%s%sからの避難所を見つけることができませんでした"
#: qcsrc/common/notifications/all.inc:350
#, c-format
msgid "^BG%s^K1 was betrayed by ^BG%s^K1%s%s"
-msgstr ""
+msgstr "^BG%s^K1 は ^BG%s^K1%s%s に裏切られた"
#: qcsrc/common/notifications/all.inc:352
#, c-format
msgid "^BG%s^BG%s^BG (%s %s every %s seconds)"
-msgstr ""
+msgstr "^BG%s^BG%s^BG (%s %s、%s 秒ごと)"
#: qcsrc/common/notifications/all.inc:354
#, c-format
msgid "^BG%s^K1 was frozen by ^BG%s"
-msgstr ""
+msgstr "^BG%s^K1 は ^BG%s によって凍結された"
#: qcsrc/common/notifications/all.inc:355
#, c-format
msgid "^BG%s^K3 was revived by ^BG%s"
-msgstr ""
+msgstr "^BG%s^K3 は ^BG%s によって復活された"
#: qcsrc/common/notifications/all.inc:356
#, c-format
msgid "^BG%s^K3 was revived by falling"
-msgstr ""
+msgstr "^BG%s^K3 は落下によって復活された"
#: qcsrc/common/notifications/all.inc:357
#, c-format
msgid "^BG%s^K3 was revived by their Nade explosion"
-msgstr ""
+msgstr "^BG%s^K3 は手榴弾の爆発で復活された"
#: qcsrc/common/notifications/all.inc:358
#, c-format
msgid "^BG%s^K3 was automatically revived after %s seconds"
-msgstr ""
+msgstr "^BG%s^K3 は %s 秒後に自動的に復活された"
#: qcsrc/common/notifications/all.inc:359
#, c-format
msgid "^BG%s^K1 froze themself"
-msgstr ""
+msgstr "^ BG%s^K1 が凍結した"
#: qcsrc/common/notifications/all.inc:361
#: qcsrc/common/notifications/all.inc:675
msgid "^TC^TT^BG team wins the round"
-msgstr ""
+msgstr "^TC^TT^BG チームがラウンドに勝利した"
#: qcsrc/common/notifications/all.inc:362
#: qcsrc/common/notifications/all.inc:676
#, c-format
msgid "^BG%s^BG wins the round"
-msgstr ""
+msgstr "^BG%s^BG がラウンドに勝利した"
#: qcsrc/common/notifications/all.inc:363
#: qcsrc/common/notifications/all.inc:539
msgid "^BGRound tied"
-msgstr ""
+msgstr "^BGラウンドに引き分けになりました"
#: qcsrc/common/notifications/all.inc:364
#: qcsrc/common/notifications/all.inc:540
msgid "^BGRound over, there's no winner"
-msgstr ""
+msgstr "^BGラウンド終了、勝者はいません"
#: qcsrc/common/notifications/all.inc:366
#, c-format
msgid "^BGGodmode saved you %s units of damage, cheater!"
-msgstr ""
+msgstr "^BG神モードはあなたに %s ユニットのダメージを保存した、詐欺師!"
#: qcsrc/common/notifications/all.inc:368
#, c-format
msgid "^BG%s^BG got the %s^BG buff!"
-msgstr ""
+msgstr "^BG%s^BG が %s^BG バフを手に入れた!"
#: qcsrc/common/notifications/all.inc:369
#, c-format
msgid "^BG%s^BG lost the %s^BG buff!"
-msgstr ""
+msgstr "^BG%s^BG は %s^BG バフを失った!"
#: qcsrc/common/notifications/all.inc:370
#: qcsrc/common/notifications/all.inc:683
#, c-format
msgid "^BGYou dropped the %s^BG buff!"
-msgstr ""
+msgstr "^BGあなたは %s^BG バフを落とした!"
#: qcsrc/common/notifications/all.inc:371
#: qcsrc/common/notifications/all.inc:684
#, c-format
msgid "^BGYou got the %s^BG buff!"
-msgstr ""
+msgstr "^BGあなたは %s^BG バフを手に入れた!"
#: qcsrc/common/notifications/all.inc:373
#: qcsrc/common/notifications/all.inc:687
#, c-format
msgid "^BGYou do not have the ^F1%s"
-msgstr ""
+msgstr "^BGあなたは ^F1%s がない"
#: qcsrc/common/notifications/all.inc:374
#: qcsrc/common/notifications/all.inc:688
#, c-format
msgid "^BGYou dropped the ^F1%s^BG%s"
-msgstr ""
+msgstr "^BGあなたは ^F1%s^BG%s を落とした"
#: qcsrc/common/notifications/all.inc:375
#: qcsrc/common/notifications/all.inc:689
#, c-format
msgid "^BGYou got the ^F1%s"
-msgstr ""
+msgstr "^BGあなたは ^F1%s を手に入れた"
#: qcsrc/common/notifications/all.inc:376
#: qcsrc/common/notifications/all.inc:690
#, c-format
msgid "^BGYou don't have enough ammo for the ^F1%s"
-msgstr ""
+msgstr "^BGあなたは ^F1%s に必要な弾薬が不足しています"
#: qcsrc/common/notifications/all.inc:377
#: qcsrc/common/notifications/all.inc:691
#, c-format
msgid "^F1%s %s^BG is unable to fire, but its ^F1%s^BG can"
-msgstr ""
+msgstr "^F1%s %s^BG は発砲できませんが、^F1%s^BG は発砲できます"
#: qcsrc/common/notifications/all.inc:378
#: qcsrc/common/notifications/all.inc:692
#, c-format
msgid "^F1%s^BG is ^F4not available^BG on this map"
-msgstr ""
+msgstr "^F1%s^BG はこのマップで ^F4使用できません^BG"
#: qcsrc/common/notifications/all.inc:380
#, c-format
msgid "^BG%s^BG is connecting..."
-msgstr ""
+msgstr "^BG%s^BG が接続中..."
#: qcsrc/common/notifications/all.inc:381
#, c-format
msgid "^BG%s^F3 connected"
-msgstr ""
+msgstr "^BG%s^F3 が接続されました"
#: qcsrc/common/notifications/all.inc:382
#, c-format
msgid "^BG%s^F3 is now playing"
-msgstr ""
+msgstr "^BG%s^F3 は遊び中です"
#: qcsrc/common/notifications/all.inc:383
#, c-format
msgid "^BG%s^F3 is now playing on the ^TC^TT team"
-msgstr ""
+msgstr "^BG%s^F3 は ^TC^TT チームでが遊び中です"
#: qcsrc/common/notifications/all.inc:385
#: qcsrc/common/notifications/all.inc:697
#, c-format
msgid "^BG%s^BG has dropped the ball!"
-msgstr ""
+msgstr "^BG%s^BG がボールを落とした!"
#: qcsrc/common/notifications/all.inc:386
#: qcsrc/common/notifications/all.inc:698
#, c-format
msgid "^BG%s^BG has picked up the ball!"
-msgstr ""
+msgstr "^BG%s^BG はボールを拾いた!"
#: qcsrc/common/notifications/all.inc:388
#, c-format
msgid "^BG%s^BG captured the keys for the ^TC^TT team"
-msgstr ""
+msgstr "^BG%s^BG は ^TC^TT チームの鍵を手に入った"
#: qcsrc/common/notifications/all.inc:389
#, c-format
msgid "^BG%s^BG dropped the ^TC^TT Key"
-msgstr ""
+msgstr "^BG%s^BG が ^TC^TT 鍵を落とした"
#: qcsrc/common/notifications/all.inc:390
#, c-format
msgid "^BG%s^BG lost the ^TC^TT Key"
-msgstr ""
+msgstr "^BG%s^BG は ^TC^TT 鍵を失った"
#: qcsrc/common/notifications/all.inc:391
#, c-format
msgid "^BG%s^BG pushed %s^BG causing the ^TC^TT Key ^BGdestruction"
-msgstr ""
+msgstr "^BG%s^BG が %s^BG を押したため、^TC^TT 鍵の^BG破壊を引き起こしている"
#: qcsrc/common/notifications/all.inc:392
#, c-format
msgid "^BG%s^BG destroyed the ^TC^TT Key"
-msgstr ""
+msgstr "^BG%s^BG は ^TC^TT 鍵を破壊した"
#: qcsrc/common/notifications/all.inc:393
#, c-format
msgid "^BG%s^BG picked up the ^TC^TT Key"
-msgstr ""
+msgstr "^BG%s^BG は ^TC^TT 鍵を拾いた"
#: qcsrc/common/notifications/all.inc:395
#, c-format
msgid "^BG%s^F3 forfeited"
-msgstr ""
+msgstr "^BG%s^F3 は捨てた"
#: qcsrc/common/notifications/all.inc:396
#, c-format
msgid "^BG%s^F3 has no more lives left"
-msgstr ""
+msgstr "^BG%s^F3 の寿命は残っていない"
#: qcsrc/common/notifications/all.inc:398
msgid "^BGMonsters are currently disabled"
-msgstr ""
+msgstr "^BGモンスターは現在無効になっています"
#: qcsrc/common/notifications/all.inc:400
msgid "^BGThe ^TC^TT^BG team held the ball for too long"
-msgstr ""
+msgstr "^BG ^TC^TT^BG チームがボールを長時間保持した"
#: qcsrc/common/notifications/all.inc:402
#, c-format
msgid "^BG%s^BG captured %s^BG control point"
-msgstr ""
+msgstr "^BG%s^BG が %s^BG コントロールポイントを取れた"
#: qcsrc/common/notifications/all.inc:403
#, c-format
msgid "^BG%s^BG captured a control point"
-msgstr ""
+msgstr "^BG%s^BG がコントロールポイントを取れた"
#: qcsrc/common/notifications/all.inc:404
#, c-format
msgid "^TC^TT^BG team %s^BG control point has been destroyed by %s"
-msgstr ""
+msgstr "^TC^TT^BG チーム %s^BG コントロールポイントが %s によって破壊された"
#: qcsrc/common/notifications/all.inc:405
#, c-format
msgid "^TC^TT^BG team control point has been destroyed by %s"
-msgstr ""
+msgstr "^TC^TT^BG チームコントロールポイントが %s によって破壊された"
#: qcsrc/common/notifications/all.inc:406
msgid "^TC^TT^BG generator has been destroyed"
-msgstr ""
+msgstr "^TC^TT^BG 発生器が破壊された"
#: qcsrc/common/notifications/all.inc:407
msgid "^TC^TT^BG generator spontaneously combusted due to overtime!"
-msgstr ""
+msgstr "^TC^TT^BG 発生器は自発的に残業により燃焼した"
#: qcsrc/common/notifications/all.inc:409
#, c-format
msgid "^BG%s^K1 picked up Invisibility"
-msgstr ""
+msgstr "^BG%s^K1 は「不可視」を拾いた"
#: qcsrc/common/notifications/all.inc:410
#, c-format
msgid "^BG%s^K1 picked up Shield"
-msgstr ""
+msgstr "^BG%s^K1 は「寿」を拾いた"
#: qcsrc/common/notifications/all.inc:411
#, c-format
msgid "^BG%s^K1 picked up Speed"
-msgstr ""
+msgstr "^BG%s^K1 は「速度」を拾いた"
#: qcsrc/common/notifications/all.inc:412
#, c-format
msgid "^BG%s^K1 picked up Strength"
-msgstr ""
+msgstr "^BG%s^K1 は「力」を拾いた"
#: qcsrc/common/notifications/all.inc:414
#, c-format
msgid "^BG%s^F3 disconnected"
-msgstr ""
+msgstr "^BG%s^F3 切断された"
#: qcsrc/common/notifications/all.inc:415
#, c-format
msgid "^BG%s^F3 was kicked for idling"
-msgstr ""
+msgstr "^BG%s^F3 は不活発者で追い出された"
#: qcsrc/common/notifications/all.inc:416
msgid ""
"^F2You were kicked from the server because you are a spectator and "
"spectators aren't allowed at the moment."
msgstr ""
+"^F2あなたは観客であり、観客は現在許可されていないため、サーバーから追い出され"
+"た。"
#: qcsrc/common/notifications/all.inc:417
#, c-format
msgid "^BG%s^F3 was kicked for excessive teamkilling"
-msgstr ""
+msgstr "^BG%s^F3 はチームメイトを殺したために追い出された"
#: qcsrc/common/notifications/all.inc:418
#, c-format
msgid "^BG%s^F3 is now spectating"
-msgstr ""
+msgstr "^BG%s^F3 は観戦中です"
#: qcsrc/common/notifications/all.inc:420
#, c-format
msgid "^BG%s^BG has abandoned the race"
-msgstr ""
+msgstr "^BG%s^BG はレースを放棄した"
#: qcsrc/common/notifications/all.inc:421
#, c-format
msgid "^BG%s^BG couldn't break their %s%s^BG place record of %s%s %s"
-msgstr ""
+msgstr "^BG%s^BG は %s%s %s の %s%s^BG 場所の記録を破ることができなかった"
#: qcsrc/common/notifications/all.inc:422
#, c-format
msgid "^BG%s^BG couldn't break the %s%s^BG place record of %s%s %s"
-msgstr ""
+msgstr "^BG%s^BG は %s%s %s の %s%s^BG 場所の記録を破ることができなかった"
#: qcsrc/common/notifications/all.inc:423
#, c-format
msgid "^BG%s^BG has finished the race"
-msgstr ""
+msgstr "^BG%s^BG はレースを終了した"
#: qcsrc/common/notifications/all.inc:424
#, c-format
msgid "^BG%s^BG broke %s^BG's %s%s^BG place record with %s%s %s"
-msgstr ""
+msgstr "^BG%s^BG は %s%s %s で %s^BG の %s%s^BG 場所の記録を破った"
#: qcsrc/common/notifications/all.inc:425
#, c-format
msgid "^BG%s^BG improved their %s%s^BG place record with %s%s %s"
-msgstr ""
+msgstr "^BG%s^BG は %s%s %s で %s%s^BG の場所の記録を改善した"
#: qcsrc/common/notifications/all.inc:426
#, c-format
"^BG%s^BG scored a new record with ^F2%s^BG, but unfortunately lacks a UID "
"and will be lost."
msgstr ""
+"^BG%s^BG は ^F2%s^BG で新しい記録を獲得したが、残念ながらUIDがなく、失われ"
+"る。"
#: qcsrc/common/notifications/all.inc:427
#, c-format
msgid ""
"^BG%s^BG scored a new record with ^F2%s^BG, but is anonymous and will be "
"lost."
-msgstr ""
+msgstr "^BG%s^BG は ^F2%s^BG で新しい記録を獲得したが、匿名で、失われる。"
#: qcsrc/common/notifications/all.inc:428
#, c-format
msgid "^BG%s^BG set the %s%s^BG place record with %s%s"
-msgstr ""
+msgstr "^BG%s^BG は %s%s で %s%s^BG 場所の記録を設定した"
#: qcsrc/common/notifications/all.inc:430
#, c-format
msgid ""
"^F4You have been invited by ^BG%s^F4 to join their game of ^F2%s^F4 "
"(^F1%s^F4)"
-msgstr ""
+msgstr "^F4あなたは ^BG%s^F4 から、^F2%s^F4 (^F1%s^F4) のゲームに招待された"
#: qcsrc/common/notifications/all.inc:432
msgid "^TC^TT ^BGteam scores!"
-msgstr ""
+msgstr "^TC^TT ^BGチームが得点した!"
#: qcsrc/common/notifications/all.inc:434
#, c-format
"^F2You have to become a player within the next %s, otherwise you will be "
"kicked, because spectating isn't allowed at this time!"
msgstr ""
+"^F2次の %s 内で選手になる必要がある。そうしないと、現時点では観戦が許可されて"
+"いないため、追い出される!"
#: qcsrc/common/notifications/all.inc:436
#, c-format
msgid "^BG%s^K1 picked up a Superweapon"
-msgstr ""
+msgstr "^BG%s^K1 はスーパー武器を拾いた"
#: qcsrc/common/notifications/all.inc:438
msgid "^BGYou cannot change to a larger team"
-msgstr ""
+msgstr "^BGあなたはより大きなチームに変更することはできません"
#: qcsrc/common/notifications/all.inc:439
msgid "^BGYou are not allowed to change teams"
-msgstr ""
+msgstr "^BGあなたはチームの変更は許可されていません"
#: qcsrc/common/notifications/all.inc:441
#, c-format
"^F4NOTE: ^BGThe server is running ^F1Xonotic %s (beta)^BG, you have "
"^F2Xonotic %s"
msgstr ""
+"^F4注: ^BGサーバーは ^F1XONOTIC %s (beta)^BG を実行しています。あなたは "
+"^F2XONOTIC %s があります。"
#: qcsrc/common/notifications/all.inc:442
#, c-format
msgid ""
"^F4NOTE: ^BGThe server is running ^F1Xonotic %s^BG, you have ^F2Xonotic %s"
msgstr ""
+"^F4注: ^BGサーバーは ^F1XONOTIC %s^BG を実行しています。あなたは ^F2XONOTIC "
+"%s があります。"
#: qcsrc/common/notifications/all.inc:443
#, c-format
"^F4NOTE: ^F1Xonotic %s^BG is out, and you still have ^F2Xonotic %s^BG - get "
"the update from ^F3http://www.xonotic.org/^BG!"
msgstr ""
+"^F4注: ^F1XONOTIC %s^BG は利用できますが、あなたは ^F2XONOTIC %s^BG がまだあ"
+"ります。 ^F3http://www.xonotic.org/ ^BGから更新を入手してください!"
#: qcsrc/common/notifications/all.inc:445
#, c-format
msgid "^F3SVQC Build information: ^F4%s"
-msgstr ""
+msgstr "^F3SVQC Build information: ^F4%s"
#: qcsrc/common/notifications/all.inc:447
#, c-format
msgid ""
"^BG%s%s^K1 died of ^BG%s^K1's great playing on the @!#%%'n Accordeon%s%s"
msgstr ""
+"^BG%s%s^K1 は@!#%%'nアコーデオン%s%sでの ^BG%s^K1 の素晴らしい演奏で死んだ"
#: qcsrc/common/notifications/all.inc:448
#, c-format
msgid "^BG%s^K1 hurt their own ears with the @!#%%'n Accordeon%s%s"
-msgstr ""
+msgstr "BG%s^K1 は@!#%%'nアコーデオン%s%sで耳を痛んだ"
#: qcsrc/common/notifications/all.inc:449
#, c-format
msgid "^BG%s%s^K1 was electrocuted by ^BG%s^K1's Arc%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 は ^BG%s^K1 のアーク%s%s によって感電された"
#: qcsrc/common/notifications/all.inc:450
#, c-format
msgid "^BG%s%s^K1 was blasted by ^BG%s^K1's Arc bolts%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 は ^BG%s^K1 のアークボルト%s%s によって爆破された"
#: qcsrc/common/notifications/all.inc:451
#, c-format
msgid "^BG%s%s^K1 was shot to death by ^BG%s^K1's Blaster%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 は ^BG%s^K1 のブラスター%s%sによって射殺された"
#: qcsrc/common/notifications/all.inc:452
#, c-format
msgid "^BG%s^K1 shot themself to hell with their Blaster%s%s"
-msgstr ""
+msgstr "^BG%s^K1 がブラスター%s%sで地獄に撃てた"
#: qcsrc/common/notifications/all.inc:453
#, c-format
msgid "^BG%s%s^K1 felt the strong pull of ^BG%s^K1's Crylink%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 は ^BG%s^K1 のクリリンク%s%sの強い引きを感じた"
#: qcsrc/common/notifications/all.inc:454
#, c-format
msgid "^BG%s^K1 felt the strong pull of their Crylink%s%s"
-msgstr ""
+msgstr "^BG%s^K1 はクリリンク%s%sの強い引きを感じた"
#: qcsrc/common/notifications/all.inc:455
#, c-format
msgid "^BG%s%s^K1 ate ^BG%s^K1's rocket%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 が ^BG%s^K1 のロケット%s%sを食べた"
#: qcsrc/common/notifications/all.inc:456
#, c-format
msgid "^BG%s%s^K1 got too close to ^BG%s^K1's rocket%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 が ^BG%s^K1 のロケット%s%sに近すぎた"
#: qcsrc/common/notifications/all.inc:457
#, c-format
msgid "^BG%s^K1 blew themself up with their Devastator%s%s"
-msgstr ""
+msgstr "^BG%s^K1 はデーバーステーター%s%sで自分自身を爆破した"
#: qcsrc/common/notifications/all.inc:458
#, c-format
msgid "^BG%s%s^K1 was blasted by ^BG%s^K1's Electro bolt%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 は ^BG%s^ K1 のエレクトロボルト%s%sによって爆破された"
#: qcsrc/common/notifications/all.inc:459
#, c-format
msgid "^BG%s%s^K1 felt the electrifying air of ^BG%s^K1's Electro combo%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 は ^BG%s^K1 の電気コンボ%s%sの電撃的にした空気を感じた"
#: qcsrc/common/notifications/all.inc:460
#, c-format
msgid "^BG%s%s^K1 got too close to ^BG%s^K1's Electro orb%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 が ^BG%s^K1 のエレクトロオーブ%s%sに近すぎた"
#: qcsrc/common/notifications/all.inc:461
#, c-format
msgid "^BG%s^K1 played with Electro bolts%s%s"
-msgstr ""
+msgstr "^BG%s^K1 はエレクトロボルト%s%sで遊びた"
#: qcsrc/common/notifications/all.inc:462
#, c-format
msgid "^BG%s^K1 could not remember where they put their Electro orb%s%s"
-msgstr ""
+msgstr "^BG%s^K1 はエレクトロオーブ%s%sをどこに置いたか思い出せなかった"
#: qcsrc/common/notifications/all.inc:463
#, c-format
msgid "^BG%s%s^K1 got too close to ^BG%s^K1's fireball%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 が ^BG%s^K1 の火の玉%s%sに近すぎた"
#: qcsrc/common/notifications/all.inc:464
#, c-format
msgid "^BG%s%s^K1 got burnt by ^BG%s^K1's firemine%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 は ^BG%s^K1 の火鉱山%s%sによって燃やされた"
#: qcsrc/common/notifications/all.inc:465
#, c-format
msgid "^BG%s^K1 should have used a smaller gun%s%s"
-msgstr ""
+msgstr "^BG%s^K1 はもっと小さな銃%s%sを使うべきだった"
#: qcsrc/common/notifications/all.inc:466
#, c-format
msgid "^BG%s^K1 forgot about their firemine%s%s"
-msgstr ""
+msgstr "^BG%s^K1 は自分の火鉱山%s%sを忘れた"
#: qcsrc/common/notifications/all.inc:467
#, c-format
msgid "^BG%s%s^K1 was pummeled by a burst of ^BG%s^K1's Hagar rockets%s%s"
msgstr ""
+"^BG%s%s^K1 は ^BG%s^K1 のハガルロケット%s%sのバーストによって打ち負かされた"
#: qcsrc/common/notifications/all.inc:468
#, c-format
msgid "^BG%s%s^K1 was pummeled by ^BG%s^K1's Hagar rockets%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 は ^BG%s^K1 のハガルロケット%s%sに衝撃された"
#: qcsrc/common/notifications/all.inc:469
#, c-format
msgid "^BG%s^K1 played with tiny Hagar rockets%s%s"
-msgstr ""
+msgstr "^BG%s^K1 が小さなハガルロケット%s%sで遊びた"
#: qcsrc/common/notifications/all.inc:470
#, c-format
msgid "^BG%s%s^K1 was cut down with ^BG%s^K1's HLAC%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 は ^BG%s^K1 のHLAC%s%sで切られた"
#: qcsrc/common/notifications/all.inc:471
#, c-format
msgid "^BG%s^K1 got a little jumpy with their HLAC%s%s"
-msgstr ""
+msgstr "^BG%s^K1 はHLAC%s%sで少しびくびくしている"
#: qcsrc/common/notifications/all.inc:472
#, c-format
msgid "^BG%s%s^K1 was caught in ^BG%s^K1's Hook gravity bomb%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 が ^BG%s^K1 のフック重力爆弾%s%sに捕まられた"
#: qcsrc/common/notifications/all.inc:473
#, c-format
msgid ""
"^BG%s%s^K1 died of ^BG%s^K1's great playing on the @!#%%'n Klein Bottle%s%s"
msgstr ""
+"^BG%s%s^K1 は@!#%%'nクラインボトル%s%sでの ^BG%s^K1 の素晴らしい演奏で死んだ"
#: qcsrc/common/notifications/all.inc:474
#, c-format
msgid "^BG%s^K1 hurt their own ears with the @!#%%'n Klein Bottle%s%s"
-msgstr ""
+msgstr "BG%s^K1 は@!#%%'nクラインボトル%s%sで耳を痛んだ"
#: qcsrc/common/notifications/all.inc:475
#, c-format
msgid "^BG%s%s^K1 was sniped by ^BG%s^K1's Machine Gun%s%s"
-msgstr ""
+msgstr "BG%s%s^K1 は ^BG%s^K1 の機関銃%s%sにひったくられた"
#: qcsrc/common/notifications/all.inc:476
#, c-format
msgid "^BG%s%s^K1 was riddled full of holes by ^BG%s^K1's Machine Gun%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 は ^BG%s^K1 の機関銃%s%sによって穴だらけになられた"
#: qcsrc/common/notifications/all.inc:477
#: qcsrc/common/notifications/all.inc:782
#, c-format
msgid "^BGYou cannot place more than ^F2%s^BG mines at a time"
-msgstr ""
+msgstr "^BGあなたは一度に ^F2%s^BG 以上の鉱山を置けません"
#: qcsrc/common/notifications/all.inc:478
#, c-format
msgid "^BG%s%s^K1 got too close to ^BG%s^K1's mine%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 が ^BG%s^K1 の鉱山%s%sに近づきすぎた"
#: qcsrc/common/notifications/all.inc:479
#, c-format
msgid "^BG%s^K1 forgot about their mine%s%s"
-msgstr ""
+msgstr "^BG%s^K1 は自分の鉱山%s%sを忘れた"
#: qcsrc/common/notifications/all.inc:480
#, c-format
msgid "^BG%s%s^K1 got too close to ^BG%s^K1's Mortar grenade%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 が ^BG%s^K1 迫撃砲手榴弾%s%sに近づきすぎた"
#: qcsrc/common/notifications/all.inc:481
#, c-format
msgid "^BG%s%s^K1 ate ^BG%s^K1's Mortar grenade%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 が ^BG%s^K1 の迫撃砲手榴弾%s%sを食べた"
#: qcsrc/common/notifications/all.inc:482
#, c-format
msgid "^BG%s^K1 didn't see their own Mortar grenade%s%s"
-msgstr ""
+msgstr "^BG%s^K1 は自分自身の迫撃砲手榴弾%s%sを見なかった"
#: qcsrc/common/notifications/all.inc:483
#, c-format
msgid "^BG%s^K1 blew themself up with their own Mortar%s%s"
-msgstr ""
+msgstr "^BG%s^K1 が自分自身の迫撃砲%s%sで爆破した"
#: qcsrc/common/notifications/all.inc:484
#, c-format
msgid "^BG%s%s^K1 was sniped by ^BG%s^K1's Overkill Heavy Machine Gun%s%s"
-msgstr ""
+msgstr "BG%s%s^K1 は ^BG%s^K1 のオーバーキル重機関銃%s%sにひったくられた"
#: qcsrc/common/notifications/all.inc:485
#, c-format
msgid ""
"^BG%s%s^K1 was torn to bits by ^BG%s^K1's Overkill Heavy Machine Gun%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 は ^BG%s^K1 のオーバーキル重機関銃%s%sによって破られた"
#: qcsrc/common/notifications/all.inc:486
#, c-format
msgid ""
"^BG%s%s^K1 was riddled full of holes by ^BG%s^K1's Overkill Machine Gun%s%s"
msgstr ""
+"^BG%s%s^K1 は ^BG%s^K1 のオーバーキル機関銃%s%sによって穴だらけになられた"
#: qcsrc/common/notifications/all.inc:487
#, c-format
msgid "^BG%s%s^K1 has been vaporized by ^BG%s^K1's Overkill Nex%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 は ^BG%s^K1 のオーバーキルネクス%s%sによって気化された"
#: qcsrc/common/notifications/all.inc:488
#, c-format
"^BG%s%s^K1 was sawn in half by ^BG%s^K1's Overkill Rocket Propelled Chainsaw"
"%s%s"
msgstr ""
+"^BG%s%s^K1 は ^BG%s^K1 のオーバーキルロケット推進チェーンソー%s%sによって半分"
+"に切断された"
#: qcsrc/common/notifications/all.inc:489
#, c-format
msgid ""
"^BG%s%s^K1 almost dodged ^BG%s^K1's Overkill Rocket Propelled Chainsaw%s%s"
msgstr ""
+"^BG%s%s^K1 は ^BG%s^K1 のオーバーキルロケット推進チェーンソー%s%sをほぼ避けた"
#: qcsrc/common/notifications/all.inc:490
#, c-format
msgid ""
"^BG%s^K1 was sawn in half by their own Overkill Rocket Propelled Chainsaw%s%s"
msgstr ""
+"^BG%s^K1 が自分自身のオーバーキルロケット推進チェーンソー%s%sによって半分に切"
+"断された"
#: qcsrc/common/notifications/all.inc:491
#, c-format
msgid ""
"^BG%s^K1 blew themself up with their Overkill Rocket Propelled Chainsaw%s%s"
msgstr ""
+"^BG%s^K1 が自分自身のオーバーキルロケット推進チェーンソー%s%sで爆破した"
#: qcsrc/common/notifications/all.inc:493
#, c-format
msgid "^BG%s%s^K1 was gunned down by ^BG%s^K1's Overkill Shotgun%s%s"
msgstr ""
+"^BG%s%s^K1 は ^BG%s^K1 のオーバーキルショットガン%s%sによって射殺された"
#: qcsrc/common/notifications/all.inc:494
#, c-format
msgid "^BG%s%s^K1 was sniped with a Rifle by ^BG%s^K1%s%s"
-msgstr ""
+msgstr "BG%s%s^K1 は ^BG%s^K1 のライフル%s%sでひったくられた"
#: qcsrc/common/notifications/all.inc:495
#, c-format
msgid "^BG%s%s^K1 died in ^BG%s^K1's Rifle bullet hail%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 が ^BG%s^K1 からのライフル弾雨%s%sで死亡した"
#: qcsrc/common/notifications/all.inc:496
#, c-format
msgid "^BG%s%s^K1 failed to hide from ^BG%s^K1's Rifle bullet hail%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 は ^BG%s^K1 のライフル弾雨%s%sから隠すことができなかった"
#: 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 ""
+msgstr "^BG%s%s^K1 は ^BG%s^K1 のライフル%s%sから隠すことができなかった"
#: qcsrc/common/notifications/all.inc:498
#, c-format
msgid "^BG%s%s^K1 was pummeled by ^BG%s^K1's Seeker rockets%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 は ^BG%s^K1 のシーカーロケット%s%sに衝撃された"
#: qcsrc/common/notifications/all.inc:499
#, c-format
msgid "^BG%s%s^K1 was tagged by ^BG%s^K1's Seeker%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 は ^BG%s^K1 のシーカー%s%sタグ付たれた"
#: qcsrc/common/notifications/all.inc:500
#, c-format
msgid "^BG%s^K1 played with tiny Seeker rockets%s%s"
-msgstr ""
+msgstr "^BG%s^K1 が小さなシーカーロケット%s%sで遊びた"
#: qcsrc/common/notifications/all.inc:501
#, c-format
msgid "^BG%s%s^K1 was gunned down by ^BG%s^K1's Shockwave%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 は ^BG%s^K1 の衝撃波%s%sによって射殺された"
#: qcsrc/common/notifications/all.inc:502
#, c-format
msgid "^BG%s%s^K1 slapped ^BG%s^K1 around a bit with a large Shockwave%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 が ^BG%s^K1 は大きな衝撃波%s%sで少し叩かれた"
#: qcsrc/common/notifications/all.inc:503
#, c-format
msgid "^BG%s%s^K1 was gunned down by ^BG%s^K1's Shotgun%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 は ^BG%s^K1 のショットガン%s%sによって射殺された"
#: qcsrc/common/notifications/all.inc:504
#, c-format
msgid "^BG%s%s^K1 slapped ^BG%s^K1 around a bit with a large Shotgun%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 が ^BG%s^K1 は大きなショットガン%s%sで少し叩かれた"
#: qcsrc/common/notifications/all.inc:505
#, c-format
msgid "^BG%s^K1 is now thinking with portals%s%s"
-msgstr ""
+msgstr "^BG%s^K1 はポータル%s%sで考えている"
#: qcsrc/common/notifications/all.inc:506
#, c-format
msgid "^BG%s%s^K1 died of ^BG%s^K1's great playing on the @!#%%'n Tuba%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 は@!#%%'nチューバ%s%sでの ^BG%s^K1 の素晴らしい演奏で死んだ"
#: qcsrc/common/notifications/all.inc:507
#, c-format
msgid "^BG%s^K1 hurt their own ears with the @!#%%'n Tuba%s%s"
-msgstr ""
+msgstr "BG%s^K1 は@!#%%'nチューバ%s%sで耳を痛んだ"
#: qcsrc/common/notifications/all.inc:508
#, c-format
msgid "^BG%s%s^K1 has been sublimated by ^BG%s^K1's Vaporizer%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 は ^BG%s^K1 の気化器%s%sによって昇華された"
#: qcsrc/common/notifications/all.inc:509
#, c-format
msgid "^BG%s%s^K1 has been vaporized by ^BG%s^K1's Vortex%s%s"
-msgstr ""
+msgstr "^BG%s%s^K1 は ^BG%s^K1 のボーテックス%s%sによって気化された"
#: qcsrc/common/notifications/all.inc:528
msgid "^F4You are now alone!"
-msgstr ""
+msgstr "^F4あなたは一人になった!"
#: qcsrc/common/notifications/all.inc:530
msgid "^BGYou are attacking!"
-msgstr ""
+msgstr "^BGあなたは攻撃している!"
#: qcsrc/common/notifications/all.inc:531
msgid "^BGYou are defending!"
-msgstr ""
+msgstr "^BGあなたは守っている!"
#: qcsrc/common/notifications/all.inc:532
#, c-format
msgid "^BGObjective destroyed in ^F4%s^BG!"
-msgstr ""
+msgstr "^F4%s^BG で^BG目的を破壊された"
#: qcsrc/common/notifications/all.inc:534
msgid "^F4Begin!"
-msgstr ""
+msgstr "^F4開始!"
#: qcsrc/common/notifications/all.inc:535
msgid "^F4Game starts in ^COUNT"
-msgstr ""
+msgstr "^F4ゲームは ^COUNT で開始します"
#: qcsrc/common/notifications/all.inc:536
msgid "^F4Round starts in ^COUNT"
-msgstr ""
+msgstr "^F4ラウンドは ^COUNT で開始します"
#: qcsrc/common/notifications/all.inc:537
msgid "^F4Round cannot start"
-msgstr ""
+msgstr "^F4ラウンドを開始できません"
#: qcsrc/common/notifications/all.inc:542
msgid "^F2Don't camp!"
-msgstr ""
+msgstr "^F2キャンプしないで!"
#: qcsrc/common/notifications/all.inc:546
msgid ""
"^BGFeel free to ^F2try to capture^BG the flag again\n"
"^BGif you think you will succeed."
msgstr ""
+"^BG今、あなたは自由です。\n"
+"^BG成功すると思われる場合\n"
+"^BG旗を^F2もう一度取ってみてください^BG。"
#: qcsrc/common/notifications/all.inc:547
msgid "^BGThis flag is currently inactive"
-msgstr ""
+msgstr "^BGこの旗は現在非活動だ"
#: qcsrc/common/notifications/all.inc:548
msgid ""
"^BGfor ^F2too many unsuccessful attempts^BG to capture.\n"
"^BGMake some defensive scores before trying again."
msgstr ""
+"^BGあなたは取るしようとして^F2失敗した回数が多すぎる^BGため、\n"
+"旗から^F1守っていた^BG。再試行する前にいくつかの防御得点を作成してください。"
#: qcsrc/common/notifications/all.inc:549
msgid "^BGYou captured the ^TC^TT^BG flag!"
-msgstr ""
+msgstr "^BGあなたが ^TC^TT^BG 旗を取れた!"
#: qcsrc/common/notifications/all.inc:550
msgid "^BGYou captured the flag!"
-msgstr ""
+msgstr "^BGあなたが旗を取れた!"
#: qcsrc/common/notifications/all.inc:551
#, c-format
msgid "^BGToo many flag throws! Throwing disabled for %s."
-msgstr ""
+msgstr "^BG旗投げが多すぎる! %s に投げが無効になっている。"
#: qcsrc/common/notifications/all.inc:552
#, c-format
msgid "^BG%s^BG passed the ^TC^TT^BG flag to %s"
-msgstr ""
+msgstr "^BG%s^BG は ^TC^TT^BG 旗を %s に渡した"
#: qcsrc/common/notifications/all.inc:553
#, c-format
msgid "^BG%s^BG passed the flag to %s"
-msgstr ""
+msgstr "^BG%s^BG は旗を %s に渡した"
#: qcsrc/common/notifications/all.inc:554
#, c-format
msgid "^BGYou received the ^TC^TT^BG flag from %s"
-msgstr ""
+msgstr "^BGあなたは %s から ^TC^TT^BG 旗を受け取った"
#: qcsrc/common/notifications/all.inc:555
#, c-format
msgid "^BGYou received the flag from %s"
-msgstr ""
+msgstr "^BGあなたは %s から旗を受け取った"
#: qcsrc/common/notifications/all.inc:556
#, c-format
msgid "^BGPress ^F2%s^BG to receive the flag from %s^BG"
-msgstr ""
+msgstr "^BG %s^BG から旗を受け取るために ^F2%s^BG を押して"
#: qcsrc/common/notifications/all.inc:557
#, c-format
msgid "^BGRequesting %s^BG to pass you the flag"
-msgstr ""
+msgstr "^BG旗を渡すよう %s^BG に要求している"
#: qcsrc/common/notifications/all.inc:558
#, c-format
msgid "^BGYou passed the ^TC^TT^BG flag to %s"
-msgstr ""
+msgstr "^BGあなたは ^TC^TT^BG 旗を %s に渡した"
#: qcsrc/common/notifications/all.inc:559
#, c-format
msgid "^BGYou passed the flag to %s"
-msgstr ""
+msgstr "^BGあなたは旗を %s に渡した"
#: qcsrc/common/notifications/all.inc:560
msgid "^BGYou got the ^TC^TT^BG flag!"
-msgstr ""
+msgstr "^BGあなたは ^TC^TT^BG 旗を手に入れた!"
#: qcsrc/common/notifications/all.inc:561
msgid "^BGYou got the flag!"
-msgstr ""
+msgstr "^BGあなたのは旗を手に入れた!"
#: qcsrc/common/notifications/all.inc:562
#, c-format
msgid "^BGYou got your %steam^BG's flag, return it!"
-msgstr ""
+msgstr "^BGあなたの%sチーム^BGの旗を手に入れた、返して!"
#: qcsrc/common/notifications/all.inc:563
#, c-format
msgid "^BGYou got the %senemy^BG's flag, return it!"
-msgstr ""
+msgstr "^BGあなたは %s敵^BG の旗を手に入れた、返して!"
#: qcsrc/common/notifications/all.inc:564
#, c-format
msgid "^BGThe %senemy^BG got your flag! Retrieve it!"
-msgstr ""
+msgstr "^BG%s敵^BGがあなたの旗を手に入れた! 取り戻せ!"
#: qcsrc/common/notifications/all.inc:565
#, c-format
msgid "^BGThe %senemy (^BG%s%s)^BG got your flag! Retrieve it!"
-msgstr ""
+msgstr "^BG%s敵 (^BG%s%s)^BG があなたの旗を手に入れた! 取り戻せ!"
#: qcsrc/common/notifications/all.inc:566
#, c-format
msgid "^BGThe %senemy^BG got the flag! Retrieve it!"
-msgstr ""
+msgstr "^BG%s敵^BGが旗を手に入れた! 取り戻せ!"
#: qcsrc/common/notifications/all.inc:567
#, c-format
msgid "^BGThe %senemy (^BG%s%s)^BG got the flag! Retrieve it!"
-msgstr ""
+msgstr "^BG%s敵 (^BG%s%s)^BG が旗を手に入れた! 取り戻せ!"
#: qcsrc/common/notifications/all.inc:568
#, c-format
msgid "^BGThe %senemy^BG got their flag! Retrieve it!"
-msgstr ""
+msgstr "^BG%s敵^BGは旗を手に入れた! 取り戻せ!"
#: qcsrc/common/notifications/all.inc:569
#, c-format
msgid "^BGThe %senemy (^BG%s%s)^BG got their flag! Retrieve it!"
-msgstr ""
+msgstr "^BG%s敵 (^B%s%sG)^BG は旗を手に入れた! 取り戻せ!"
#: qcsrc/common/notifications/all.inc:570
#, c-format
msgid "^BGYour %steam mate^BG got the ^TC^TT^BG flag! Protect them!"
-msgstr ""
+msgstr "^BGあなたの%sチームメイト^BGは ^TC^TT^BG 旗を手に入れた! 守れ!"
#: qcsrc/common/notifications/all.inc:571
#, c-format
msgid "^BGYour %steam mate (^BG%s%s)^BG got the ^TC^TT^BG flag! Protect them!"
msgstr ""
+"^BGあなたの%sチームメイト (^B%s%sG)^BG は ^TC^TT^BG 旗を手に入れた! 守れ!"
#: qcsrc/common/notifications/all.inc:572
#, c-format
msgid "^BGYour %steam mate^BG got the flag! Protect them!"
-msgstr ""
+msgstr "^BGあなたの%sチームメイト^BGは旗を手に入れた! 守れ!"
#: qcsrc/common/notifications/all.inc:573
#, c-format
msgid "^BGYour %steam mate (^BG%s%s)^BG got the flag! Protect them!"
-msgstr ""
+msgstr "^BGあなたの%sチームメイト (^B%s%sG)^BG は旗を手に入れた! 守れ!"
#: qcsrc/common/notifications/all.inc:574
msgid "^BGEnemies can now see you on radar!"
-msgstr ""
+msgstr "^BG敵はレーダーであなたを見ることができる!"
#: qcsrc/common/notifications/all.inc:575
msgid "^BGYou returned the ^TC^TT^BG flag!"
-msgstr ""
+msgstr "^BGあなたは ^TC^TT^BG 旗を返した!"
#: qcsrc/common/notifications/all.inc:576
msgid "^BGStalemate! Enemies can now see you on radar!"
-msgstr ""
+msgstr "^BG停滞! 敵はレーダーであなたを見ることができる!"
#: qcsrc/common/notifications/all.inc:577
msgid "^BGStalemate! Flag carriers can now be seen by enemies on radar!"
-msgstr ""
+msgstr "^BG停滞! 旗持ちはレーダーで敵に見られる!"
#: qcsrc/common/notifications/all.inc:581
#, c-format
msgid "^K3%sYou fragged ^BG%s"
-msgstr ""
+msgstr "^K3%sあなたは ^BG%s を削除した"
#: qcsrc/common/notifications/all.inc:582
#: qcsrc/common/notifications/all.inc:591
#: qcsrc/common/notifications/all.inc:600
#, c-format
msgid "^K3%sYou scored against ^BG%s"
-msgstr ""
+msgstr "^K3%sあなたは ^BG%s に対して得点した"
#: qcsrc/common/notifications/all.inc:583
#, c-format
msgid "^K1%sYou were fragged by ^BG%s"
-msgstr ""
+msgstr "^K1%sあなたは ^BG%s によって削除された!"
#: qcsrc/common/notifications/all.inc:584
#: qcsrc/common/notifications/all.inc:593
#: qcsrc/common/notifications/all.inc:602
#, c-format
msgid "^K1%sYou were scored against by ^BG%s"
-msgstr ""
+msgstr "^K1%sあなたは ^BG%s によって対して得点された"
#: qcsrc/common/notifications/all.inc:590
#, c-format
msgid "^K3%sYou burned ^BG%s"
-msgstr ""
+msgstr "^K3%sあなたは ^BG%s を燃やした"
#: qcsrc/common/notifications/all.inc:592
#, c-format
msgid "^K1%sYou were burned by ^BG%s"
-msgstr ""
+msgstr "^K1%sあなたは ^BG%s によって燃やされた"
#: qcsrc/common/notifications/all.inc:599
#, c-format
msgid "^K3%sYou froze ^BG%s"
-msgstr ""
+msgstr "^K3%sあなたは ^BG%s を凍結した"
#: qcsrc/common/notifications/all.inc:601
#, c-format
msgid "^K1%sYou were frozen by ^BG%s"
-msgstr ""
+msgstr "^K1%sあなたは ^BG%s によって凍結された"
#: qcsrc/common/notifications/all.inc:608
#, c-format
msgid "^K1%sYou typefragged ^BG%s"
-msgstr ""
+msgstr "^K1%sあなたは彼がタイプしている間に ^BG%s を削除した"
#: qcsrc/common/notifications/all.inc:609
#, c-format
msgid "^K1%sYou scored against ^BG%s^K1 while they were typing"
-msgstr ""
+msgstr "^K1%s彼らがタイプしていた間、あなたは ^BG%s^K1 に対して得点した"
#: qcsrc/common/notifications/all.inc:610
#, c-format
msgid "^K1%sYou were typefragged by ^BG%s"
-msgstr ""
+msgstr "^K1%sあなたはタイプしている間に ^BG%s によって削除された"
#: qcsrc/common/notifications/all.inc:611
#, c-format
msgid "^K1%sYou were scored against by ^BG%s^K1 while typing"
-msgstr ""
+msgstr "^K1%sあなたはタイプしている間、 ^BG%s^K1 によって対して得点した"
#: qcsrc/common/notifications/all.inc:617
#, c-format
msgid "^BGPress ^F2%s^BG again to toss the nade!"
-msgstr ""
+msgstr "^BG手榴弾を投げるために ^F2%s^BG をもう一度押して!"
#: qcsrc/common/notifications/all.inc:618
msgid "^F2You got a ^K1BONUS GRENADE^F2!"
-msgstr ""
+msgstr "^F2あなたは^K1ボーナス手榴弾^F2を手に入れた!"
#: qcsrc/common/notifications/all.inc:620
#, c-format
"^BGYou have been moved into a different team\n"
"You are now on: %s"
msgstr ""
+"^BGあなたは別のチームに移動された\n"
+"現在: %s"
#: qcsrc/common/notifications/all.inc:621
msgid "^K1Don't go against your team mates!"
-msgstr ""
+msgstr "^K1チームメイトに反対しないで!"
#: qcsrc/common/notifications/all.inc:621
msgid "^K1Don't shoot your team mates!"
-msgstr ""
+msgstr "^K1チームメイトを撃たないで!"
#: qcsrc/common/notifications/all.inc:622
msgid "^K1Die camper!"
-msgstr ""
+msgstr "^K1死ね、キャンパー!"
#: qcsrc/common/notifications/all.inc:622
msgid "^K1Reconsider your tactics, camper!"
-msgstr ""
+msgstr "^K1戦術を再考しろ、キャンパー!"
#: qcsrc/common/notifications/all.inc:623
msgid "^K1You unfairly eliminated yourself!"
-msgstr ""
+msgstr "^K1あなたは不当に自分を削除した!"
#: qcsrc/common/notifications/all.inc:624
#, c-format
msgid "^K1You were %s"
-msgstr ""
+msgstr "^K1あなたは %s だった"
#: qcsrc/common/notifications/all.inc:625
msgid "^K1You couldn't catch your breath!"
-msgstr ""
+msgstr "^K1あなたは息ができなかった!"
#: qcsrc/common/notifications/all.inc:626
msgid "^K1You hit the ground with a crunch!"
-msgstr ""
+msgstr "^K1あなたはクランチで地面を打ちた!"
#: qcsrc/common/notifications/all.inc:627
msgid "^K1You felt a little too hot!"
-msgstr ""
+msgstr "^K1あなたは少し暑く感じすぎた!"
#: qcsrc/common/notifications/all.inc:627
msgid "^K1You got a little bit too crispy!"
-msgstr ""
+msgstr "^K1あなたは少しカリカリになりすぎた!"
#: qcsrc/common/notifications/all.inc:628
msgid "^K1You killed your own dumb self!"
-msgstr ""
+msgstr "^K1あなたは自分の愚かな自己を殺した!"
#: qcsrc/common/notifications/all.inc:628
msgid "^K1You need to be more careful!"
-msgstr ""
+msgstr "^K1あなたはもっと注意する必要がある!"
#: qcsrc/common/notifications/all.inc:629
msgid "^K1You couldn't stand the heat!"
-msgstr ""
+msgstr "^K1あなたは暑さに耐えられなかった!"
#: qcsrc/common/notifications/all.inc:630
msgid "^K1You need to watch out for monsters!"
-msgstr ""
+msgstr "あなたはモンスターに気をつける必要がある!"
#: qcsrc/common/notifications/all.inc:630
msgid "^K1You were killed by a monster!"
-msgstr ""
+msgstr "^K1あなたはモンスターに殺された!"
#: qcsrc/common/notifications/all.inc:631
msgid "^K1Tastes like chicken!"
-msgstr ""
+msgstr "^K1チキンの味!"
#: qcsrc/common/notifications/all.inc:631
msgid "^K1You forgot to put the pin back in!"
-msgstr ""
+msgstr "^K1あなたはピンを戻すのを忘れた!"
#: qcsrc/common/notifications/all.inc:632
msgid "^K1Hanging around a napalm explosion is bad!"
-msgstr ""
+msgstr "^K1ナパーム弾の周りをぶら下がることは悪い!"
#: qcsrc/common/notifications/all.inc:633
msgid "^K1You felt a little chilly!"
-msgstr ""
+msgstr "^K1あなたは少し肌寒くなった!"
#: qcsrc/common/notifications/all.inc:633
msgid "^K1You got a little bit too cold!"
-msgstr ""
+msgstr "^K1あなたは少し寒くなった!"
#: qcsrc/common/notifications/all.inc:634
msgid "^K1Your Healing Nade is a bit defective"
-msgstr ""
+msgstr "^K1あなたの治癒手榴弾は少し欠陥だ"
#: qcsrc/common/notifications/all.inc:635
msgid "^K1You are respawning for running out of ammo..."
-msgstr ""
+msgstr "^K1あなたは弾薬が切れたために再び現れている..."
#: qcsrc/common/notifications/all.inc:635
msgid "^K1You were killed for running out of ammo..."
-msgstr ""
+msgstr "^K1あなたは弾薬が切れたために殺された..."
#: qcsrc/common/notifications/all.inc:636
msgid "^K1You grew too old without taking your medicine"
-msgstr ""
+msgstr "^K1あなたは薬を飲まずに年を取りすぎた"
#: qcsrc/common/notifications/all.inc:636
msgid "^K1You need to preserve your health"
-msgstr ""
+msgstr "^K1あなたは健康を維持する必要がある"
#: qcsrc/common/notifications/all.inc:637
msgid "^K1You became a shooting star!"
-msgstr ""
+msgstr "^K1あなたは流れ星になった!"
#: qcsrc/common/notifications/all.inc:638
msgid "^K1You melted away in slime!"
-msgstr ""
+msgstr "^K1あなたはスライムで溶かした!"
#: qcsrc/common/notifications/all.inc:639
msgid "^K1You committed suicide!"
-msgstr ""
+msgstr "^K1あなたは自殺した!"
#: qcsrc/common/notifications/all.inc:639
msgid "^K1You ended it all!"
-msgstr ""
+msgstr "^K1あなたは全て終了した!"
#: qcsrc/common/notifications/all.inc:640
msgid "^K1You got stuck in a swamp!"
-msgstr ""
+msgstr "^K1あなたは沼で立ち往生した!"
#: qcsrc/common/notifications/all.inc:641
#, c-format
msgid "^BGYou are now on: %s"
-msgstr ""
+msgstr "^BG現在: %s"
#: qcsrc/common/notifications/all.inc:642
msgid "^K1You died in an accident!"
-msgstr ""
+msgstr "^K1あなたは事故で死んだ!"
#: qcsrc/common/notifications/all.inc:643
msgid "^K1You had an unfortunate run in with a turret!"
-msgstr ""
+msgstr "^K1あなたは砲塔との不運な出会いがあった!"
#: qcsrc/common/notifications/all.inc:643
msgid "^K1You were fragged by a turret!"
-msgstr ""
+msgstr "^K1あなたは砲塔によって削除された!"
#: qcsrc/common/notifications/all.inc:644
msgid "^K1You had an unfortunate run in with an eWheel turret!"
-msgstr ""
+msgstr "^K1あなたはeWheel砲塔との不運な出会いがあった!"
#: qcsrc/common/notifications/all.inc:644
msgid "^K1You were fragged by an eWheel turret!"
-msgstr ""
+msgstr "^K1あなたはeWheel砲塔によって削除された!"
#: qcsrc/common/notifications/all.inc:645
msgid "^K1You had an unfortunate run in with a Walker turret!"
-msgstr ""
+msgstr "^K1あなたはウォーカー砲塔との不運な出会いがあった!"
#: qcsrc/common/notifications/all.inc:645
msgid "^K1You were fragged by a Walker turret!"
-msgstr ""
+msgstr "^K1あなたはウォーカー砲塔によって削除された!"
#: qcsrc/common/notifications/all.inc:646
msgid "^K1You got caught in the blast of a Bumblebee explosion!"
-msgstr ""
+msgstr "^K1あなたはバンブルビーの爆風に巻き込まれた!"
#: qcsrc/common/notifications/all.inc:647
msgid "^K1You were crushed by a vehicle!"
-msgstr ""
+msgstr "^K1あなたは乗り物に押し潰された!"
#: qcsrc/common/notifications/all.inc:648
msgid "^K1You were caught in a Raptor cluster bomb!"
-msgstr ""
+msgstr "^K1あなたはラプタークラスター爆弾に巻き込まれた!"
#: qcsrc/common/notifications/all.inc:649
msgid "^K1You got caught in the blast of a Raptor explosion!"
-msgstr ""
+msgstr "^K1あなたはラプターの爆風に巻き込まれた!"
#: qcsrc/common/notifications/all.inc:650
msgid "^K1You got caught in the blast of a Spiderbot explosion!"
-msgstr ""
+msgstr "^K1あなたはスパイダーボットの爆風に巻き込まれた!"
#: qcsrc/common/notifications/all.inc:651
msgid "^K1You were blasted to bits by a Spiderbot rocket!"
-msgstr ""
+msgstr "^K1あなたはスパイダーボットのロケットで爆破された!"
#: qcsrc/common/notifications/all.inc:652
msgid "^K1You got caught in the blast of a Racer explosion!"
-msgstr ""
+msgstr "^K1あなたはレーサーの爆風に巻き込まれた!"
#: qcsrc/common/notifications/all.inc:653
msgid "^K1You couldn't find shelter from a Racer rocket!"
-msgstr ""
+msgstr "^K1あなたはレーサーロケットからの避難所を見つけることができなかった!"
#: qcsrc/common/notifications/all.inc:654
msgid "^K1Watch your step!"
-msgstr ""
+msgstr "^K1あなたの足元に気を付けて!"
#: qcsrc/common/notifications/all.inc:656
#, c-format
msgid "^K1Moron! You fragged ^BG%s^K1, a team mate!"
-msgstr ""
+msgstr "^K1馬鹿! あなたは ^BG%s^K1 を削除した、彼があんたのチームメイトだ!"
#: qcsrc/common/notifications/all.inc:656
#, c-format
msgid "^K1Moron! You went against ^BG%s^K1, a team mate!"
-msgstr ""
+msgstr "^K1馬鹿! あなたは ^BG%s^K1 に反対した、彼があんたのチームメイトだ!"
#: qcsrc/common/notifications/all.inc:657
#, c-format
msgid "^K1You were fragged by ^BG%s^K1, a team mate"
-msgstr ""
+msgstr "^K1あなたは ^BG%s^K1 によって削除された、彼があんたのチームメイトだ"
#: qcsrc/common/notifications/all.inc:657
#, c-format
msgid "^K1You were scored against by ^BG%s^K1, a team mate"
msgstr ""
+"^K1あなたは ^BG%s^K1 によって対して得点された、彼があんたのチームメイトだ"
#: qcsrc/common/notifications/all.inc:659
msgid ""
"^K1Stop idling!\n"
"^BGDisconnecting in ^COUNT..."
msgstr ""
+"不活発者であることを停止しろ!\n"
+"^BG^COUNT 後に切断してる..."
#: qcsrc/common/notifications/all.inc:661
#, c-format
msgid "^BGYou need %s^BG!"
-msgstr ""
+msgstr "^BGあなたは %s^BG が必要だ!"
#: qcsrc/common/notifications/all.inc:662
#, c-format
msgid "^BGYou also need %s^BG!"
-msgstr ""
+msgstr "^BGあなたは %s^BG も必要だ!"
#: qcsrc/common/notifications/all.inc:663
msgid "^BGDoor unlocked!"
-msgstr ""
+msgstr "^BG扉を開けた!"
#: qcsrc/common/notifications/all.inc:665
#, c-format
msgid "^F2Extra lives taken: ^K1%s"
-msgstr ""
+msgstr "^F2奪った余分な命数: ^K1%s"
#: qcsrc/common/notifications/all.inc:667
#, c-format
msgid "^K3You revived ^BG%s"
-msgstr ""
+msgstr "^K3あなたは ^BG%s を復活した"
#: qcsrc/common/notifications/all.inc:668
msgid "^K3You revived yourself"
-msgstr ""
+msgstr "^K3あなた自身を復活した"
#: qcsrc/common/notifications/all.inc:669
#, c-format
msgid "^K3You were revived by ^BG%s"
-msgstr ""
+msgstr "^K3あなたは ^BG%s によって復活された"
#: qcsrc/common/notifications/all.inc:670
#, c-format
msgid "^K3You were automatically revived after %s seconds"
-msgstr ""
+msgstr "^K3あなたは %s 秒後に自動的に復活した"
#: qcsrc/common/notifications/all.inc:672
msgid "^BGThe generator is under attack!"
-msgstr ""
+msgstr "^BG発生器が攻撃を受けている!"
#: qcsrc/common/notifications/all.inc:674
msgid "^TC^TT^BG team loses the round"
-msgstr ""
+msgstr "^TC^TT^BG チームがラウンドに負けた"
#: qcsrc/common/notifications/all.inc:678
msgid "^K1You froze yourself"
-msgstr ""
+msgstr "^K1あなたは自分を冷凍した"
#: qcsrc/common/notifications/all.inc:679
msgid "^K1Round already started, you spawn as frozen"
-msgstr ""
+msgstr "^K1ラウンドはすでに開始されており、凍結状態で現れる"
#: qcsrc/common/notifications/all.inc:681
#, c-format
msgid "^K1A %s has arrived!"
-msgstr ""
+msgstr "^K1 %s が到着した!"
#: qcsrc/common/notifications/all.inc:685
msgid "^BGYou got the ^F1Fuel regenerator"
-msgstr ""
+msgstr "^BGあなたは^F1燃料再生器を手に入れた"
#: qcsrc/common/notifications/all.inc:686
msgid "^BGYou got the ^F1Jetpack"
-msgstr ""
+msgstr "^BGあなたは^F1ジェットパックを手に入れた"
#: qcsrc/common/notifications/all.inc:694
msgid ""
"^K1No spawnpoints available!\n"
"Hope your team can fix it..."
msgstr ""
+"^K1利用可能な現れられるスペースがありません!\n"
+"あなたのチームがそれを修正できることを願っています..."
#: qcsrc/common/notifications/all.inc:695
msgid ""
"^K1You may not join the game at this time.\n"
"The player limit reached maximum capacity."
msgstr ""
+"現在、ゲームに参加できません。\n"
+"選手の制限が最大容量に達しました。"
#: qcsrc/common/notifications/all.inc:699
msgid "^BGYou picked up the ball"
-msgstr ""
+msgstr "^BGあなたはボールを拾いた"
#: qcsrc/common/notifications/all.inc:700
msgid "^BGKilling people while you don't have the ball gives no points!"
-msgstr ""
+msgstr "^BGあなたにはボールを持っていない時に人を殺してもポイントを与えない!"
#: qcsrc/common/notifications/all.inc:702
msgid ""
"^BGAll keys are in your team's hands!\n"
"Help the key carriers to meet!"
msgstr ""
+"^BG全ての鍵はチームの手にある!\n"
+"鍵持ちが会うのを助けて!"
#: qcsrc/common/notifications/all.inc:703
msgid ""
"^BGAll keys are in ^TC^TT team^BG's hands!\n"
"Interfere ^F4NOW^BG!"
msgstr ""
+"^BG全ての鍵は ^TC^TT チーム^BGの手にあ全る!\n"
+"^F4今^BGすぐ干渉して!"
#: qcsrc/common/notifications/all.inc:704
msgid ""
"^BGAll keys are in your team's hands!\n"
"Meet the other key carriers ^F4NOW^BG!"
msgstr ""
+"^BG全ての鍵はチームの手にある!\n"
+"^F4今^BGすぐ他の鍵持ちに会って!"
#: qcsrc/common/notifications/all.inc:705
msgid "^F4Round will start in ^COUNT"
-msgstr ""
+msgstr "^F4ラウンドは ^COUNT から開始する"
#: qcsrc/common/notifications/all.inc:706
msgid "^BGScanning frequency range..."
-msgstr ""
+msgstr "^BG周波数範囲をスキャン中..."
#: qcsrc/common/notifications/all.inc:707
msgid "^BGYou are starting with the ^TC^TT Key"
-msgstr ""
+msgstr "^BGあなたは ^TC^TT 鍵で開始ている"
#: qcsrc/common/notifications/all.inc:709
msgid "^BGYou have no lives left, you must wait until the next match"
-msgstr ""
+msgstr "^BGあなたには残りの命がない、あなたは次の試合まで待つ必要がない"
#: qcsrc/common/notifications/all.inc:711
#, c-format
"^BGWaiting for players to join...\n"
"Need active players for: %s"
msgstr ""
+"^BG選手の参加を待ち中...\n"
+"必要活発な選手: %s"
#: qcsrc/common/notifications/all.inc:712
#, c-format
msgid "^BGWaiting for %s player(s) to join..."
-msgstr ""
+msgstr "^BG%s 選手の参加を待ち中..."
#: qcsrc/common/notifications/all.inc:714
msgid "^BGYour weapon has been downgraded until you find some ammo!"
-msgstr ""
+msgstr "^BGあなたは弾薬がいくつか見つかるまで、あなたの武器が格下げされた!"
#: qcsrc/common/notifications/all.inc:715
msgid "^F4^COUNT^BG left to find some ammo!"
-msgstr ""
+msgstr "^F4残り ^COUNT^BG で弾薬が見つかる!"
#: qcsrc/common/notifications/all.inc:716
msgid "^BGGet some ammo or you'll be dead in ^F4^COUNT^BG!"
-msgstr ""
+msgstr "^BG弾薬を入手しないと ^F4^COUNT^BG で死んでしまいる!"
#: qcsrc/common/notifications/all.inc:716
msgid "^BGGet some ammo! ^F4^COUNT^BG left!"
-msgstr ""
+msgstr "^BG弾薬を入手しろ! ^F4残り ^COUNT^BG !"
#: qcsrc/common/notifications/all.inc:717
#, c-format
msgid "^F2Extra lives remaining: ^K1%s"
-msgstr ""
+msgstr "^F2残りの余分な命: ^K1%s"
#: qcsrc/common/notifications/all.inc:719 qcsrc/menu/xonotic/campaign.qc:244
#, c-format
msgid "Level %s: "
-msgstr ""
+msgstr "レベル %s: "
#: qcsrc/common/notifications/all.inc:719
#, c-format
msgid "^BGPress ^F2%s^BG to enter the game"
-msgstr ""
+msgstr "^BG ^F2%s^BG を押してゲームに入る"
#: qcsrc/common/notifications/all.inc:722
#, c-format
"^F2^COUNT^BG until weapon change...\n"
"Next weapon: ^F1%s"
msgstr ""
+"^F2^COUNT^BG 、武器が変更されるまで...\n"
+"次の武器: ^F1%s"
#: qcsrc/common/notifications/all.inc:723
#, c-format
msgid "^F2Active weapon: ^F1%s"
-msgstr ""
+msgstr "^F2活発な武器: ^F1%s"
#: qcsrc/common/notifications/all.inc:725
#, c-format
msgid "^BGYou captured %s^BG control point"
-msgstr ""
+msgstr "^BGあなたは %s^BG コントロールポイントを取れた"
#: qcsrc/common/notifications/all.inc:726
msgid "^BGYou captured a control point"
-msgstr ""
+msgstr "^BGあなたはコントロールポイントを取れた"
#: qcsrc/common/notifications/all.inc:727
#, c-format
msgid "^TC^TT^BG team captured %s^BG control point"
-msgstr ""
+msgstr "^TC^TT^BG チームは %s^BG コントロールポイントを取れた"
#: qcsrc/common/notifications/all.inc:728
msgid "^TC^TT^BG team captured a control point"
-msgstr ""
+msgstr "^TC^TT^BG チームはコントロールポイントを取れた"
#: qcsrc/common/notifications/all.inc:729
msgid "^BGThis control point currently cannot be captured"
-msgstr ""
+msgstr "^BGこのコントロールポイントは現在取られない"
#: qcsrc/common/notifications/all.inc:730
msgid ""
"^BGThe enemy generator cannot be destroyed yet\n"
"^F2Capture some control points to unshield it"
msgstr ""
+"^BG敵の発生器はまだ破壊できない\n"
+"^F2いくつかのコントロールポイントを取れて、非シールドする"
#: qcsrc/common/notifications/all.inc:731
msgid "^BGThe ^TCenemy^BG generator is no longer shielded!"
-msgstr ""
+msgstr "^BG ^TC 敵^BGの発生器はシールドされなくなった!"
#: qcsrc/common/notifications/all.inc:732
msgid ""
"^K1Your generator is NOT shielded!\n"
"^BGRe-capture control points to shield it!"
msgstr ""
+"^K1あなたの発生器はシールドされていない!\n"
+"^BGコントロールポイントを再取れてシールドして!"
#: qcsrc/common/notifications/all.inc:733
#, c-format
msgid "^BGPress ^F2%s^BG to teleport"
-msgstr ""
+msgstr "^BG ^F2%s^BG を押してテレポートする"
#: qcsrc/common/notifications/all.inc:734
#, c-format
msgid "^BGTeleporting disabled for %s"
-msgstr ""
+msgstr "^BGテレポートは %s 間無効"
#: qcsrc/common/notifications/all.inc:736
msgid ""
"^F2Now playing ^F4OVERTIME^F2!\n"
"Keep fragging until we have a winner!"
msgstr ""
+"^F2残業中!\n"
+"勝者が出るまで削除を立て続けて!"
#: qcsrc/common/notifications/all.inc:736
msgid ""
"^F2Now playing ^F4OVERTIME^F2!\n"
"Keep scoring until we have a winner!"
msgstr ""
+"^F2残業中!\n"
+"勝者が出るまで得点を立て続けて!"
#: qcsrc/common/notifications/all.inc:737
msgid ""
"The more control points your team holds,\n"
"the faster the enemy generator decays"
msgstr ""
+"^F2残業中!\n"
+"\n"
+"発電機は現在衰退してる。\n"
+"チームが保持するコントロールポイントが多いほど、\n"
+"敵の発生器の減衰が速くなる"
#: qcsrc/common/notifications/all.inc:738
#, c-format
"^F2Now playing ^F4OVERTIME^F2!\n"
"^BGAdded ^F4%s^BG to the game!"
msgstr ""
+"^F2残業中!\n"
+"^BG F4%s^BG がゲームに追加された!"
#: qcsrc/common/notifications/all.inc:740
msgid "^K1In^BG-portal created"
-msgstr ""
+msgstr "^BGポータル^K1内^BGが作成された"
#: qcsrc/common/notifications/all.inc:741
msgid "^F3Out^BG-portal created"
-msgstr ""
+msgstr "^BGポータル^F3外^BGが作成された"
#: qcsrc/common/notifications/all.inc:742
msgid "^F1Portal creation failed"
-msgstr ""
+msgstr "^F1ポータルの作成に失敗した"
#: qcsrc/common/notifications/all.inc:744
msgid "^F2Strength infuses your weapons with devastating power"
-msgstr ""
+msgstr "^F2「力」はあなたの武器に壊滅的な力を吹き込みる"
#: qcsrc/common/notifications/all.inc:745
msgid "^F2Strength has worn off"
-msgstr ""
+msgstr "^F2「力」がすり減った"
#: qcsrc/common/notifications/all.inc:747
msgid "^F2Shield surrounds you"
-msgstr ""
+msgstr "^F2「寿」があなたを囲んでいる"
#: qcsrc/common/notifications/all.inc:748
msgid "^F2Shield has worn off"
-msgstr ""
+msgstr "^F2「寿」がすり減った"
#: qcsrc/common/notifications/all.inc:750
msgid "^F2You are on speed"
-msgstr ""
+msgstr "^F2あなたは「速度」に乗っている"
#: qcsrc/common/notifications/all.inc:751
msgid "^F2Speed has worn off"
-msgstr ""
+msgstr "^F2「速度」がすり減った"
#: qcsrc/common/notifications/all.inc:753
msgid "^F2You are invisible"
-msgstr ""
+msgstr "^F2あなたには「不可視」がある"
#: qcsrc/common/notifications/all.inc:754
msgid "^F2Invisibility has worn off"
-msgstr ""
+msgstr "^F2「不可視」がすり減った"
#: qcsrc/common/notifications/all.inc:756
msgid "^F2The race is over, finish your lap!"
-msgstr ""
+msgstr "^F2レースが終わった、ラップを終了して!"
#: qcsrc/common/notifications/all.inc:758
msgid "^BGSequence completed!"
-msgstr ""
+msgstr "^BG順序完了!"
#: qcsrc/common/notifications/all.inc:759
msgid "^BGThere are more to go..."
-msgstr ""
+msgstr "^BG続行するにはさらに必要がある..."
#: qcsrc/common/notifications/all.inc:760
#, c-format
msgid "^BGOnly %s^BG more to go..."
-msgstr ""
+msgstr "^BG後 ^BG%s だけ..."
#: qcsrc/common/notifications/all.inc:762
msgid "^F2Superweapons have broken down"
-msgstr ""
+msgstr "^F2スーパー武器が壊れられた"
#: qcsrc/common/notifications/all.inc:763
msgid "^F2Superweapons have been lost"
-msgstr ""
+msgstr "^F2スーパー武器は失われた"
#: qcsrc/common/notifications/all.inc:764
msgid "^F2You now have a superweapon"
-msgstr ""
+msgstr "^F2今、あなたはスーパー武器がある"
#: qcsrc/common/notifications/all.inc:766
msgid "^K1Changing to ^TC^TT^K1 in ^COUNT"
-msgstr ""
+msgstr "^K1 ^COUNT に ^TC^TT^K1 に変更中"
#: qcsrc/common/notifications/all.inc:767
msgid "^K1Changing team in ^COUNT"
-msgstr ""
+msgstr "^K1 ^COUNT にチームに変更中"
#: qcsrc/common/notifications/all.inc:768
msgid "^K1Spectating in ^COUNT"
-msgstr ""
+msgstr "^K1 ^COUNT に観戦中"
#: qcsrc/common/notifications/all.inc:769
msgid "^K1Suicide in ^COUNT"
-msgstr ""
+msgstr "^K1 ^COUNT に自殺中"
#: qcsrc/common/notifications/all.inc:771
msgid "^F4Timeout begins in ^COUNT"
-msgstr ""
+msgstr "^F4タイムアウトは ^COUNT から開始します"
#: qcsrc/common/notifications/all.inc:772
msgid "^F4Timeout ends in ^COUNT"
-msgstr ""
+msgstr "^F4タイムアウトは ^COUNT で終了します"
#: qcsrc/common/notifications/all.inc:774
msgid "^K1Cannot join given minigame session!"
-msgstr ""
+msgstr "^K1特定のミニゲームセッションに参加できない!"
#: qcsrc/common/notifications/all.inc:776
#, c-format
msgid "^BGPress ^F2%s^BG to enter/exit the vehicle"
-msgstr ""
+msgstr "^BG乗り物に出入りするために ^F2%s^BG を押して"
#: qcsrc/common/notifications/all.inc:777
#, c-format
msgid "^BGPress ^F2%s^BG to enter the vehicle gunner"
-msgstr ""
+msgstr "^BG乗り物の砲手に入るために ^F2%s^BG を押して"
#: qcsrc/common/notifications/all.inc:778
#, c-format
msgid "^BGPress ^F2%s^BG to steal this vehicle"
-msgstr ""
+msgstr "^BGこの乗り物を盗むために ^F2%s^BG を押して"
#: qcsrc/common/notifications/all.inc:779
msgid ""
"^F2The enemy is stealing one of your vehicles!\n"
"^F4Stop them!"
msgstr ""
+"^F2敵はあなたの乗り物を盗んでいる!\n"
+"^F4彼らを止めて!"
#: qcsrc/common/notifications/all.inc:780
msgid "^F2Intruder detected, disabling shields!"
-msgstr ""
+msgstr "^F2侵入者を検出した、シールドを無効中!"
#: qcsrc/common/notifications/all.qh:198
msgid "Notification dump command only works with cl_cmd and sv_cmd."
-msgstr ""
+msgstr "通知ダンプコマンドは cl_cmd および sv_cmd でのみ機能します。"
#: qcsrc/common/notifications/all.qh:408 qcsrc/common/notifications/all.qh:409
#, c-format
msgid " (near %s)"
-msgstr ""
+msgstr " ( %s に近い)"
#: qcsrc/common/notifications/all.qh:416 qcsrc/common/notifications/all.qh:417
msgid "primary"
-msgstr ""
+msgstr "一次"
#: qcsrc/common/notifications/all.qh:416 qcsrc/common/notifications/all.qh:417
msgid "secondary"
-msgstr ""
+msgstr "二次"
#: qcsrc/common/notifications/all.qh:419
msgid "point"
-msgstr ""
+msgstr "ポイント"
#: qcsrc/common/notifications/all.qh:419
msgid "points"
-msgstr ""
+msgstr "ポイント"
#: qcsrc/common/notifications/all.qh:428
msgid "drop flag"
-msgstr ""
+msgstr "旗を落とす"
#: qcsrc/common/notifications/all.qh:429
msgid "throw nade"
-msgstr ""
+msgstr "手榴弾を投げる"
#: qcsrc/common/notifications/all.qh:455
#, c-format
msgid "%s^K1 made a TRIPLE FRAG! %s^BG"
-msgstr ""
+msgstr "%s^K1 がトリプル削除をした! %s^BG"
#: qcsrc/common/notifications/all.qh:455
#, c-format
msgid "%s^K1 made a TRIPLE SCORE! %s^BG"
-msgstr ""
+msgstr "%s^K1 がトリプル得点をした! %s^BG"
#: qcsrc/common/notifications/all.qh:455
msgid "TRIPLE FRAG! "
-msgstr ""
+msgstr "トリプル削除! "
#: qcsrc/common/notifications/all.qh:456
#, c-format
msgid "%s^K1 made FIVE SCORES IN A ROW! %s^BG"
-msgstr ""
+msgstr "%s^K1 は5得点を一列にした! %s^BG"
#: qcsrc/common/notifications/all.qh:456
#, c-format
msgid "%s^K1 unlocked RAGE! %s^BG"
-msgstr ""
+msgstr "%s^K1 が激怒を解除した! %s^BG"
#: qcsrc/common/notifications/all.qh:456
msgid "RAGE! "
-msgstr ""
+msgstr "激怒! "
#: qcsrc/common/notifications/all.qh:457
#, c-format
msgid "%s^K1 made TEN SCORES IN A ROW! %s^BG"
-msgstr ""
+msgstr "%s^K1 は10得点を一列にした! %s^BG"
#: qcsrc/common/notifications/all.qh:457
#, c-format
msgid "%s^K1 started a MASSACRE! %s^BG"
-msgstr ""
+msgstr "%s^K1 が虐殺を開始した! %s^BG"
#: qcsrc/common/notifications/all.qh:457
msgid "MASSACRE! "
-msgstr ""
+msgstr "虐殺! "
#: qcsrc/common/notifications/all.qh:458
#, c-format
msgid "%s^K1 executed MAYHEM! %s^BG"
-msgstr ""
+msgstr "%s^K1 が暴力を実行した! %s^BG"
#: qcsrc/common/notifications/all.qh:458
#, c-format
msgid "%s^K1 made FIFTEEN SCORES IN A ROW! %s^BG"
-msgstr ""
+msgstr "%s^K1 は15得点を一列にした! %s^BG"
#: qcsrc/common/notifications/all.qh:458
msgid "MAYHEM! "
-msgstr ""
+msgstr "暴力! "
#: qcsrc/common/notifications/all.qh:459
#, c-format
msgid "%s^K1 is a BERSERKER! %s^BG"
-msgstr ""
+msgstr "%s^K1 はバーサーカーだ! %s^BG"
#: qcsrc/common/notifications/all.qh:459
#, c-format
msgid "%s^K1 made TWENTY SCORES IN A ROW! %s^BG"
-msgstr ""
+msgstr "%s^K1 は20得点を一列にした! %s^BG"
#: qcsrc/common/notifications/all.qh:459
msgid "BERSERKER! "
-msgstr ""
+msgstr "バーサーカー! "
#: qcsrc/common/notifications/all.qh:460
#, c-format
msgid "%s^K1 inflicts CARNAGE! %s^BG"
-msgstr ""
+msgstr "%s^K1 は大虐殺をやった! %s^BG"
#: qcsrc/common/notifications/all.qh:460
#, c-format
msgid "%s^K1 made TWENTY FIVE SCORES IN A ROW! %s^BG"
-msgstr ""
+msgstr "%s^K1 は25得点を一列にした! %s^BG"
#: qcsrc/common/notifications/all.qh:460
msgid "CARNAGE! "
-msgstr ""
+msgstr "大虐殺! "
#: qcsrc/common/notifications/all.qh:461
#, c-format
msgid "%s^K1 made THIRTY SCORES IN A ROW! %s^BG"
-msgstr ""
+msgstr "%s^K1 は30得点を一列にした! %s^BG"
#: qcsrc/common/notifications/all.qh:461
#, c-format
msgid "%s^K1 unleashes ARMAGEDDON! %s^BG"
-msgstr ""
+msgstr "%s^K1 はアルマゲドンを解放する! %s^BG"
#: qcsrc/common/notifications/all.qh:461
msgid "ARMAGEDDON! "
-msgstr ""
+msgstr "アルマゲドン! "
#: qcsrc/common/notifications/all.qh:468
#, c-format
msgid "%s(^F1Bot^BG)"
-msgstr ""
+msgstr "%s(^F1ボット^BG)"
#: qcsrc/common/notifications/all.qh:470
#, c-format
msgid "%s(Ping ^F1%d^BG)"
-msgstr ""
+msgstr "%s(PING ^F1%d^BG)"
#: qcsrc/common/notifications/all.qh:477
#, c-format
"\n"
"(Health ^1%d^BG / Armor ^2%d^BG)%s"
msgstr ""
+"\n"
+"(健康 ^1%d^BG / 鎧 ^2%d^BG)%s"
#: qcsrc/common/notifications/all.qh:479
#, c-format
"\n"
"(^F4Dead^BG)%s"
msgstr ""
+"\n"
+"( ^F4^死んだBG )%s"
#: 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"
-msgstr ""
+msgstr "赤"
#: qcsrc/common/teams.qh:32
msgid "TEAM^Blue"
-msgstr ""
+msgstr "青"
#: qcsrc/common/teams.qh:33
msgid "TEAM^Yellow"
-msgstr ""
+msgstr "黄"
#: qcsrc/common/teams.qh:34
msgid "TEAM^Pink"
-msgstr ""
+msgstr "ピンク"
#: qcsrc/common/teams.qh:35
msgid "Team"
-msgstr ""
+msgstr "チーム"
#: qcsrc/common/teams.qh:36
msgid "Neutral"
-msgstr ""
+msgstr "中立"
#: qcsrc/common/teams.qh:39
msgid "KEY^Red"
-msgstr ""
+msgstr "赤"
#: qcsrc/common/teams.qh:40
msgid "KEY^Blue"
-msgstr ""
+msgstr "青"
#: qcsrc/common/teams.qh:41
msgid "KEY^Yellow"
-msgstr ""
+msgstr "黄"
#: qcsrc/common/teams.qh:42
msgid "KEY^Pink"
-msgstr ""
+msgstr "ピンク"
#: qcsrc/common/teams.qh:43
msgid "FLAG^Red"
-msgstr ""
+msgstr "赤"
#: qcsrc/common/teams.qh:44
msgid "FLAG^Blue"
-msgstr ""
+msgstr "青"
#: qcsrc/common/teams.qh:45
msgid "FLAG^Yellow"
-msgstr ""
+msgstr "黄"
#: qcsrc/common/teams.qh:46
msgid "FLAG^Pink"
-msgstr ""
+msgstr "ピンク"
#: qcsrc/common/teams.qh:47
msgid "GENERATOR^Red"
-msgstr ""
+msgstr "赤"
#: qcsrc/common/teams.qh:48
msgid "GENERATOR^Blue"
-msgstr ""
+msgstr "青"
#: qcsrc/common/teams.qh:49
msgid "GENERATOR^Yellow"
-msgstr ""
+msgstr "黄"
#: qcsrc/common/teams.qh:50
msgid "GENERATOR^Pink"
-msgstr ""
+msgstr "ピンク"
#: qcsrc/common/turrets/all.qh:95
msgid "Turrets dump command only works with sv_cmd."
-msgstr ""
+msgstr "砲塔ダンプコマンドは sv_cmd でのみ機能します。"
#: qcsrc/common/turrets/cl_turrets.qc:125
#, c-format
msgid "%s under attack!"
-msgstr ""
+msgstr "%s 攻撃を受けている!"
#: qcsrc/common/turrets/turret.qh:11
msgid "Turret"
-msgstr ""
+msgstr "砲塔"
#: qcsrc/common/turrets/turret/ewheel.qh:15
msgid "eWheel Turret"
-msgstr ""
+msgstr "eWheel砲塔"
#: qcsrc/common/turrets/turret/ewheel_weapon.qh:7
msgid "eWheel"
-msgstr ""
+msgstr "eWheel"
#: qcsrc/common/turrets/turret/flac.qh:13
msgid "FLAC Cannon"
-msgstr ""
+msgstr "FLACキャノン"
#: qcsrc/common/turrets/turret/flac_weapon.qh:7
msgid "FLAC"
-msgstr ""
+msgstr "FLAC"
#: qcsrc/common/turrets/turret/fusionreactor.qh:11
msgid "Fusion Reactor"
-msgstr ""
+msgstr "融合炉"
#: qcsrc/common/turrets/turret/hellion.qh:13
msgid "Hellion Missile Turret"
-msgstr ""
+msgstr "ヘリオンミサイル砲塔"
#: qcsrc/common/turrets/turret/hellion_weapon.qh:7
msgid "Hellion"
-msgstr ""
+msgstr "ヘリオン"
#: qcsrc/common/turrets/turret/hk.qh:15
msgid "Hunter-Killer Turret"
-msgstr ""
+msgstr "ハンターキラー砲塔"
#: qcsrc/common/turrets/turret/hk_weapon.qh:7
msgid "Hunter-Killer"
-msgstr ""
+msgstr "ハンターキラー"
#: qcsrc/common/turrets/turret/machinegun.qh:13
msgid "Machinegun Turret"
-msgstr ""
+msgstr "機関銃砲塔"
#: qcsrc/common/turrets/turret/machinegun_weapon.qh:7
msgid "Machinegun"
-msgstr ""
+msgstr "機関銃"
#: qcsrc/common/turrets/turret/mlrs.qh:13
msgid "MLRS Turret"
-msgstr ""
+msgstr "MLRS砲塔"
#: qcsrc/common/turrets/turret/mlrs_weapon.qh:7
msgid "MLRS"
-msgstr ""
+msgstr "MLRS"
#: qcsrc/common/turrets/turret/phaser.qh:13
msgid "Phaser Cannon"
-msgstr ""
+msgstr "フェイザーキャノン"
#: qcsrc/common/turrets/turret/phaser_weapon.qh:7
msgid "Phaser"
-msgstr ""
+msgstr "フェイザー"
#: qcsrc/common/turrets/turret/plasma.qh:13
msgid "Plasma Cannon"
-msgstr ""
+msgstr "プラズマキャノン"
#: qcsrc/common/turrets/turret/plasma_dual.qh:8
msgid "Dual plasma"
-msgstr ""
+msgstr "デュアルプラズマ"
#: qcsrc/common/turrets/turret/plasma_dual.qh:20
msgid "Dual Plasma Cannon"
-msgstr ""
+msgstr "デュアルプラズマキャノン"
#: qcsrc/common/turrets/turret/plasma_weapon.qh:7
msgid "Plasma"
-msgstr ""
+msgstr "プラズマ"
#: qcsrc/common/turrets/turret/tesla.qh:13
#: qcsrc/common/turrets/turret/tesla_weapon.qh:7
msgid "Tesla Coil"
-msgstr ""
+msgstr "テスラコイル"
#: qcsrc/common/turrets/turret/walker.qh:15
msgid "Walker Turret"
-msgstr ""
+msgstr "ウォーカー砲塔"
#: qcsrc/common/turrets/turret/walker_weapon.qh:7
msgid "Walker"
-msgstr ""
+msgstr "ウォーカー"
#: qcsrc/common/util.qc:1390
#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:176
#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:186
msgid "Male"
-msgstr ""
+msgstr "男性"
#: qcsrc/common/util.qc:1391
#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:175
#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:185
msgid "Female"
-msgstr ""
+msgstr "女性"
#: qcsrc/common/util.qc:1392
#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:174
#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:187
msgid "Undisclosed"
-msgstr ""
+msgstr "未知"
#: qcsrc/common/util.qc:1439
msgid "<KEY NOT FOUND>"
-msgstr ""
+msgstr "<KEY NOT FOUND>"
#: qcsrc/common/util.qc:1440
msgid "<UNKNOWN KEYNUM>"
-msgstr ""
+msgstr "<UNKNOWN KEYNUM>"
#: qcsrc/common/util.qc:1445
msgid "TAB"
-msgstr ""
+msgstr "TAB"
#: qcsrc/common/util.qc:1446 qcsrc/common/util.qc:1517
#, c-format
msgid "ENTER"
-msgstr ""
+msgstr "ENTER"
#: qcsrc/common/util.qc:1447
msgid "ESCAPE"
-msgstr ""
+msgstr "ESCAPE"
#: qcsrc/common/util.qc:1448
msgid "SPACE"
-msgstr ""
+msgstr "SPACE"
#: qcsrc/common/util.qc:1450
msgid "BACKSPACE"
-msgstr ""
+msgstr "BACKSPACE"
#: qcsrc/common/util.qc:1451 qcsrc/common/util.qc:1508
#, c-format
msgid "UPARROW"
-msgstr ""
+msgstr "UPARROW"
#: qcsrc/common/util.qc:1452 qcsrc/common/util.qc:1503
#, c-format
msgid "DOWNARROW"
-msgstr ""
+msgstr "DOWNARROW"
#: qcsrc/common/util.qc:1453 qcsrc/common/util.qc:1505
#, c-format
msgid "LEFTARROW"
-msgstr ""
+msgstr "LEFTARROW"
#: qcsrc/common/util.qc:1454 qcsrc/common/util.qc:1506
#, c-format
msgid "RIGHTARROW"
-msgstr ""
+msgstr "RIGHTARROW"
#: qcsrc/common/util.qc:1456
msgid "ALT"
-msgstr ""
+msgstr "ALT"
#: qcsrc/common/util.qc:1457
msgid "CTRL"
-msgstr ""
+msgstr "CTRL"
#: qcsrc/common/util.qc:1458
msgid "SHIFT"
-msgstr ""
+msgstr "SHIFT"
#: qcsrc/common/util.qc:1460 qcsrc/common/util.qc:1501
#, c-format
msgid "INS"
-msgstr ""
+msgstr "INS"
#: qcsrc/common/util.qc:1461 qcsrc/common/util.qc:1511
#, c-format
msgid "DEL"
-msgstr ""
+msgstr "DEL"
#: qcsrc/common/util.qc:1462 qcsrc/common/util.qc:1504
#, c-format
msgid "PGDN"
-msgstr ""
+msgstr "PGDN"
#: qcsrc/common/util.qc:1463 qcsrc/common/util.qc:1509
#, c-format
msgid "PGUP"
-msgstr ""
+msgstr "PGUP"
#: qcsrc/common/util.qc:1464 qcsrc/common/util.qc:1507
#, c-format
msgid "HOME"
-msgstr ""
+msgstr "HOME"
#: qcsrc/common/util.qc:1465 qcsrc/common/util.qc:1502
#, c-format
msgid "END"
-msgstr ""
+msgstr "END"
#: qcsrc/common/util.qc:1467
msgid "PAUSE"
-msgstr ""
+msgstr "PAUSE"
#: qcsrc/common/util.qc:1469
msgid "NUMLOCK"
-msgstr ""
+msgstr "NUMLOCK"
#: qcsrc/common/util.qc:1470
msgid "CAPSLOCK"
-msgstr ""
+msgstr "CAPSLOCK"
#: qcsrc/common/util.qc:1471
msgid "SCROLLOCK"
-msgstr ""
+msgstr "SCROLLOCK"
#: qcsrc/common/util.qc:1473
msgid "SEMICOLON"
-msgstr ""
+msgstr "SEMICOLON"
#: qcsrc/common/util.qc:1474
msgid "TILDE"
-msgstr ""
+msgstr "TILDE"
#: qcsrc/common/util.qc:1475
msgid "BACKQUOTE"
-msgstr ""
+msgstr "BACKQUOTE"
#: qcsrc/common/util.qc:1476
msgid "QUOTE"
-msgstr ""
+msgstr "QUOTE"
#: qcsrc/common/util.qc:1477
msgid "APOSTROPHE"
-msgstr ""
+msgstr "APOSTROPHE"
#: qcsrc/common/util.qc:1478
msgid "BACKSLASH"
-msgstr ""
+msgstr "BACKSLASH"
#: qcsrc/common/util.qc:1486
#, c-format
msgid "F%d"
-msgstr ""
+msgstr "F%d"
#: qcsrc/common/util.qc:1496
#, c-format
msgid "KP_%d"
-msgstr ""
+msgstr "KP_%d"
#: qcsrc/common/util.qc:1501 qcsrc/common/util.qc:1502
#: qcsrc/common/util.qc:1503 qcsrc/common/util.qc:1504
#: qcsrc/common/util.qc:1517 qcsrc/common/util.qc:1518
#, c-format
msgid "KP_%s"
-msgstr ""
+msgstr "KP_%s"
#: qcsrc/common/util.qc:1510
#, c-format
msgid "PERIOD"
-msgstr ""
+msgstr "PERIOD"
#: qcsrc/common/util.qc:1512
#, c-format
msgid "DIVIDE"
-msgstr ""
+msgstr "DIVIDE"
#: qcsrc/common/util.qc:1513
#, c-format
msgid "SLASH"
-msgstr ""
+msgstr "SLASH"
#: qcsrc/common/util.qc:1514
#, c-format
msgid "MULTIPLY"
-msgstr ""
+msgstr "MULTIPLY"
#: qcsrc/common/util.qc:1515
#, c-format
msgid "MINUS"
-msgstr ""
+msgstr "MINUS"
#: qcsrc/common/util.qc:1516
#, c-format
msgid "PLUS"
-msgstr ""
+msgstr "PLUS"
#: qcsrc/common/util.qc:1518
#, c-format
msgid "EQUALS"
-msgstr ""
+msgstr "EQUALS"
#: qcsrc/common/util.qc:1523
msgid "PRINTSCREEN"
-msgstr ""
+msgstr "PRINTSCREEN"
#: qcsrc/common/util.qc:1526
#, c-format
msgid "MOUSE%d"
-msgstr ""
+msgstr "MOUSE%d"
#: qcsrc/common/util.qc:1528
msgid "MWHEELUP"
-msgstr ""
+msgstr "MWHEELUP"
#: qcsrc/common/util.qc:1529
msgid "MWHEELDOWN"
-msgstr ""
+msgstr "MWHEELDOWN"
#: qcsrc/common/util.qc:1532
#, c-format
msgid "JOY%d"
-msgstr ""
+msgstr "JOY%d"
#: qcsrc/common/util.qc:1535
#, c-format
msgid "AUX%d"
-msgstr ""
+msgstr "AUX%d"
#: qcsrc/common/util.qc:1542
#, c-format
msgid "DPAD_UP"
-msgstr ""
+msgstr "DPAD_UP"
#: qcsrc/common/util.qc:1542 qcsrc/common/util.qc:1543
#: qcsrc/common/util.qc:1544 qcsrc/common/util.qc:1545
#: qcsrc/common/util.qc:1560 qcsrc/common/util.qc:1561
#, c-format
msgid "X360_%s"
-msgstr ""
+msgstr "X360_%s"
#: qcsrc/common/util.qc:1543
#, c-format
msgid "DPAD_DOWN"
-msgstr ""
+msgstr "DPAD_DOWN"
#: qcsrc/common/util.qc:1544
#, c-format
msgid "DPAD_LEFT"
-msgstr ""
+msgstr "DPAD_LEFT"
#: qcsrc/common/util.qc:1545
#, c-format
msgid "DPAD_RIGHT"
-msgstr ""
+msgstr "DPAD_RIGHT"
#: qcsrc/common/util.qc:1546
#, c-format
msgid "START"
-msgstr ""
+msgstr "START"
#: qcsrc/common/util.qc:1547
#, c-format
msgid "BACK"
-msgstr ""
+msgstr "BACK"
#: qcsrc/common/util.qc:1548
#, c-format
msgid "LEFT_THUMB"
-msgstr ""
+msgstr "LEFT_THUMB"
#: qcsrc/common/util.qc:1549
#, c-format
msgid "RIGHT_THUMB"
-msgstr ""
+msgstr "RIGHT_THUMB"
#: qcsrc/common/util.qc:1550
#, c-format
msgid "LEFT_SHOULDER"
-msgstr ""
+msgstr "LEFT_SHOULDER"
#: qcsrc/common/util.qc:1551
#, c-format
msgid "RIGHT_SHOULDER"
-msgstr ""
+msgstr "RIGHT_SHOULDER"
#: qcsrc/common/util.qc:1552
#, c-format
msgid "LEFT_TRIGGER"
-msgstr ""
+msgstr "LEFT_TRIGGER"
#: qcsrc/common/util.qc:1553
#, c-format
msgid "RIGHT_TRIGGER"
-msgstr ""
+msgstr "RIGHT_TRIGGER"
#: qcsrc/common/util.qc:1554
#, c-format
msgid "LEFT_THUMB_UP"
-msgstr ""
+msgstr "LEFT_THUMB_UP"
#: qcsrc/common/util.qc:1555
#, c-format
msgid "LEFT_THUMB_DOWN"
-msgstr ""
+msgstr "LEFT_THUMB_DOWN"
#: qcsrc/common/util.qc:1556
#, c-format
msgid "LEFT_THUMB_LEFT"
-msgstr ""
+msgstr "LEFT_THUMB_LEFT"
#: qcsrc/common/util.qc:1557
#, c-format
msgid "LEFT_THUMB_RIGHT"
-msgstr ""
+msgstr "LEFT_THUMB_RIGHT"
#: qcsrc/common/util.qc:1558
#, c-format
msgid "RIGHT_THUMB_UP"
-msgstr ""
+msgstr "RIGHT_THUMB_UP"
#: qcsrc/common/util.qc:1559
#, c-format
msgid "RIGHT_THUMB_DOWN"
-msgstr ""
+msgstr "RIGHT_THUMB_DOWN"
#: qcsrc/common/util.qc:1560
#, c-format
msgid "RIGHT_THUMB_LEFT"
-msgstr ""
+msgstr "RIGHT_THUMB_LEFT"
#: qcsrc/common/util.qc:1561
#, c-format
msgid "RIGHT_THUMB_RIGHT"
-msgstr ""
+msgstr "RIGHT_THUMB_RIGHT"
#: qcsrc/common/util.qc:1571 qcsrc/common/util.qc:1572
#: qcsrc/common/util.qc:1573 qcsrc/common/util.qc:1574
#, c-format
msgid "JOY_%s"
-msgstr ""
+msgstr "JOY_%s"
#: qcsrc/common/util.qc:1571
#, c-format
msgid "UP"
-msgstr ""
+msgstr "UP"
#: qcsrc/common/util.qc:1572
#, c-format
msgid "DOWN"
-msgstr ""
+msgstr "DOWN"
#: qcsrc/common/util.qc:1573
#, c-format
msgid "LEFT"
-msgstr ""
+msgstr "LEFT"
#: qcsrc/common/util.qc:1574
#, c-format
msgid "RIGHT"
-msgstr ""
+msgstr "RIGHT"
#: qcsrc/common/util.qc:1580
#, c-format
msgid "MIDINOTE%d"
-msgstr ""
+msgstr "MIDINOTE%d"
#: qcsrc/common/vehicles/cl_vehicles.qc:190
#, c-format
msgid "Press %s"
-msgstr ""
+msgstr "%s を押して"
#: qcsrc/common/vehicles/vehicle/bumblebee.qc:954
msgid "No right gunner!"
-msgstr ""
+msgstr "右の砲手はない!"
#: qcsrc/common/vehicles/vehicle/bumblebee.qc:960
msgid "No left gunner!"
-msgstr ""
+msgstr "左の砲手はない!"
#: qcsrc/common/vehicles/vehicle/bumblebee.qh:19
msgid "Bumblebee"
-msgstr ""
+msgstr "バンブルビー"
#: qcsrc/common/vehicles/vehicle/racer.qh:19
msgid "Racer"
-msgstr ""
+msgstr "レーサー"
#: qcsrc/common/vehicles/vehicle/racer_weapon.qh:9
msgid "Racer cannon"
-msgstr ""
+msgstr "レーサーキャノン"
#: qcsrc/common/vehicles/vehicle/raptor.qh:19
msgid "Raptor"
-msgstr ""
+msgstr "ラプター"
#: qcsrc/common/vehicles/vehicle/raptor_weapons.qh:9
msgid "Raptor cannon"
-msgstr ""
+msgstr "ラプターキャノン"
#: qcsrc/common/vehicles/vehicle/raptor_weapons.qh:17
msgid "Raptor bomb"
-msgstr ""
+msgstr "ラプターボム"
#: qcsrc/common/vehicles/vehicle/raptor_weapons.qh:25
msgid "Raptor flare"
-msgstr ""
+msgstr "ラプターフレア"
#: qcsrc/common/vehicles/vehicle/spiderbot.qh:19
msgid "Spiderbot"
-msgstr ""
+msgstr "蜘蛛ボット"
#: qcsrc/common/weapons/all.qh:76
msgid "Weapons dump command only works with sv_cmd."
-msgstr ""
+msgstr "武器ダンプコマンドは sv_cmd でのみ機能します。"
#: qcsrc/common/weapons/weapon/arc.qh:18
msgid "Arc"
-msgstr ""
+msgstr "アーク"
#: qcsrc/common/weapons/weapon/blaster.qh:18
msgid "Blaster"
-msgstr ""
+msgstr "ブラスター"
#: qcsrc/common/weapons/weapon/crylink.qh:18
msgid "Crylink"
-msgstr ""
+msgstr "クリリンク"
#: qcsrc/common/weapons/weapon/devastator.qh:18
msgid "Devastator"
-msgstr ""
+msgstr "デーバーステーター"
#: qcsrc/common/weapons/weapon/electro.qh:18
msgid "Electro"
-msgstr ""
+msgstr "エレクトロ"
#: qcsrc/common/weapons/weapon/fireball.qh:18
msgid "Fireball"
-msgstr ""
+msgstr "ファイアボール"
#: qcsrc/common/weapons/weapon/hagar.qh:18
msgid "Hagar"
-msgstr ""
+msgstr "ハガル"
#: qcsrc/common/weapons/weapon/hlac.qh:18
msgid "Heavy Laser Assault Cannon"
-msgstr ""
+msgstr "重いレーザー突撃キャノン"
#: qcsrc/common/weapons/weapon/hook.qh:18
msgid "Grappling Hook"
-msgstr ""
+msgstr "グラップリングフック"
#: qcsrc/common/weapons/weapon/machinegun.qh:18
msgid "MachineGun"
-msgstr ""
+msgstr "機関銃"
#: qcsrc/common/weapons/weapon/minelayer.qh:18
msgid "Mine Layer"
-msgstr ""
+msgstr "鉱山レーヤー"
#: qcsrc/common/weapons/weapon/mortar.qh:18
msgid "Mortar"
-msgstr ""
+msgstr "迫撃砲"
#: qcsrc/common/weapons/weapon/porto.qh:18
msgid "Port-O-Launch"
-msgstr ""
+msgstr "ポート・オー・ローンチ"
#: qcsrc/common/weapons/weapon/rifle.qh:19
msgid "Rifle"
-msgstr ""
+msgstr "ライフル"
#: qcsrc/common/weapons/weapon/seeker.qh:18
msgid "T.A.G. Seeker"
-msgstr ""
+msgstr "T.A.G.シーカー"
#: qcsrc/common/weapons/weapon/shockwave.qh:18
msgid "Shockwave"
-msgstr ""
+msgstr "衝撃波"
#: qcsrc/common/weapons/weapon/shotgun.qh:18
msgid "Shotgun"
-msgstr ""
+msgstr "ショットガン"
#: qcsrc/common/weapons/weapon/tuba.qh:18
#, no-c-format
msgid "@!#%'n Tuba"
-msgstr ""
+msgstr "@!#%'nチューバ"
#: qcsrc/common/weapons/weapon/vaporizer.qh:19
msgid "Vaporizer"
-msgstr ""
+msgstr "気化器"
#: qcsrc/common/weapons/weapon/vortex.qh:19
msgid "Vortex"
-msgstr ""
+msgstr "ボーテックス"
#: qcsrc/lib/counting.qh:9
#, c-format
msgid "CI_DEC^%s years"
-msgstr ""
+msgstr "%s 年"
#: qcsrc/lib/counting.qh:12
#, c-format
msgid "CI_ZER^%d years"
-msgstr ""
+msgstr "%d 年"
#: qcsrc/lib/counting.qh:13
#, c-format
msgid "CI_FIR^%d year"
-msgstr ""
+msgstr "%d 年"
#: qcsrc/lib/counting.qh:14
#, c-format
msgid "CI_SEC^%d years"
-msgstr ""
+msgstr "%d 年"
#: qcsrc/lib/counting.qh:15
#, c-format
msgid "CI_THI^%d years"
-msgstr ""
+msgstr "%d 年"
#: qcsrc/lib/counting.qh:16
#, c-format
msgid "CI_MUL^%d years"
-msgstr ""
+msgstr "%d 年"
#: qcsrc/lib/counting.qh:18
#, c-format
msgid "CI_DEC^%s weeks"
-msgstr ""
+msgstr "%s 週間"
#: qcsrc/lib/counting.qh:21
#, c-format
msgid "CI_ZER^%d weeks"
-msgstr ""
+msgstr "%d 週間"
#: qcsrc/lib/counting.qh:22
#, c-format
msgid "CI_FIR^%d week"
-msgstr ""
+msgstr "%d 週間"
#: qcsrc/lib/counting.qh:23
#, c-format
msgid "CI_SEC^%d weeks"
-msgstr ""
+msgstr "%d 週間"
#: qcsrc/lib/counting.qh:24
#, c-format
msgid "CI_THI^%d weeks"
-msgstr ""
+msgstr "%d 週間"
#: qcsrc/lib/counting.qh:25
#, c-format
msgid "CI_MUL^%d weeks"
-msgstr ""
+msgstr "%d 週間"
#: qcsrc/lib/counting.qh:27
#, c-format
msgid "CI_DEC^%s days"
-msgstr ""
+msgstr "%s 日"
#: qcsrc/lib/counting.qh:30
#, c-format
msgid "CI_ZER^%d days"
-msgstr ""
+msgstr "%d 日"
#: qcsrc/lib/counting.qh:31
#, c-format
msgid "CI_FIR^%d day"
-msgstr ""
+msgstr "%d 日"
#: qcsrc/lib/counting.qh:32
#, c-format
msgid "CI_SEC^%d days"
-msgstr ""
+msgstr "%d 日"
#: qcsrc/lib/counting.qh:33
#, c-format
msgid "CI_THI^%d days"
-msgstr ""
+msgstr "%d 日"
#: qcsrc/lib/counting.qh:34
#, c-format
msgid "CI_MUL^%d days"
-msgstr ""
+msgstr "%d 日"
#: qcsrc/lib/counting.qh:36
#, c-format
msgid "CI_DEC^%s hours"
-msgstr ""
+msgstr "%s 時間"
#: qcsrc/lib/counting.qh:39
#, c-format
msgid "CI_ZER^%d hours"
-msgstr ""
+msgstr "%d 時間"
#: qcsrc/lib/counting.qh:40
#, c-format
msgid "CI_FIR^%d hour"
-msgstr ""
+msgstr "%d 時間"
#: qcsrc/lib/counting.qh:41
#, c-format
msgid "CI_SEC^%d hours"
-msgstr ""
+msgstr "%d 時間"
#: qcsrc/lib/counting.qh:42
#, c-format
msgid "CI_THI^%d hours"
-msgstr ""
+msgstr "%d 時間"
#: qcsrc/lib/counting.qh:43
#, c-format
msgid "CI_MUL^%d hours"
-msgstr ""
+msgstr "%d 時間"
#: qcsrc/lib/counting.qh:46
#, c-format
msgid "CI_DEC^%s minutes"
-msgstr ""
+msgstr "%s 分"
#: qcsrc/lib/counting.qh:49
#, c-format
msgid "CI_ZER^%d minutes"
-msgstr ""
+msgstr "%d 分"
#: qcsrc/lib/counting.qh:50
#, c-format
msgid "CI_FIR^%d minute"
-msgstr ""
+msgstr "%d 分"
#: qcsrc/lib/counting.qh:51
#, c-format
msgid "CI_SEC^%d minutes"
-msgstr ""
+msgstr "%d 分"
#: qcsrc/lib/counting.qh:52
#, c-format
msgid "CI_THI^%d minutes"
-msgstr ""
+msgstr "%d 分"
#: qcsrc/lib/counting.qh:53
#, c-format
msgid "CI_MUL^%d minutes"
-msgstr ""
+msgstr "%d 分"
#: qcsrc/lib/counting.qh:55
#, c-format
msgid "CI_DEC^%s seconds"
-msgstr ""
+msgstr "%s 秒"
#: qcsrc/lib/counting.qh:58
#, c-format
msgid "CI_ZER^%d seconds"
-msgstr ""
+msgstr "%d 秒"
#: qcsrc/lib/counting.qh:59
#, c-format
msgid "CI_FIR^%d second"
-msgstr ""
+msgstr "%d 秒"
#: qcsrc/lib/counting.qh:60
#, c-format
msgid "CI_SEC^%d seconds"
-msgstr ""
+msgstr "%d 秒"
#: qcsrc/lib/counting.qh:61
#, c-format
msgid "CI_THI^%d seconds"
-msgstr ""
+msgstr "%d 秒"
#: qcsrc/lib/counting.qh:62
#, c-format
msgid "CI_MUL^%d seconds"
-msgstr ""
+msgstr "%d 秒"
#: qcsrc/lib/counting.qh:79
#, c-format
msgid "%dst"
-msgstr ""
+msgstr "%dst"
#: qcsrc/lib/counting.qh:80
#, c-format
msgid "%dnd"
-msgstr ""
+msgstr "%dnd"
#: qcsrc/lib/counting.qh:81
#, c-format
msgid "%drd"
-msgstr ""
+msgstr "%drd"
#: qcsrc/lib/counting.qh:85
#, c-format
msgid "%dth"
-msgstr ""
+msgstr "%dth"
#: qcsrc/lib/oo.qh:324
msgid "No description"
-msgstr ""
+msgstr "説明なし"
#: qcsrc/lib/spawnfunc.qh:248
#, c-format
"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 ""
+msgstr "%d 日、 %02d:%02d:%02d"
#: qcsrc/lib/string.qh:82
#, c-format
msgid "%02d:%02d:%02d"
-msgstr ""
+msgstr "%02d:%02d:%02d"
#: qcsrc/menu/command/menu_cmd.qc:48
msgid "Usage: menu_cmd command..., where possible commands are:"
-msgstr ""
+msgstr "使用法: menu_cmd コマンド...、可能なコマンドは次:"
#: qcsrc/menu/command/menu_cmd.qc:49
msgid " sync - reloads all cvars on the current menu page"
-msgstr ""
+msgstr " sync - 現在のメニューページの全ての cvar をリロードする"
#: qcsrc/menu/command/menu_cmd.qc:50
msgid " directmenu ITEM - select a menu item as main item"
-msgstr ""
+msgstr " directmenu ITEM - メニューアイテムをメインアイテムとして選択する"
#: qcsrc/menu/command/menu_cmd.qc:51
msgid " dumptree - dump the state of the menu as a tree to the console"
-msgstr ""
+msgstr " dumptree - メニューの状態をツリー状としてコンソールにダンプする"
#: qcsrc/menu/command/menu_cmd.qc:81
msgid "Available options:"
-msgstr ""
+msgstr "利用可能なオプション:"
#: qcsrc/menu/command/menu_cmd.qc:130
msgid "Invalid command. For a list of supported commands, try menu_cmd help."
msgstr ""
+"INVALID COMMAND - サポートされているコマンドのリストについては menu_cmd help "
+"を試してください。"
#: qcsrc/menu/item/listbox.qc:413
#, c-format
msgid "Item %d"
-msgstr ""
+msgstr "アイテム %d"
#: qcsrc/menu/item/textslider.qc:11 qcsrc/menu/item/textslider.qc:12
#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:37
#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:68
#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:115
msgid "Custom"
-msgstr ""
+msgstr "カスタム"
#: qcsrc/menu/xonotic/credits.qc:4
msgid "Core Team"
-msgstr ""
+msgstr "メインチーム"
#: qcsrc/menu/xonotic/credits.qc:15
msgid "Extended Team"
-msgstr ""
+msgstr "拡張チーム"
#: qcsrc/menu/xonotic/credits.qc:46
msgid "Website"
-msgstr ""
+msgstr "ウェブサイト"
#: qcsrc/menu/xonotic/credits.qc:51
msgid "Stats"
-msgstr ""
+msgstr "状態"
#: qcsrc/menu/xonotic/credits.qc:55
msgid "Art"
-msgstr ""
+msgstr "アート"
#: qcsrc/menu/xonotic/credits.qc:63
msgid "Animation"
-msgstr ""
+msgstr "アニメーション"
#: qcsrc/menu/xonotic/credits.qc:67
msgid "Level Design"
-msgstr ""
+msgstr "レベルの設計"
#: qcsrc/menu/xonotic/credits.qc:90
msgid "Music / Sound FX"
-msgstr ""
+msgstr "音楽 / サウンドFX"
#: qcsrc/menu/xonotic/credits.qc:106
msgid "Game Code"
-msgstr ""
+msgstr "ゲームコード"
#: qcsrc/menu/xonotic/credits.qc:114
msgid "Marketing / PR"
-msgstr ""
+msgstr "マーケティング / PR"
#: qcsrc/menu/xonotic/credits.qc:120
msgid "Legal"
-msgstr ""
+msgstr "法的"
#: qcsrc/menu/xonotic/credits.qc:125
msgid "Game Engine"
-msgstr ""
+msgstr "ゲームエンジン"
#: qcsrc/menu/xonotic/credits.qc:129
msgid "Engine Additions"
-msgstr ""
+msgstr "エンジンの追加"
#: qcsrc/menu/xonotic/credits.qc:135
msgid "Compiler"
-msgstr ""
+msgstr "コンパイラ"
#: qcsrc/menu/xonotic/credits.qc:141
msgid "Other Active Contributors"
-msgstr ""
+msgstr "他の活発な貢献者"
#: qcsrc/menu/xonotic/credits.qc:148
msgid "Translators"
-msgstr ""
+msgstr "翻訳者"
#: qcsrc/menu/xonotic/credits.qc:150
msgid "Asturian"
-msgstr ""
+msgstr "アストゥリアス語"
#: qcsrc/menu/xonotic/credits.qc:155
msgid "Belarusian"
-msgstr ""
+msgstr "ベラルーシ語"
#: qcsrc/menu/xonotic/credits.qc:158
msgid "Bulgarian"
-msgstr ""
+msgstr "ブルガリア語"
#: qcsrc/menu/xonotic/credits.qc:165
msgid "Chinese (China)"
-msgstr ""
+msgstr "中国語 (中国)"
#: qcsrc/menu/xonotic/credits.qc:171
msgid "Chinese (Taiwan)"
-msgstr ""
+msgstr "中国語 (台湾)"
#: qcsrc/menu/xonotic/credits.qc:176
msgid "Cornish"
-msgstr ""
+msgstr "コーニッシュ語"
#: qcsrc/menu/xonotic/credits.qc:179
msgid "Czech"
-msgstr ""
+msgstr "チェコ語"
#: qcsrc/menu/xonotic/credits.qc:184
msgid "Dutch"
-msgstr ""
+msgstr "オランダ語"
#: qcsrc/menu/xonotic/credits.qc:191
msgid "English (Australia)"
-msgstr ""
+msgstr "英語 (オーストラリア)"
#: qcsrc/menu/xonotic/credits.qc:196
msgid "Finnish"
-msgstr ""
+msgstr "フィンランド語"
#: qcsrc/menu/xonotic/credits.qc:201
msgid "French"
-msgstr ""
+msgstr "フランス語"
#: qcsrc/menu/xonotic/credits.qc:209
msgid "German"
-msgstr ""
+msgstr "ドイツ語"
#: qcsrc/menu/xonotic/credits.qc:220
msgid "Greek"
-msgstr ""
+msgstr "ギリシャ語"
#: qcsrc/menu/xonotic/credits.qc:226
msgid "Hungarian"
-msgstr ""
+msgstr "ハンガリー語"
#: qcsrc/menu/xonotic/credits.qc:230
msgid "Irish"
-msgstr ""
+msgstr "アイリッシュ語"
#: qcsrc/menu/xonotic/credits.qc:233
msgid "Italian"
-msgstr ""
+msgstr "イタリア語"
#: qcsrc/menu/xonotic/credits.qc:239
msgid "Kazakh"
-msgstr ""
+msgstr "カザフスタン語"
#: qcsrc/menu/xonotic/credits.qc:242
msgid "Korean"
-msgstr ""
+msgstr "韓国語"
#: qcsrc/menu/xonotic/credits.qc:246
msgid "Polish"
-msgstr ""
+msgstr "ポーランド語"
#: qcsrc/menu/xonotic/credits.qc:254
msgid "Portuguese"
-msgstr ""
+msgstr "ポルトガル語"
#: qcsrc/menu/xonotic/credits.qc:260
msgid "Romanian"
-msgstr ""
+msgstr "ルーマニア語"
#: qcsrc/menu/xonotic/credits.qc:267
msgid "Russian"
-msgstr ""
+msgstr "ロシア語"
#: qcsrc/menu/xonotic/credits.qc:278
msgid "Scottish Gaelic"
-msgstr ""
+msgstr "スコットランドゲール語"
#: qcsrc/menu/xonotic/credits.qc:281
msgid "Serbian"
-msgstr ""
+msgstr "セルビア語"
#: qcsrc/menu/xonotic/credits.qc:287
msgid "Spanish"
-msgstr ""
+msgstr "スペイン語"
#: qcsrc/menu/xonotic/credits.qc:298
msgid "Swedish"
-msgstr ""
+msgstr "スウェーデン語"
#: qcsrc/menu/xonotic/credits.qc:302
msgid "Ukrainian"
-msgstr ""
+msgstr "ウクライナ語"
#: qcsrc/menu/xonotic/credits.qc:309
msgid "Past Contributors"
-msgstr ""
+msgstr "以前の貢献者"
#: qcsrc/menu/xonotic/cvarlist.qc:73
msgid "forced to be saved to config.cfg"
-msgstr ""
+msgstr "強制的に config.cfg に保存される"
#: qcsrc/menu/xonotic/cvarlist.qc:79 qcsrc/menu/xonotic/cvarlist.qc:89
msgid "will not be saved"
-msgstr ""
+msgstr "保存されない"
#: qcsrc/menu/xonotic/cvarlist.qc:84
msgid "will be saved to config.cfg"
-msgstr ""
+msgstr "config.cfg に保存される"
#: qcsrc/menu/xonotic/cvarlist.qc:93
msgid "private"
-msgstr ""
+msgstr "非公開"
#: qcsrc/menu/xonotic/cvarlist.qc:95
msgid "engine setting"
-msgstr ""
+msgstr "エンジン設定"
#: qcsrc/menu/xonotic/cvarlist.qc:97
msgid "read only"
-msgstr ""
+msgstr "読み取り専用"
#: qcsrc/menu/xonotic/dialog_credits.qc:13
#: qcsrc/menu/xonotic/dialog_monstertools.qc:38
#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.qc:75
#: qcsrc/menu/xonotic/dialog_singleplayer_winner.qc:14
msgid "OK"
-msgstr ""
+msgstr "OK"
#: qcsrc/menu/xonotic/dialog_credits.qh:7
msgid "Credits"
-msgstr ""
+msgstr "クレジット"
#: qcsrc/menu/xonotic/dialog_credits.qh:8
msgid "The Xonotic credits"
-msgstr ""
+msgstr "XONOTICクレジット"
#: qcsrc/menu/xonotic/dialog_disconnect.qc:16
msgid "Are you sure to disconnect from server?"
-msgstr ""
+msgstr "サーバーから切断してもよろしいですか?"
#: qcsrc/menu/xonotic/dialog_disconnect.qc:19
msgid "I would disconnect from server..."
-msgstr ""
+msgstr "サーバーから切断し..."
#: qcsrc/menu/xonotic/dialog_disconnect.qc:22
msgid "I would play more!"
-msgstr ""
+msgstr "もっと遊びます!"
#: qcsrc/menu/xonotic/dialog_disconnect.qh:6
#: qcsrc/menu/xonotic/dialog_multiplayer_media_demo_startconfirm.qh:6
#: qcsrc/menu/xonotic/dialog_multiplayer_media_demo_timeconfirm.qh:6
msgid "Disconnect"
-msgstr ""
+msgstr "切断"
#: qcsrc/menu/xonotic/dialog_disconnect.qh:7
msgid "Disconnect from the server you are connected to"
-msgstr ""
+msgstr "接続してるサーバーから切断する"
#: qcsrc/menu/xonotic/dialog_firstrun.qc:39
msgid ""
"player name to get started. You can change these options later through the "
"menu system."
msgstr ""
+"XONOTICへようこそ。使用する言語を選択し、選手名前を入力して開始してください。"
+"これらの設定は後でメニューシステムから変更できます。"
#: qcsrc/menu/xonotic/dialog_firstrun.qc:45
#: qcsrc/menu/xonotic/dialog_settings_input_userbind.qc:28
msgid "Name:"
-msgstr ""
+msgstr "名前:"
#: qcsrc/menu/xonotic/dialog_firstrun.qc:53
#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:62
msgid "Name under which you will appear in the game"
-msgstr ""
+msgstr "ゲームに登場するあなたの名前:"
#: qcsrc/menu/xonotic/dialog_firstrun.qc:69
msgid "Text language:"
-msgstr ""
+msgstr "テキスト言語:"
#: qcsrc/menu/xonotic/dialog_firstrun.qc:78
msgid "Allow player statistics to use your nickname at stats.xonotic.org?"
msgstr ""
+"選手の統計が stats.xonotic.org であなたのニックネームを使用できるように許可し"
+"ますか?"
#: qcsrc/menu/xonotic/dialog_firstrun.qc:84
msgid "Undecided"
-msgstr ""
+msgstr "未定"
#: qcsrc/menu/xonotic/dialog_firstrun.qc:88
msgid "Save settings"
-msgstr ""
+msgstr "設定を保存する"
#: qcsrc/menu/xonotic/dialog_firstrun.qh:6
msgid "Welcome"
-msgstr ""
+msgstr "ようこそ"
#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.qc:18
msgid "Ammunition display:"
-msgstr ""
+msgstr "弾薬表示:"
#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.qc:21
msgid "Show only current ammo type"
-msgstr ""
+msgstr "現在の弾薬タイプのみを表示する"
#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.qc:24
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:46
msgid "Noncurrent alpha:"
-msgstr ""
+msgstr "非現行アルファ:"
#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.qc:28
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:50
msgid "Noncurrent scale:"
-msgstr ""
+msgstr "非現在のスケール:"
#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.qc:32
#: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:24
msgid "Align icon:"
-msgstr ""
+msgstr "整列アイコン:"
#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.qc:33
#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qc:32
#: qcsrc/menu/xonotic/dialog_hudpanel_quickmenu.qc:21
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:57
msgid "Left"
-msgstr ""
+msgstr "左"
#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.qc:34
#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qc:34
#: qcsrc/menu/xonotic/dialog_hudpanel_quickmenu.qc:23
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:59
msgid "Right"
-msgstr ""
+msgstr "右"
#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.qh:6
msgid "Ammo Panel"
-msgstr ""
+msgstr "弾薬パネル"
#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qc:19
msgid "Message duration:"
-msgstr ""
+msgstr "メッセージ期間:"
#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qc:23
msgid "Fade time:"
-msgstr ""
+msgstr "フェージング時刻"
#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qc:27
msgid "Flip messages order"
-msgstr ""
+msgstr "メッセージの順序を逆にする"
#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qc:29
#: qcsrc/menu/xonotic/dialog_hudpanel_quickmenu.qc:18
msgid "Text alignment:"
-msgstr ""
+msgstr "テキストの配置:"
#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qc:33
#: qcsrc/menu/xonotic/dialog_hudpanel_quickmenu.qc:22
#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:70
msgid "Center"
-msgstr ""
+msgstr "中央"
#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qc:37
msgid "Font scale:"
-msgstr ""
+msgstr "フォントスケール:"
#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.qh:6
msgid "Centerprint Panel"
-msgstr ""
+msgstr "センタープリントパネル"
#: qcsrc/menu/xonotic/dialog_hudpanel_chat.qc:17
msgid "Chat entries:"
-msgstr ""
+msgstr "チャットエントリ:"
#: qcsrc/menu/xonotic/dialog_hudpanel_chat.qc:20
msgid "Chat size:"
-msgstr ""
+msgstr "チャットサイズ:"
#: qcsrc/menu/xonotic/dialog_hudpanel_chat.qc:24
msgid "Chat lifetime:"
-msgstr ""
+msgstr "チャットの存続期間:"
#: qcsrc/menu/xonotic/dialog_hudpanel_chat.qc:28
msgid "Chat beep sound"
-msgstr ""
+msgstr "チャットのビープ音"
#: qcsrc/menu/xonotic/dialog_hudpanel_chat.qh:6
msgid "Chat Panel"
-msgstr ""
+msgstr "チャットパネル"
#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.qc:16
msgid "Engine info:"
-msgstr ""
+msgstr "エンジン情報"
#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.qc:19
msgid "Use an averaging algorithm for fps"
-msgstr ""
+msgstr "FPSの平均化アルゴリズムを使用する"
#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.qh:6
msgid "Engine Info Panel"
-msgstr ""
+msgstr "エンジン情報パネル"
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:17
msgid "Combine health and armor"
-msgstr ""
+msgstr "健康と鎧を組み合わせる"
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:19
#: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:28
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.qc:17
msgid "Enable status bar"
-msgstr ""
+msgstr "ステータスバーを有効にする"
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:21
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.qc:19
msgid "Status bar alignment:"
-msgstr ""
+msgstr "ステータスバーの配置:"
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:29
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:39
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.qc:27
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.qc:37
msgid "Inward"
-msgstr ""
+msgstr "内部"
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:31
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:40
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.qc:29
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.qc:38
msgid "Outward"
-msgstr ""
+msgstr "外部"
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:34
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.qc:32
msgid "Icon alignment:"
-msgstr ""
+msgstr "アイコンの配置:"
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qc:42
msgid "Flip health and armor positions"
-msgstr ""
+msgstr "健康 / 鎧の位置を逆にする"
#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.qh:6
msgid "Health/Armor Panel"
-msgstr ""
+msgstr "健康 / 鎧 パネル"
#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.qc:16
msgid "Info messages:"
-msgstr ""
+msgstr "情報メッセージ:"
#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.qc:19
msgid "Flip align"
-msgstr ""
+msgstr "配置を逆にする"
#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.qh:6
msgid "Info Messages Panel"
-msgstr ""
+msgstr "情報メッセージパネル"
#: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:16
#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:15
#: qcsrc/menu/xonotic/util.qc:770 qcsrc/menu/xonotic/util.qc:786
#: qcsrc/menu/xonotic/util.qc:803
msgid "Disable"
-msgstr ""
+msgstr "無効にする"
#: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:17
#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.qc:15
msgid "Enable spectating"
-msgstr ""
+msgstr "観戦中を有効にする"
#: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:18
msgid "Enable even playing in warmup"
-msgstr ""
+msgstr "準備でも遊べるように有効にする"
#: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:29
msgid "Reduced"
-msgstr ""
+msgstr "下げた"
#: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:32
msgid "Text/icon ratio:"
-msgstr ""
+msgstr "テキスト / アイコン率"
#: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:35
msgid "Hide spawned items"
-msgstr ""
+msgstr "現れたアイテムを隠す"
#: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:37
msgid "Hide big armor and health"
-msgstr ""
+msgstr "大きな鎧と健康を隠す"
#: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qc:39
msgid "Dynamic size"
-msgstr ""
+msgstr "ダイナミックサイズ:"
#: qcsrc/menu/xonotic/dialog_hudpanel_itemstime.qh:6
msgid "Items Time Panel"
-msgstr ""
+msgstr "アイテムの時刻パネル"
#: qcsrc/menu/xonotic/dialog_hudpanel_modicons.qh:6
msgid "Mod Icons Panel"
-msgstr ""
+msgstr "MODアイコンパネル"
#: qcsrc/menu/xonotic/dialog_hudpanel_notification.qc:17
msgid "Notifications:"
-msgstr ""
+msgstr "通知:"
#: qcsrc/menu/xonotic/dialog_hudpanel_notification.qc:20
msgid "Also print notifications to the console"
-msgstr ""
+msgstr "コンソールにも通知を印刷する"
#: qcsrc/menu/xonotic/dialog_hudpanel_notification.qc:23
msgid "Flip notify order"
-msgstr ""
+msgstr "通知の順序を逆にする"
#: qcsrc/menu/xonotic/dialog_hudpanel_notification.qc:26
msgid "Entry lifetime:"
-msgstr ""
+msgstr "通知を表示する:"
#: qcsrc/menu/xonotic/dialog_hudpanel_notification.qc:30
msgid "Entry fadetime:"
-msgstr ""
+msgstr "通知の退色を表示する:"
#: qcsrc/menu/xonotic/dialog_hudpanel_notification.qh:6
msgid "Notification Panel"
-msgstr ""
+msgstr "通知パネル"
#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:16
#: qcsrc/menu/xonotic/util.qc:758
msgid "Enable"
-msgstr ""
+msgstr "有効にする"
#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:17
msgid "Enable even observing"
-msgstr ""
+msgstr "観察さえに有効にする"
#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:18
msgid "Enable only in Race/CTS"
-msgstr ""
+msgstr "レース / CTSでのみ有効にする"
#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:24
msgid "Status bar"
-msgstr ""
+msgstr "ステータスバー"
#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:26
#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:67
msgid "Left align"
-msgstr ""
+msgstr "左揃え"
#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:27
#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:73
msgid "Right align"
-msgstr ""
+msgstr "右揃え"
#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:28
msgid "Inward align"
-msgstr ""
+msgstr "内揃え"
#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:29
msgid "Outward align"
-msgstr ""
+msgstr "外揃え"
#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:33
msgid "Flip speed/acceleration positions"
-msgstr ""
+msgstr "速度/加速位置を逆にする"
#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:37
msgid "Speed:"
-msgstr ""
+msgstr "速度:"
#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:38
msgid "Include vertical speed"
-msgstr ""
+msgstr "垂直速度を含める"
#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:49
msgid "Speed unit:"
-msgstr ""
+msgstr "速度単位:"
#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:51
msgid "qu/s"
-msgstr ""
+msgstr "qu/s"
#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:52
msgid "m/s"
-msgstr ""
+msgstr "ミリ秒"
#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:53
msgid "km/h"
-msgstr ""
+msgstr "時速キロ"
#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:54
msgid "mph"
-msgstr ""
+msgstr "時速マイル"
#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:55
msgid "knots"
-msgstr ""
+msgstr "ノット"
#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:57
msgid "Show"
-msgstr ""
+msgstr "表示する"
#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:60
msgid "Top speed"
-msgstr ""
+msgstr "トップ速度"
#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:66
msgid "Acceleration:"
-msgstr ""
+msgstr "加速"
#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qc:67
msgid "Include vertical acceleration"
-msgstr ""
+msgstr "垂直加速度を含める"
#: qcsrc/menu/xonotic/dialog_hudpanel_physics.qh:6
msgid "Physics Panel"
-msgstr ""
+msgstr "物理パネル"
#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.qh:6
msgid "Powerups Panel"
-msgstr ""
+msgstr "パワーアップパネル"
#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.qc:16
#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:17
msgid "Always enable"
-msgstr ""
+msgstr "常に有効にする"
#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.qc:23
msgid "Forced aspect:"
-msgstr ""
+msgstr "強制アスペクト:"
#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.qh:6
msgid "Pressed Keys Panel"
-msgstr ""
+msgstr "押されたキーパネル"
#: qcsrc/menu/xonotic/dialog_hudpanel_quickmenu.qh:6
msgid "Quick Menu Panel"
-msgstr ""
+msgstr "クイックメニューパネル"
#: qcsrc/menu/xonotic/dialog_hudpanel_racetimer.qh:6
msgid "Race Timer Panel"
-msgstr ""
+msgstr "レースタイマーパネル"
#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:16
msgid "Enable in team games"
-msgstr ""
+msgstr "チームゲームで有効にする"
#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:23
msgid "Radar:"
-msgstr ""
+msgstr "レーダー:"
#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:26
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:68
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:124
#: qcsrc/menu/xonotic/util.qc:792
msgid "Alpha:"
-msgstr ""
+msgstr "アルファ:"
#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:30
msgid "Rotation:"
-msgstr ""
+msgstr "回転:"
#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:32
msgid "Forward"
-msgstr ""
+msgstr "前方"
#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:33
msgid "West"
-msgstr ""
+msgstr "西"
#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:34
msgid "South"
-msgstr ""
+msgstr "南"
#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:35
msgid "East"
-msgstr ""
+msgstr "東"
#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:36
msgid "North"
-msgstr ""
+msgstr "北"
#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:40
msgid "Scale:"
-msgstr ""
+msgstr "スケール:"
#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:44
msgid "Zoom mode:"
-msgstr ""
+msgstr "ズームモード:"
#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:46
msgid "Zoomed in"
-msgstr ""
+msgstr "ズームした内"
#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:47
msgid "Zoomed out"
-msgstr ""
+msgstr "ズームした外"
#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:48
msgid "Always zoomed"
-msgstr ""
+msgstr "常にズームした"
#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qc:49
msgid "Never zoomed"
-msgstr ""
+msgstr "決してズームした"
#: qcsrc/menu/xonotic/dialog_hudpanel_radar.qh:6
msgid "Radar Panel"
-msgstr ""
+msgstr "レーダーパネル"
#: qcsrc/menu/xonotic/dialog_hudpanel_score.qc:17
msgid "Score:"
-msgstr ""
+msgstr "得点:"
#: qcsrc/menu/xonotic/dialog_hudpanel_score.qc:20
msgid "Rankings:"
-msgstr ""
+msgstr "ランキング:"
#: qcsrc/menu/xonotic/dialog_hudpanel_score.qc:21
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:58
msgid "Off"
-msgstr ""
+msgstr "無効"
#: qcsrc/menu/xonotic/dialog_hudpanel_score.qc:22
msgid "And me"
-msgstr ""
+msgstr "私も"
#: qcsrc/menu/xonotic/dialog_hudpanel_score.qc:23
msgid "Pure"
-msgstr ""
+msgstr "純粋"
#: qcsrc/menu/xonotic/dialog_hudpanel_score.qh:6
msgid "Score Panel"
-msgstr ""
+msgstr "得点パネル"
#: qcsrc/menu/xonotic/dialog_hudpanel_timer.qc:16
msgid "Timer:"
-msgstr ""
+msgstr "タイマー:"
#: qcsrc/menu/xonotic/dialog_hudpanel_timer.qc:19
msgid "Show elapsed time"
-msgstr ""
+msgstr "経過時間を表示する:"
#: qcsrc/menu/xonotic/dialog_hudpanel_timer.qh:6
msgid "Timer Panel"
-msgstr ""
+msgstr "タイマーパネル"
#: qcsrc/menu/xonotic/dialog_hudpanel_vote.qc:17
msgid "Alpha after voting:"
-msgstr ""
+msgstr "投票後のアルファ:"
#: qcsrc/menu/xonotic/dialog_hudpanel_vote.qh:6
msgid "Vote Panel"
-msgstr ""
+msgstr "投票パネル"
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:22
msgid "Fade out after:"
-msgstr ""
+msgstr "退色後:"
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:24
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:167
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:145
#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:55
msgid "Never"
-msgstr ""
+msgstr "なし"
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:26
#, c-format
msgid "%ds"
-msgstr ""
+msgstr "%ds"
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:30
msgid "Fade effect:"
-msgstr ""
+msgstr "退色エフェクト:"
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:33
msgid "EF^None"
-msgstr ""
+msgstr "なし"
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:34
msgid "Alpha"
-msgstr ""
+msgstr "アルファ"
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:35
msgid "Slide"
-msgstr ""
+msgstr "スライド"
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:36
msgid "EF^Both"
-msgstr ""
+msgstr "両"
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:40
msgid "Weapon icons:"
-msgstr ""
+msgstr "武器アイコン:"
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:43
msgid "Show only owned weapons"
-msgstr ""
+msgstr "所有している武器のみを表示する"
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:54
msgid "Show weapon ID as:"
-msgstr ""
+msgstr "武器IDを次として表示する:"
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:55
msgid "SHOWAS^None"
-msgstr ""
+msgstr "なし"
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:56
msgid "Number"
-msgstr ""
+msgstr "番号"
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:57
msgid "Bind"
-msgstr ""
+msgstr "割り当てられたキー"
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:60
msgid "Weapon ID scale:"
-msgstr ""
+msgstr "武器IDスケール:"
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:66
msgid "Show Accuracy"
-msgstr ""
+msgstr "精度を表示する"
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:67
msgid "Show Ammo"
-msgstr ""
+msgstr "弾薬を表示する"
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:70
msgid "Ammo bar alpha:"
-msgstr ""
+msgstr "弾薬バーアルファ:"
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qc:76
msgid "Ammo bar color:"
-msgstr ""
+msgstr "弾薬バーの色:"
#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.qh:6
msgid "Weapons Panel"
-msgstr ""
+msgstr "武器パネル"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:19
msgid "HUD skins"
-msgstr ""
+msgstr "HUDスキン"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:22
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:173
#: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:25
#: qcsrc/menu/xonotic/dialog_multiplayer_media_screenshot.qc:33
msgid "Filter:"
-msgstr ""
+msgstr "フィルター:"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:30
#: qcsrc/menu/xonotic/dialog_multiplayer_join.qc:54
#: qcsrc/menu/xonotic/dialog_multiplayer_media_demo.qc:49
#: qcsrc/menu/xonotic/dialog_multiplayer_media_screenshot.qc:43
msgid "Refresh"
-msgstr ""
+msgstr "更新する"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:33
#: qcsrc/menu/xonotic/dialog_settings_user.qc:28
msgid "Set skin"
-msgstr ""
+msgstr "スキンを設定する"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:37
msgid "Save current skin"
-msgstr ""
+msgstr "現在のスキンを保存する"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:46
msgid "Panel background defaults:"
-msgstr ""
+msgstr "パネルの背景のデフォルト:"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:48
#: qcsrc/menu/xonotic/util.qc:767
msgid "Background:"
-msgstr ""
+msgstr "背景:"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:60
#: qcsrc/menu/xonotic/util.qc:783
msgid "Border size:"
-msgstr ""
+msgstr "ボーダーサイズ:"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:75
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:114
msgid "Team color:"
-msgstr ""
+msgstr "チームカラー:"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:83
#: qcsrc/menu/xonotic/util.qc:809
msgid "Test team color in configure mode"
-msgstr ""
+msgstr "構成モードでのチームカラーのテストする"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:86
#: qcsrc/menu/xonotic/util.qc:812
msgid "Padding:"
-msgstr ""
+msgstr "パディング:"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:93
msgid "HUD Dock:"
-msgstr ""
+msgstr "HUDドック:"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:95
msgid "DOCK^Disabled"
-msgstr ""
+msgstr "無効"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:96
msgid "DOCK^Small"
-msgstr ""
+msgstr "小"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:97
msgid "DOCK^Medium"
-msgstr ""
+msgstr "中"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:98
msgid "DOCK^Large"
-msgstr ""
+msgstr "大"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:121
msgid "Grid settings:"
-msgstr ""
+msgstr "グリッド設定:"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:124
msgid "Snap panels to grid"
-msgstr ""
+msgstr "グリッドパネルにスナップする:"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:127
msgid "Grid size:"
-msgstr ""
+msgstr "グリッドサイズ:"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:129
msgid "X:"
-msgstr ""
+msgstr "X:"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:136
msgid "Y:"
-msgstr ""
+msgstr "Y:"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qc:145
msgid "Exit setup"
-msgstr ""
+msgstr "出口のセットアップ"
#: qcsrc/menu/xonotic/dialog_hudsetup_exit.qh:6
msgid "Panel HUD Setup"
-msgstr ""
+msgstr "パネルHUDセットアップ"
#: qcsrc/menu/xonotic/dialog_monstertools.qc:13
msgid "Monster:"
-msgstr ""
+msgstr "モンスター:"
#: qcsrc/menu/xonotic/dialog_monstertools.qc:22
#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:20
msgid "Spawn"
-msgstr ""
+msgstr "現れる"
#: qcsrc/menu/xonotic/dialog_monstertools.qc:23
msgid "Remove"
-msgstr ""
+msgstr "削除する"
#: qcsrc/menu/xonotic/dialog_monstertools.qc:25
msgid "Move target:"
-msgstr ""
+msgstr "ターゲットを移動する:"
#: qcsrc/menu/xonotic/dialog_monstertools.qc:26
msgid "Follow"
-msgstr ""
+msgstr "従う"
#: qcsrc/menu/xonotic/dialog_monstertools.qc:27
msgid "Wander"
-msgstr ""
+msgstr "彷徨う"
#: qcsrc/menu/xonotic/dialog_monstertools.qc:28
msgid "Spawnpoint"
-msgstr ""
+msgstr "現れるポイント"
#: qcsrc/menu/xonotic/dialog_monstertools.qc:29
msgid "No moving"
-msgstr ""
+msgstr "動かない"
#: qcsrc/menu/xonotic/dialog_monstertools.qc:31
msgid "Colors:"
-msgstr ""
+msgstr "色:"
#: qcsrc/menu/xonotic/dialog_monstertools.qc:33
#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:39
msgid "Set skin:"
-msgstr ""
+msgstr "スキンを設定する:"
#: qcsrc/menu/xonotic/dialog_monstertools.qh:6
msgid "Monster Tools"
-msgstr ""
+msgstr "モンスター用具"
#: qcsrc/menu/xonotic/dialog_multiplayer.qc:14
msgid "Servers"
-msgstr ""
+msgstr "サーバー"
#: qcsrc/menu/xonotic/dialog_multiplayer.qc:15
msgid "Find servers to play on"
-msgstr ""
+msgstr "遊ぶためにサーバーを見つける"
#: qcsrc/menu/xonotic/dialog_multiplayer.qc:17
msgid "Host your own game"
-msgstr ""
+msgstr "自分のゲームを作成する"
#: qcsrc/menu/xonotic/dialog_multiplayer.qc:18
msgid "Media"
-msgstr ""
+msgstr "メディア"
#: qcsrc/menu/xonotic/dialog_multiplayer.qc:19
msgid "Profile"
-msgstr ""
+msgstr "プロフィール"
#: qcsrc/menu/xonotic/dialog_multiplayer.qh:6
msgid "Multiplayer"
-msgstr ""
+msgstr "マルチプレイヤー"
#: qcsrc/menu/xonotic/dialog_multiplayer.qh:7
msgid ""
"Play online, against your friends in LAN, view demos or change player "
"settings"
msgstr ""
+"オンラインで遊ぶ、LANの友達に対して、デモを表示するか、選手設定を変更する"
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:38
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:111
#: qcsrc/menu/xonotic/util.qc:785 qcsrc/menu/xonotic/util.qc:794
#: qcsrc/menu/xonotic/util.qc:802 qcsrc/menu/xonotic/util.qc:814
msgid "Default"
-msgstr ""
+msgstr "デフォルト"
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:40
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:60
msgid "Unlimited"
-msgstr ""
+msgstr "無制限"
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:74
msgid "Gametype"
-msgstr ""
+msgstr "ゲームモード"
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:79
msgid "Time limit:"
-msgstr ""
+msgstr "制限時刻:"
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:81
msgid "Timelimit in minutes that when hit, will end the match"
-msgstr ""
+msgstr "ヒットすると試合が終了する分単位の制限時刻"
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:82
#, c-format
msgid "%d minutes"
-msgstr ""
+msgstr "%d 分"
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:83
msgid "TIMLIM^Default"
-msgstr ""
+msgstr "TIMLIM^デフォルト"
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:84
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:159
msgid "1 minute"
-msgstr ""
+msgstr "1分"
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:101
msgid "TIMLIM^Infinite"
-msgstr ""
+msgstr "無限"
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:109
msgid "Teams:"
-msgstr ""
+msgstr "チーム数:"
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:112
msgid "2 teams"
-msgstr ""
+msgstr "2チーム"
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:113
msgid "3 teams"
-msgstr ""
+msgstr "3チーム"
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:114
msgid "4 teams"
-msgstr ""
+msgstr "4チーム"
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:117
msgid "Player slots:"
-msgstr ""
+msgstr "選手スロット:"
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:119
msgid ""
"The maximum amount of players or bots that can be connected to your server "
"at once"
-msgstr ""
+msgstr "一度にサーバーに接続できる選手またはボットの最大数"
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:121
msgid "Number of bots:"
-msgstr ""
+msgstr "ボット数:"
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:123
msgid "Amount of bots on your server"
-msgstr ""
+msgstr "サーバーでボットの量"
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:125
msgid "Bot skill:"
-msgstr ""
+msgstr "ボット技術:"
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:128
msgid "Specify how experienced the bots will be"
-msgstr ""
+msgstr "ボットの経験値を指定する"
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:129
msgid "Botlike"
-msgstr ""
+msgstr "ボット"
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:130
msgid "Beginner"
-msgstr ""
+msgstr "初心者"
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:131
msgid "You will win"
-msgstr ""
+msgstr "あなたは勝つ"
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:132
msgid "You can win"
-msgstr ""
+msgstr "あなたは勝てる"
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:133
msgid "You might win"
-msgstr ""
+msgstr "あなたは勝つかもしれない"
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:134
msgid "Advanced"
-msgstr ""
+msgstr "高度"
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:135
msgid "Expert"
-msgstr ""
+msgstr "専門家"
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:136
msgid "Pro"
-msgstr ""
+msgstr "プロ"
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:137
msgid "Assassin"
-msgstr ""
+msgstr "暗殺者"
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:138
msgid "Unhuman"
-msgstr ""
+msgstr "非人間"
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:139
msgid "Godlike"
-msgstr ""
+msgstr "神"
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:155
msgid "Mutators..."
-msgstr ""
+msgstr "ミューテーター..."
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:156
msgid "Mutators and weapon arenas"
-msgstr ""
+msgstr "ミューテーターと武器アリーナ"
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:165
msgid "Maplist"
-msgstr ""
+msgstr "マップリスト"
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:175
msgid ""
"Click here or Ctrl-F to provide a keyword to narrow down the map list. Ctrl-"
"Delete to clear; Enter when done."
msgstr ""
+"ここをクリックするか、Ctrl-Fを使用して、マップリストを絞り込むキーワードを指"
+"定します。 Ctrl-Deleteでクリアします; 完了したらEnterキーを押します。"
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:184
msgid "Add shown"
-msgstr ""
+msgstr "表示された者を追加する"
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:185
msgid "Add the maps shown in the list to your selection"
-msgstr ""
+msgstr "リストに表示されているマップを選択に追加する"
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:188
msgid "Remove shown"
-msgstr ""
+msgstr "表示された者を全て削除する"
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:189
msgid "Remove the maps shown in the list from your selection"
-msgstr ""
+msgstr "リストに表示されているマップを選択から削除する"
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:194
msgid "Add all"
-msgstr ""
+msgstr "全て追加する"
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:195
msgid "Add every available map to your selection"
-msgstr ""
+msgstr "利用可能な全てのマップを選択に追加する"
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:198
msgid "Remove all"
-msgstr ""
+msgstr "全て削除する"
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:199
msgid "Remove all the maps from your selection"
-msgstr ""
+msgstr "利用可能な全てのマップを選択から削除する"
#: qcsrc/menu/xonotic/dialog_multiplayer_create.qc:206
msgid "Start Multiplayer!"
-msgstr ""
+msgstr "マルチプレイヤーを開始!"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.qc:50
msgid "Title:"
-msgstr ""
+msgstr "タイトル:"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.qc:56
msgid "Author:"
-msgstr ""
+msgstr "作者:"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.qc:62
msgid "Game types:"
-msgstr ""
+msgstr "ゲームタイプ:"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.qc:85
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:257
msgid "Close"
-msgstr ""
+msgstr "閉じる"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.qc:88
msgid "MAP^Play"
-msgstr ""
+msgstr "遊ぶ"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.qh:7
msgid "Map Information"
-msgstr ""
+msgstr "マップ情報"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:28
msgid "All Weapons Arena"
-msgstr ""
+msgstr "全ての武器アリーナ"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:30
msgid "Most Weapons Arena"
-msgstr ""
+msgstr "ほとんどの武器アリーナ"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:46
#, c-format
msgid "%s Arena"
-msgstr ""
+msgstr "%sアリーナ"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:57
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:163
msgid "Dodging"
-msgstr ""
+msgstr "避ける"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:59
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:283
msgid "InstaGib"
-msgstr ""
+msgstr "インスタギブ"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:61
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:224
msgid "New Toys"
-msgstr ""
+msgstr "新しいおもちゃ"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:63
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:288
msgid "NIX"
-msgstr ""
+msgstr "NIX"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:65
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:229
msgid "Rocket Flying"
-msgstr ""
+msgstr "ロケットで飛ぶ"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:67
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:219
msgid "Invincible Projectiles"
-msgstr ""
+msgstr "無敵の弾"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:71
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:298
msgid "No start weapons"
-msgstr ""
+msgstr "武器なしで開始"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:73
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:202
msgid "Low gravity"
-msgstr ""
+msgstr "低重力"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:75
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:171
msgid "Cloaked"
-msgstr ""
+msgstr "クロークされた"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:77
msgid "Hook"
-msgstr ""
+msgstr "フック"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:79
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:180
msgid "Midair"
-msgstr ""
+msgstr "中空"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:81
msgid "Melee only"
-msgstr ""
+msgstr "混戦のみ"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:85
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:234
msgid "Piñata"
-msgstr ""
+msgstr "ピニャータ"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:87
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:239
msgid "Weapons stay"
-msgstr ""
+msgstr "武器は残る"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:89
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:191
msgid "Blood loss"
-msgstr ""
+msgstr "失血"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:93
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:175
msgid "Buffs"
-msgstr ""
+msgstr "バフ"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:95
msgid "Overkill"
-msgstr ""
+msgstr "オーバーキル"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:97
msgid "No powerups"
-msgstr ""
+msgstr "パワーアップなし"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:99
msgid "Powerups"
-msgstr ""
+msgstr "パワーアップ"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:101
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:167
msgid "Touch explode"
-msgstr ""
+msgstr "爆発性接触"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:103
msgid "Wall jumping"
-msgstr ""
+msgstr "壁ジャンプ"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:105
msgid "MUT^None"
-msgstr ""
+msgstr "なし"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:160
msgid "Gameplay mutators:"
-msgstr ""
+msgstr "ゲームプレイミューテーター:"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:164
msgid ""
"Enable dodging (quick acceleration in a given direction). Double-tap a "
"directional key to dodge"
msgstr ""
+"避けるを有効にする (特定の方向への迅速な加速)。方向キーを避けてダブルタップし"
+"て"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:168
msgid "An explosion occurs when two players collide"
-msgstr ""
+msgstr "2人の選手が衝突すると爆発が発生する"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:172
msgid "All players are almost invisible"
-msgstr ""
+msgstr "全ての選手はほとんど見えない"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:176
msgid ""
"Enable buff pickups (random bonuses like Medic, Invisible, etc.) on the maps "
"that support it"
msgstr ""
+"サポートするマップでバフピックアップ (再生、不可視、等どのランダムボーナス) "
+"を有効にする"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:181
msgid "Only possible to inflict damage on your enemy while they're airborne"
-msgstr ""
+msgstr "空中の敵にのみダメージを与えることができる"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:185
msgid "Damage done to your enemy gets added to your own health"
-msgstr ""
+msgstr "敵に与えたダメージは自分の健康に追加される"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:190
msgid ""
"Amount of health below which players start bleeding out (health rots and "
"they can't jump)"
-msgstr ""
+msgstr "選手が出血し始める健康の量 (健康が腐り、ジャンプできない)"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:199
msgid "Make things fall to the ground slower (percentage of normal gravity)"
-msgstr ""
+msgstr "物がゆっくりと地面に落ちるようにする(通常の重力率)"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:208
msgid "Weapon & item mutators:"
-msgstr ""
+msgstr "武器とアイテムのミューテーター:"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:211
msgid "Grappling hook"
-msgstr ""
+msgstr "グラップリングフック"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:212
msgid "Players spawn with the grappling hook. Press the 'hook' key to use it"
-msgstr ""
+msgstr "選手はグラップリングフックで現れる。使用するには「フック」キーを押して"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:216
msgid ""
"Players spawn with the jetpack. Double-tap 'jump' or press the 'jetpack' key "
"to use it"
msgstr ""
+"選手はジェットパックでスポーンする。 「ジャンプ」をダブルタップするか、使用す"
+"るために「ジェットパック」キーを押して"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:220
msgid ""
"Projectiles can't be destroyed. However, you can still explode Electro orbs "
"with the Electro primary fire"
msgstr ""
+"弾は破壊できない。ただし、エレクトの一次射撃でエレクトオーブを爆発させること"
+"はできる"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:225
msgid ""
"Some weapon spawns will be randomly replaced with new weapons: Heavy Laser "
"Assault Cannon, Mine Layer, Rifle, T.A.G. Seeker"
msgstr ""
+"一部の武器スポーンは新しい武器にランダムに置き換えられる: 重いレーザー突撃"
+"キャノン、鉱山レーヤー、ライフル、T.A.G.シーカー"
#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc:230
msgid ""
"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
msgid "Join!"
-msgstr ""
+msgstr "参加!"
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:114
#: qcsrc/menu/xonotic/serverlist.qc:1020
msgid "MOD^Default"
-msgstr ""
+msgstr "MOD^デフォルト"
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:121
#, c-format
msgid "%d modified"
-msgstr ""
+msgstr "%d 変更した"
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:121
msgid "Official"
-msgstr ""
+msgstr "公式"
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:129
msgid "N/A (auth library missing, can't connect)"
-msgstr ""
+msgstr "N/A (認証ライブラリがないため接続できません)"
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:131
msgid "N/A (auth library missing)"
-msgstr ""
+msgstr "N/A (認証ライブラリがない)"
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:137
msgid "Not supported (can't connect)"
-msgstr ""
+msgstr "サポートされていません (接続できません)"
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:139
msgid "Not supported (won't encrypt)"
-msgstr ""
+msgstr "サポートされていません "
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:143
msgid "Supported (will encrypt)"
-msgstr ""
+msgstr "サポートされている (暗号化します)"
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:145
msgid "Supported (won't encrypt)"
-msgstr ""
+msgstr "サポートされている (暗号化しません)"
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:149
msgid "Requested (will encrypt)"
-msgstr ""
+msgstr "要求した (暗号化します)"
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:151
msgid "Requested (won't encrypt)"
-msgstr ""
+msgstr "要求した (暗号化しません)"
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:155
msgid "Required (can't connect)"
-msgstr ""
+msgstr "必須 (接続できません)"
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:157
msgid "Required (will encrypt)"
-msgstr ""
+msgstr "必須 (暗号化します)"
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:161
msgid "Use the `crypto_aeslevel` cvar to change your preferences"
-msgstr ""
+msgstr "設定を変更するには `crypto_aeslevel` cvarを使用する"
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:178
msgid "Hostname:"
-msgstr ""
+msgstr "ホスト名:"
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:192
msgid "Gametype:"
-msgstr ""
+msgstr "ゲームモード:"
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:197
msgid "Map:"
-msgstr ""
+msgstr "マップ:"
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:202
msgid "Mod:"
-msgstr ""
+msgstr "MOD:"
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:207
msgid "Version:"
-msgstr ""
+msgstr "バージョン:"
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:212
msgid "Settings:"
-msgstr ""
+msgstr "設定:"
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:219
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:251
msgid "Players:"
-msgstr ""
+msgstr "選手:"
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:224
msgid "Bots:"
-msgstr ""
+msgstr "ボット:"
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:229
msgid "Free slots:"
-msgstr ""
+msgstr "自由スロット:"
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:235
msgid "Encryption:"
-msgstr ""
+msgstr "暗号化:"
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:240
msgid "ID:"
-msgstr ""
+msgstr "ID:"
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qc:245
msgid "Key:"
-msgstr ""
+msgstr "キー:"
#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.qh:7
msgid "Server Information"
-msgstr ""
+msgstr "サーバー情報"
#: qcsrc/menu/xonotic/dialog_multiplayer_media.qc:25
msgid "Demos"
-msgstr ""
+msgstr "デモ"
#: qcsrc/menu/xonotic/dialog_multiplayer_media.qc:26
msgid "Screenshots"
-msgstr ""
+msgstr "スクリーンショット"
#: qcsrc/menu/xonotic/dialog_multiplayer_media.qc:27
msgid "Music Player"
-msgstr ""
+msgstr "音楽プレーヤー"
#: qcsrc/menu/xonotic/dialog_multiplayer_media_demo.qc:48
msgid "Auto record demos"
-msgstr ""
+msgstr "自動録音デモ"
#: qcsrc/menu/xonotic/dialog_multiplayer_media_demo.qc:57
msgid "Timedemo"
-msgstr ""
+msgstr "最高速度でデモを再生する"
#: qcsrc/menu/xonotic/dialog_multiplayer_media_demo.qc:58
msgid "Benchmark how fast your computer can run the highlighted demo"
msgstr ""
+"お使いのコンピューターが強調表示されたデモを実行できる速度をベンチマークする"
#: qcsrc/menu/xonotic/dialog_multiplayer_media_demo.qc:62
msgid "DEMO^Play"
-msgstr ""
+msgstr "再生する"
#: qcsrc/menu/xonotic/dialog_multiplayer_media_demo_startconfirm.qc:13
msgid "Playing a demo will disconnect you from the current match."
-msgstr ""
+msgstr "デモを再生すると、現在の試合から切断される。"
#: qcsrc/menu/xonotic/dialog_multiplayer_media_demo_startconfirm.qc:15
#: qcsrc/menu/xonotic/dialog_multiplayer_media_demo_timeconfirm.qc:15
msgid "Do you really wish to disconnect now?"
-msgstr ""
+msgstr "本当に切断しますか?"
#: qcsrc/menu/xonotic/dialog_multiplayer_media_demo_timeconfirm.qc:13
msgid "Timing a demo will disconnect you from the current match."
-msgstr ""
+msgstr "デモのタイミングをとると、現在の試合から切り離されます。"
#: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:37
msgid "MUSICPL^Add"
-msgstr ""
+msgstr "追加する"
#: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:40
msgid "MUSICPL^Add all"
-msgstr ""
+msgstr "全て追加する"
#: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:44
msgid "Set as menu track"
-msgstr ""
+msgstr "メニュートラックとして設定する"
#: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:48
msgid "Reset default menu track"
-msgstr ""
+msgstr "デフォルトのメニュートラックをリセットする"
#: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:54
msgid "Playlist:"
-msgstr ""
+msgstr "プレイリスト:"
#: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:55
msgid "Random order"
-msgstr ""
+msgstr "ランダム順序"
#: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:60
msgid "MUSICPL^Stop"
-msgstr ""
+msgstr "停止する"
#: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:63
msgid "MUSICPL^Play"
-msgstr ""
+msgstr "再生する"
#: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:66
msgid "MUSICPL^Pause"
-msgstr ""
+msgstr "一時停止する"
#: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:69
msgid "MUSICPL^Prev"
-msgstr ""
+msgstr "前"
#: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:72
msgid "MUSICPL^Next"
-msgstr ""
+msgstr "次"
#: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:76
msgid "MUSICPL^Remove"
-msgstr ""
+msgstr "削除する"
#: qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc:79
msgid "MUSICPL^Remove all"
-msgstr ""
+msgstr "全て削除する"
#: qcsrc/menu/xonotic/dialog_multiplayer_media_screenshot.qc:41
msgid "Auto screenshot scoreboard"
-msgstr ""
+msgstr "自動スクリーンショット得点表"
#: qcsrc/menu/xonotic/dialog_multiplayer_media_screenshot.qc:62
msgid "Open in the viewer"
-msgstr ""
+msgstr "ビューアで開く"
#: qcsrc/menu/xonotic/dialog_multiplayer_media_screenshot_viewer.qc:137
msgid "Reset"
-msgstr ""
+msgstr "リセットする"
#: qcsrc/menu/xonotic/dialog_multiplayer_media_screenshot_viewer.qc:142
msgid "Previous"
-msgstr ""
+msgstr "前"
#: qcsrc/menu/xonotic/dialog_multiplayer_media_screenshot_viewer.qc:145
msgid "Next"
-msgstr ""
+msgstr "次"
#: qcsrc/menu/xonotic/dialog_multiplayer_media_screenshot_viewer.qc:150
msgid "Slide show"
-msgstr ""
+msgstr "スライドショー"
#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:38
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:21
#: 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"
-msgstr ""
+msgstr "名前"
#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:79
msgid "Model"
-msgstr ""
+msgstr "モデル"
#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:98
msgid "Glowing color"
-msgstr ""
+msgstr "輝く色"
#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:108
msgid "Detail color"
-msgstr ""
+msgstr "詳細色"
#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:123
msgid "Statistics"
-msgstr ""
+msgstr "統計"
#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:127
msgid "Allow player statistics to track your client"
-msgstr ""
+msgstr "選手の統計にクライアントの追跡を許可する"
#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:131
msgid "Allow player statistics to use your nickname"
-msgstr ""
+msgstr "選手の統計であなたのニックネームを使用できるように許可する"
#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:136
msgid "Allow player statistics to rank you in leaderboards"
-msgstr ""
+msgstr "選手の統計が得点表であなたをランク付けできるように許可する"
#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:152
msgid "Country"
-msgstr ""
+msgstr "国"
#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:156
msgid "Select language..."
-msgstr ""
+msgstr "言語を選択する..."
#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:172
msgid "Gender:"
-msgstr ""
+msgstr "性別:"
#: qcsrc/menu/xonotic/dialog_multiplayer_profile.qc:179
msgid "Gender"
-msgstr ""
+msgstr "性別"
#: qcsrc/menu/xonotic/dialog_quit.qc:11
msgid "Are you sure you want to quit?"
-msgstr ""
+msgstr "本当に出かけたいですか?"
#: qcsrc/menu/xonotic/dialog_quit.qc:15
msgid "Back to work..."
-msgstr ""
+msgstr "仕事に戻る..."
#: qcsrc/menu/xonotic/dialog_quit.qc:17
msgid "I got some more fragging to do!"
-msgstr ""
+msgstr "後いくつか得点します!"
#: qcsrc/menu/xonotic/dialog_quit.qh:7
msgid "Quit the game"
-msgstr ""
+msgstr "ゲームを終了する"
#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:15
msgid "Model:"
-msgstr ""
+msgstr "モデル:"
#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:21
msgid "Remove *"
-msgstr ""
+msgstr "* 削除する"
#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:23
msgid "Copy *"
-msgstr ""
+msgstr "* コピーする"
#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:24
msgid "Paste"
-msgstr ""
+msgstr "ペーストする"
#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:26
msgid "Bone:"
-msgstr ""
+msgstr "骨:"
#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:31
msgid "Set * as child"
-msgstr ""
+msgstr "* を子として設定する"
#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:32
msgid "Attach to *"
-msgstr ""
+msgstr "* に添付する"
#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:34
msgid "Detach from *"
-msgstr ""
+msgstr "* に取り除く"
#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:37
msgid "Visual object properties for *:"
-msgstr ""
+msgstr "* のビジュアルオブジェクトプロパティ:"
#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:41
msgid "Set alpha:"
-msgstr ""
+msgstr "アルファを設定する:"
#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:44
msgid "Set color main:"
-msgstr ""
+msgstr "メインカラーを設定する:"
#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:46
msgid "Set color glow:"
-msgstr ""
+msgstr "カラーグローを設定する:"
#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:50
msgid "Set frame:"
-msgstr ""
+msgstr "フレームを設定する:"
#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:54
msgid "Physical object properties for *:"
-msgstr ""
+msgstr "* の物理オブジェクトプロパティ:"
#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:56
msgid "Set material:"
-msgstr ""
+msgstr "素材を設定する:"
#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:62
msgid "Set solidity:"
-msgstr ""
+msgstr "固体の程度を設定する:"
#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:63
msgid "Non-solid"
-msgstr ""
+msgstr "非固体"
#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:64
msgid "Solid"
-msgstr ""
+msgstr "固体"
#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:65
msgid "Set physics:"
-msgstr ""
+msgstr "物理を設定する:"
#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:66
msgid "Static"
-msgstr ""
+msgstr "静的"
#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:67
msgid "Movable"
-msgstr ""
+msgstr "可動"
#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:68
msgid "Physical"
-msgstr ""
+msgstr "物理的"
#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:70
msgid "Set scale:"
-msgstr ""
+msgstr "スケールを設定する:"
#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:72
msgid "Set force:"
-msgstr ""
+msgstr "強度を設定する:"
#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:76
msgid "Claim *"
-msgstr ""
+msgstr "* 請求する"
#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:78
msgid "* object info"
-msgstr ""
+msgstr "* オブジェクト情報"
#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:79
msgid "* mesh info"
-msgstr ""
+msgstr "* メッシュ情報"
#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:80
msgid "* attachment info"
-msgstr ""
+msgstr "* 添付情報"
#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:81
msgid "Show help"
-msgstr ""
+msgstr "ヘルプを表示する"
#: qcsrc/menu/xonotic/dialog_sandboxtools.qc:82
msgid "* is the object you are facing"
-msgstr ""
+msgstr "* はあなたが直面しているオブジェクトです"
#: qcsrc/menu/xonotic/dialog_sandboxtools.qh:6
msgid "Sandbox Tools"
-msgstr ""
+msgstr "サンドボックスツール"
#: qcsrc/menu/xonotic/dialog_settings.qc:18
msgid "Video"
-msgstr ""
+msgstr "ビデオ"
#: qcsrc/menu/xonotic/dialog_settings.qc:19
msgid "Effects"
-msgstr ""
+msgstr "エフェクト"
#: qcsrc/menu/xonotic/dialog_settings.qc:20
msgid "Audio"
-msgstr ""
+msgstr "オーディオ"
#: qcsrc/menu/xonotic/dialog_settings.qc:22
msgid "Game"
-msgstr ""
+msgstr "ゲーム"
#: qcsrc/menu/xonotic/dialog_settings.qc:23
msgid "Input"
-msgstr ""
+msgstr "インプット"
#: qcsrc/menu/xonotic/dialog_settings.qc:24
msgid "User"
-msgstr ""
+msgstr "ユーザー"
#: qcsrc/menu/xonotic/dialog_settings.qc:25
#: qcsrc/menu/xonotic/keybinder.qc:119
msgid "Misc"
-msgstr ""
+msgstr "その他"
#: qcsrc/menu/xonotic/dialog_settings.qh:6
msgid "Settings"
-msgstr ""
+msgstr "設定"
#: qcsrc/menu/xonotic/dialog_settings.qh:7
msgid "Change the game settings"
-msgstr ""
+msgstr "ゲームの設定を変更する"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:29
msgid "Master:"
-msgstr ""
+msgstr "マスター:"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:35
msgid "Music:"
-msgstr ""
+msgstr "音楽:"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:43
msgid "VOL^Ambient:"
-msgstr ""
+msgstr "アンビエント:"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:50
msgid "Info:"
-msgstr ""
+msgstr "情報:"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:57
msgid "Items:"
-msgstr ""
+msgstr "アイテム:"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:64
msgid "Pain:"
-msgstr ""
+msgstr "痛み:"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:71
msgid "Player:"
-msgstr ""
+msgstr "選手:"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:78
msgid "Shots:"
-msgstr ""
+msgstr "ショット:"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:85
msgid "Voice:"
-msgstr ""
+msgstr "声:"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:93
msgid "Weapons:"
-msgstr ""
+msgstr "武器:"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:99
msgid "New style sound attenuation"
-msgstr ""
+msgstr "新しいスタイルの音響減衰"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:102
msgid "Mute sounds when not active"
-msgstr ""
+msgstr "活発でないときに音を消す"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:105
msgid "Frequency:"
-msgstr ""
+msgstr "周波数:"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:107
msgid "Sound output frequency"
-msgstr ""
+msgstr "サウンド出力周波数"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:108
msgid "8 kHz"
-msgstr ""
+msgstr "8 kHz"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:109
msgid "11.025 kHz"
-msgstr ""
+msgstr "11.025 kHz"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:110
msgid "16 kHz"
-msgstr ""
+msgstr "16 kHz"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:111
msgid "22.05 kHz"
-msgstr ""
+msgstr "22.05 kHz"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:112
msgid "24 kHz"
-msgstr ""
+msgstr "24 kHz"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:113
msgid "32 kHz"
-msgstr ""
+msgstr "32 kHz"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:114
msgid "44.1 kHz"
-msgstr ""
+msgstr "44.1 kHz"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:115
msgid "48 kHz"
-msgstr ""
+msgstr "48 kHz"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:119
msgid "Channels:"
-msgstr ""
+msgstr "チャネル:"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:121
msgid "Number of channels for the sound output"
-msgstr ""
+msgstr "サウンド出力のチャンネル数"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:122
msgid "Mono"
-msgstr ""
+msgstr "モノ"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:123
msgid "Stereo"
-msgstr ""
+msgstr "ステレオ"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:124
msgid "2.1"
-msgstr ""
+msgstr "2.1"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:125
msgid "4"
-msgstr ""
+msgstr "4"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:126
msgid "5"
-msgstr ""
+msgstr "5"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:127
msgid "5.1"
-msgstr ""
+msgstr "5.1"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:128
msgid "6.1"
-msgstr ""
+msgstr "6.1"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:129
msgid "7.1"
-msgstr ""
+msgstr "7.1"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:134
msgid "Swap stereo output channels"
-msgstr ""
+msgstr "サウンド出力のチャンネルを入れ替える"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:135
msgid "Swap left/right channels"
-msgstr ""
+msgstr "左 / 右チャンネルを反転する"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:138
msgid "Headphone friendly mode"
-msgstr ""
+msgstr "ヘッドフォンモード"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:139
msgid ""
"Enable spatialization (blend the right and left channel slightly to decrease "
"stereo separation a bit for headphones)"
msgstr ""
+"空間化を有効にする (ヘッドフォンのステレオ分離を少し減らすために、右チャネル"
+"と左チャネルを少しブレンドする)"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:143
msgid "Hit indication sound"
-msgstr ""
+msgstr "インパクトインジケーターサウンド"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:144
msgid "Play a hit indicator sound when your shot hits an enemy"
-msgstr ""
+msgstr "ショットが敵に当たったときにインパクトインジケーターサウンドを再生する"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:147
msgid "Chat message sound"
-msgstr ""
+msgstr "チャットメッセージサウンド"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:149
msgid "Menu sounds"
-msgstr ""
+msgstr "メニューサウンド"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:150
msgid "Play sounds when clicking menu items"
-msgstr ""
+msgstr "メニューアイテムをクリックするとサウンドを再生する"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:151
msgid "Focus sounds"
-msgstr ""
+msgstr "サウンドを集中させる"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:152
msgid "Play sounds when hovering over menu items too"
-msgstr ""
+msgstr "メニューアイテムの上にマウスを置いたときにもサウンドを再生する"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:156
msgid "Time announcer:"
-msgstr ""
+msgstr "時刻アナウンサー:"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:158
msgid "WRN^Disabled"
-msgstr ""
+msgstr "無効"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:160
msgid "5 minutes"
-msgstr ""
+msgstr "5分"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:161
msgid "WRN^Both"
-msgstr ""
+msgstr "両"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:164
msgid "Automatic taunts:"
-msgstr ""
+msgstr "自動からかう:"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:166
msgid "Automatically taunt enemies after fragging them"
-msgstr ""
+msgstr "削除後に敵を自動的にからかう"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:168
msgid "Sometimes"
-msgstr ""
+msgstr "時々"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:169
msgid "Often"
-msgstr ""
+msgstr "しばしば"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:170
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:147
#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:57
msgid "Always"
-msgstr ""
+msgstr "常に"
#: qcsrc/menu/xonotic/dialog_settings_audio.qc:176
msgid "Debug info about sounds"
-msgstr ""
+msgstr "サウンドのついてデバッグ情報"
#: qcsrc/menu/xonotic/dialog_settings_bindings_reset.qc:11
msgid "Are you sure you want to reset all key bindings?"
-msgstr ""
+msgstr "全てのキー割り当てをリセットしてもよろしいですか?"
#: qcsrc/menu/xonotic/dialog_settings_bindings_reset.qh:6
msgid "Reset key bindings"
-msgstr ""
+msgstr "キー割り当てをリセットする"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:41
msgid "Quality preset:"
-msgstr ""
+msgstr "品質プリセット:"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:45
msgid "PRE^OMG!"
-msgstr ""
+msgstr "OMG!"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:48
msgid "PRE^Low"
-msgstr ""
+msgstr "低い"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:50
msgid "PRE^Medium"
-msgstr ""
+msgstr "中"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:52
msgid "PRE^Normal"
-msgstr ""
+msgstr "通常"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:54
msgid "PRE^High"
-msgstr ""
+msgstr "高い"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:56
msgid "PRE^Ultra"
-msgstr ""
+msgstr "超"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:60
msgid "PRE^Ultimate"
-msgstr ""
+msgstr "究極"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:65
msgid "Geometry detail:"
-msgstr ""
+msgstr "ジオメトリ詳細:"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:67
msgid "Change the smoothness of the curves on the map"
-msgstr ""
+msgstr "マップ上の曲線の滑らかさを変更する"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:68
msgid "DET^Lowest"
-msgstr ""
+msgstr "最低"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:69
msgid "DET^Low"
-msgstr ""
+msgstr "低い"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:70
msgid "DET^Normal"
-msgstr ""
+msgstr "通常"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:71
msgid "DET^Good"
-msgstr ""
+msgstr "良い"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:72
msgid "DET^Best"
-msgstr ""
+msgstr "最高"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:73
msgid "DET^Insane"
-msgstr ""
+msgstr "非常識"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:77
msgid "Player detail:"
-msgstr ""
+msgstr "選手詳細:"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:79
msgid "PDET^Low"
-msgstr ""
+msgstr "低い"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:80
msgid "PDET^Medium"
-msgstr ""
+msgstr "中"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:81
msgid "PDET^Normal"
-msgstr ""
+msgstr "通常"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:82
msgid "PDET^Good"
-msgstr ""
+msgstr "良い"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:83
msgid "PDET^Best"
-msgstr ""
+msgstr "最高"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:87
msgid "Texture resolution:"
-msgstr ""
+msgstr "テクスチャ解像度"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:91
msgid "RES^Leet"
-msgstr ""
+msgstr "Leet"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:92
msgid "RES^Lowest"
-msgstr ""
+msgstr "最低"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:93
msgid "RES^Very low"
-msgstr ""
+msgstr "とても低い"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:94
msgid "RES^Low"
-msgstr ""
+msgstr "低い"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:95
msgid "RES^Normal"
-msgstr ""
+msgstr "通常"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:96
msgid "RES^Good"
-msgstr ""
+msgstr "良い"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:97
msgid "RES^Best"
-msgstr ""
+msgstr "最高"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:110
#: 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:"
-msgstr ""
+msgstr "時刻:"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:180
msgid "Time in seconds before decals fade away"
-msgstr ""
+msgstr "デカールが消えるまでの秒数"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:184
msgid "Damage effects:"
-msgstr ""
+msgstr "ダメージエフェクト:"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:186
msgid "DMGFX^Disabled"
-msgstr ""
+msgstr "無効"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:187
msgid "Skeletal"
-msgstr ""
+msgstr "骨格"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:188
msgid "DMGFX^All"
-msgstr ""
+msgstr "全て"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:192
msgid "No dynamic lighting"
-msgstr ""
+msgstr "動的照明なし"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:193
msgid "Enable corona flares around certain lights"
-msgstr ""
+msgstr "特定のライトの周りでコロナフレアを有効にする"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:195
msgid "Fake corona lighting"
-msgstr ""
+msgstr "偽のコロナ照明"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:196
msgid ""
"Enable faster but uglier dynamic lights by rendering bright coronas instead "
"of real dynamic lights"
msgstr ""
+"実際のダイナミックライトの代わりに明るいコロナをレンダリングすることで、より"
+"高速で醜いダイナミックライトを有効にする"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:199
msgid "Realtime dynamic lighting"
-msgstr ""
+msgstr "リアルタイムの動的照明"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:200
msgid "Enable rendering of dynamic lights such as explosions and rocket lights"
-msgstr ""
+msgstr "爆発やロケットライトなどの動的ライトのレンダリングを有効にする"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:202
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:208
msgid "Shadows"
-msgstr ""
+msgstr "影"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:203
msgid "Enable rendering of shadows from dynamic lights"
-msgstr ""
+msgstr "動的ライトからの影のレンダリングを有効にする"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:206
msgid "Realtime world lighting"
-msgstr ""
+msgstr "リアルタイムの世界の照明"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:207
msgid ""
"Enable rendering of full realtime world lighting on maps that support it. "
"Note that this might have a big impact on performance."
msgstr ""
+"それをサポートするマップでフルリアルタイムのワールドライティングのレンダリン"
+"グを有効にする。これはパフォーマンスに大きな影響を与える可能性があることに注"
+"意してください。"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:209
msgid "Enable rendering of shadows from realtime world lights"
-msgstr ""
+msgstr "リアルタイムのワールドライトからの影のレンダリングを有効にする"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:213
msgid "Use normal maps"
-msgstr ""
+msgstr "法線マップを使用する"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:214
msgid "Enable use of directional shading on textures"
-msgstr ""
+msgstr "テクスチャでの指向性シェーディングの使用を有効にする"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:216
msgid "Soft shadows"
-msgstr ""
+msgstr "滑らかな影"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:220
msgid "Fade corona according to visibility"
-msgstr ""
+msgstr "可視性に応じてフェードコロナ"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:221
msgid "Fade coronas according to visibility"
-msgstr ""
+msgstr "可視性に応じてフェードコロナ"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:225
msgid "Bloom"
-msgstr ""
+msgstr "ブルーム"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:226
msgid ""
"Enable bloom effect, which brightens the neighboring pixels of very bright "
"pixels. Has a big impact on performance."
msgstr ""
+"非常に明るいピクセルの隣接ピクセルを明るくするブルームエフェクトを有効にす"
+"る。パフォーマンスに大きな影響を与えます。"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:227
msgid "Extra postprocessing effects"
-msgstr ""
+msgstr "追加の後処理エフェクト"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:228
msgid ""
"Enables special postprocessing effects for when damaged or under water or "
"using a powerup"
msgstr ""
+"損傷した場合、水中、またはパワーアップを使用した場合の特殊な後処理エフェクト"
+"を有効にする"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:233
msgid "Motion blur strength - 0.4 recommended"
-msgstr ""
+msgstr "モーションブラーの強度 - 0.4を勧めす"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:234
msgid "Motion blur:"
-msgstr ""
+msgstr "モーションブラー:"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:240
msgid "Particles"
-msgstr ""
+msgstr "パーティクル"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:241
msgid "Spawnpoint effects"
-msgstr ""
+msgstr "現れるポイントエフェクト"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:242
msgid "Particles effects at all spawn points and whenever a player spawns"
-msgstr ""
+msgstr "全ての現れるポイントで選手が現れるたびにパーティクルエフェクト"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:247
msgid "Quality:"
-msgstr ""
+msgstr "品質:"
#: qcsrc/menu/xonotic/dialog_settings_effects.qc:250
#: qcsrc/menu/xonotic/slider_particles.qc:13
"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"
-msgstr ""
+msgstr "十字線なし"
#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:33
#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:62
msgid "Per weapon"
-msgstr ""
+msgstr "武器ごと"
#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:34
msgid ""
"Set a different crosshair for each weapon, good if you play without weapon "
"models"
msgstr ""
+"武器ごとに異なる十字線を設定する。武器モデルなしで遊ぶ場合に適しています"
#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:48
#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:81
#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:97
msgid "Size:"
-msgstr ""
+msgstr "サイズ:"
#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:64
msgid "By health"
-msgstr ""
+msgstr "健康で"
#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:76
msgid "Use rings to indicate weapon status"
-msgstr ""
+msgstr "武器のステータスを示すためにリングを使用する"
#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:93
msgid "Enable center crosshair dot"
-msgstr ""
+msgstr "中央十字線ドットを有効にする"
#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:111
msgid "Use normal crosshair color"
-msgstr ""
+msgstr "通常の十字線の色を使用する"
#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:122
msgid "Smooth effects of crosshairs"
-msgstr ""
+msgstr "十字線の滑らかなエフェクト"
#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:125
msgid "Hit testing:"
-msgstr ""
+msgstr "照準テスト:"
#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:128
msgid ""
"when there's an obstacle between your gun and the target; Enemies: also "
"enlarge the crosshair when you would hit an enemy"
msgstr ""
+"なし: 十字線のヒットテストを行いません。真の照準: 銃とターゲットの間に障害物"
+"があるときに十字線をぼかす。敵:敵に当たったときに十字線を拡大する"
#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:129
msgid "HTTST^Disabled"
-msgstr ""
+msgstr "無効"
#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:130
msgid "HTTST^TrueAim"
-msgstr ""
+msgstr "真の照準"
#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:131
msgid "HTTST^Enemies"
-msgstr ""
+msgstr "敵"
#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:136
msgid "Blur crosshair if the shot is obstructed"
-msgstr ""
+msgstr "ショットが遮られている場合は十字線をぼかす"
#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:140
msgid "Enlarge crosshair if targeting an enemy"
-msgstr ""
+msgstr "敵を狙った場合は十字線を拡大する"
#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:143
msgid "Animate crosshair when hitting an enemy"
-msgstr ""
+msgstr "敵に当たったときに十字線をアニメーション化する"
#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc:146
msgid "Animate crosshair when picking up an item"
-msgstr ""
+msgstr "アイテムを拾うときに十字線をアニメーション化する"
#: qcsrc/menu/xonotic/dialog_settings_game_crosshair.qh:7
msgid "Crosshair"
-msgstr ""
+msgstr "十字線"
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:43
msgid "Scoreboard"
-msgstr ""
+msgstr "得点表"
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:48
msgid "Fading speed:"
-msgstr ""
+msgstr "フェージング速度:"
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:51
msgid "Enable rows / columns highlighting"
-msgstr ""
+msgstr "行 / 列の強調表示を有効にする"
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:53
msgid "Show accuracy underneath scoreboard"
-msgstr ""
+msgstr "得点表の下に精度を表示する"
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:55
msgid "Show team sizes:"
-msgstr ""
+msgstr "チームのサイズを表示する:"
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:56
msgid ""
"Team size position: Off=do not show; Left=on the left side of the scoreboard "
"and move team scores to the right; Right=on the right of the scoreboard"
msgstr ""
+"チームサイズの位置: 無効 = 表示されない。左 = 得点表の左側にあり、チームの得"
+"点を右に移動する。右 = 得点表の右側"
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:64
msgid "Waypoints"
-msgstr ""
+msgstr "ウェイポイント"
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:66
msgid "Display waypoint markers for objectives on the map"
-msgstr ""
+msgstr "マップ上の目標のウェイポイントマーカーを表示する"
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:67
msgid "Show various gametype specific waypoints"
-msgstr ""
+msgstr "さまざまなゲームタイプ固有のウェイポイントを表示する"
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:73
msgid "Control transparency of the waypoints"
-msgstr ""
+msgstr "ウェイポイントの透明度のコントロール"
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:77
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:130
msgid "Fontsize:"
-msgstr ""
+msgstr "フォントサイズ:"
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:83
msgid "Edge offset:"
-msgstr ""
+msgstr "エッジオフセット:"
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:91
msgid "Fade when near the crosshair"
-msgstr ""
+msgstr "十字線の近くでフェードする"
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:95
msgid "Display names instead of icons"
-msgstr ""
+msgstr "アイコンの代わりに名前を表示する"
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:100
msgid "Damage"
-msgstr ""
+msgstr "ダメージ"
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:102
msgid "Overlay:"
-msgstr ""
+msgstr "オーバーレイ:"
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:105
msgid "Factor:"
-msgstr ""
+msgstr "因子:"
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:110
msgid "Fade rate:"
-msgstr ""
+msgstr "フェード率:"
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:118
msgid "Player Names"
-msgstr ""
+msgstr "選手名"
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:120
msgid "Show names above players"
-msgstr ""
+msgstr "選手の上に名前を表示する"
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:136
msgid "Max distance:"
-msgstr ""
+msgstr "最大距離:"
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:142
msgid "Decolorize:"
-msgstr ""
+msgstr "脱色:"
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:146
#: qcsrc/menu/xonotic/keybinder.qc:113
msgid "Teamplay"
-msgstr ""
+msgstr "チームプレイ"
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:154
msgid "Only when near crosshair"
-msgstr ""
+msgstr "十字線に近い場合のみ"
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:158
msgid "Display health and armor"
-msgstr ""
+msgstr "健康と鎧を表示する"
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:163
msgid "Damage overlay:"
-msgstr ""
+msgstr "ダメージオーバーレイ:"
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:166
msgid "Dynamic HUD"
-msgstr ""
+msgstr "ダイナミックHUD"
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:167
msgid "HUD moves around following player's movement"
-msgstr ""
+msgstr "HUDは選手の動きに従って動き回る"
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:169
msgid "Shake the HUD when hurt"
-msgstr ""
+msgstr "傷ついたときにHUDを振る"
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qc:173
#: qcsrc/menu/xonotic/dialog_settings_game_hudconfirm.qh:6
msgid "Enter HUD editor"
-msgstr "ヘッドアップディスプレイ(HUD)の編集者に入る"
+msgstr "HUDの編集者に入る"
#: qcsrc/menu/xonotic/dialog_settings_game_hud.qh:7
msgid "HUD"
-msgstr "ハッド(HUD)"
+msgstr "HUD"
#: qcsrc/menu/xonotic/dialog_settings_game_hudconfirm.qc:21
msgid "In order for the HUD editor to show, you must first be in game."
-msgstr ""
+msgstr "HUDエディターを表示するには、まずゲームに参加している必要があります。"
#: qcsrc/menu/xonotic/dialog_settings_game_hudconfirm.qc:23
msgid "Do you wish to start a local game to set up the HUD?"
-msgstr ""
+msgstr "HUDを構成するローカルゲームを開始しますか?"
#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:24
msgid "Frag Information"
-msgstr ""
+msgstr "削除情報"
#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:26
msgid "Display information about killing sprees"
-msgstr ""
+msgstr "殺害に関する情報を表示する"
#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:29
msgid "Only display sprees if they are achievements"
-msgstr ""
+msgstr "達成である場合のみ殺害を表示する"
#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:34
msgid "Show spree information in centerprints"
-msgstr ""
+msgstr "センタープリントで殺害情報を表示する"
#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:38
msgid "Show spree information in death messages"
-msgstr ""
+msgstr "死のメッセージに殺害情報を表示する"
#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:43
msgid "Sprees in info messages:"
-msgstr ""
+msgstr "情報メッセージの殺害:"
#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:46
msgid "SPREES^Disabled"
-msgstr ""
+msgstr "無効"
#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:47
msgid "Target"
-msgstr ""
+msgstr "目的"
#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:48
msgid "Attacker"
-msgstr ""
+msgstr "アタッカー"
#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:49
msgid "SPREES^Both"
-msgstr ""
+msgstr "両"
#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:55
msgid "Print on a seperate line"
-msgstr ""
+msgstr "別の行に印刷"
#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:58
msgid "Add extra frag information to centerprint when available"
-msgstr ""
+msgstr "可能な場合はセンタープリントに削除情報を追加する"
#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:62
msgid "Add frag location to death messages when available"
-msgstr ""
+msgstr "可能な場合は削除メッセージを死のメッセージに追加する"
#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:65
msgid "Gamemode Settings"
-msgstr ""
+msgstr "ゲームモード設定"
#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:67
msgid "Display capture times in Capture The Flag"
-msgstr ""
+msgstr "「キャプチャー・ザ・フラッグ」に取れた時間を表示する"
#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:71
msgid "Display name of flag stealer in Capture The Flag"
-msgstr ""
+msgstr "「キャプチャー・ザ・フラッグ」に旗の強盗者の名を表示する"
#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:76
#: qcsrc/menu/xonotic/dialog_settings_input.qc:92
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:126
msgid "Other"
-msgstr ""
+msgstr "その他"
#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:78
msgid "Display console messages in the top left corner"
-msgstr ""
+msgstr "左上隅にコンソールメッセージを表示する"
#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:80
msgid "Display all info messages in the chatbox"
-msgstr ""
+msgstr "チャットボックスに全ての情報メッセージを表示する"
#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:82
msgid "Display player statuses in the chatbox"
-msgstr ""
+msgstr "チャットボックスに選手のステータスを表示する"
#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:86
msgid "Powerup notifications"
-msgstr ""
+msgstr "パワーアップ通知"
#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:89
msgid "Weapon centerprint notifications"
-msgstr ""
+msgstr "武器センタープリント通知"
#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:92
msgid "Weapon info message notifications"
-msgstr ""
+msgstr "武器情報メッセージ通知"
#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:96
msgid "Announcers"
-msgstr ""
+msgstr "アナウンサー"
#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:98
msgid "Respawn countdown sounds"
-msgstr ""
+msgstr "再び現れるカウントダウンのサウンド"
#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:101
msgid "Killstreak sounds"
-msgstr ""
+msgstr "連勝殺害のサウンド"
#: qcsrc/menu/xonotic/dialog_settings_game_messages.qc:104
msgid "Achievement sounds"
-msgstr ""
+msgstr "達成のサウンド"
#: qcsrc/menu/xonotic/dialog_settings_game_messages.qh:7
msgid "Messages"
-msgstr ""
+msgstr "メッセージ"
#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:30
msgid "Items"
-msgstr ""
+msgstr "アイテム"
#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:32
msgid "Use simple 2D images instead of item models"
-msgstr ""
+msgstr "アイテムモデルの代わりにシンプルな2D画像を使用する"
#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:34
msgid "Unavailable alpha:"
-msgstr ""
+msgstr "利用できないアルファ:"
#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:37
msgid "Unavailable color:"
-msgstr ""
+msgstr "利用できない色:"
#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:39
msgid "GHOITEMS^Black"
-msgstr ""
+msgstr "黒い"
#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:40
msgid "GHOITEMS^Dark"
-msgstr ""
+msgstr "暗い"
#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:41
msgid "GHOITEMS^Tinted"
-msgstr ""
+msgstr "色合い"
#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:42
msgid "GHOITEMS^Normal"
-msgstr ""
+msgstr "正常"
#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:43
msgid "GHOITEMS^Blue"
-msgstr ""
+msgstr "青い"
#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:49
#: qcsrc/menu/xonotic/serverlist.qc:737
msgid "Players"
-msgstr ""
+msgstr "選手達"
#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:51
msgid "Force player models to mine"
-msgstr ""
+msgstr "プレイヤーのモデルを私のものに強制的する"
#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:53
msgid "Force player colors to mine"
-msgstr ""
+msgstr "プレイヤーの色を私のものに強制的する"
#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:56
msgid "In non teamplay modes only"
-msgstr ""
+msgstr "非チームプレイモードのみ"
#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:60
msgid "Body fading:"
-msgstr ""
+msgstr "体フェージング:"
#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:63
msgid "Gibs:"
-msgstr ""
+msgstr "内臓:"
#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:65
msgid "GIBS^None"
-msgstr ""
+msgstr "なし"
#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:66
msgid "GIBS^Few"
-msgstr ""
+msgstr "少ない"
#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:67
msgid "GIBS^Many"
-msgstr ""
+msgstr "多い"
#: qcsrc/menu/xonotic/dialog_settings_game_model.qc:68
msgid "GIBS^Lots"
-msgstr ""
+msgstr "たくさん"
#: qcsrc/menu/xonotic/dialog_settings_game_model.qh:7
msgid "Models"
-msgstr ""
+msgstr "モデル"
#: qcsrc/menu/xonotic/dialog_settings_game_model.qh:8
msgid "Customize how players and items are displayed in game"
-msgstr ""
+msgstr "ゲームでのプレーヤーとアイテムの表示方法をカスタマイズする"
#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:26
msgid "1st person perspective"
-msgstr ""
+msgstr "一人称視点"
#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:29
msgid "Slide to third person upon death"
-msgstr ""
+msgstr "死後三人称視点に変更する"
#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:33
msgid "Smooth the view when landing from a jump"
-msgstr ""
+msgstr "ジャンプから着陸するときにビューを滑らかにする"
#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:37
msgid "Smooth the view while crouching"
-msgstr ""
+msgstr "しゃがみながらビューを滑らかにする"
#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:41
msgid "View waving while idle"
-msgstr ""
+msgstr "不活発に中にビューを振る"
#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:45
msgid "View bobbing while walking around"
-msgstr ""
+msgstr "歩きながらビューをボビングする"
#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:50
msgid "3rd person perspective"
-msgstr ""
+msgstr "三人称視点"
#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:53
msgid "Back distance"
-msgstr ""
+msgstr "後方距離"
#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:59
msgid "Up distance"
-msgstr ""
+msgstr "上への距離"
#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:65
msgid "Allow passing through walls while spectating"
-msgstr ""
+msgstr "観戦中に壁を通過できるようにする"
#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:69
msgid "Field of view:"
-msgstr ""
+msgstr "視野:"
#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:71
msgid "Field of vision in degrees"
-msgstr ""
+msgstr "度単位の視野"
#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:75
msgid "ZOOM^Zoom factor:"
-msgstr ""
+msgstr "ズーム因子:"
#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:77
msgid "How big the zoom factor is when the zoom button is pressed"
-msgstr ""
+msgstr "ズームボタンを押したときのズーム率頻度"
#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:80
msgid "ZOOM^Zoom speed:"
-msgstr ""
+msgstr "ズーム速度:"
#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:82
msgid "How fast the view will be zoomed, disable to zoom instantly"
-msgstr ""
+msgstr "ビューがズームされる速度頻度、無効にするとすぐにズームされる"
#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:91
msgid "ZOOM^Instant"
-msgstr ""
+msgstr "瞬時"
#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:95
msgid "ZOOM^Zoom sensitivity:"
-msgstr ""
+msgstr "ズーム感度:"
#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:97
msgid ""
"How zoom changes sensitivity, from 0 (lower sensitivity) to 1 (no "
"sensitivity change)"
msgstr ""
+"ズームが感度をどのように変更するか、0 (低い感度) から 1 (感度の変更なし)"
#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:100
msgid "Velocity zoom"
-msgstr ""
+msgstr "速度ズーム"
#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:101
msgid "Forward movement only"
-msgstr ""
+msgstr "前進のみ"
#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:105
msgid "VZOOM^Factor"
-msgstr ""
+msgstr "因子"
#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:112
msgid "Display reticle 2D overlay while zooming"
-msgstr ""
+msgstr "ズーム中にレチクル2Dオーバーレイを表示する"
#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:115
msgid "Release zoom when you die or respawn"
-msgstr ""
+msgstr "死んだり再び現れたときにズームを解放する"
#: qcsrc/menu/xonotic/dialog_settings_game_view.qc:119
msgid "Release zoom when you switch weapons"
-msgstr ""
+msgstr "武器を切り替えるときにズームを解放する"
#: qcsrc/menu/xonotic/dialog_settings_game_view.qh:7
#: qcsrc/menu/xonotic/keybinder.qc:83
msgid "View"
-msgstr ""
+msgstr "ビュー"
#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:33
msgid "Weapon Priority List (* = mutator weapon)"
-msgstr ""
+msgstr "武器優先リスト (* = ミューテーター武器)"
#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:39
msgid "Up"
-msgstr ""
+msgstr "上"
#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:43
msgid "Down"
-msgstr ""
+msgstr "下"
#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:49
msgid "Use priority list for weapon cycling"
-msgstr ""
+msgstr "武器のサイクリングに優先リストを使用する"
#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:50
msgid ""
"Make use of the list above when cycling through weapons with the mouse wheel"
-msgstr ""
+msgstr "マウスホイールで武器をサイクリングするときは、上記のリストを使用する"
#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:52
msgid "Cycle through only usable weapon selections"
-msgstr ""
+msgstr "使用可能な武器の選択のみを循環する"
#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:56
msgid "Auto switch weapons on pickup"
-msgstr ""
+msgstr "拾ったときに自動的に武器を切り替える"
#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:57
msgid ""
"Automatically switch to newly picked up weapons if they are better than what "
"you are carrying"
-msgstr ""
+msgstr "持っている武器よりも優れている場合は自動的に収集した武器に切り替える"
#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:60
msgid "Release attack buttons when you switch weapons"
-msgstr ""
+msgstr "武器を切り替えるときに攻撃ボタンを解放する"
#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:63
msgid "Draw 1st person weapon model"
-msgstr ""
+msgstr "一人称で武器モデルを描く"
#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:64
msgid "Draw the weapon model"
-msgstr ""
+msgstr "武器モデルを描く"
#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:68
#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:71
#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:74
msgid "Position of the weapon model; requires reconnect"
-msgstr ""
+msgstr "武器モデルの位置、接続が必要だ"
#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:77
msgid "Weapon model opacity:"
-msgstr ""
+msgstr "武器モデルの不透明度:"
#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:91
msgid "Gun model swaying"
-msgstr ""
+msgstr "揺れる銃モデル"
#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qc:96
msgid "Gun model bobbing"
-msgstr ""
+msgstr "振る銃モデル"
#: qcsrc/menu/xonotic/dialog_settings_game_weapons.qh:7
#: qcsrc/menu/xonotic/keybinder.qc:51
msgid "Weapons"
-msgstr ""
+msgstr "武器"
#: qcsrc/menu/xonotic/dialog_settings_input.qc:34
msgid "Key Bindings"
-msgstr ""
+msgstr "キー割り当て"
#: qcsrc/menu/xonotic/dialog_settings_input.qc:38
msgid "Change key..."
-msgstr ""
+msgstr "キーを変更する..."
#: qcsrc/menu/xonotic/dialog_settings_input.qc:42
msgid "Edit..."
-msgstr ""
+msgstr "編集する..."
#: qcsrc/menu/xonotic/dialog_settings_input.qc:48
msgid "Clear"
-msgstr ""
+msgstr "クリアする"
#: qcsrc/menu/xonotic/dialog_settings_input.qc:53
msgid "Reset all"
-msgstr ""
+msgstr "全てリセットする"
#: qcsrc/menu/xonotic/dialog_settings_input.qc:58
msgid "Mouse"
-msgstr ""
+msgstr "マウス"
#: qcsrc/menu/xonotic/dialog_settings_input.qc:60
msgid "Sensitivity:"
-msgstr ""
+msgstr "感度:"
#: qcsrc/menu/xonotic/dialog_settings_input.qc:62
msgid "Mouse speed multiplier"
-msgstr ""
+msgstr "マウス速度乗数"
#: qcsrc/menu/xonotic/dialog_settings_input.qc:64
msgid "Smooth aiming"
-msgstr ""
+msgstr "滑らかな照準"
#: qcsrc/menu/xonotic/dialog_settings_input.qc:65
msgid "Smoothes the mouse movement, but makes aiming slightly less responsive"
-msgstr ""
+msgstr "マウスの動きを滑らかにするが、照準は少し反応が遅くなる"
#: qcsrc/menu/xonotic/dialog_settings_input.qc:67
msgid "Invert aiming"
-msgstr ""
+msgstr "照準を反転する"
#: qcsrc/menu/xonotic/dialog_settings_input.qc:68
msgid "Invert mouse movement on the Y-axis"
-msgstr ""
+msgstr "Y-軸上のマウスの動きを反転する"
#: qcsrc/menu/xonotic/dialog_settings_input.qc:70
msgid "Use system mouse positioning"
-msgstr ""
+msgstr "システムのマウスの位置を使用する"
#: qcsrc/menu/xonotic/dialog_settings_input.qc:75
msgid "Enable built in mouse acceleration"
-msgstr ""
+msgstr "組み込みのマウス加速を有効にする"
#: qcsrc/menu/xonotic/dialog_settings_input.qc:79
#: qcsrc/menu/xonotic/dialog_settings_input.qc:83
#: qcsrc/menu/xonotic/dialog_settings_input.qc:86
msgid "Disable system mouse acceleration"
-msgstr ""
+msgstr "システムのマウス加速を無効にする"
#: qcsrc/menu/xonotic/dialog_settings_input.qc:80
msgid "Make use of DGA mouse input"
-msgstr ""
+msgstr "DGAマウス入力を利用する"
#: qcsrc/menu/xonotic/dialog_settings_input.qc:94
msgid "Pressing \"enter console\" key also closes it"
-msgstr ""
+msgstr "「コンソールを入力する」キーを押すと、それも閉じる"
#: qcsrc/menu/xonotic/dialog_settings_input.qc:95
msgid "Allow the console toggling bind to also close the console"
-msgstr ""
+msgstr "コンソールのバインドの切り替えを許可して、コンソールも閉じる"
#: qcsrc/menu/xonotic/dialog_settings_input.qc:97
msgid "Automatically repeat jumping if holding jump"
-msgstr ""
+msgstr "ジャンプを押し続けると自動的にジャンプを繰り返す"
#: qcsrc/menu/xonotic/dialog_settings_input.qc:100
msgid "Jetpack on jump:"
-msgstr ""
+msgstr "ジャンプときのジェットパック:"
#: qcsrc/menu/xonotic/dialog_settings_input.qc:102
msgid "JPJUMP^Disabled"
-msgstr ""
+msgstr "無効"
#: qcsrc/menu/xonotic/dialog_settings_input.qc:103
msgid "Air only"
-msgstr ""
+msgstr "空気のみ"
#: qcsrc/menu/xonotic/dialog_settings_input.qc:104
msgid "JPJUMP^All"
-msgstr ""
+msgstr "全て"
#: qcsrc/menu/xonotic/dialog_settings_input.qc:110
#: qcsrc/menu/xonotic/dialog_settings_input.qc:115
#: qcsrc/menu/xonotic/dialog_settings_input.qc:120
msgid "Use joystick input"
-msgstr ""
+msgstr "ジョイスティック入力を使用する"
#: qcsrc/menu/xonotic/dialog_settings_input_userbind.qc:31
msgid "Command when pressed:"
-msgstr ""
+msgstr "押されたときのコマンド:"
#: qcsrc/menu/xonotic/dialog_settings_input_userbind.qc:34
msgid "Command when released:"
-msgstr ""
+msgstr "解放された時のコマンド:"
#: qcsrc/menu/xonotic/dialog_settings_input_userbind.qc:40
msgid "Cancel"
-msgstr ""
+msgstr "キャンセルする"
#: qcsrc/menu/xonotic/dialog_settings_input_userbind.qh:7
msgid "User defined key bind"
-msgstr ""
+msgstr "ユーザー定義のキー割り当て"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:11
#, c-format
msgid "%d fps"
-msgstr ""
+msgstr "%d fps"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:12
#, c-format
msgid "%d KB/s"
-msgstr ""
+msgstr "%d KB/s"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:13
#, c-format
msgid "%d MB/s"
-msgstr ""
+msgstr "%d MB/s"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:27
msgid "Network"
-msgstr ""
+msgstr "ネットワーク"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:29
msgid "Client UDP port:"
-msgstr ""
+msgstr "クライアントUDPポート:"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:31
msgid "Force client to use chosen port unless it is set to 0"
-msgstr ""
+msgstr "0に設定されていない限り、選択したポートをクライアントに強制的する"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:34
msgid "Bandwidth:"
-msgstr ""
+msgstr "バンド幅:"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:36
msgid "Specify your network speed"
-msgstr ""
+msgstr "ネットワーク速度を指定する"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:37
msgid "56k"
-msgstr ""
+msgstr "56k"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:38
msgid "ISDN"
-msgstr ""
+msgstr "ISDN"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:39
msgid "Slow ADSL"
-msgstr ""
+msgstr "遅いADSL"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:40
msgid "Fast ADSL"
-msgstr ""
+msgstr "速いADSL"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:41
msgid "Broadband"
-msgstr ""
+msgstr "ブロードバンド"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:44
msgid "Server queries/s:"
-msgstr ""
+msgstr "サーバークエリ:"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:48
msgid "Downloads:"
-msgstr ""
+msgstr "ダウンロード:"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:50
msgid "Maximum number of concurrent HTTP/FTP downloads"
-msgstr ""
+msgstr "同時HTTP / FTPダウンロードの最大数"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:52
msgid "Download speed:"
-msgstr ""
+msgstr "ダウンロード速度:"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:65
msgid "Local latency:"
-msgstr ""
+msgstr "ローカルレイテンシ:"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:69
msgid "Show netgraph"
-msgstr ""
+msgstr "ネットグラフを表示する"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:70
msgid "Show a graph of packet sizes and other information"
-msgstr ""
+msgstr "パケットサイズとその他の情報のグラフを表示する"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:72
msgid "Client-side movement prediction"
-msgstr ""
+msgstr "クライアント側の動き予測"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:74
msgid "Movement error compensation"
-msgstr ""
+msgstr "エラー補償の動き"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:78
msgid "Use encryption (AES) when available"
-msgstr ""
+msgstr "可能な場合は暗号化(AES)を使用する"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:81
msgid "Framerate"
-msgstr ""
+msgstr "フレームレート"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:83
msgid "Maximum:"
-msgstr ""
+msgstr "最大:"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:93
msgid "MAXFPS^Unlimited"
-msgstr ""
+msgstr "無制限"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:96
msgid "Target:"
-msgstr ""
+msgstr "目的:"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:98
msgid "TRGT^Disabled"
-msgstr ""
+msgstr "無効"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:109
msgid "Idle limit:"
-msgstr ""
+msgstr "不活発の制限:"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:115
msgid "IDLFPS^Unlimited"
-msgstr ""
+msgstr "無制限"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:119
msgid "Save processing time for other apps"
-msgstr ""
+msgstr "他のアプリの処理時間を保存する"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:122
msgid "Show frames per second"
-msgstr ""
+msgstr "FPSを表示する"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:123
msgid "Show your rendered frames per second"
-msgstr ""
+msgstr "レンダリングしたFPSを表示する"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:128
msgid "Menu tooltips:"
-msgstr ""
+msgstr "メニューツールチップ:"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:130
msgid ""
"Menu tooltips: disabled, standard or advanced (also shows cvar or console "
"command bound to the menu item)"
msgstr ""
+"メニューツールチップ: 無効、標準、高度 (メニュー項目にバインドされた cvar コ"
+"マンドまたはコンソールコマンドも表示する)"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:131
msgid "TLTIP^Disabled"
-msgstr ""
+msgstr "無効"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:132
msgid "TLTIP^Standard"
-msgstr ""
+msgstr "標準"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:133
msgid "TLTIP^Advanced"
-msgstr ""
+msgstr "高度"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:136
msgid "Show current date and time"
-msgstr ""
+msgstr "現在の日付と時刻を表示する"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:137
msgid "Show current date and time of day, useful on screenshots"
-msgstr ""
+msgstr "現在の日付と時刻を表示す、スクリーンショットに便利"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:140
msgid "Enable developer mode"
-msgstr ""
+msgstr "開発者モードを有効にする"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:144
msgid "Advanced settings..."
-msgstr ""
+msgstr "高度な設定..."
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:145
msgid "Advanced settings where you can tweak every single variable of the game"
-msgstr ""
+msgstr "各ゲーム変数を調整できる詳細設定"
#: qcsrc/menu/xonotic/dialog_settings_misc.qc:150
#: qcsrc/menu/xonotic/dialog_settings_misc_reset.qh:6
msgid "Factory reset"
-msgstr ""
+msgstr "工場リセット"
#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.qc:31
msgid "Cvar filter:"
-msgstr ""
+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:"
-msgstr ""
+msgstr "設定:"
#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.qc:49
msgid "Type:"
-msgstr ""
+msgstr "タイプ:"
#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.qc:53
msgid "Value:"
-msgstr ""
+msgstr "値:"
#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.qc:70
msgid "Description:"
-msgstr ""
+msgstr "説明:"
#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.qh:7
msgid "Advanced settings"
-msgstr ""
+msgstr "高度な設定"
#: qcsrc/menu/xonotic/dialog_settings_misc_reset.qc:11
msgid "Are you sure you want to reset all settings?"
-msgstr ""
+msgstr "全ての設定をリセットしてもよろしいですか?"
#: qcsrc/menu/xonotic/dialog_settings_misc_reset.qc:13
msgid "This will create a backup config in your data directory"
-msgstr ""
+msgstr "これによりデータディレクトリにバックアップ構成が作成されます"
#: qcsrc/menu/xonotic/dialog_settings_user.qc:23
msgid "Menu Skins"
-msgstr ""
+msgstr "メニュースキン"
#: qcsrc/menu/xonotic/dialog_settings_user.qc:62
msgid "Text Language"
-msgstr ""
+msgstr "テキスト言語"
#: qcsrc/menu/xonotic/dialog_settings_user.qc:67
msgid "Set language"
-msgstr ""
+msgstr "言語を設定する"
#: qcsrc/menu/xonotic/dialog_settings_user.qc:72
msgid "Disable gore effects and harsh language"
-msgstr ""
+msgstr "流血の効果と攻撃的な言葉を無効にする"
#: qcsrc/menu/xonotic/dialog_settings_user.qc:73
msgid "Replace blood and gibs with content that does not have any gore effects"
-msgstr ""
+msgstr "血と内臓を流血の効果コンテンツに置き換える"
#: qcsrc/menu/xonotic/dialog_settings_user_languagewarning.qc:10
msgid "While connected language changes will be applied only to the menu,"
-msgstr ""
+msgstr "接続されている言語の変更はメニューにのみ適用されますが、"
#: qcsrc/menu/xonotic/dialog_settings_user_languagewarning.qc:12
msgid "full language changes will take effect starting from the next game"
-msgstr ""
+msgstr "完全な言語の変更は次のゲームから有効になります"
#: qcsrc/menu/xonotic/dialog_settings_user_languagewarning.qc:16
msgid "Disconnect now"
-msgstr ""
+msgstr "今すぐ切断する"
#: qcsrc/menu/xonotic/dialog_settings_user_languagewarning.qc:17
msgid "Switch language"
-msgstr ""
+msgstr "言語を変更する"
#: qcsrc/menu/xonotic/dialog_settings_user_languagewarning.qh:6
msgid "Warning"
-msgstr ""
+msgstr "警告"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:33
msgid "Resolution:"
-msgstr ""
+msgstr "解像度:"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:37
msgid "Font/UI size:"
-msgstr ""
+msgstr "フォント / UIサイズ:"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:39
msgid "SZ^Unreadable"
-msgstr ""
+msgstr "読めない"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:40
msgid "SZ^Tiny"
-msgstr ""
+msgstr "小っぽけ"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:41
msgid "SZ^Little"
-msgstr ""
+msgstr "少"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:42
msgid "SZ^Small"
-msgstr ""
+msgstr "小"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:43
msgid "SZ^Medium"
-msgstr ""
+msgstr "中"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:44
msgid "SZ^Large"
-msgstr ""
+msgstr "大"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:45
msgid "SZ^Huge"
-msgstr ""
+msgstr "でかい"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:46
msgid "SZ^Gigantic"
-msgstr ""
+msgstr "巨大"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:47
msgid "SZ^Colossal"
-msgstr ""
+msgstr "膨大"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:51
msgid "Color depth:"
-msgstr ""
+msgstr "色深度:"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:53
msgid "How many bits per pixel (BPP) to render at, 32 is recommended"
-msgstr ""
+msgstr "レンダリングするピクセルあたりのビット数 (BPP)、32を勧めす"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:54
msgid "16bit"
-msgstr ""
+msgstr "16bit"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:55
msgid "32bit"
-msgstr ""
+msgstr "32bit"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:59
msgid "Full screen"
-msgstr ""
+msgstr "フルスケ"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:61
msgid "Vertical Synchronization"
-msgstr ""
+msgstr "垂直同期"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:62
msgid ""
"Enable vertical synchronization to prevent tearing, will cap your fps to the "
"screen refresh rate"
msgstr ""
+"垂直同期を有効にしてティアリングを防止し、fpsを画面のリフレッシュレートに制限"
+"する"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:67
msgid "Flip view horizontally"
-msgstr ""
+msgstr "ビューを水平に反転する"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:68
msgid "Poor man's left handed mode"
-msgstr ""
+msgstr "左利きモード"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:71
msgid "Anisotropy:"
-msgstr ""
+msgstr "異方性:"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:73
msgid "Anisotropic filtering quality"
-msgstr ""
+msgstr "異方性フィルタリング品質"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:74
msgid "ANISO^Disabled"
-msgstr ""
+msgstr "無効"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:75
#: qcsrc/menu/xonotic/dialog_settings_video.qc:86
msgid "2x"
-msgstr ""
+msgstr "2x"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:76
#: qcsrc/menu/xonotic/dialog_settings_video.qc:87
msgid "4x"
-msgstr ""
+msgstr "4x"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:77
msgid "8x"
-msgstr ""
+msgstr "8x"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:78
msgid "16x"
-msgstr ""
+msgstr "16x"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:81
msgid "Antialiasing:"
-msgstr ""
+msgstr "アンチエイリアシング:"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:84
msgid ""
"Enable antialiasing, which smooths the edges of 3D geometry. Note that it "
"might decrease performance by quite a lot"
msgstr ""
+"3Dジオメトリのエッジを滑らかにするアンチエイリアスを有効にする。パフォーマン"
+"スが大幅に低下する可能性があることに注意してください"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:85
msgid "AA^Disabled"
-msgstr ""
+msgstr "無効"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:92
msgid "High-quality frame buffer"
-msgstr ""
+msgstr "高品質のフレームバッファ"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:97
msgid "Depth first:"
-msgstr ""
+msgstr "深さ優先:"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:99
msgid ""
"Eliminate overdraw by rendering a depth-only version of the scene before the "
"normal rendering starts"
msgstr ""
+"通常のレンダリングが開始する前に、深度のみのバージョンのシーンをレンダリング"
+"することにより、オーバードローを排除する"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:100
msgid "DF^Disabled"
-msgstr ""
+msgstr "無効"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:101
msgid "DF^World"
-msgstr ""
+msgstr "マップ"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:102
msgid "DF^All"
-msgstr ""
+msgstr "全"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:105
msgid "Vertex Buffer Objects (VBOs)"
-msgstr ""
+msgstr "頂点バッファーオブジェクト (VBOs)"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:108
msgid "VBO^Off"
-msgstr ""
+msgstr "無効"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:109
msgid "Vertices, some Tris (compatible)"
-msgstr ""
+msgstr "頂点、いくつかの三角形 (互換性)"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:110
#: qcsrc/menu/xonotic/dialog_settings_video.qc:114
"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"
-msgstr ""
+msgstr "頂点"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:115
msgid "Vertices and Triangles"
-msgstr ""
+msgstr "頂点と三角形"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:119
msgid "Brightness:"
-msgstr ""
+msgstr "明るさ:"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:121
msgid "Brightness of black"
-msgstr ""
+msgstr "黒の明るさ:"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:123
msgid "Contrast:"
-msgstr ""
+msgstr "コントラスト:"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:125
msgid "Brightness of white"
-msgstr ""
+msgstr "白の明るさ:"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:127
msgid "Gamma:"
-msgstr ""
+msgstr "ガンマ:"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:130
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:"
-msgstr ""
+msgstr "コントラストの増加:"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:136
msgid "By how much to multiply the contrast in dark areas"
-msgstr ""
+msgstr "暗い部分のコントラストをどれだけ掛けるか"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:139
msgid "Saturation:"
-msgstr ""
+msgstr "彩度:"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:142
msgid ""
"Saturation adjustment (0 = grayscale, 1 = normal, 2 = oversaturated), "
"requires GLSL color control"
msgstr ""
+"彩度調整 (0 = グレースケール、1 = 通常、2 = 過飽和)、GLSLカラーコントロールが"
+"必要する"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:146
msgid "LIT^Ambient:"
-msgstr ""
+msgstr "アンビエント:"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:148
msgid ""
"Ambient lighting, if set too high it tends to make light on maps look dull "
"and flat"
msgstr ""
+"アンビエント照明、設定が高すぎると、マップ上のライトが鈍く平坦に見える傾向が"
+"ある"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:150
msgid "Intensity:"
-msgstr ""
+msgstr "強度:"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:152
msgid "Global rendering brightness"
-msgstr ""
+msgstr "グローバルレンダリングの明るさ"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:155
msgid "Wait for GPU to finish each frame"
-msgstr ""
+msgstr "GPUが各フレームを完了するまで待つ"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:156
msgid ""
"Make the CPU wait for the GPU to finish each frame, can help with some "
"strange input or video lag on some machines"
msgstr ""
+"GPUが各フレームを完了するまでCPUを待機させる。一部のマシンでは奇妙な入力やビ"
+"デオの遅延に役立つ。"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:158
msgid "Use OpenGL 2.0 shaders (GLSL)"
-msgstr ""
+msgstr "OpenGL 2.0 シェーダー(GLSL)を使う"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:163
msgid "Psycho coloring (easter egg)"
-msgstr ""
+msgstr "サイコカラーズ (イースターエッグ)"
#: qcsrc/menu/xonotic/dialog_settings_video.qc:166
msgid "Trippy vertices (easter egg)"
-msgstr ""
+msgstr "幻覚の頂点 (イースターエッグ)"
#: qcsrc/menu/xonotic/dialog_singleplayer.qc:109
msgid "Instant action! (random map with bots)"
-msgstr ""
+msgstr "インスタントアクション! (ボット付きランダムマップ)"
#: qcsrc/menu/xonotic/dialog_singleplayer.qc:116
msgid "???"
-msgstr ""
+msgstr "???"
#: qcsrc/menu/xonotic/dialog_singleplayer.qc:129
msgid "Campaign Difficulty:"
-msgstr ""
+msgstr "キャンペーンの難しさ:"
#: qcsrc/menu/xonotic/dialog_singleplayer.qc:130
msgid "CSKL^Easy"
-msgstr ""
+msgstr "簡単"
#: qcsrc/menu/xonotic/dialog_singleplayer.qc:131
msgid "CSKL^Medium"
-msgstr ""
+msgstr "中"
#: qcsrc/menu/xonotic/dialog_singleplayer.qc:132
msgid "CSKL^Hard"
-msgstr ""
+msgstr "難い"
#: qcsrc/menu/xonotic/dialog_singleplayer.qc:134
msgid "Start Singleplayer!"
-msgstr ""
+msgstr "シングルプレイヤーを開始!"
#: qcsrc/menu/xonotic/dialog_singleplayer.qh:6
msgid "Singleplayer"
-msgstr ""
+msgstr "シングルプレイヤー"
#: qcsrc/menu/xonotic/dialog_singleplayer.qh:7
msgid "Play the singleplayer campaign or instant action matches against bots"
msgstr ""
+"ボットに対してシングルプレイヤーキャンペーンまたはインスタントアクションマッ"
+"チを遊ぶ"
#: qcsrc/menu/xonotic/dialog_singleplayer_winner.qh:7
msgid "Winner"
#: 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"
-msgstr ""
+msgstr "赤"
#: qcsrc/menu/xonotic/dialog_teamselect.qc:38
msgid "blue"
-msgstr ""
+msgstr "青"
#: qcsrc/menu/xonotic/dialog_teamselect.qc:39
msgid "yellow"
-msgstr ""
+msgstr "黄"
#: qcsrc/menu/xonotic/dialog_teamselect.qc:40
msgid "pink"
-msgstr ""
+msgstr "ピンク"
#: qcsrc/menu/xonotic/dialog_teamselect.qc:43
#: qcsrc/menu/xonotic/keybinder.qc:116
msgid "spectate"
-msgstr ""
+msgstr "観戦する"
#: qcsrc/menu/xonotic/dialog_teamselect.qh:7
msgid "Team Selection"
-msgstr ""
+msgstr "チームの選択"
#: qcsrc/menu/xonotic/dialog_uid2name.qc:10
msgid "Allow player statistics to use your nickname?"
-msgstr ""
+msgstr "選手の統計であなたのニックネームを使用できるように許可しますか?"
#: qcsrc/menu/xonotic/dialog_uid2name.qc:12
msgid "Answering \"No\" you will appear as \"Anonymous player\""
-msgstr ""
+msgstr "「いいえ」と答えると、 \"Anonymous player\" として表示される"
#: qcsrc/menu/xonotic/gametypelist.qc:87
msgid "teamplay"
#: qcsrc/menu/xonotic/gametypelist.qc:89
msgid "free for all"
-msgstr ""
+msgstr "やりたい放題"
#: qcsrc/menu/xonotic/keybinder.qc:35
msgid "Moving"
-msgstr ""
+msgstr "動き中"
#: qcsrc/menu/xonotic/keybinder.qc:36
msgid "forward"
-msgstr ""
+msgstr "前方"
#: qcsrc/menu/xonotic/keybinder.qc:37
msgid "backpedal"
-msgstr ""
+msgstr "後方"
#: qcsrc/menu/xonotic/keybinder.qc:38
msgid "strafe left"
-msgstr ""
+msgstr "左"
#: qcsrc/menu/xonotic/keybinder.qc:39
msgid "strafe right"
-msgstr ""
+msgstr "右"
#: qcsrc/menu/xonotic/keybinder.qc:40
msgid "jump / swim"
-msgstr ""
+msgstr "ジャンプする / 泳ぐ"
#: qcsrc/menu/xonotic/keybinder.qc:41
msgid "crouch / sink"
-msgstr ""
+msgstr "しゃがむ / 降りる"
#: qcsrc/menu/xonotic/keybinder.qc:42
msgid "off-hand hook"
-msgstr ""
+msgstr "フック"
#: qcsrc/menu/xonotic/keybinder.qc:43
msgid "jetpack"
-msgstr ""
+msgstr "ジェットパック"
#: qcsrc/menu/xonotic/keybinder.qc:46
msgid "Attacking"
-msgstr ""
+msgstr "攻撃中"
#: qcsrc/menu/xonotic/keybinder.qc:52
msgid "WEAPON^previous"
-msgstr ""
+msgstr "前"
#: qcsrc/menu/xonotic/keybinder.qc:53
msgid "WEAPON^next"
-msgstr ""
+msgstr "次"
#: qcsrc/menu/xonotic/keybinder.qc:54
msgid "WEAPON^previously used"
-msgstr ""
+msgstr "以前に使用された"
#: qcsrc/menu/xonotic/keybinder.qc:55
msgid "WEAPON^best"
-msgstr ""
+msgstr "最高"
#: qcsrc/menu/xonotic/keybinder.qc:56
msgid "reload"
-msgstr "リロード"
+msgstr "リロードする"
#: qcsrc/menu/xonotic/keybinder.qc:57
msgid "drop weapon / throw nade"
-msgstr ""
+msgstr "武器を落とす / 手榴弾を投げる"
#: qcsrc/menu/xonotic/keybinder.qc:84
msgid "hold zoom"
-msgstr ""
+msgstr "ズームを維持する"
#: qcsrc/menu/xonotic/keybinder.qc:85
msgid "toggle zoom"
-msgstr ""
+msgstr "ズームを切り替える"
#: qcsrc/menu/xonotic/keybinder.qc:86
msgid "show scores"
-msgstr ""
+msgstr "得点を表示する"
#: qcsrc/menu/xonotic/keybinder.qc:87
msgid "screen shot"
-msgstr ""
+msgstr "スクリーンショット"
#: qcsrc/menu/xonotic/keybinder.qc:88
msgid "maximize radar"
-msgstr ""
+msgstr "レーダーを最大化する"
#: qcsrc/menu/xonotic/keybinder.qc:89
msgid "3rd person view"
-msgstr ""
+msgstr "三人称ビュー"
#: qcsrc/menu/xonotic/keybinder.qc:90
msgid "enter spectator mode"
-msgstr ""
+msgstr "観客モードに入る"
#: qcsrc/menu/xonotic/keybinder.qc:93
msgid "Communication"
-msgstr ""
+msgstr "コミュニケーション"
#: qcsrc/menu/xonotic/keybinder.qc:94
msgid "public chat"
-msgstr ""
+msgstr "公衆チャット"
#: qcsrc/menu/xonotic/keybinder.qc:95
msgid "team chat"
-msgstr ""
+msgstr "チームチャット"
#: qcsrc/menu/xonotic/keybinder.qc:96
msgid "show chat history"
-msgstr ""
+msgstr "チャットの履歴を表示する"
#: qcsrc/menu/xonotic/keybinder.qc:97
msgid "vote YES"
-msgstr ""
+msgstr "「はい」を投票する"
#: qcsrc/menu/xonotic/keybinder.qc:98
msgid "vote NO"
-msgstr ""
+msgstr "「いいえ」を投票する"
#: qcsrc/menu/xonotic/keybinder.qc:102
msgid "Client"
-msgstr ""
+msgstr "クライアント"
#: qcsrc/menu/xonotic/keybinder.qc:106 qcsrc/menu/xonotic/keybinder.qc:108
msgid "enter console"
-msgstr ""
+msgstr "コンソールを入力する"
#: qcsrc/menu/xonotic/keybinder.qc:109
msgid "disconnect"
-msgstr ""
+msgstr "切断する"
#: qcsrc/menu/xonotic/keybinder.qc:110
msgid "quit"
-msgstr ""
+msgstr "ゲームをやめる"
#: qcsrc/menu/xonotic/keybinder.qc:114
msgid "auto-join team"
-msgstr ""
+msgstr "自動的にチームに参加する"
#: qcsrc/menu/xonotic/keybinder.qc:120
msgid "drop key/flag, exit vehicle"
-msgstr ""
+msgstr "鍵/旗を落とす / 乗り物から降りる"
#: qcsrc/menu/xonotic/keybinder.qc:121
msgid "suicide / respawn"
-msgstr ""
+msgstr "自殺する / 再び現れる"
#: qcsrc/menu/xonotic/keybinder.qc:122
msgid "quick menu"
-msgstr ""
+msgstr "クイックメニュー"
#: qcsrc/menu/xonotic/keybinder.qc:125
msgid "User defined"
-msgstr ""
+msgstr "ユーザー定義"
#: qcsrc/menu/xonotic/keybinder.qc:132
msgid "Development"
-msgstr ""
+msgstr "開発"
#: qcsrc/menu/xonotic/keybinder.qc:133
msgid "sandbox menu"
-msgstr ""
+msgstr "サンドボックスメニュー"
#: qcsrc/menu/xonotic/keybinder.qc:134
msgid "drag object (sandbox)"
-msgstr ""
+msgstr "オブジェクトをドラッグ (サンドボックス)"
#: qcsrc/menu/xonotic/keybinder.qc:135
msgid "waypoint editor menu"
-msgstr ""
+msgstr "ウェイポイント編集メニュー"
#: qcsrc/menu/xonotic/mainwindow.qc:96 qcsrc/menu/xonotic/mainwindow.qc:99
msgid "Do not press this button again!"
-msgstr ""
+msgstr "もう一度このボタンを押さないでください!"
#: qcsrc/menu/xonotic/maplist.qc:288
msgid ""
"Huh? Can't play this (m is NULL). Refiltering so this won't happen again."
msgstr ""
+"あれ? これを遊べません (m is NULL)。これが再度発生しないように再フィルタリン"
+"グします。"
#: qcsrc/menu/xonotic/maplist.qc:296
#, c-format
msgid "%s's Xonotic Server"
-msgstr ""
+msgstr "%s XONOTICサーバー"
#: qcsrc/menu/xonotic/maplist.qc:301
msgid ""
"Huh? Can't play this (invalid game type). Refiltering so this won't happen "
"again."
msgstr ""
+"あれ? これを遊べません (invalid game type)。これが再度発生しないように再フィ"
+"ルタリングします。"
#: qcsrc/menu/xonotic/playerlist.qc:102 qcsrc/menu/xonotic/playerlist.qc:112
msgid "spectator"
-msgstr ""
+msgstr "観客"
#: qcsrc/menu/xonotic/playermodel.qc:161
msgid "<no model found>"
-msgstr ""
+msgstr "<no model found>"
#: qcsrc/menu/xonotic/serverlist.qc:256
msgid "SERVER^Remove favorite"
-msgstr ""
+msgstr "好きなサーバーを取り除く"
#: qcsrc/menu/xonotic/serverlist.qc:257
msgid "Remove the currently highlighted server from bookmarks"
-msgstr ""
+msgstr "現在ハイライト表示されているサーバーをブックマークから削除する"
#: qcsrc/menu/xonotic/serverlist.qc:261
msgid "SERVER^Favorite"
-msgstr ""
+msgstr "好きなサーバーを加える"
#: qcsrc/menu/xonotic/serverlist.qc:262
msgid ""
"Bookmark the currently highlighted server so that it's faster to find in the "
"future"
msgstr ""
+"現在ハイライトされているサーバーにブックマークを付けて、未来見つけやすくする"
#: qcsrc/menu/xonotic/serverlist.qc:733
msgid "Ping"
-msgstr ""
+msgstr "Ping"
#: qcsrc/menu/xonotic/serverlist.qc:734
msgid "Hostname"
-msgstr ""
+msgstr "ホスト名"
#: qcsrc/menu/xonotic/serverlist.qc:735
msgid "Map"
-msgstr ""
+msgstr "マップ"
#: qcsrc/menu/xonotic/serverlist.qc:736
msgid "Type"
-msgstr ""
+msgstr "種類"
#: qcsrc/menu/xonotic/serverlist.qc:1019
#, c-format
msgid "AES level %d"
-msgstr ""
+msgstr "AESレベル %d"
#: qcsrc/menu/xonotic/serverlist.qc:1019
msgid "ENC^none"
-msgstr ""
+msgstr "なし"
#: qcsrc/menu/xonotic/serverlist.qc:1019
msgid "encryption:"
-msgstr ""
+msgstr "暗号化:"
#: qcsrc/menu/xonotic/serverlist.qc:1020
#, c-format
msgid "mod: %s"
-msgstr ""
+msgstr "mod: %s"
#: qcsrc/menu/xonotic/serverlist.qc:1022
#, c-format
msgid "modified settings"
-msgstr ""
+msgstr "変更された設定"
#: qcsrc/menu/xonotic/serverlist.qc:1022
#, c-format
msgid "official settings"
-msgstr ""
+msgstr "公式設定"
#: qcsrc/menu/xonotic/serverlist.qc:1024
msgid "stats disabled"
-msgstr ""
+msgstr "無効な状態"
#: qcsrc/menu/xonotic/serverlist.qc:1024
msgid "stats enabled"
-msgstr "状態 有効"
+msgstr "有効な状態"
#: qcsrc/menu/xonotic/serverlist.qh:152
msgid "SLCAT^Favorites"
-msgstr ""
+msgstr "好き"
#: qcsrc/menu/xonotic/serverlist.qh:153
msgid "SLCAT^Recommended"
-msgstr ""
+msgstr "推奨"
#: qcsrc/menu/xonotic/serverlist.qh:154
msgid "SLCAT^Normal Servers"
-msgstr ""
+msgstr "通常のサーバー"
#: qcsrc/menu/xonotic/serverlist.qh:155
msgid "SLCAT^Servers"
-msgstr ""
+msgstr "サーバー"
#: qcsrc/menu/xonotic/serverlist.qh:156
msgid "SLCAT^Competitive Mode"
-msgstr ""
+msgstr "SLCAT^競争モード"
#: qcsrc/menu/xonotic/serverlist.qh:157
msgid "SLCAT^Modified Servers"
-msgstr ""
+msgstr "変更されたサーバー"
#: qcsrc/menu/xonotic/serverlist.qh:158
msgid "SLCAT^Overkill"
-msgstr ""
+msgstr "オーバーキル"
#: qcsrc/menu/xonotic/serverlist.qh:159
msgid "SLCAT^InstaGib"
-msgstr ""
+msgstr "インスタギブ"
#: qcsrc/menu/xonotic/serverlist.qh:160
msgid "SLCAT^Defrag Mode"
-msgstr ""
+msgstr "デフラグモード"
#: qcsrc/menu/xonotic/skinlist.qc:70
msgid "<TITLE>"
-msgstr ""
+msgstr "<TITLE>"
#: qcsrc/menu/xonotic/skinlist.qc:71
msgid "<AUTHOR>"
-msgstr ""
+msgstr "<AUTHOR>"
#: qcsrc/menu/xonotic/slider_decibels.qc:72
msgid "VOL^MAX"
-msgstr ""
+msgstr "MAX"
#: qcsrc/menu/xonotic/slider_decibels.qc:74
msgid "VOL^OFF"
-msgstr ""
+msgstr "OFF"
#: qcsrc/menu/xonotic/slider_decibels.qc:82
#, c-format
msgid "%s dB"
-msgstr ""
+msgstr "%s dB"
#: qcsrc/menu/xonotic/slider_particles.qc:14
msgid "PART^OMG"
-msgstr ""
+msgstr "OMG"
#: qcsrc/menu/xonotic/slider_particles.qc:15
msgid "PART^Low"
-msgstr ""
+msgstr "低い"
#: qcsrc/menu/xonotic/slider_particles.qc:16
msgid "PART^Medium"
-msgstr ""
+msgstr "中"
#: qcsrc/menu/xonotic/slider_particles.qc:17
#: qcsrc/menu/xonotic/slider_sbfadetime.qc:14
msgid "PART^Normal"
-msgstr ""
+msgstr "通常"
#: qcsrc/menu/xonotic/slider_particles.qc:18
msgid "PART^High"
-msgstr ""
+msgstr "高い"
#: qcsrc/menu/xonotic/slider_particles.qc:19
msgid "PART^Ultra"
-msgstr ""
+msgstr "超"
#: qcsrc/menu/xonotic/slider_particles.qc:20
msgid "PART^Ultimate"
-msgstr ""
+msgstr "究極"
#: qcsrc/menu/xonotic/slider_picmip.qc:13
msgid ""
"Change the sharpness of the textures. Lowering it will effectively reduce "
"texture memory usage, but make the textures appear very blurry."
msgstr ""
+"テクスチャのシャープネスを変更します。これを下げると、テクスチャのメモリ使用"
+"量がエフェクト的に減少しますが、テクスチャが非常にぼやけて見えます。"
#: qcsrc/menu/xonotic/slider_resolution.qc:115
msgid "Screen resolution"
-msgstr ""
+msgstr "画面の解像度"
#: qcsrc/menu/xonotic/slider_sbfadetime.qc:13
msgid "PART^Slow"
-msgstr ""
+msgstr "遅い"
#: qcsrc/menu/xonotic/slider_sbfadetime.qc:15
msgid "PART^Fast"
-msgstr ""
+msgstr "速い"
#: qcsrc/menu/xonotic/slider_sbfadetime.qc:16
msgid "PART^Instant"
-msgstr ""
+msgstr "瞬時"
#: qcsrc/menu/xonotic/statslist.qc:29
msgid "January"
-msgstr ""
+msgstr "一月"
#: qcsrc/menu/xonotic/statslist.qc:30
msgid "February"
-msgstr ""
+msgstr "二月"
#: qcsrc/menu/xonotic/statslist.qc:31
msgid "March"
-msgstr ""
+msgstr "三月"
#: qcsrc/menu/xonotic/statslist.qc:32
msgid "April"
-msgstr ""
+msgstr "四月"
#: qcsrc/menu/xonotic/statslist.qc:33
msgid "May"
-msgstr ""
+msgstr "五月"
#: qcsrc/menu/xonotic/statslist.qc:34
msgid "June"
-msgstr ""
+msgstr "六月"
#: qcsrc/menu/xonotic/statslist.qc:35
msgid "July"
-msgstr ""
+msgstr "七月"
#: qcsrc/menu/xonotic/statslist.qc:36
msgid "August"
-msgstr ""
+msgstr "八月"
#: qcsrc/menu/xonotic/statslist.qc:37
msgid "September"
-msgstr ""
+msgstr "九月"
#: qcsrc/menu/xonotic/statslist.qc:38
msgid "October"
-msgstr ""
+msgstr "十月"
#: qcsrc/menu/xonotic/statslist.qc:39
msgid "November"
-msgstr ""
+msgstr "十一月"
#: qcsrc/menu/xonotic/statslist.qc:40
msgid "December"
-msgstr ""
+msgstr "十二月"
#: qcsrc/menu/xonotic/statslist.qc:46
#, no-c-format
msgid "DATE^%m %d, %Y"
-msgstr ""
+msgstr "DATE^%m %d, %Y"
#: qcsrc/menu/xonotic/statslist.qc:97
msgid "Joined:"
-msgstr ""
+msgstr "参加した:"
#: qcsrc/menu/xonotic/statslist.qc:104
msgid "Last match:"
-msgstr ""
+msgstr "最後の試合:"
#: qcsrc/menu/xonotic/statslist.qc:111
msgid "Time played:"
-msgstr ""
+msgstr "遊んだ時刻:"
#: qcsrc/menu/xonotic/statslist.qc:118 qcsrc/menu/xonotic/statslist.qc:231
msgid "Favorite map:"
-msgstr ""
+msgstr "好きなマップ:"
#: qcsrc/menu/xonotic/statslist.qc:150 qcsrc/menu/xonotic/statslist.qc:202
#: qcsrc/menu/xonotic/statslist.qc:245
#, c-format
msgid "Matches:"
-msgstr ""
+msgstr "試合:"
#: qcsrc/menu/xonotic/statslist.qc:155
#, c-format
msgid "Wins/Losses:"
-msgstr ""
+msgstr "勝利 / 負け"
#: qcsrc/menu/xonotic/statslist.qc:156
#, c-format
msgid "Win percentage:"
-msgstr ""
+msgstr "勝利率:"
#: qcsrc/menu/xonotic/statslist.qc:167
#, c-format
msgid "Kills/Deaths:"
-msgstr ""
+msgstr "キル数 / デス数:"
#: qcsrc/menu/xonotic/statslist.qc:173
#, c-format
msgid "Kill ratio:"
-msgstr ""
+msgstr "キル率:"
#: qcsrc/menu/xonotic/statslist.qc:208
msgid "ELO:"
-msgstr ""
+msgstr "ELO:"
#: qcsrc/menu/xonotic/statslist.qc:215
msgid "Rank:"
-msgstr ""
+msgstr "ランク:"
#: qcsrc/menu/xonotic/statslist.qc:222
msgid "Percentile:"
-msgstr ""
+msgstr "パーセンタイル:"
#: qcsrc/menu/xonotic/statslist.qc:247
#, c-format
msgid "%d (unranked)"
-msgstr ""
+msgstr "%d (ランクなし)"
#: qcsrc/menu/xonotic/util.qc:420
msgid "Update can be downloaded at:"
-msgstr ""
+msgstr "更新はここからダウンロードできます:"
#: qcsrc/menu/xonotic/util.qc:528
msgid "Autogenerating mapinfo for newly added maps..."
-msgstr ""
+msgstr "新しく追加されたマップの mapinfo を自動生成している..."
#: qcsrc/menu/xonotic/util.qc:566
#, c-format
msgid "Update to %s now!"
-msgstr ""
+msgstr "今すぐ %s に更新している!"
#: qcsrc/menu/xonotic/util.qc:650
msgid ""
"^1ERROR: Texture compression is required but not supported.\n"
"^1Expect visual problems."
msgstr ""
+"^1ERROR: テクスチャ圧縮が必要ですが、サポートされていません。\n"
+"^1視覚的な問題が予想されます。"
#: qcsrc/menu/xonotic/util.qc:780
msgid "Use default"
-msgstr ""
+msgstr "デフォルトで使用する"
#: qcsrc/menu/xonotic/util.qc:800
msgid "Team Color:"
-msgstr ""
+msgstr "チームカラー:"
# Antoni Das <Antonidas159@gmail.com>, 2015
# Antoni Das <Antonidas159@gmail.com>, 2015,2017
# sapphireliu <balancedliu@gmail.com>, 2014
+# CodingJellyfish <dumaosen_main01@outlook.com>, 2018
# kalawore <kalawore@outlook.com>, 2015
# Liang Liu <dxkliu@126.com>, 2019
# Losier Blackheath <losier.cc@gmail.com>, 2018
# sapphireliu <balancedliu@gmail.com>, 2014
-# 杜茂森 <dumaosen_main01@outlook.com>, 2018-2019
-# 杜茂森 <dumaosen_main01@outlook.com>, 2018
+# CodingJellyfish <dumaosen_main01@outlook.com>, 2018-2020
+# CodingJellyfish <dumaosen_main01@outlook.com>, 2018
# 韬 刘 <jiegushijia@gmail.com>, 2019
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-25 11:27+0000\n"
+"Last-Translator: CodingJellyfish <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"
// =================
seta hud_panel_centerprint_align "0.5"
seta hud_panel_centerprint_flip "0"
seta hud_panel_centerprint_fontscale "1"
-seta hud_panel_centerprint_fontscale_bold "1.8"
+seta hud_panel_centerprint_fontscale_bold "1.4"
seta hud_panel_centerprint_time "3"
seta hud_panel_centerprint_fade_in "0.2"
seta hud_panel_centerprint_fade_out "0.5"
seta hud_panel_centerprint_align "0.5"
seta hud_panel_centerprint_flip "0"
seta hud_panel_centerprint_fontscale "1"
-seta hud_panel_centerprint_fontscale_bold "1.8"
+seta hud_panel_centerprint_fontscale_bold "1.4"
seta hud_panel_centerprint_time "3"
seta hud_panel_centerprint_fade_in "0.2"
seta hud_panel_centerprint_fade_out "0.5"
seta hud_panel_centerprint_align "0.5"
seta hud_panel_centerprint_flip "0"
seta hud_panel_centerprint_fontscale "1"
-seta hud_panel_centerprint_fontscale_bold "1.8"
+seta hud_panel_centerprint_fontscale_bold "1.4"
seta hud_panel_centerprint_time "3"
seta hud_panel_centerprint_fade_in "0.2"
seta hud_panel_centerprint_fade_out "0.5"
seta hud_panel_centerprint_align "0.5"
seta hud_panel_centerprint_flip "0"
seta hud_panel_centerprint_fontscale "1"
-seta hud_panel_centerprint_fontscale_bold "1.8"
+seta hud_panel_centerprint_fontscale_bold "1.4"
seta hud_panel_centerprint_time "3"
seta hud_panel_centerprint_fade_in "0.2"
seta hud_panel_centerprint_fade_out "0.5"
seta hud_panel_centerprint_align "0.5"
seta hud_panel_centerprint_flip "0"
seta hud_panel_centerprint_fontscale "1"
-seta hud_panel_centerprint_fontscale_bold "1.8"
+seta hud_panel_centerprint_fontscale_bold "1.4"
seta hud_panel_centerprint_time "3"
seta hud_panel_centerprint_fade_in "0.2"
seta hud_panel_centerprint_fade_out "0.5"
seta hud_panel_centerprint_align "0.5"
seta hud_panel_centerprint_flip "0"
seta hud_panel_centerprint_fontscale "1"
-seta hud_panel_centerprint_fontscale_bold "1.8"
+seta hud_panel_centerprint_fontscale_bold "1.4"
seta hud_panel_centerprint_time "3"
seta hud_panel_centerprint_fade_in "0.2"
seta hud_panel_centerprint_fade_out "0.5"
de_CH "German (Switzerland)" "Deutsch (Schweiz)" 100%
en "English" "English" 100%
en_AU "English (Australia)" "English (Australia)" 75%
-es "Spanish" "Español" 98%
+es "Spanish" "Español" 100%
fr "French" "Français" 100%
ga "Irish" "Irish" 32%
it "Italian" "Italiano" 100%
pt "Portuguese" "Português" 84%
pt_BR "Portuguese (Brazil)" "Português (Brasil)" 99%
ro "Romanian" "Romana" 74%
-fi "Finnish" "Suomi" 98%
+fi "Finnish" "Suomi" 100%
el "Greek" "Ελληνική" 47%
be "Belarusian" "Беларуская" 54%
-bg "Bulgarian" "Български" 59%
+bg "Bulgarian" "Български" 63%
ru "Russian" "Русский" 100%
sr "Serbian" "Српски" 64%
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/teamradar.qc>
#include <client/view.qc>
-#include <client/commands/_mod.inc>
+#include <client/command/_mod.inc>
#include <client/hud/_mod.inc>
+#include <client/items/_mod.inc>
#include <client/mutators/_mod.inc>
#include <client/weapons/_mod.inc>
#include <client/teamradar.qh>
#include <client/view.qh>
-#include <client/commands/_mod.qh>
+#include <client/command/_mod.qh>
#include <client/hud/_mod.qh>
+#include <client/items/_mod.qh>
#include <client/mutators/_mod.qh>
#include <client/weapons/_mod.qh>
float autocvar_hud_panel_centerprint_fade_minfontsize = 0;
bool autocvar_hud_panel_centerprint_flip;
float autocvar_hud_panel_centerprint_fontscale;
-float autocvar_hud_panel_centerprint_fontscale_bold = 1.8;
+float autocvar_hud_panel_centerprint_fontscale_bold = 1.4;
float autocvar_hud_panel_centerprint_time;
bool autocvar_hud_panel_chat;
bool autocvar_hud_panel_engineinfo;
#include <common/util.qh>
#include <client/autocvars.qh>
-#include <client/defs.qh>
#include <client/main.qh>
#define CONSTANT_SPEED_DECAY
#pragma once
-entityclass(BGMScript);
-classfield(BGMScript) .string bgmscript;
-classfield(BGMScript) .float bgmscriptattack;
-classfield(BGMScript) .float bgmscriptdecay;
-classfield(BGMScript) .float bgmscriptsustain;
-classfield(BGMScript) .float bgmscriptrelease;
+#include <common/mapobjects/bgmscript.qh>
classfield(BGMScript) .float just_toggled;
-#ifdef CSQC
+float bgmtime;
+
void BGMScript_InitEntity(entity e);
float doBGMScript(entity e);
-#endif
--- /dev/null
+// generated file; do not modify
+#ifdef CSQC
+ #include <client/command/cl_cmd.qc>
+#endif
--- /dev/null
+// generated file; do not modify
+#ifdef CSQC
+ #include <client/command/cl_cmd.qh>
+#endif
--- /dev/null
+#include "cl_cmd.qh"
+// ==============================================
+// CSQC client commands code, written by Samual
+// Last updated: December 28th, 2011
+// ==============================================
+
+#include <common/command/_mod.qh>
+#include "cl_cmd.qh"
+
+#include "../autocvars.qh"
+#include <client/hud/_mod.qh>
+#include <client/hud/panel/quickmenu.qh>
+#include <client/hud/panel/radar.qh>
+#include <client/hud/panel/scoreboard.qh>
+#include <client/hud/panel/vote.qh>
+#include "../main.qh"
+#include "../mapvoting.qh"
+#include "../miscfunctions.qh"
+#include <client/view.qh>
+
+#include <client/mutators/_mod.qh>
+
+#include <common/minigames/cl_minigames_hud.qh>
+
+#include <common/mapinfo.qh>
+
+void DrawDebugModel(entity this)
+{
+ if (time - floor(time) > 0.5)
+ {
+ PolyDrawModel(this);
+ this.drawmask = 0;
+ }
+ else
+ {
+ this.renderflags = 0;
+ this.drawmask = MASK_NORMAL;
+ }
+}
+
+
+// =======================
+// Command Sub-Functions
+// =======================
+
+void LocalCommand_blurtest(int request)
+{
+ TC(int, request);
+ // Simple command to work with postprocessing temporarily... possibly completely pointless, the glsl shader is used for a real feature now...
+ // Anyway, to enable it, just compile the client with -DBLURTEST and then you can use the command.
+
+ #ifdef BLURTEST
+ switch (request)
+ {
+ case CMD_REQUEST_COMMAND:
+ {
+ blurtest_time0 = time;
+ blurtest_time1 = time + stof(argv(1));
+ blurtest_radius = stof(argv(2));
+ blurtest_power = stof(argv(3));
+ LOG_INFO("Enabled blurtest");
+ return;
+ }
+
+ default:
+ case CMD_REQUEST_USAGE:
+ {
+ LOG_HELP("Usage:^3 cl_cmd blurtest");
+ LOG_HELP(" No arguments required.");
+ return;
+ }
+ }
+ #else
+ if (request)
+ {
+ LOG_INFO("Blurtest is not enabled on this client.");
+ return;
+ }
+ #endif
+}
+
+void LocalCommand_boxparticles(int request, int argc)
+{
+ TC(int, request); TC(int, argc);
+ switch (request)
+ {
+ case CMD_REQUEST_COMMAND:
+ {
+ if (argc == 9)
+ {
+ int effect = _particleeffectnum(argv(1));
+ if (effect >= 0)
+ {
+ int index = stoi(argv(2));
+ entity own;
+ if (index <= 0)
+ own = entitybyindex(-index);
+ else
+ own = findfloat(NULL, entnum, index);
+ vector org_from = stov(argv(3));
+ vector org_to = stov(argv(4));
+ vector dir_from = stov(argv(5));
+ vector dir_to = stov(argv(6));
+ int countmultiplier = stoi(argv(7));
+ int flags = stoi(argv(8));
+ boxparticles(effect, own, org_from, org_to, dir_from, dir_to, countmultiplier, flags);
+ return;
+ }
+ }
+ }
+
+ default:
+ LOG_INFOF("Incorrect parameters for ^2%s^7", argv(0));
+ case CMD_REQUEST_USAGE:
+ {
+ LOG_HELP(
+ "Usage:^3 cl_cmd boxparticles effectname own org_from org_to, dir_from, dir_to, countmultiplier, flags\n"
+ " 'effectname' is the name of a particle effect in effectinfo.txt\n"
+ " 'own' is the entity number of the owner (negative for csqc ent, positive for svqc ent)\n"
+ " 'org_from' is the starting origin of the box\n"
+ " 'org_to' is the ending origin of the box\n"
+ " 'dir_from' is the minimum velocity\n"
+ " 'dir_to' is the maximum velocity\n"
+ " 'countmultiplier' defines a multiplier for the particle count (affects count only, not countabsolute or trailspacing)\n"
+ " 'flags' can contain:\n"
+ " 1 to respect globals particles_alphamin, particles_alphamax (set right before via prvm_globalset client)\n"
+ " 2 to respect globals particles_colormin, particles_colormax (set right before via prvm_globalset client)\n"
+ " 4 to respect globals particles_fade (set right before via prvm_globalset client)\n"
+ " 128 to draw a trail, not a box"
+ );
+ return;
+ }
+ }
+}
+
+void LocalCommand_create_scrshot_ent(int request)
+{
+ TC(int, request);
+ switch (request)
+ {
+ case CMD_REQUEST_COMMAND:
+ {
+ string path = ((argv(1) == "") ? "" : strcat(argv(1), "/"));
+ string filename = strcat(path, MapInfo_Map_bspname, "_scrshot_ent.txt");
+ int fh = fopen(filename, FILE_APPEND);
+
+ if (fh >= 0)
+ {
+ fputs(fh, "{\n");
+ fputs(fh, strcat("\"classname\" \"info_autoscreenshot\"\n"));
+ fputs(fh, strcat("\"origin\" \"", strcat(ftos(view_origin.x), " ", ftos(view_origin.y), " ", ftos(view_origin.z)), "\"\n"));
+ fputs(fh, strcat("\"angles\" \"", strcat(ftos(view_angles.x), " ", ftos(view_angles.y), " ", ftos(view_angles.z)), "\"\n"));
+ fputs(fh, "}\n");
+
+ LOG_INFO("Completed screenshot entity dump in ^2data/data/", path, MapInfo_Map_bspname, "_scrshot_ent.txt^7.");
+
+ fclose(fh);
+ }
+ else
+ {
+ LOG_INFO("^1Error: ^7Could not dump to file!");
+ }
+ return;
+ }
+
+ default:
+ case CMD_REQUEST_USAGE:
+ {
+ LOG_HELP("Usage:^3 cl_cmd create_scrshot_ent [path]");
+ LOG_HELP(" Where 'path' can be the subdirectory of data/data in which the file is saved.");
+ return;
+ }
+ }
+}
+
+void LocalCommand_debugmodel(int request, int argc)
+{
+ TC(int, request); TC(int, argc);
+ switch (request)
+ {
+ case CMD_REQUEST_COMMAND:
+ {
+ string modelname = argv(1);
+
+ entity debugmodel_entity = new(debugmodel);
+ precache_model(modelname);
+ _setmodel(debugmodel_entity, modelname);
+ setorigin(debugmodel_entity, view_origin);
+ debugmodel_entity.angles = view_angles;
+ debugmodel_entity.draw = DrawDebugModel;
+ IL_PUSH(g_drawables, debugmodel_entity);
+
+ return;
+ }
+
+ default:
+ case CMD_REQUEST_USAGE:
+ {
+ LOG_HELP("Usage:^3 cl_cmd debugmodel model");
+ LOG_HELP(" Where 'model' is a string of the model name to use for the debug model.");
+ return;
+ }
+ }
+}
+
+void LocalCommand_handlevote(int request, int argc)
+{
+ TC(int, request); TC(int, argc);
+ switch (request)
+ {
+ case CMD_REQUEST_COMMAND:
+ {
+ int vote_selection;
+ string vote_string;
+
+ if (InterpretBoolean(argv(1)))
+ {
+ vote_selection = 2;
+ vote_string = "yes";
+ }
+ else
+ {
+ vote_selection = 1;
+ vote_string = "no";
+ }
+
+ if (vote_selection)
+ {
+ if (uid2name_dialog) // handled by "uid2name" option
+ {
+ vote_active = 0;
+ vote_prev = 0;
+ vote_change = -9999;
+ localcmd(strcat("setreport cl_allow_uid2name ", ftos(vote_selection - 1), "\n"));
+ uid2name_dialog = 0;
+ }
+ else { localcmd(strcat("cmd vote ", vote_string, "\n")); }
+
+ return;
+ }
+ }
+
+ default:
+ LOG_INFOF("Incorrect parameters for ^2%s^7", argv(0));
+ case CMD_REQUEST_USAGE:
+ {
+ LOG_HELP("Usage:^3 cl_cmd handlevote vote");
+ LOG_HELP(" Where 'vote' is the selection for either the current poll or uid2name.");
+ return;
+ }
+ }
+}
+
+void LocalCommand_hud(int request, int argc)
+{
+ TC(int, request); TC(int, argc);
+ switch (request)
+ {
+ case CMD_REQUEST_COMMAND:
+ {
+ if(MUTATOR_CALLHOOK(HUD_Command, argc))
+ return;
+
+ switch (argv(1))
+ {
+ case "configure":
+ {
+ cvar_set("_hud_configure", ftos(!autocvar__hud_configure));
+ return;
+ }
+
+ case "quickmenu":
+ {
+ if (argv(2) == "help")
+ {
+ LOG_HELP(" quickmenu [[default | file | \"\"] submenu file]");
+ LOG_HELP("Called without options (or with \"\") loads either the default quickmenu or a quickmenu file if hud_panel_quickmenu_file is set to a valid filename.");
+ LOG_HELP("A submenu name can be given to open the quickmenu directly in a submenu; it requires to specify 'default', 'file' or '\"\"' option.");
+ LOG_HELP("A file name can also be given to open a different quickmenu");
+ return;
+ }
+ string file = ((argv(4) == "") ? autocvar_hud_panel_quickmenu_file : argv(4));
+ if (QuickMenu_IsOpened())
+ QuickMenu_Close();
+ else
+ QuickMenu_Open(argv(2), argv(3), file); // mode, submenu
+ return;
+ }
+
+ case "save":
+ {
+ if (argv(2))
+ {
+ HUD_Panel_ExportCfg(argv(2));
+ return;
+ }
+ else
+ {
+ break; // go to usage, we're missing the paramater needed here.
+ }
+ }
+
+ case "scoreboard_columns_set":
+ {
+ Cmd_Scoreboard_SetFields(argc);
+ return;
+ }
+
+ case "scoreboard_columns_help":
+ {
+ Cmd_Scoreboard_Help();
+ return;
+ }
+
+ case "radar":
+ {
+ if (argv(2))
+ HUD_Radar_Show_Maximized(InterpretBoolean(argv(2)), 0);
+ else
+ HUD_Radar_Show_Maximized(!hud_panel_radar_maximized, 0);
+ return;
+ }
+
+ case "clickradar":
+ {
+ if(!isdemo())
+ HUD_Radar_Show_Maximized(!hud_panel_radar_mouse, 1);
+ return;
+ }
+ }
+ }
+
+ default:
+ LOG_INFOF("Incorrect parameters for ^2%s^7", argv(0));
+ case CMD_REQUEST_USAGE:
+ {
+ LOG_HELP("Usage:^3 cl_cmd hud action [configname | radartoggle | layout]");
+ LOG_HELP(" Where 'action' is the command to complete,");
+ LOG_HELP(" 'configname' is the name to save to for \"save\" action,");
+ LOG_HELP(" 'radartoggle' is to control hud_panel_radar_maximized for \"radar\" action,");
+ LOG_HELP(" and 'layout' is how to organize the scoreboard columns for the set action.");
+ LOG_HELP(" Full list of commands here: \"configure, quickmenu, minigame, save, scoreboard_columns_help, scoreboard_columns_set, radar.\"");
+ return;
+ }
+ }
+}
+
+void LocalCommand_localprint(int request, int argc)
+{
+ TC(int, request); TC(int, argc);
+ switch (request)
+ {
+ case CMD_REQUEST_COMMAND:
+ {
+ if (argv(1))
+ {
+ centerprint_AddStandard(argv(1));
+ return;
+ }
+ }
+
+ default:
+ LOG_INFOF("Incorrect parameters for ^2%s^7", argv(0));
+ case CMD_REQUEST_USAGE:
+ {
+ LOG_HELP("Usage:^3 cl_cmd localprint \"message\"");
+ LOG_HELP(" 'message' is the centerprint message to send to yourself.");
+ return;
+ }
+ }
+}
+
+void LocalCommand_mv_download(int request, int argc)
+{
+ TC(int, request); TC(int, argc);
+ switch (request)
+ {
+ case CMD_REQUEST_COMMAND:
+ {
+ if (argv(1))
+ {
+ Cmd_MapVote_MapDownload(argc);
+ return;
+ }
+ }
+
+ default:
+ LOG_INFOF("Incorrect parameters for ^2%s^7", argv(0));
+ case CMD_REQUEST_USAGE:
+ {
+ LOG_HELP("Usage:^3 cl_cmd mv_download mapid");
+ LOG_HELP(" Where 'mapid' is the id number of the map to request an image of on the map vote selection menu.");
+ return;
+ }
+ }
+}
+
+void LocalCommand_sendcvar(int request, int argc)
+{
+ TC(int, request); TC(int, argc);
+ switch (request)
+ {
+ case CMD_REQUEST_COMMAND:
+ {
+ if (argv(1))
+ {
+ // W_FixWeaponOrder will trash argv, so save what we need.
+ string thiscvar = string_null; strcpy(thiscvar, argv(1));
+ string s = cvar_string(thiscvar);
+
+ if (thiscvar == "cl_weaponpriority")
+ s = W_FixWeaponOrder(W_NumberWeaponOrder(s), 1);
+ else if (substring(thiscvar, 0, 17) == "cl_weaponpriority" && strlen(thiscvar) == 18)
+ s = W_FixWeaponOrder(W_NumberWeaponOrder(s), 0);
+
+ localcmd("cmd sentcvar ", thiscvar, " \"", s, "\"\n");
+ strfree(thiscvar);
+ return;
+ }
+ }
+
+ default:
+ LOG_INFOF("Incorrect parameters for ^2%s^7", argv(0));
+ case CMD_REQUEST_USAGE:
+ {
+ LOG_HELP("Usage:^3 cl_cmd sendcvar <cvar>");
+ LOG_HELP(" Where 'cvar' is the cvar to send to the server.");
+ return;
+ }
+ }
+}
+
+/* use this when creating a new command, making sure to place it in alphabetical order... also,
+** ADD ALL NEW COMMANDS TO commands.cfg WITH PROPER ALIASES IN THE SAME FASHION!
+void LocalCommand_(int request)
+{
+ switch(request)
+ {
+ case CMD_REQUEST_COMMAND:
+ {
+
+ return;
+ }
+
+ default:
+ case CMD_REQUEST_USAGE:
+ {
+ LOG_HELP("Usage:^3 cl_cmd ");
+ LOG_HELP(" No arguments required.");
+ return;
+ }
+ }
+}
+*/
+
+
+// ==================================
+// Macro system for client commands
+// ==================================
+
+// Normally do not hard code aliases for these, instead create them in commands.cfg... also: keep in alphabetical order, please ;)
+CLIENT_COMMAND(blurtest, "Feature for testing blur postprocessing") { LocalCommand_blurtest(request); }
+CLIENT_COMMAND(boxparticles, "Spawn particles manually") { LocalCommand_boxparticles(request, arguments); }
+CLIENT_COMMAND(create_scrshot_ent, "Create an entity at this location for automatic screenshots") { LocalCommand_create_scrshot_ent(request); }
+CLIENT_COMMAND(debugmodel, "Spawn a debug model manually") { LocalCommand_debugmodel(request, arguments); }
+CLIENT_COMMAND(handlevote, "System to handle selecting a vote or option") { LocalCommand_handlevote(request, arguments); }
+CLIENT_COMMAND(hud, "Commands regarding/controlling the HUD system") { LocalCommand_hud(request, arguments); }
+CLIENT_COMMAND(localprint, "Create your own centerprint sent to yourself") { LocalCommand_localprint(request, arguments); }
+CLIENT_COMMAND(mv_download, "Retrieve mapshot picture from the server") { LocalCommand_mv_download(request, arguments); }
+CLIENT_COMMAND(sendcvar, "Send a cvar to the server (like cl_weaponpriority)") { LocalCommand_sendcvar(request, arguments); }
+
+void LocalCommand_macro_help()
+{
+ FOREACH(CLIENT_COMMANDS, true, LOG_HELPF(" ^2%s^7: %s", it.m_name, it.m_description));
+}
+
+bool LocalCommand_macro_command(int argc, string command)
+{
+ string c = strtolower(argv(0));
+ FOREACH(CLIENT_COMMANDS, it.m_name == c, {
+ it.m_invokecmd(it, CMD_REQUEST_COMMAND, NULL, argc, command);
+ return true;
+ });
+ return false;
+}
+
+bool LocalCommand_macro_usage(int argc)
+{
+ string c = strtolower(argv(1));
+ FOREACH(CLIENT_COMMANDS, it.m_name == c, {
+ it.m_invokecmd(it, CMD_REQUEST_USAGE, NULL, argc, "");
+ return true;
+ });
+ return false;
+}
+
+void LocalCommand_macro_write_aliases(int fh)
+{
+ FOREACH(CLIENT_COMMANDS, true, CMD_Write_Alias("qc_cmd_cl", it.m_name, it.m_description));
+}
+
+
+// =========================================
+// Main Function Called By Engine (cl_cmd)
+// =========================================
+// If this function exists, client code handles gamecommand instead of the engine code.
+
+void GameCommand(string command)
+{
+ int argc = tokenize_console(command);
+
+ // Guide for working with argc arguments by example:
+ // argc: 1 - 2 - 3 - 4
+ // argv: 0 - 1 - 2 - 3
+ // cmd vote - master - login - password
+ string s = strtolower(argv(0));
+ if (s == "help")
+ {
+ if (argc == 1)
+ {
+ LOG_HELP("Client console commands:");
+ LocalCommand_macro_help();
+
+ LOG_HELP("\nGeneric commands shared by all programs:");
+ GenericCommand_macro_help();
+
+ LOG_HELP("\nUsage:^3 cl_cmd COMMAND...^7, where possible commands are listed above.");
+ LOG_HELP("For help about a specific command, type cl_cmd help COMMAND");
+
+ return;
+ }
+ else if (GenericCommand_macro_usage(argc)) // Instead of trying to call a command, we're going to see detailed information about it
+ {
+ return;
+ }
+ else if (LocalCommand_macro_usage(argc)) // now try for normal commands too
+ {
+ return;
+ }
+ }
+ // continue as usual and scan for normal commands
+ if (GenericCommand(command) // handled by common/command/generic.qc
+ || LocalCommand_macro_command(argc, command) // handled by one of the above LocalCommand_* functions
+ || MUTATOR_CALLHOOK(CSQC_ConsoleCommand, s, argc, command) // handled by a mutator
+ ) return;
+
+ // nothing above caught the command, must be invalid
+ LOG_INFO(((command != "") ? strcat("Unknown client command \"", command, "\"") : "No command provided"), ". For a list of supported commands, try cl_cmd help.");
+}
+
+
+// ===================================
+// Macro system for console commands
+// ===================================
+
+// These functions are here specifically to add special + - commands to the game, and are not really normal commands.
+// Please add client commands to the function above this, as this is only for special reasons.
+// NOTE: showaccuracy is kept as legacy command
+#define CONSOLE_COMMANDS_NORMAL() \
+ CONSOLE_COMMAND("+showscores", { scoreboard_showscores = true; }) \
+ CONSOLE_COMMAND("-showscores", { scoreboard_showscores = false; }) \
+ CONSOLE_COMMAND("+showaccuracy", { }) \
+ CONSOLE_COMMAND("-showaccuracy", { }) \
+ /* nothing */
+
+#define CONSOLE_COMMANDS_MOVEMENT() \
+ CONSOLE_COMMAND("+forward", { ++camera_direction.x; }) \
+ CONSOLE_COMMAND("-forward", { --camera_direction.x; }) \
+ CONSOLE_COMMAND("+back", { --camera_direction.x; }) \
+ CONSOLE_COMMAND("-back", { ++camera_direction.x; }) \
+ CONSOLE_COMMAND("+moveup", { ++camera_direction.z; }) \
+ CONSOLE_COMMAND("-moveup", { --camera_direction.z; }) \
+ CONSOLE_COMMAND("+movedown", { --camera_direction.z; }) \
+ CONSOLE_COMMAND("-movedown", { ++camera_direction.z; }) \
+ CONSOLE_COMMAND("+moveright", { --camera_direction.y; }) \
+ CONSOLE_COMMAND("-moveright", { ++camera_direction.y; }) \
+ CONSOLE_COMMAND("+moveleft", { ++camera_direction.y; }) \
+ CONSOLE_COMMAND("-moveleft", { --camera_direction.y; }) \
+ CONSOLE_COMMAND("+roll_right", { ++camera_roll; }) \
+ CONSOLE_COMMAND("-roll_right", { --camera_roll; }) \
+ CONSOLE_COMMAND("+roll_left", { --camera_roll; }) \
+ CONSOLE_COMMAND("-roll_left", { ++camera_roll; }) \
+ /* nothing */
+
+void ConsoleCommand_macro_init()
+{
+ // first init normal commands
+ #define CONSOLE_COMMAND(name, execution) \
+ { registercommand(name); }
+
+ CONSOLE_COMMANDS_NORMAL();
+ #undef CONSOLE_COMMAND
+
+ // then init movement commands
+ #ifndef CAMERATEST
+ if (isdemo())
+ {
+ #endif
+ #define CONSOLE_COMMAND(name, execution) \
+ registercommand(name);
+
+ CONSOLE_COMMANDS_MOVEMENT();
+ #undef CONSOLE_COMMAND
+ #ifndef CAMERATEST
+}
+ #endif
+}
+
+bool ConsoleCommand_macro_normal(string s, int argc)
+{
+ #define CONSOLE_COMMAND(name, execution) \
+ { if (name == s) { { execution } return true; } }
+
+ CONSOLE_COMMANDS_NORMAL();
+ #undef CONSOLE_COMMAND
+
+ return false;
+}
+
+bool ConsoleCommand_macro_movement(string s, int argc)
+{
+ if (camera_active)
+ {
+ #define CONSOLE_COMMAND(name, execution) \
+ { if (name == s) { { execution } return true; } }
+
+ CONSOLE_COMMANDS_MOVEMENT();
+ #undef CONSOLE_COMMAND
+ }
+
+ return false;
+}
+
+
+// ======================================================
+// Main Function Called By Engine (registered commands)
+// ======================================================
+// Used to parse commands in the console that have been registered with the "registercommand" function
+
+bool CSQC_ConsoleCommand(string command)
+{
+ int argc = tokenize_console(command);
+ string s = strtolower(argv(0));
+ // Return value should be true if CSQC handled the command, otherwise return false to have the engine handle it.
+ return ConsoleCommand_macro_normal(s, argc)
+ || ConsoleCommand_macro_movement(s, argc)
+ ;
+}
--- /dev/null
+#pragma once
+
+void Cmd_Scoreboard_SetFields(int);
+void Cmd_Scoreboard_Help();
+void ConsoleCommand_macro_init();
+
+// used by common/command/generic.qc:GenericCommand_dumpcommands to list all commands into a .txt file
+void LocalCommand_macro_write_aliases(int fh);
+
+REGISTRY(CLIENT_COMMANDS, BITS(7))
+REGISTER_REGISTRY(CLIENT_COMMANDS)
+REGISTRY_SORT(CLIENT_COMMANDS)
+
+REGISTRY_DEFINE_GET(CLIENT_COMMANDS, NULL)
+
+#define CLIENT_COMMAND(id, description) \
+ CLASS(clientcommand_##id, Command) \
+ ATTRIB(clientcommand_##id, m_name, string, #id); \
+ ATTRIB(clientcommand_##id, m_description, string, description); \
+ ENDCLASS(clientcommand_##id) \
+ REGISTER(CLIENT_COMMANDS, CMD_CL, id, m_id, NEW(clientcommand_##id)); \
+ METHOD(clientcommand_##id, m_invokecmd, void(clientcommand_##id this, int request, entity caller, int arguments, string command))
+
+STATIC_INIT(CLIENT_COMMANDS_aliases) {
+ FOREACH(CLIENT_COMMANDS, true, localcmd(sprintf("alias %1$s \"%2$s %1$s ${* ?}\"\n", it.m_name, "qc_cmd_cl")));
+}
+++ /dev/null
-// generated file; do not modify
-#ifdef CSQC
- #include <client/commands/cl_cmd.qc>
-#endif
+++ /dev/null
-// generated file; do not modify
-#ifdef CSQC
- #include <client/commands/cl_cmd.qh>
-#endif
+++ /dev/null
-#include "cl_cmd.qh"
-// ==============================================
-// CSQC client commands code, written by Samual
-// Last updated: December 28th, 2011
-// ==============================================
-
-#include <common/command/_mod.qh>
-#include "cl_cmd.qh"
-
-#include "../autocvars.qh"
-#include "../defs.qh"
-#include <client/hud/_mod.qh>
-#include <client/hud/panel/quickmenu.qh>
-#include <client/hud/panel/radar.qh>
-#include "../main.qh"
-#include "../mapvoting.qh"
-#include "../miscfunctions.qh"
-
-#include <client/mutators/_mod.qh>
-
-#include <common/minigames/cl_minigames_hud.qh>
-
-#include <common/mapinfo.qh>
-
-void DrawDebugModel(entity this)
-{
- if (time - floor(time) > 0.5)
- {
- PolyDrawModel(this);
- this.drawmask = 0;
- }
- else
- {
- this.renderflags = 0;
- this.drawmask = MASK_NORMAL;
- }
-}
-
-
-// =======================
-// Command Sub-Functions
-// =======================
-
-void LocalCommand_blurtest(int request)
-{
- TC(int, request);
- // Simple command to work with postprocessing temporarily... possibly completely pointless, the glsl shader is used for a real feature now...
- // Anyway, to enable it, just compile the client with -DBLURTEST and then you can use the command.
-
- #ifdef BLURTEST
- switch (request)
- {
- case CMD_REQUEST_COMMAND:
- {
- blurtest_time0 = time;
- blurtest_time1 = time + stof(argv(1));
- blurtest_radius = stof(argv(2));
- blurtest_power = stof(argv(3));
- LOG_INFO("Enabled blurtest");
- return;
- }
-
- default:
- case CMD_REQUEST_USAGE:
- {
- LOG_HELP("Usage:^3 cl_cmd blurtest");
- LOG_HELP(" No arguments required.");
- return;
- }
- }
- #else
- if (request)
- {
- LOG_INFO("Blurtest is not enabled on this client.");
- return;
- }
- #endif
-}
-
-void LocalCommand_boxparticles(int request, int argc)
-{
- TC(int, request); TC(int, argc);
- switch (request)
- {
- case CMD_REQUEST_COMMAND:
- {
- if (argc == 9)
- {
- int effect = _particleeffectnum(argv(1));
- if (effect >= 0)
- {
- int index = stoi(argv(2));
- entity own;
- if (index <= 0)
- own = entitybyindex(-index);
- else
- own = findfloat(NULL, entnum, index);
- vector org_from = stov(argv(3));
- vector org_to = stov(argv(4));
- vector dir_from = stov(argv(5));
- vector dir_to = stov(argv(6));
- int countmultiplier = stoi(argv(7));
- int flags = stoi(argv(8));
- boxparticles(effect, own, org_from, org_to, dir_from, dir_to, countmultiplier, flags);
- return;
- }
- }
- }
-
- default:
- LOG_INFOF("Incorrect parameters for ^2%s^7", argv(0));
- case CMD_REQUEST_USAGE:
- {
- LOG_HELP(
- "Usage:^3 cl_cmd boxparticles effectname own org_from org_to, dir_from, dir_to, countmultiplier, flags\n"
- " 'effectname' is the name of a particle effect in effectinfo.txt\n"
- " 'own' is the entity number of the owner (negative for csqc ent, positive for svqc ent)\n"
- " 'org_from' is the starting origin of the box\n"
- " 'org_to' is the ending origin of the box\n"
- " 'dir_from' is the minimum velocity\n"
- " 'dir_to' is the maximum velocity\n"
- " 'countmultiplier' defines a multiplier for the particle count (affects count only, not countabsolute or trailspacing)\n"
- " 'flags' can contain:\n"
- " 1 to respect globals particles_alphamin, particles_alphamax (set right before via prvm_globalset client)\n"
- " 2 to respect globals particles_colormin, particles_colormax (set right before via prvm_globalset client)\n"
- " 4 to respect globals particles_fade (set right before via prvm_globalset client)\n"
- " 128 to draw a trail, not a box"
- );
- return;
- }
- }
-}
-
-void LocalCommand_create_scrshot_ent(int request)
-{
- TC(int, request);
- switch (request)
- {
- case CMD_REQUEST_COMMAND:
- {
- string path = ((argv(1) == "") ? "" : strcat(argv(1), "/"));
- string filename = strcat(path, MapInfo_Map_bspname, "_scrshot_ent.txt");
- int fh = fopen(filename, FILE_APPEND);
-
- if (fh >= 0)
- {
- fputs(fh, "{\n");
- fputs(fh, strcat("\"classname\" \"info_autoscreenshot\"\n"));
- fputs(fh, strcat("\"origin\" \"", strcat(ftos(view_origin.x), " ", ftos(view_origin.y), " ", ftos(view_origin.z)), "\"\n"));
- fputs(fh, strcat("\"angles\" \"", strcat(ftos(view_angles.x), " ", ftos(view_angles.y), " ", ftos(view_angles.z)), "\"\n"));
- fputs(fh, "}\n");
-
- LOG_INFO("Completed screenshot entity dump in ^2data/data/", path, MapInfo_Map_bspname, "_scrshot_ent.txt^7.");
-
- fclose(fh);
- }
- else
- {
- LOG_INFO("^1Error: ^7Could not dump to file!");
- }
- return;
- }
-
- default:
- case CMD_REQUEST_USAGE:
- {
- LOG_HELP("Usage:^3 cl_cmd create_scrshot_ent [path]");
- LOG_HELP(" Where 'path' can be the subdirectory of data/data in which the file is saved.");
- return;
- }
- }
-}
-
-void LocalCommand_debugmodel(int request, int argc)
-{
- TC(int, request); TC(int, argc);
- switch (request)
- {
- case CMD_REQUEST_COMMAND:
- {
- string modelname = argv(1);
-
- entity debugmodel_entity = new(debugmodel);
- precache_model(modelname);
- _setmodel(debugmodel_entity, modelname);
- setorigin(debugmodel_entity, view_origin);
- debugmodel_entity.angles = view_angles;
- debugmodel_entity.draw = DrawDebugModel;
- IL_PUSH(g_drawables, debugmodel_entity);
-
- return;
- }
-
- default:
- case CMD_REQUEST_USAGE:
- {
- LOG_HELP("Usage:^3 cl_cmd debugmodel model");
- LOG_HELP(" Where 'model' is a string of the model name to use for the debug model.");
- return;
- }
- }
-}
-
-void LocalCommand_handlevote(int request, int argc)
-{
- TC(int, request); TC(int, argc);
- switch (request)
- {
- case CMD_REQUEST_COMMAND:
- {
- int vote_selection;
- string vote_string;
-
- if (InterpretBoolean(argv(1)))
- {
- vote_selection = 2;
- vote_string = "yes";
- }
- else
- {
- vote_selection = 1;
- vote_string = "no";
- }
-
- if (vote_selection)
- {
- if (uid2name_dialog) // handled by "uid2name" option
- {
- vote_active = 0;
- vote_prev = 0;
- vote_change = -9999;
- localcmd(strcat("setreport cl_allow_uid2name ", ftos(vote_selection - 1), "\n"));
- uid2name_dialog = 0;
- }
- else { localcmd(strcat("cmd vote ", vote_string, "\n")); }
-
- return;
- }
- }
-
- default:
- LOG_INFOF("Incorrect parameters for ^2%s^7", argv(0));
- case CMD_REQUEST_USAGE:
- {
- LOG_HELP("Usage:^3 cl_cmd handlevote vote");
- LOG_HELP(" Where 'vote' is the selection for either the current poll or uid2name.");
- return;
- }
- }
-}
-
-void LocalCommand_hud(int request, int argc)
-{
- TC(int, request); TC(int, argc);
- switch (request)
- {
- case CMD_REQUEST_COMMAND:
- {
- if(MUTATOR_CALLHOOK(HUD_Command, argc))
- return;
-
- switch (argv(1))
- {
- case "configure":
- {
- cvar_set("_hud_configure", ftos(!autocvar__hud_configure));
- return;
- }
-
- case "quickmenu":
- {
- if (argv(2) == "help")
- {
- LOG_HELP(" quickmenu [[default | file | \"\"] submenu file]");
- LOG_HELP("Called without options (or with \"\") loads either the default quickmenu or a quickmenu file if hud_panel_quickmenu_file is set to a valid filename.");
- LOG_HELP("A submenu name can be given to open the quickmenu directly in a submenu; it requires to specify 'default', 'file' or '\"\"' option.");
- LOG_HELP("A file name can also be given to open a different quickmenu");
- return;
- }
- string file = ((argv(4) == "") ? autocvar_hud_panel_quickmenu_file : argv(4));
- if (QuickMenu_IsOpened())
- QuickMenu_Close();
- else
- QuickMenu_Open(argv(2), argv(3), file); // mode, submenu
- return;
- }
-
- case "save":
- {
- if (argv(2))
- {
- HUD_Panel_ExportCfg(argv(2));
- return;
- }
- else
- {
- break; // go to usage, we're missing the paramater needed here.
- }
- }
-
- case "scoreboard_columns_set":
- {
- Cmd_Scoreboard_SetFields(argc);
- return;
- }
-
- case "scoreboard_columns_help":
- {
- Cmd_Scoreboard_Help();
- return;
- }
-
- case "radar":
- {
- if (argv(2))
- HUD_Radar_Show_Maximized(InterpretBoolean(argv(2)), 0);
- else
- HUD_Radar_Show_Maximized(!hud_panel_radar_maximized, 0);
- return;
- }
-
- case "clickradar":
- {
- if(!isdemo())
- HUD_Radar_Show_Maximized(!hud_panel_radar_mouse, 1);
- return;
- }
- }
- }
-
- default:
- LOG_INFOF("Incorrect parameters for ^2%s^7", argv(0));
- case CMD_REQUEST_USAGE:
- {
- LOG_HELP("Usage:^3 cl_cmd hud action [configname | radartoggle | layout]");
- LOG_HELP(" Where 'action' is the command to complete,");
- LOG_HELP(" 'configname' is the name to save to for \"save\" action,");
- LOG_HELP(" 'radartoggle' is to control hud_panel_radar_maximized for \"radar\" action,");
- LOG_HELP(" and 'layout' is how to organize the scoreboard columns for the set action.");
- LOG_HELP(" Full list of commands here: \"configure, quickmenu, minigame, save, scoreboard_columns_help, scoreboard_columns_set, radar.\"");
- return;
- }
- }
-}
-
-void LocalCommand_localprint(int request, int argc)
-{
- TC(int, request); TC(int, argc);
- switch (request)
- {
- case CMD_REQUEST_COMMAND:
- {
- if (argv(1))
- {
- centerprint_AddStandard(argv(1));
- return;
- }
- }
-
- default:
- LOG_INFOF("Incorrect parameters for ^2%s^7", argv(0));
- case CMD_REQUEST_USAGE:
- {
- LOG_HELP("Usage:^3 cl_cmd localprint \"message\"");
- LOG_HELP(" 'message' is the centerprint message to send to yourself.");
- return;
- }
- }
-}
-
-void LocalCommand_mv_download(int request, int argc)
-{
- TC(int, request); TC(int, argc);
- switch (request)
- {
- case CMD_REQUEST_COMMAND:
- {
- if (argv(1))
- {
- Cmd_MapVote_MapDownload(argc);
- return;
- }
- }
-
- default:
- LOG_INFOF("Incorrect parameters for ^2%s^7", argv(0));
- case CMD_REQUEST_USAGE:
- {
- LOG_HELP("Usage:^3 cl_cmd mv_download mapid");
- LOG_HELP(" Where 'mapid' is the id number of the map to request an image of on the map vote selection menu.");
- return;
- }
- }
-}
-
-void LocalCommand_sendcvar(int request, int argc)
-{
- TC(int, request); TC(int, argc);
- switch (request)
- {
- case CMD_REQUEST_COMMAND:
- {
- if (argv(1))
- {
- // W_FixWeaponOrder will trash argv, so save what we need.
- string thiscvar = string_null; strcpy(thiscvar, argv(1));
- string s = cvar_string(thiscvar);
-
- if (thiscvar == "cl_weaponpriority")
- s = W_FixWeaponOrder(W_NumberWeaponOrder(s), 1);
- else if (substring(thiscvar, 0, 17) == "cl_weaponpriority" && strlen(thiscvar) == 18)
- s = W_FixWeaponOrder(W_NumberWeaponOrder(s), 0);
-
- localcmd("cmd sentcvar ", thiscvar, " \"", s, "\"\n");
- strfree(thiscvar);
- return;
- }
- }
-
- default:
- LOG_INFOF("Incorrect parameters for ^2%s^7", argv(0));
- case CMD_REQUEST_USAGE:
- {
- LOG_HELP("Usage:^3 cl_cmd sendcvar <cvar>");
- LOG_HELP(" Where 'cvar' is the cvar to send to the server.");
- return;
- }
- }
-}
-
-/* use this when creating a new command, making sure to place it in alphabetical order... also,
-** ADD ALL NEW COMMANDS TO commands.cfg WITH PROPER ALIASES IN THE SAME FASHION!
-void LocalCommand_(int request)
-{
- switch(request)
- {
- case CMD_REQUEST_COMMAND:
- {
-
- return;
- }
-
- default:
- case CMD_REQUEST_USAGE:
- {
- LOG_HELP("Usage:^3 cl_cmd ");
- LOG_HELP(" No arguments required.");
- return;
- }
- }
-}
-*/
-
-
-// ==================================
-// Macro system for client commands
-// ==================================
-
-// Normally do not hard code aliases for these, instead create them in commands.cfg... also: keep in alphabetical order, please ;)
-CLIENT_COMMAND(blurtest, "Feature for testing blur postprocessing") { LocalCommand_blurtest(request); }
-CLIENT_COMMAND(boxparticles, "Spawn particles manually") { LocalCommand_boxparticles(request, arguments); }
-CLIENT_COMMAND(create_scrshot_ent, "Create an entity at this location for automatic screenshots") { LocalCommand_create_scrshot_ent(request); }
-CLIENT_COMMAND(debugmodel, "Spawn a debug model manually") { LocalCommand_debugmodel(request, arguments); }
-CLIENT_COMMAND(handlevote, "System to handle selecting a vote or option") { LocalCommand_handlevote(request, arguments); }
-CLIENT_COMMAND(hud, "Commands regarding/controlling the HUD system") { LocalCommand_hud(request, arguments); }
-CLIENT_COMMAND(localprint, "Create your own centerprint sent to yourself") { LocalCommand_localprint(request, arguments); }
-CLIENT_COMMAND(mv_download, "Retrieve mapshot picture from the server") { LocalCommand_mv_download(request, arguments); }
-CLIENT_COMMAND(sendcvar, "Send a cvar to the server (like cl_weaponpriority)") { LocalCommand_sendcvar(request, arguments); }
-
-void LocalCommand_macro_help()
-{
- FOREACH(CLIENT_COMMANDS, true, LOG_HELPF(" ^2%s^7: %s", it.m_name, it.m_description));
-}
-
-bool LocalCommand_macro_command(int argc, string command)
-{
- string c = strtolower(argv(0));
- FOREACH(CLIENT_COMMANDS, it.m_name == c, {
- it.m_invokecmd(it, CMD_REQUEST_COMMAND, NULL, argc, command);
- return true;
- });
- return false;
-}
-
-bool LocalCommand_macro_usage(int argc)
-{
- string c = strtolower(argv(1));
- FOREACH(CLIENT_COMMANDS, it.m_name == c, {
- it.m_invokecmd(it, CMD_REQUEST_USAGE, NULL, argc, "");
- return true;
- });
- return false;
-}
-
-void LocalCommand_macro_write_aliases(int fh)
-{
- FOREACH(CLIENT_COMMANDS, true, CMD_Write_Alias("qc_cmd_cl", it.m_name, it.m_description));
-}
-
-
-// =========================================
-// Main Function Called By Engine (cl_cmd)
-// =========================================
-// If this function exists, client code handles gamecommand instead of the engine code.
-
-void GameCommand(string command)
-{
- int argc = tokenize_console(command);
-
- // Guide for working with argc arguments by example:
- // argc: 1 - 2 - 3 - 4
- // argv: 0 - 1 - 2 - 3
- // cmd vote - master - login - password
- string s = strtolower(argv(0));
- if (s == "help")
- {
- if (argc == 1)
- {
- LOG_HELP("Client console commands:");
- LocalCommand_macro_help();
-
- LOG_HELP("\nGeneric commands shared by all programs:");
- GenericCommand_macro_help();
-
- LOG_HELP("\nUsage:^3 cl_cmd COMMAND...^7, where possible commands are listed above.");
- LOG_HELP("For help about a specific command, type cl_cmd help COMMAND");
-
- return;
- }
- else if (GenericCommand_macro_usage(argc)) // Instead of trying to call a command, we're going to see detailed information about it
- {
- return;
- }
- else if (LocalCommand_macro_usage(argc)) // now try for normal commands too
- {
- return;
- }
- }
- // continue as usual and scan for normal commands
- if (GenericCommand(command) // handled by common/command/generic.qc
- || LocalCommand_macro_command(argc, command) // handled by one of the above LocalCommand_* functions
- || MUTATOR_CALLHOOK(CSQC_ConsoleCommand, s, argc, command) // handled by a mutator
- ) return;
-
- // nothing above caught the command, must be invalid
- LOG_INFO(((command != "") ? strcat("Unknown client command \"", command, "\"") : "No command provided"), ". For a list of supported commands, try cl_cmd help.");
-}
-
-
-// ===================================
-// Macro system for console commands
-// ===================================
-
-// These functions are here specifically to add special + - commands to the game, and are not really normal commands.
-// Please add client commands to the function above this, as this is only for special reasons.
-// NOTE: showaccuracy is kept as legacy command
-#define CONSOLE_COMMANDS_NORMAL() \
- CONSOLE_COMMAND("+showscores", { scoreboard_showscores = true; }) \
- CONSOLE_COMMAND("-showscores", { scoreboard_showscores = false; }) \
- CONSOLE_COMMAND("+showaccuracy", { }) \
- CONSOLE_COMMAND("-showaccuracy", { }) \
- /* nothing */
-
-#define CONSOLE_COMMANDS_MOVEMENT() \
- CONSOLE_COMMAND("+forward", { ++camera_direction.x; }) \
- CONSOLE_COMMAND("-forward", { --camera_direction.x; }) \
- CONSOLE_COMMAND("+back", { --camera_direction.x; }) \
- CONSOLE_COMMAND("-back", { ++camera_direction.x; }) \
- CONSOLE_COMMAND("+moveup", { ++camera_direction.z; }) \
- CONSOLE_COMMAND("-moveup", { --camera_direction.z; }) \
- CONSOLE_COMMAND("+movedown", { --camera_direction.z; }) \
- CONSOLE_COMMAND("-movedown", { ++camera_direction.z; }) \
- CONSOLE_COMMAND("+moveright", { --camera_direction.y; }) \
- CONSOLE_COMMAND("-moveright", { ++camera_direction.y; }) \
- CONSOLE_COMMAND("+moveleft", { ++camera_direction.y; }) \
- CONSOLE_COMMAND("-moveleft", { --camera_direction.y; }) \
- CONSOLE_COMMAND("+roll_right", { ++camera_roll; }) \
- CONSOLE_COMMAND("-roll_right", { --camera_roll; }) \
- CONSOLE_COMMAND("+roll_left", { --camera_roll; }) \
- CONSOLE_COMMAND("-roll_left", { ++camera_roll; }) \
- /* nothing */
-
-void ConsoleCommand_macro_init()
-{
- // first init normal commands
- #define CONSOLE_COMMAND(name, execution) \
- { registercommand(name); }
-
- CONSOLE_COMMANDS_NORMAL();
- #undef CONSOLE_COMMAND
-
- // then init movement commands
- #ifndef CAMERATEST
- if (isdemo())
- {
- #endif
- #define CONSOLE_COMMAND(name, execution) \
- registercommand(name);
-
- CONSOLE_COMMANDS_MOVEMENT();
- #undef CONSOLE_COMMAND
- #ifndef CAMERATEST
-}
- #endif
-}
-
-bool ConsoleCommand_macro_normal(string s, int argc)
-{
- #define CONSOLE_COMMAND(name, execution) \
- { if (name == s) { { execution } return true; } }
-
- CONSOLE_COMMANDS_NORMAL();
- #undef CONSOLE_COMMAND
-
- return false;
-}
-
-bool ConsoleCommand_macro_movement(string s, int argc)
-{
- if (camera_active)
- {
- #define CONSOLE_COMMAND(name, execution) \
- { if (name == s) { { execution } return true; } }
-
- CONSOLE_COMMANDS_MOVEMENT();
- #undef CONSOLE_COMMAND
- }
-
- return false;
-}
-
-
-// ======================================================
-// Main Function Called By Engine (registered commands)
-// ======================================================
-// Used to parse commands in the console that have been registered with the "registercommand" function
-
-bool CSQC_ConsoleCommand(string command)
-{
- int argc = tokenize_console(command);
- string s = strtolower(argv(0));
- // Return value should be true if CSQC handled the command, otherwise return false to have the engine handle it.
- return ConsoleCommand_macro_normal(s, argc)
- || ConsoleCommand_macro_movement(s, argc)
- ;
-}
+++ /dev/null
-#pragma once
-
-void Cmd_Scoreboard_SetFields(int);
-void Cmd_Scoreboard_Help();
-void ConsoleCommand_macro_init();
-
-// used by common/command/generic.qc:GenericCommand_dumpcommands to list all commands into a .txt file
-void LocalCommand_macro_write_aliases(int fh);
-
-REGISTRY(CLIENT_COMMANDS, BITS(7))
-REGISTER_REGISTRY(CLIENT_COMMANDS)
-REGISTRY_SORT(CLIENT_COMMANDS)
-
-REGISTRY_DEFINE_GET(CLIENT_COMMANDS, NULL)
-
-#define CLIENT_COMMAND(id, description) \
- CLASS(clientcommand_##id, Command) \
- ATTRIB(clientcommand_##id, m_name, string, #id); \
- ATTRIB(clientcommand_##id, m_description, string, description); \
- ENDCLASS(clientcommand_##id) \
- REGISTER(CLIENT_COMMANDS, CMD_CL, id, m_id, NEW(clientcommand_##id)); \
- METHOD(clientcommand_##id, m_invokecmd, void(clientcommand_##id this, int request, entity caller, int arguments, string command))
-
-STATIC_INIT(CLIENT_COMMANDS_aliases) {
- FOREACH(CLIENT_COMMANDS, true, localcmd(sprintf("alias %1$s \"%2$s %1$s ${* ?}\"\n", it.m_name, "qc_cmd_cl")));
-}
#include "csqcmodel_hooks.qh"
#include "autocvars.qh"
+#include "main.qh"
#include "miscfunctions.qh"
#include <client/mutators/_mod.qh>
+#include <client/main.qh>
#include "player_skeleton.qh"
#include "weapons/projectile.qh"
#include <common/animdecide.qh>
#include <common/ent_cs.qh>
+#include <common/gamemodes/_mod.qh>
+#include <common/mapinfo.qh>
#include <common/physics/movetypes/movetypes.qh>
+#include <common/physics/player.qh>
#include <common/viewloc.qh>
#include <common/effects/all.qh>
#include <common/effects/all.inc>
}
void CSQCPlayer_ModelAppearance_Apply(entity this, bool islocalplayer)
{
+ int cm = this.forceplayermodels_savecolormap;
+ cm = (cm >= 1024) ? cm : (entcs_GetClientColors(cm - 1) + 1024);
+
if(MUTATOR_CALLHOOK(ForcePlayermodels_Skip, this, islocalplayer))
goto skipforcemodels;
// apply it
bool isfriend;
- int cm;
- cm = this.forceplayermodels_savecolormap;
- cm = (cm >= 1024) ? cm : (entcs_GetClientColors(cm - 1) + 1024);
if(teamplay)
isfriend = (cm == 1024 + 17 * myteam);
this.skin = this.forceplayermodels_saveskin;
}
+ LABEL(skipforcemodels)
+
+ if(MUTATOR_CALLHOOK(ForcePlayercolors_Skip, this, islocalplayer))
+ goto skipforcecolors;
+
// forceplayercolors too
if(teamplay)
{
if(autocvar_cl_forcemyplayercolors)
forcecolor_friend = 1024 + autocvar_cl_forcemyplayercolors;
- if(autocvar_cl_forceplayercolors == 2 && team_count == 2)
+ if((autocvar_cl_forceplayercolors == 2 && team_count == 2)
+ || (autocvar_cl_forceplayercolors == 3 && IS_GAMETYPE(DUEL)))
forcecolor_enemy = 1024 + autocvar__cl_color;
if(forcecolor_enemy && !forcecolor_friend)
this.colormap = player_localnum + 1;
}
- LABEL(skipforcemodels)
+ LABEL(skipforcecolors)
if((this.csqcmodel_effects & CSQCMODEL_EF_RESPAWNGHOST) && !autocvar_cl_respawn_ghosts_keepcolors)
{
if(eff & EF_FULLBRIGHT)
this.renderflags |= RF_FULLBRIGHT;
if(eff & EF_FLAME)
- pointparticles(EFFECT_EF_FLAME, this.origin, '0 0 0', bound(0, frametime, 0.1));
+ {
+ boxparticles(particleeffectnum(EFFECT_EF_FLAME), this, this.absmin, this.absmax, this.velocity, this.velocity, bound(0, frametime, 0.1), 0);
+ //pointparticles(EFFECT_EF_FLAME, this.origin, '0 0 0', bound(0, frametime, 0.1));
+ }
if(eff & EF_STARDUST)
- pointparticles(EFFECT_EF_STARDUST, this.origin, '0 0 0', bound(0, frametime, 0.1));
+ {
+ boxparticles(particleeffectnum(EFFECT_EF_STARDUST), this, this.absmin, this.absmax, this.velocity, this.velocity, bound(0, frametime, 0.1), 0);
+ //pointparticles(EFFECT_EF_STARDUST, this.origin, '0 0 0', bound(0, frametime, 0.1));
+ }
if(eff & EF_NOSHADOW)
this.renderflags |= RF_NOSHADOW;
if(eff & EF_NODEPTHTEST)
.int csqcmodel_modelflags;
.int csqcmodel_traileffect;
+.bool csqcmodel_isdead; // used by shownames and miscfunctions (entcs_IsDead) to know when a player is dead
+
.int isplayermodel;
void CSQCModel_Effects_Apply(entity this);
+++ /dev/null
-#pragma once
-
-// Additional OPTIONAL Fields and Globals
-//float intermission;
-float scoreboard_showscores;
-.string message;
-.float renderflags;
-// float coop;
-// float deathmatch;
-
-float dmg_take;
-// float dmg_save;
-// vector dmg_origin;
-
-// Darkplaces Render Modifications
-#if 0
-.float alpha;
-.vector colormod;
-.float scale;
-#endif
-
-// Basic variables
-.int enttype; // entity type sent from server
-.int sv_entnum; // entity number sent from server
-.int team;
-.int team_size;
-
-float vid_conheight;
-int binddb;
-
-// QUALIFYING
-float race_checkpoint;
-float race_time;
-float race_laptime;
-float race_checkpointtime;
-float race_previousbesttime;
-float race_mypreviousbesttime;
-string race_previousbestname;
-float race_nextcheckpoint;
-float race_nextbesttime;
-float race_mybesttime;
-string race_nextbestname;
-float race_penaltyaccumulator; // qualifying: total penalty time in tenths
-float race_penaltyeventtime; // time when the player got the penalty
-float race_penaltytime; // duration of penalty time, in tenths
-string race_penaltyreason; // reason for penalty
-float race_server_record; // server record
-float race_speedaward;
-string race_speedaward_holder;
-string race_speedaward_unit;
-float race_speedaward_alltimebest;
-string race_speedaward_alltimebest_holder;
-string race_speedaward_alltimebest_unit;
-
-// RACE
-float race_mycheckpoint;
-float race_mycheckpointtime;
-float race_mycheckpointdelta;
-float race_mycheckpointlapsdelta;
-string race_mycheckpointenemy;
-float race_othercheckpoint;
-float race_othercheckpointtime;
-float race_othercheckpointdelta;
-float race_othercheckpointlapsdelta;
-string race_othercheckpointenemy;
-float scoreboard_showscores_force;
-float race_status;
-string race_status_name;
-float race_myrank;
-
-// Nexball
-float nb_pb_period;
-
-// Spectating
-// -1 - observing
-// 0 - playing
-// >0 - id of spectated player
-float spectatee_status;
-float spectatee_status_changed_time;
-
-// short mapname
-string shortmapname;
-
-// database for misc stuff
-int tempdb;
-int ClientProgsDB;
-vector hook_shotorigin[4];
-vector lightning_shotorigin[4];
-
-
-#ifdef BLURTEST
-float blurtest_time0, blurtest_time1, blurtest_radius, blurtest_power;
-#endif
-
-float serverprevtime, serverdeltatime;
-
-float ticrate;
-
-.float damageforcescale;
-const float MIN_DAMAGEEXTRARADIUS = 2;
-const float MAX_DAMAGEEXTRARADIUS = 16;
-.float damageextraradius;
-.void(entity this, float thisdmg, int hittype, vector org, vector thisforce) event_damage;
-
-// weapons
-.bool silent;
-
-int w_deathtype;
-float w_issilent, w_random;
-vector w_org, w_backoff;
-
-float autoswitch;
-bool cvar_cl_allow_uid2name;
-bool cvar_cl_allow_uidranking;
-float cvar_cl_autoscreenshot;
-float cvar_cl_autotaunt;
-float cvar_cl_clippedspectating;
-int cvar_cl_gunalign;
-float cvar_cl_handicap;
-float cvar_cl_jetpack_jump;
-float cvar_cl_movement_track_canjump;
-float cvar_cl_noantilag;
-string cvar_cl_physics;
-float cvar_cl_voice_directional;
-float cvar_cl_voice_directional_taunt_attenuation;
-float cvar_cl_weaponimpulsemode;
-string cvar_g_xonoticversion;
-float cvar_cl_cts_noautoswitch;
-bool cvar_cl_weapon_switch_reload;
-bool cvar_cl_weapon_switch_fallback_to_impulse;
-
-REPLICATE(autoswitch, bool, "cl_autoswitch");
-REPLICATE(cvar_cl_allow_uid2name, bool, "cl_allow_uid2name");
-REPLICATE(cvar_cl_allow_uidranking, bool, "cl_allow_uidranking");
-REPLICATE(cvar_cl_autoscreenshot, int, "cl_autoscreenshot");
-REPLICATE(cvar_cl_autotaunt, float, "cl_autotaunt");
-REPLICATE(cvar_cl_clippedspectating, bool, "cl_clippedspectating");
-REPLICATE(cvar_cl_gunalign, int, "cl_gunalign");
-REPLICATE(cvar_cl_handicap, float, "cl_handicap");
-REPLICATE(cvar_cl_jetpack_jump, bool, "cl_jetpack_jump");
-REPLICATE(cvar_cl_movement_track_canjump, bool, "cl_movement_track_canjump");
-REPLICATE(cvar_cl_noantilag, bool, "cl_noantilag");
-REPLICATE(cvar_cl_physics, string, "cl_physics");
-REPLICATE(cvar_cl_voice_directional, int, "cl_voice_directional");
-REPLICATE(cvar_cl_voice_directional_taunt_attenuation, float, "cl_voice_directional_taunt_attenuation");
-REPLICATE(cvar_cl_weaponimpulsemode, int, "cl_weaponimpulsemode");
-REPLICATE(cvar_g_xonoticversion, string, "g_xonoticversion");
-REPLICATE(cvar_cl_cts_noautoswitch, bool, "cl_cts_noautoswitch");
-REPLICATE(cvar_cl_weapon_switch_reload, bool, "cl_weapon_switch_reload");
-REPLICATE(cvar_cl_weapon_switch_fallback_to_impulse, bool, "cl_weapon_switch_fallback_to_impulse");
-/*
-// cvar cl_newusekeysupported doesn't exist
-float cvar_cl_newusekeysupported;
-REPLICATE(cvar_cl_newusekeysupported, bool, "cl_newusekeysupported");
-*/
-string cvar_cl_allow_uidtracking;
-REPLICATE(cvar_cl_allow_uidtracking, string, "cl_allow_uidtracking");
-
-string cvar_cl_weaponpriority;
-REPLICATE(cvar_cl_weaponpriority, string, "cl_weaponpriority");
-
-string cvar_cl_weaponpriorities[10];
-REPLICATE(cvar_cl_weaponpriorities[0], string, "cl_weaponpriority0");
-REPLICATE(cvar_cl_weaponpriorities[1], string, "cl_weaponpriority1");
-REPLICATE(cvar_cl_weaponpriorities[2], string, "cl_weaponpriority2");
-REPLICATE(cvar_cl_weaponpriorities[3], string, "cl_weaponpriority3");
-REPLICATE(cvar_cl_weaponpriorities[4], string, "cl_weaponpriority4");
-REPLICATE(cvar_cl_weaponpriorities[5], string, "cl_weaponpriority5");
-REPLICATE(cvar_cl_weaponpriorities[6], string, "cl_weaponpriority6");
-REPLICATE(cvar_cl_weaponpriorities[7], string, "cl_weaponpriority7");
-REPLICATE(cvar_cl_weaponpriorities[8], string, "cl_weaponpriority8");
-REPLICATE(cvar_cl_weaponpriorities[9], string, "cl_weaponpriority9");
-
-float bgmtime;
-
-float vortex_charge_movingavg;
-
-int serverflags;
-
-float uid2name_dialog;
-
-float intermission_time;
-
-.bool csqcmodel_isdead; // used by shownames and miscfunctions (entcs_IsDead) to know when a player is dead
-
-#define player_currententnum (spectatee_status > 0 ? spectatee_status : player_localnum + 1)
#pragma once
+float vortex_charge_movingavg; // WEAPONTODO
+
vector crosshair_getcolor(entity this, float health_stat);
void TrueAim_Init();
void HUD_Crosshair(entity this);
#include "hud.qh"
-#include <client/defs.qh>
+#include <client/items/items.qh>
#include <client/miscfunctions.qh>
#include <client/view.qh>
#include "panel/scoreboard.qh"
#include "../mapvoting.qh"
#include "../teamradar.qh"
#include <common/minigames/cl_minigames.qh>
-#include <common/t_items.qh>
#include <common/deathtypes/all.qh>
#include <common/ent_cs.qh>
#include <common/items/_mod.qh>
#include "hud.qh"
#include "panel/scoreboard.qh"
#include <client/autocvars.qh>
-#include <client/defs.qh>
#include <client/miscfunctions.qh>
#include <client/view.qh>
#include "ammo.qh"
#include <client/autocvars.qh>
-#include <client/defs.qh>
+#include <client/items/items.qh>
+#include <client/main.qh>
#include <client/miscfunctions.qh>
#include <client/view.qh>
-#include <common/t_items.qh>
#include <common/wepent.qh>
#include <common/mutators/mutator/nades/nades.qh>
#include "scoreboard.qh"
#include <common/notifications/all.qh>
-#include <client/defs.qh>
#include <client/miscfunctions.qh>
// CenterPrint (#16)
#include "chat.qh"
#include <client/autocvars.qh>
-#include <client/defs.qh>
#include <client/miscfunctions.qh>
// Chat (#12)
#include "healtharmor.qh"
-#include <client/defs.qh>
+#include <client/main.qh>
#include <client/miscfunctions.qh>
#include <common/deathtypes/all.qh>
#include "infomessages.qh"
#include <client/autocvars.qh>
+#include <client/main.qh>
#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 "physics.qh"
#include <client/autocvars.qh>
-#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 "powerups.qh"
#include <client/autocvars.qh>
-#include <client/defs.qh>
+#include <client/main.qh>
#include <client/miscfunctions.qh>
#include <common/items/_mod.qh>
+#include <common/util.qh>
// Powerups (#2)
#include "pressedkeys.qh"
#include <client/autocvars.qh>
-#include <client/defs.qh>
+#include <client/main.qh>
#include <client/miscfunctions.qh>
// Pressed keys (#11)
#include "quickmenu.qh"
#include <client/autocvars.qh>
-#include <client/defs.qh>
+#include <client/main.qh>
#include <client/miscfunctions.qh>
#include <common/ent_cs.qh>
#include <common/minigames/cl_minigames.qh>
#include "racetimer.qh"
#include <client/autocvars.qh>
-#include <client/defs.qh>
+#include <client/main.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;
}
#pragma once
#include "../panel.qh"
+
+// QUALIFYING
+float race_checkpoint;
+float race_time;
+float race_laptime;
+float race_checkpointtime;
+float race_previousbesttime;
+float race_mypreviousbesttime;
+string race_previousbestname;
+float race_nextcheckpoint;
+float race_nextbesttime;
+float race_mybesttime;
+string race_nextbestname;
+float race_penaltyaccumulator; // qualifying: total penalty time in tenths
+float race_penaltyeventtime; // time when the player got the penalty
+float race_penaltytime; // duration of penalty time, in tenths
+string race_penaltyreason; // reason for penalty
+float race_server_record; // server record
+float race_speedaward;
+string race_speedaward_holder;
+string race_speedaward_unit;
+float race_speedaward_alltimebest;
+string race_speedaward_alltimebest_holder;
+string race_speedaward_alltimebest_unit;
+
+// RACE
+float race_mycheckpoint;
+float race_mycheckpointtime;
+float race_mycheckpointdelta;
+float race_mycheckpointlapsdelta;
+string race_mycheckpointenemy;
+float race_othercheckpoint;
+float race_othercheckpointtime;
+float race_othercheckpointdelta;
+float race_othercheckpointlapsdelta;
+string race_othercheckpointenemy;
+float scoreboard_showscores_force;
+float race_status;
+string race_status_name;
+float race_myrank;
#include "radar.qh"
#include <client/autocvars.qh>
-#include <client/defs.qh>
+#include <client/main.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 "score.qh"
#include <client/autocvars.qh>
-#include <client/defs.qh>
+#include <client/main.qh>
#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();
#include "scoreboard.qh"
#include <client/autocvars.qh>
-#include <client/defs.qh>
#include <client/main.qh>
#include <client/miscfunctions.qh>
+#include <client/hud/panel/racetimer.qh>
#include "quickmenu.qh"
#include <common/ent_cs.qh>
#include <common/constants.qh>
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);
#pragma once
#include "../panel.qh"
+bool scoreboard_showscores;
+
bool scoreboard_active;
float scoreboard_fade_alpha;
float scoreboard_acc_fade_alpha;
#include "timer.qh"
#include <client/autocvars.qh>
-#include <client/defs.qh>
#include <client/miscfunctions.qh>
+#include <client/view.qh>
// Timer (#5)
#include "vote.qh"
#include <client/autocvars.qh>
-#include <client/defs.qh>
+#include <client/main.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
#pragma once
#include "../panel.qh"
+
+float uid2name_dialog;
#include "weapons.qh"
#include <client/autocvars.qh>
-#include <client/defs.qh>
+#include <client/main.qh>
#include <client/miscfunctions.qh>
#include <client/view.qh>
#include <common/wepent.qh>
--- /dev/null
+// generated file; do not modify
+#include <client/items/items.qc>
--- /dev/null
+// generated file; do not modify
+#include <client/items/items.qh>
--- /dev/null
+#include "items.qh"
+
+#include <common/items/_mod.qh>
+
+#include <client/main.qh>
+#include <common/physics/movetypes/movetypes.qh>
+#include <common/weapons/_all.qh>
+#include <lib/csqcmodel/cl_model.qh>
+#include <lib/csqcmodel/common.qh>
+#include <lib/warpzone/common.qh>
+
+bool autocvar_cl_ghost_items_vehicle = true;
+.vector item_glowmod;
+.bool item_simple; // probably not really needed, but better safe than sorry
+.float alpha;
+.bool pushable;
+void Item_SetAlpha(entity this)
+{
+ bool veh_hud = (hud && autocvar_cl_ghost_items_vehicle);
+
+ if(!veh_hud && (this.ItemStatus & ITS_AVAILABLE))
+ {
+ this.alpha = 1;
+ this.colormod = '1 1 1';
+ this.glowmod = this.item_glowmod;
+ }
+ else
+ {
+ this.alpha = autocvar_cl_ghost_items;
+ this.colormod = this.glowmod = autocvar_cl_ghost_items_color;
+ }
+
+ if((!veh_hud) && (this.ItemStatus & ITS_STAYWEP))
+ {
+ this.colormod = this.glowmod = autocvar_cl_weapon_stay_color;
+ this.alpha = autocvar_cl_weapon_stay_alpha;
+ }
+
+ this.drawmask = ((this.alpha <= 0) ? 0 : MASK_NORMAL);
+}
+
+void ItemDraw(entity this)
+{
+ if(this.gravity)
+ {
+ Movetype_Physics_MatchServer(this, false);
+ if(IS_ONGROUND(this))
+ { // For some reason avelocity gets set to '0 0 0' here ...
+ this.oldorigin = this.origin;
+ this.gravity = 0;
+
+ if(autocvar_cl_animate_items)
+ { // ... so reset it if animations are requested.
+ if(this.ItemStatus & ITS_ANIMATE1)
+ this.avelocity = '0 180 0';
+
+ if(this.ItemStatus & ITS_ANIMATE2)
+ this.avelocity = '0 -90 0';
+ }
+
+ // delay is for blocking item's position for a while;
+ // it's a workaround for dropped weapons that receive the position
+ // another time right after they spawn overriding animation position
+ this.onground_time = time + 0.5;
+ }
+ }
+ else if (autocvar_cl_animate_items && !this.item_simple) // no bobbing applied to simple items, for consistency's sake (no visual difference between ammo and weapons)
+ {
+ if(this.ItemStatus & ITS_ANIMATE1)
+ {
+ this.angles += this.avelocity * frametime;
+ float fade_in = bound(0, time - this.onground_time, 1);
+ setorigin(this, this.oldorigin + fade_in * ('0 0 10' + '0 0 8' * sin((time - this.onground_time) * 2)));
+ }
+
+ if(this.ItemStatus & ITS_ANIMATE2)
+ {
+ this.angles += this.avelocity * frametime;
+ float fade_in = bound(0, time - this.onground_time, 1);
+ setorigin(this, this.oldorigin + fade_in * ('0 0 8' + '0 0 4' * sin((time - this.onground_time) * 3)));
+ }
+ }
+
+ Item_SetAlpha(this);
+}
+
+void Item_PreDraw(entity this)
+{
+ if(warpzone_warpzones_exist)
+ {
+ setpredraw(this, func_null); // no need to keep running this
+ return;
+ }
+ float alph;
+ vector org = getpropertyvec(VF_ORIGIN);
+ //if(!checkpvs(org, this)) // this makes sense as long as we don't support recursive warpzones
+ //alph = 0; // this shouldn't be needed, since items behind walls are culled anyway
+ if(this.fade_start)
+ {
+ if(vdist(org - this.origin, >, this.fade_end))
+ alph = 0; // save on some processing
+ else if(vdist(org - this.origin, <, this.fade_start))
+ alph = 1; // more processing saved
+ else
+ alph = bound(0, (this.fade_end - vlen(org - this.origin - 0.5 * (this.mins + this.maxs))) / (this.fade_end - this.fade_start), 1);
+ }
+ else
+ alph = 1;
+ //printf("%v <-> %v\n", view_origin, this.origin + 0.5 * (this.mins + this.maxs));
+ if(!hud && (this.ItemStatus & ITS_AVAILABLE))
+ this.alpha = alph;
+ if(alph <= 0)
+ this.drawmask = 0;
+ //else
+ //this.drawmask = MASK_NORMAL; // reset by the setalpha function
+}
+
+void ItemRemove(entity this)
+{
+ strfree(this.mdl);
+}
+
+HashMap ENT_CLIENT_ITEM_simple;
+STATIC_INIT(ENT_CLIENT_ITEM_simple)
+{
+ HM_NEW(ENT_CLIENT_ITEM_simple);
+}
+SHUTDOWN(ENT_CLIENT_ITEM_simple)
+{
+ HM_DELETE(ENT_CLIENT_ITEM_simple);
+}
+
+NET_HANDLE(ENT_CLIENT_ITEM, bool isnew)
+{
+ int sf = ReadByte();
+
+ if(sf & ISF_LOCATION)
+ {
+ this.origin = ReadVector();
+ setorigin(this, this.origin);
+ this.oldorigin = this.origin;
+ }
+
+ if(sf & ISF_ANGLES)
+ {
+ this.angles = ReadAngleVector();
+ }
+
+ if(sf & ISF_SIZE)
+ {
+ setsize(this, '-16 -16 0', '16 16 48');
+ }
+
+ if(sf & ISF_STATUS) // need to read/write status first so model can handle simple, fb etc.
+ {
+ this.ItemStatus = ReadByte();
+
+ Item_SetAlpha(this);
+
+ if(this.ItemStatus & ITS_ALLOWFB)
+ this.effects |= EF_FULLBRIGHT;
+ else
+ this.effects &= ~EF_FULLBRIGHT;
+
+ if(this.ItemStatus & ITS_GLOW)
+ {
+ if(this.ItemStatus & ITS_AVAILABLE)
+ this.effects |= (EF_ADDITIVE | EF_FULLBRIGHT);
+ else
+ this.effects &= ~(EF_ADDITIVE | EF_FULLBRIGHT);
+ }
+ }
+
+ if(sf & ISF_MODEL)
+ {
+ this.drawmask = MASK_NORMAL;
+ set_movetype(this, MOVETYPE_TOSS);
+ if (isnew) IL_PUSH(g_drawables, this);
+ this.draw = ItemDraw;
+ this.solid = SOLID_TRIGGER;
+ //this.flags |= FL_ITEM;
+
+ this.fade_end = ReadShort();
+ this.fade_start = ReadShort();
+ if(!warpzone_warpzones_exist && this.fade_start && !autocvar_cl_items_nofade)
+ setpredraw(this, Item_PreDraw);
+
+ strfree(this.mdl);
+
+ string _fn = ReadString();
+ this.item_simple = false; // reset it!
+
+ if(autocvar_cl_simple_items && (this.ItemStatus & ITS_ALLOWSI))
+ {
+ string _fn2 = substring(_fn, 0 , strlen(_fn) -4);
+ this.item_simple = true;
+
+ #define extensions(x) \
+ x(md3) \
+ x(dpm) \
+ x(iqm) \
+ x(mdl) \
+ /**/
+ #define tryext(ext) { \
+ string s = strcat(_fn2, autocvar_cl_simpleitems_postfix, "." #ext); \
+ string cached = HM_gets(ENT_CLIENT_ITEM_simple, s); \
+ if (cached == "") { \
+ HM_sets(ENT_CLIENT_ITEM_simple, s, cached = fexists(s) ? "1" : "0"); \
+ } \
+ if (cached != "0") { \
+ strcpy(this.mdl, s); \
+ break; \
+ } \
+ }
+ do {
+ extensions(tryext);
+ this.item_simple = false;
+ LOG_TRACEF("Simple item requested for %s but no model exists for it", _fn);
+ } while (0);
+ #undef tryext
+ #undef extensions
+ }
+
+ if(!this.item_simple)
+ strcpy(this.mdl, _fn);
+
+ if(this.mdl == "")
+ LOG_WARNF("this.mdl is unset for item %s", this.classname);
+
+ precache_model(this.mdl);
+ _setmodel(this, this.mdl);
+
+ setsize(this, '-16 -16 0', '16 16 48');
+ }
+
+ if(sf & ISF_COLORMAP)
+ {
+ this.colormap = ReadShort();
+ this.item_glowmod_x = ReadByte() / 255.0;
+ this.item_glowmod_y = ReadByte() / 255.0;
+ this.item_glowmod_z = ReadByte() / 255.0;
+ }
+
+ if(sf & ISF_DROP)
+ {
+ this.gravity = 1;
+ this.pushable = true;
+ //this.angles = '0 0 0';
+ set_movetype(this, MOVETYPE_TOSS);
+ this.velocity = ReadVector();
+ setorigin(this, this.oldorigin);
+
+ if(!this.move_time)
+ {
+ this.move_time = time;
+ this.spawntime = time;
+ }
+ else
+ this.move_time = max(this.move_time, time);
+ }
+
+ if(autocvar_cl_animate_items)
+ {
+ if(this.ItemStatus & ITS_ANIMATE1)
+ this.avelocity = '0 180 0';
+
+ if(this.ItemStatus & ITS_ANIMATE2)
+ this.avelocity = '0 -90 0';
+ }
+
+ this.entremove = ItemRemove;
+
+ return true;
+}
--- /dev/null
+#pragma once
+
+const int AMMO_COUNT = 4; // amount of ammo types to show in the ammo panel
+
+.float onground_time;
+
+bool autocvar_cl_items_nofade;
+float autocvar_cl_animate_items = 1;
+float autocvar_cl_ghost_items = 0.45;
+vector autocvar_cl_ghost_items_color = '-1 -1 -1';
+vector autocvar_cl_weapon_stay_color = '2 0.5 0.5';
+float autocvar_cl_weapon_stay_alpha = 0.75;
+float autocvar_cl_simple_items = 0;
+string autocvar_cl_simpleitems_postfix = "_simple";
+.float spawntime;
+.float gravity;
+.vector colormod;
+
+void ItemDraw(entity this);
#include "main.qh"
-#include "defs.qh"
+#include <client/items/items.qh>
#include <common/ent_cs.qh>
#include "miscfunctions.qh"
#include <common/effects/effect.qh>
#include <common/effects/all.qh>
#include <common/effects/all.inc>
#include "hud/_mod.qh"
-#include "commands/cl_cmd.qh"
+#include "command/cl_cmd.qh"
#include "mapvoting.qh"
#include <client/mutators/_mod.qh>
#include "hud/panel/centerprint.qh"
#include "hud/panel/quickmenu.qh"
#include "shownames.qh"
#include "view.qh"
-#include <common/t_items.qh>
#include "weapons/projectile.qh"
#include <common/deathtypes/all.qh>
#include <common/items/_mod.qh>
+#include <common/gamemodes/gamemode/nexball/cl_nexball.qh>
#include <common/mapinfo.qh>
#include <common/minigames/cl_minigames.qh>
#include <common/minigames/cl_minigames_hud.qh>
for(i = 0; i < MAX_SPECTATORS; ++i)
spectatorlist[i] = 0; // reset list first
- for(i = 0; i < num_spectators; ++i)
+ int limit = min(num_spectators, MAX_SPECTATORS);
+ for(i = 0; i < limit; ++i)
{
slot = ReadByte();
spectatorlist[i] = slot - 1;
}
}
+ else
+ {
+ for(int j = 0; j < MAX_SPECTATORS; ++j)
+ spectatorlist[j] = 0; // reset list if showspectators has been turned off
+ num_spectators = 0;
+ }
return = true;
float drawframetime;
vector view_origin, view_forward, view_right, view_up;
+.float renderflags; // engine field
bool button_zoom;
bool spectatorbutton_zoom;
float GetSpeedUnitFactor(int speed_unit);
string GetSpeedUnit(int speed_unit);
+
+.int enttype; // entity type sent from server
+.int sv_entnum; // entity number sent from server
+
+.int team;
+.int team_size;
+
+int binddb;
+
+// Spectating
+// -1 - observing
+// 0 - playing
+// >0 - id of spectated player
+float spectatee_status;
+float spectatee_status_changed_time;
+
+#define player_currententnum (spectatee_status > 0 ? spectatee_status : player_localnum + 1)
+
+// short mapname
+string shortmapname;
+
+// database for misc stuff
+int tempdb;
+int ClientProgsDB;
+vector hook_shotorigin[4]; // WEAPONTODO
+vector lightning_shotorigin[4]; // TODO: unused
+
+float serverprevtime, serverdeltatime;
+
+float ticrate;
+
+int serverflags;
#include "mapvoting.qh"
#include "autocvars.qh"
+#include "main.qh"
#include "miscfunctions.qh"
-#include "defs.qh"
#include "hud/_mod.qh"
#include "hud/panel/scoreboard.qh"
#include <common/mapinfo.qh>
+#include <common/util.qh>
// MapVote (#21)
}
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);
}
#include "miscfunctions.qh"
#include "autocvars.qh"
-#include "defs.qh"
#include "hud/_mod.qh"
+#include "main.qh"
#include <common/command/_mod.qh>
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);
/** Called when updating the view's liquid contents, return true to disable the standard checks and apply your own */
MUTATOR_HOOKABLE(HUD_Contents, EV_NO_ARGS);
-/** Return true to disable player model/color forcing */
+/** Return true to disable player model forcing */
#define EV_ForcePlayermodels_Skip(i, o) \
/** entity id */ i(entity, MUTATOR_ARGV_0_entity) \
/** is local */ i(bool, MUTATOR_ARGV_1_bool) \
/**/
MUTATOR_HOOKABLE(ForcePlayermodels_Skip, EV_ForcePlayermodels_Skip);
+/** Return true to disable player color forcing */
+#define EV_ForcePlayercolors_Skip(i, o) \
+ /** entity id */ i(entity, MUTATOR_ARGV_0_entity) \
+ /** is local */ i(bool, MUTATOR_ARGV_1_bool) \
+ /**/
+MUTATOR_HOOKABLE(ForcePlayercolors_Skip, EV_ForcePlayercolors_Skip);
+
/** Called when damage info is received on the client, useful for playing explosion effects */
#define EV_DamageInfo(i, o) \
/** entity id */ i(entity, MUTATOR_ARGV_0_entity) \
/** 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 "shownames.qh"
#include "autocvars.qh"
+#include "main.qh"
#include "miscfunctions.qh"
#include "resources.qh"
#include "hud/_mod.qh"
#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)
#include "autocvars.qh"
#include "hud/_mod.qh"
+#include <client/main.qh>
#include <common/mutators/mutator/waypoints/all.qh>
#include "miscfunctions.qh"
#include "announcer.qh"
#include "hud/_mod.qh"
+#include "main.qh"
#include "mapvoting.qh"
#include "shownames.qh"
#include "hud/panel/scoreboard.qh"
#include <lib/warpzone/client.qh>
#include <lib/warpzone/common.qh>
-#define EFMASK_CHEAP (EF_ADDITIVE | EF_DOUBLESIDED | EF_FULLBRIGHT | EF_NODEPTHTEST | EF_NODRAW | EF_NOSHADOW | EF_SELECTABLE | EF_TELEPORT_BIT)
-
float autocvar_cl_viewmodel_scale;
float autocvar_cl_viewmodel_alpha = 1;
if(autocvar_r_letterbox == 0)
if(autocvar_viewsize < 120)
{
- if(!(ISGAMETYPE(RACE) || ISGAMETYPE(CTS)))
+ if(!MUTATOR_CALLHOOK(DrawScoreboardAccuracy))
Accuracy_LoadLevels();
HUD_Main();
float drawtime;
float unaccounted_damage = 0;
float zoomscript_caught;
+
+float dmg_take;
+// float dmg_save;
+// vector dmg_origin;
+
+#ifdef BLURTEST
+float blurtest_time0, blurtest_time1, blurtest_radius, blurtest_power;
+#endif
+
+float intermission_time;
#include "projectile.qh"
#include "../autocvars.qh"
-#include "../defs.qh"
#include "../main.qh"
#include <client/mutators/_mod.qh>
void loopsound(entity e, int ch, Sound samp, float vol, float attn);
void Ent_RemoveProjectile(entity this);
-
-const int FL_PROJECTILE = BIT(15);
#include "effects/all.qc"
#include "impulses/all.qc"
#include "notifications/all.qc"
-#include "t_items.qc"
#endif
#include "items/_mod.inc"
#include <common/mapinfo.qc>
#include <common/net_notice.qc>
#include <common/playerstats.qc>
+#include <common/replicate.qc>
#include <common/state.qc>
-#include <common/t_items.qc>
#include <common/util.qc>
#include <common/viewloc.qc>
#include <common/wepent.qc>
#include <common/mapinfo.qh>
#include <common/net_notice.qh>
#include <common/playerstats.qh>
+#include <common/replicate.qh>
#include <common/state.qh>
-#include <common/t_items.qh>
#include <common/util.qh>
#include <common/viewloc.qh>
#include <common/wepent.qh>
#if defined(SVQC)
#include "util.qh"
- #include "../server/defs.qh"
+ #include <common/weapons/_all.qh>
+ #include <common/stats.qh>
#endif
bool monsters_animoverride(entity this)
#endif
#ifdef CSQC
- #include <client/commands/cl_cmd.qh>
+ #include <client/command/cl_cmd.qh>
#endif
#ifdef SVQC
#pragma once
+const int FRAGS_PLAYER = 0;
+const int FRAGS_SPECTATOR = -666;
+const int FRAGS_PLAYER_OUT_OF_GAME = -616;
+
+///////////////////////////
+// cvar constants
+
+const int CVAR_SAVE = 1;
+const int CVAR_NOTIFY = 2;
+const int CVAR_READONLY = 4;
+
+// server flags
+const int SERVERFLAG_ALLOW_FULLBRIGHT = 1;
+const int SERVERFLAG_TEAMPLAY = 2;
+const int SERVERFLAG_PLAYERSTATS = 4;
+
+const int SPECIES_HUMAN = 0;
+const int SPECIES_ROBOT_SOLID = 1;
+const int SPECIES_ALIEN = 2;
+const int SPECIES_ANIMAL = 3;
+const int SPECIES_ROBOT_RUSTY = 4;
+const int SPECIES_ROBOT_SHINY = 5;
+const int SPECIES_RESERVED = 15;
+
+#ifdef GAMEQC
const int RANKINGS_CNT = 99;
///////////////////////////
const int KEY_ATCK = BIT(6);
const int KEY_ATCK2 = BIT(7);
-///////////////////////////
-// cvar constants
-
-const int CVAR_SAVE = 1;
-const int CVAR_NOTIFY = 2;
-const int CVAR_READONLY = 4;
-
///////////////////////////
// csqc communication stuff
// # of maps, I'll use arrays for them :P
const int MAPVOTE_COUNT = 30;
-const int SPECIES_HUMAN = 0;
-const int SPECIES_ROBOT_SOLID = 1;
-const int SPECIES_ALIEN = 2;
-const int SPECIES_ANIMAL = 3;
-const int SPECIES_ROBOT_RUSTY = 4;
-const int SPECIES_ROBOT_SHINY = 5;
-const int SPECIES_RESERVED = 15;
-
-const int FRAGS_PLAYER = 0;
-const int FRAGS_SPECTATOR = -666;
-const int FRAGS_PLAYER_OUT_OF_GAME = -616;
-
-// server flags
-const int SERVERFLAG_ALLOW_FULLBRIGHT = 1;
-const int SERVERFLAG_TEAMPLAY = 2;
-const int SERVERFLAG_PLAYERSTATS = 4;
-
// a bit more constant
const vector PL_MAX_CONST = '16 16 45';
const vector PL_MIN_CONST = '-16 -16 -24';
const int GTV_FORBIDDEN = 0; // Cannot be voted
const int GTV_AVAILABLE = 1; // Can be voted
const int GTV_CUSTOM = 2; // Custom entry
+
+// generic entity flags
+// engine flags can't be redefined as they are used by the engine (unfortunately), they are listed here for posterity
+#ifdef CSQC
+const int FL_FLY = 1; /* BIT(0) */
+const int FL_SWIM = 2; /* BIT(1) */
+const int FL_CLIENT = 8; /* BIT(2) */ // set for all client edicts
+const int FL_INWATER = 16; /* BIT(3) */ // for enter / leave water splash
+const int FL_MONSTER = 32; /* BIT(4) */
+const int FL_GODMODE = 64; /* BIT(5) */ // player cheat
+const int FL_NOTARGET = 128; /* BIT(6) */ // player cheat
+const int FL_ITEM = 256; /* BIT(7) */ // extra wide size for bonus items
+const int FL_ONGROUND = 512; /* BIT(8) */ // standing on something
+const int FL_PARTIALGROUND = 1024; /* BIT(9) */ // not all corners are valid
+const int FL_WATERJUMP = 2048; /* BIT(10) */ // player jumping out of water
+const int FL_JUMPRELEASED = 4096; /* BIT(11) */ // for jump debouncing
+#endif
+const int FL_WEAPON = BIT(12);
+const int FL_POWERUP = BIT(13);
+const int FL_PROJECTILE = BIT(14);
+const int FL_TOSSED = BIT(15);
+const int FL_SPAWNING = BIT(16);
+const int FL_PICKUPITEMS = BIT(17);
+const int FL_DUCKED = BIT(18);
+const int FL_ONSLICK = BIT(19);
+#endif
+
+#if defined(SVQC)
+ #define EFMASK_CHEAP (EF_ADDITIVE | EF_DOUBLESIDED | EF_FULLBRIGHT | EF_NODEPTHTEST | EF_NODRAW | EF_NOGUNBOB | EF_NOSHADOW | EF_LOWPRECISION | EF_SELECTABLE | EF_TELEPORT_BIT)
+#elif defined(CSQC)
+ #define EFMASK_CHEAP (EF_ADDITIVE | EF_DOUBLESIDED | EF_FULLBRIGHT | EF_NODEPTHTEST | EF_NODRAW | EF_NOSHADOW | EF_SELECTABLE | EF_TELEPORT_BIT)
+#endif
# define ALPHA m_alpha
.float m_alpha;
+
+# define GROUNDENTITY_NAME ground_networkentity
+# define GROUNDENTITY_TYPE float
+.float ground_networkentity;
#else
# define TAG_ENTITY_NAME tag_entity
# define TAG_ENTITY_TYPE entity
# define TAG_VIEWLOC_TYPE entity
# define ALPHA alpha
+
+# define GROUNDENTITY_NAME groundentity
+# define GROUNDENTITY_TYPE entity
#endif
// add properties you want networked to CSQC here
CSQCMODEL_PROPERTY(BIT(0), int, ReadShort, WriteShort, colormap) \
CSQCMODEL_PROPERTY(BIT(1), int, ReadInt24_t, WriteInt24_t, effects) \
CSQCMODEL_PROPERTY(BIT(2), int, ReadByte, WriteByte, modelflags) \
- CSQCMODEL_PROPERTY_SCALED(BIT(3), float, ReadByte, WriteByte, ALPHA, 254, -1, 254) \
+ CSQCMODEL_PROPERTY_SCALED(BIT(3), float, ReadByte, WriteByte, ALPHA, 254, -1, 254) /* NOTE: update the use of this in cl_model.qc if you change the bitflag number! */ \
CSQCMODEL_PROPERTY(BIT(4), int, ReadByte, WriteByte, skin) \
CSQCMODEL_PROPERTY(BIT(5), float, ReadApproxPastTime, WriteApproxPastTime, death_time) \
CSQCMODEL_PROPERTY(BIT(6), float, ReadByte, WriteByte, solid) \
CSQCMODEL_PROPERTY(BIT(11), int, ReadByte, WriteByte, traileffect) \
CSQCMODEL_PROPERTY(BIT(12), float, ReadCoord, WriteCoord, scale) \
CSQCMODEL_PROPERTY(BIT(13), int, ReadInt24_t, WriteInt24_t, dphitcontentsmask) \
- CSQCMODEL_PROPERTY(BIT(14), TAG_VIEWLOC_TYPE, ReadShort, WriteEntity, TAG_VIEWLOC_NAME) \
+ CSQCMODEL_PROPERTY(BIT(14), TAG_VIEWLOC_TYPE, ReadShort, WriteEntity, TAG_VIEWLOC_NAME) /* NOTE: update the use of this in cl_model.qc if you change the bitflag number! */ \
+ /* bit 15 should NOT be reused, it is large enough sending the model's hitbox vectors! */ \
CSQCMODEL_PROPERTY(BIT(16), int, ReadByte, WriteByte, multijump_count) \
- CSQCMODEL_PROPERTY(BIT(16), int, ReadByte, WriteByte, move_movetype)
+ CSQCMODEL_PROPERTY(BIT(16), int, ReadByte, WriteByte, move_movetype) \
+ CSQCMODEL_IF(isplayer) \
+ CSQCMODEL_PROPERTY(BIT(17), GROUNDENTITY_TYPE, ReadShort, WriteEntity, GROUNDENTITY_NAME) \
+ CSQCMODEL_ENDIF \
+ CSQCMODEL_PROPERTY(BIT(17), int, ReadByte, WriteByte, clipgroup)
+// NOTE: bits above 15 are defined in lib/csqcmodel/common.qh, avoid reusing them if possible
// TODO get rid of colormod/glowmod here; also get rid of some useless properties on non-players that only exist for CopyBody
// add hook function calls here
EFFECT(0, RACER_IMPACT, "wakizashi_gun_impact")
EFFECT(0, RACER_MUZZLEFLASH, "wakizashi_gun_muzzleflash")
EFFECT(0, RACER_ROCKETLAUNCH, "wakizashi_rocket_launch")
-EFFECT(0, RACER_ROCKET_EXPLODE, "wakizashi_rocket_launch")
+EFFECT(0, RACER_ROCKET_EXPLODE, "wakizashi_rocket_explode")
EFFECT(1, RACER_ROCKET_TRAIL, "wakizashi_rocket_thrust")
EFFECT(0, SPIDERBOT_ROCKETLAUNCH, "spiderbot_rocket_launch")
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";
#include "casings.qh"
+#include <common/replicate.qh>
#include <common/util.qh>
#ifdef CSQC
.float cnt;
.int state;
+.bool silent;
+
void DamageEffect_Think(entity this)
{
// if particle distribution is enabled, slow ticrate by total number of damages
#include <client/mutators/_mod.qh>
#include <common/vehicles/all.qh>
#include <common/weapons/_all.qh>
+
+int w_deathtype;
+float w_issilent, w_random;
+vector w_org, w_backoff;
+
+.float damageforcescale;
+const float MIN_DAMAGEEXTRARADIUS = 2;
+const float MAX_DAMAGEEXTRARADIUS = 16;
+.float damageextraradius;
+.void(entity this, float thisdmg, int hittype, vector org, vector thisforce) event_damage;
#endif
#ifdef SVQC
#include <server/player.qh>
#endif
+ #ifdef CSQC
+ #include <client/main.qh>
+ #endif
REGISTER_NET_TEMP(globalsound)
REGISTER_NET_TEMP(playersound)
* @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);
}
if(f & 2)
{
- WriteCoord(MSG_ENTITY, this.angles.x);
- WriteCoord(MSG_ENTITY, this.angles.y);
- WriteCoord(MSG_ENTITY, this.angles.z);
+ WriteAngleVector(MSG_ENTITY, this.angles);
}
if(f & 4)
{
- WriteCoord(MSG_ENTITY, this.avelocity.x);
- WriteCoord(MSG_ENTITY, this.avelocity.y);
- WriteCoord(MSG_ENTITY, this.avelocity.z);
+ WriteAngleVector(MSG_ENTITY, this.avelocity);
}
WriteShort(MSG_ENTITY, this.scale * 256.0);
WriteShort(MSG_ENTITY, this.scale2 * 256.0);
}
if(f & 2)
{
- e.angles_x = ReadAngle();
- e.angles_y = ReadAngle();
- e.angles_z = ReadAngle();
+ e.angles = ReadAngleVector();
}
if(f & 4)
{
- e.avelocity_x = ReadAngle();
- e.avelocity_y = ReadAngle();
- e.avelocity_z = ReadAngle();
+ e.avelocity = ReadAngleVector();
}
e.scale1 = ReadShort() / 256.0;
e.scale2 = ReadShort() / 256.0;
do {
if (IS_PLAYER(player))
{
- if (radar_showennemies) break;
+ if (radar_showenemies) break;
if (SAME_TEAM(to, player)) break;
if (!(IS_PLAYER(to) || to.caplayer) && time > game_starttime) break;
}
#pragma once
#ifdef CSQC
-#include <client/defs.qh>
+#include <client/csqcmodel_hooks.qh>
#endif
REGISTER_NET_LINKED(ENT_CLIENT_ENTCS)
void entcs_force_origin(entity player);
+ bool radar_showenemies;
+
#endif
#ifdef CSQC
// 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)
#include "sv_assault.qh"
+#include <server/command/vote.qh>
#include <common/mapobjects/func/breakable.qh>
+#include <common/mapobjects/triggers.qh>
+#include <common/turrets/sv_turrets.qh>
+#include <server/damage.qh>
+#include <server/world.qh>
+#include <server/spawnpoints.qh>
.entity sprite;
#define AS_ROUND_DELAY 5
// 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
#include "sv_ctf.qh"
#include <common/effects/all.qh>
+#include <common/mapobjects/teleporters.qh>
+#include <common/mapobjects/triggers.qh>
#include <common/vehicles/all.qh>
+#include <server/command/vote.qh>
+#include <server/client.qh>
+#include <server/gamelog.qh>
+#include <server/damage.qh>
+#include <server/world.qh>
+#include <server/items/items.qh>
+#include <server/race.qh>
#include <server/teamplay.qh>
#include <lib/warpzone/common.qh>
ctf_CaptureShield_Update(player, 0); // shield player from picking up flag
}
+#if 0
void shockwave_spawn(string m, vector org, float sz, float t1, float t2)
{
return modeleffect_spawn(m, 0, 0, org, '0 0 0', '0 0 0', '0 0 0', 0, sz, 1, t1, t2);
}
+#endif
// ==============
// Event Handlers
// effects
Send_Effect_(flag.capeffect, flag.origin, '0 0 0', 1);
- //shockwave_spawn("models/ctf/shockwavetransring.md3", flag.origin - '0 0 15', -0.8, 0, 1);
+#if 0
+ shockwave_spawn("models/ctf/shockwavetransring.md3", flag.origin - '0 0 15', -0.8, 0, 1);
+#endif
// other
if(capturetype == CAPTURE_NORMAL)
WaypointSprite_UpdateHealth(player.wps_flagcarrier, healtharmor_maxdamage(GetResource(player, RES_HEALTH), GetResource(player, RES_ARMOR), autocvar_g_balance_armor_blockpercent, DEATH_WEAPON.m_id).x);
}
-MUTATOR_HOOKFUNCTION(ctf, Damage_Calculate) // for changing damage and force values that are applied to players in g_damage.qc
+MUTATOR_HOOKFUNCTION(ctf, Damage_Calculate) // for changing damage and force values that are applied to players in damage.qc
{
entity frag_attacker = M_ARGV(1, entity);
entity frag_target = M_ARGV(2, entity);
if(head != player && SAME_TEAM(head, player))
if(!head.speedrunning && !head.vehicle)
{
- // if it's a player, use the view origin as reference (stolen from RadiusDamage functions in g_damage.qc)
+ // if it's a player, use the view origin as reference (stolen from RadiusDamage functions in damage.qc)
vector head_center = WarpZone_UnTransformOrigin(head, CENTER_OR_VIEWOFS(head));
vector passer_center = CENTER_OR_VIEWOFS(player);
#include "ctf.qh"
+#include <common/gamemodes/sv_rules.qh>
+
void ctf_Initialize();
REGISTER_MUTATOR(ctf, false)
.float score_return;
.float score_team_capture; // shouldn't be too high
+// property set on objects to point to the flag they're carrying (if any)
+.entity flagcarried;
+
// effects
.string toucheffect;
.string passeffect;
// 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)
#include "sv_cts.qh"
+#include <server/client.qh>
#include <server/race.qh>
-#include <server/items.qh>
+#include <server/world.qh>
+#include <server/gamelog.qh>
+#include <server/items/spawning.qh>
+#include <server/weapons/common.qh>
+#include <common/mapobjects/triggers.qh>
float autocvar_g_cts_finish_kill_delay;
bool autocvar_g_cts_selfdamage;
// 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));
#include "sv_domination.qh"
+#include <server/client.qh>
+#include <server/command/vote.qh>
+#include <server/damage.qh>
+#include <server/gamelog.qh>
+#include <server/items/items.qh>
#include <server/teamplay.qh>
+#include <common/mapobjects/platforms.qh>
+#include <common/mapobjects/triggers.qh>
bool g_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));
#include "sv_invasion.qh"
+#include <common/mapobjects/triggers.qh>
#include <common/monsters/sv_spawn.qh>
#include <common/monsters/sv_spawner.qh>
#include <common/monsters/sv_monsters.qh>
+#include <server/bot/api.qh>
+#include <server/world.qh>
#include <server/teamplay.qh>
IntrusiveList g_invasion_roundends;
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));
#include "sv_keepaway.qh"
#include <common/effects/all.qh>
+#include <server/client.qh>
+#include <server/gamelog.qh>
+#include <server/damage.qh>
+#include <server/items/items.qh>
.entity ballcarried;
}
}
-MUTATOR_HOOKFUNCTION(ka, Damage_Calculate) // for changing damage and force values that are applied to players in g_damage.qc
+MUTATOR_HOOKFUNCTION(ka, Damage_Calculate) // for changing damage and force values that are applied to players in damage.qc
{
entity frag_attacker = M_ARGV(1, entity);
entity frag_target = M_ARGV(2, entity);
#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));
#include "sv_keyhunt.qh"
+#include <server/command/vote.qh>
+#include <server/gamelog.qh>
+#include <server/damage.qh>
+#include <server/items/items.qh>
+#include <common/mapobjects/triggers.qh>
+
float autocvar_g_balance_keyhunt_damageforcescale;
float autocvar_g_balance_keyhunt_delay_collect;
float autocvar_g_balance_keyhunt_delay_damage_return;
// 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));
#include <common/mutators/mutator/instagib/items.qh>
#include <server/campaign.qh>
#include <server/command/_mod.qh>
+#include <server/world.qh>
+#include <server/items/items.qh>
int autocvar_g_lms_extra_lives;
bool autocvar_g_lms_join_anytime;
return true;
return false;
}
+
+MUTATOR_HOOKFUNCTION(cl_nb, DrawScoreboardAccuracy)
+{
+ return ISGAMETYPE(NEXBALL); // accuracy is not a factor in this gamemode
+}
#pragma once
void HUD_Mod_NexBall(vector pos, vector mySize);
+
+float nb_pb_period;
#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)
#include "sv_nexball.qh"
+#include <server/client.qh>
+#include <server/command/vote.qh>
+#include <server/gamelog.qh>
+#include <common/ent_cs.qh>
+#include <common/mapobjects/triggers.qh>
+
.entity ballcarried;
int autocvar_g_nexball_goalleadlimit;
CVTOV(g_nexball_delay_idle); //10
CVTOV(g_nexball_football_physics); //0
*/
- radar_showennemies = autocvar_g_nexball_radar_showallplayers;
+ radar_showenemies = autocvar_g_nexball_radar_showallplayers;
InitializeEntity(NULL, nb_delayedinit, INITPRIO_GAMETYPE);
WEP_NEXBALL.spawnflags &= ~WEP_FLAG_MUTATORBLOCKED;
.float nb_droptime;
.float teamtime;
+
+float g_nexball_meter_period;
#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);
this.origin = ReadVector();
setorigin(this, this.origin);
- this.angles_x = ReadAngle();
- this.angles_y = ReadAngle();
- this.angles_z = ReadAngle();
+ this.angles = ReadAngleVector();
this.drawmask = MASK_NORMAL;
setmodel(this, MDL_Null); // give it a size for clientcamera
#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)
#include "sv_controlpoint.qh"
#include "sv_generator.qh"
+#include <server/bot/api.qh>
+#include <server/command/vote.qh>
+#include <server/damage.qh>
+#include <server/items/items.qh>
+#include <common/mapobjects/defs.qh>
+#include <common/mapobjects/triggers.qh>
+
bool g_onslaught;
float autocvar_g_onslaught_teleport_wait;
WriteVector(MSG_ENTITY, this.origin);
- WriteAngle(MSG_ENTITY, this.angles_x);
- WriteAngle(MSG_ENTITY, this.angles_y);
- WriteAngle(MSG_ENTITY, this.angles_z);
+ WriteAngleVector(MSG_ENTITY, this.angles);
return true;
}
this.team = this.enemy.team;
}
-void ons_CaptureShield_Spawn(entity generator, bool is_generator)
+void ons_CaptureShield_Spawn(entity this, Model shield_model)
{
entity shield = new(ons_captureshield);
IL_PUSH(g_onsshields, shield);
- shield.enemy = generator;
- shield.team = generator.team;
- shield.colormap = generator.colormap;
+ shield.enemy = this;
+ shield.team = this.team;
+ shield.colormap = this.colormap;
shield.reset = ons_CaptureShield_Reset;
settouch(shield, ons_CaptureShield_Touch);
setcefc(shield, ons_CaptureShield_Customize);
set_movetype(shield, MOVETYPE_NOCLIP);
shield.solid = SOLID_TRIGGER;
shield.avelocity = '7 0 11';
- shield.scale = 1;
- shield.model = ((is_generator) ? "models/onslaught/generator_shield.md3" : "models/onslaught/controlpoint_shield.md3");
+ shield.scale = this.scale;
- precache_model(shield.model);
- setorigin(shield, generator.origin);
- _setmodel(shield, shield.model);
- setsize(shield, shield.scale * shield.mins, shield.scale * shield.maxs);
+ float shield_extra_size = 1.20; // hitbox is 20% larger than the object itself
+ setorigin(shield, this.origin);
+ setmodel(shield, shield_model);
+ setsize(shield, shield_extra_size * this.mins, shield_extra_size * this.maxs);
}
onslaught_updatelinks();
// captureshield setup
- ons_CaptureShield_Spawn(this, false);
+ ons_CaptureShield_Spawn(this, MDL_ONS_CP_SHIELD);
CSQCMODEL_AUTOINIT(this);
}
FOREACH_CLIENT(true, it.clientcamera = cam;);
+ // NOTE: engine networked
WriteByte(MSG_ALL, SVC_SETVIEWANGLES);
WriteAngle(MSG_ALL, cam.angles_x);
WriteAngle(MSG_ALL, cam.angles_y);
{
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));
this.bot_basewaypoint = this.nearestwaypoint;
// captureshield setup
- ons_CaptureShield_Spawn(this, true);
+ ons_CaptureShield_Spawn(this, MDL_ONS_GEN_SHIELD);
onslaught_updatelinks();
// 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)
#include "sv_race.qh"
+#include <server/client.qh>
+#include <server/world.qh>
+#include <server/gamelog.qh>
#include <server/race.qh>
+#include <common/ent_cs.qh>
+#include <common/mapobjects/triggers.qh>
#define autocvar_g_race_laps_limit cvar("g_race_laps_limit")
float autocvar_g_race_qualifying_timelimit;
race_ScoreRules();
if(g_race_qualifying == 2)
warmup_stage = 0;
+ radar_showenemies = true;
}
void rc_SetLimits()
// 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)
#include "sv_rules.qh"
+#include <server/spawnpoints.qh>
#include <server/teamplay.qh>
void GameRules_teams(bool value)
#endif
#ifdef SVQC
-#include <server/items.qh>
+#include <server/items/spawning.qh>
#endif
+#ifdef GAMEQC
const int IT_UNLIMITED_AMMO = BIT(0); // when this bit is set, using a weapon does not reduce ammo. Checkpoints can give this powerup.
const int IT_UNLIMITED_SUPERWEAPONS = BIT(1); // when this bit is set, superweapons don't expire. Checkpoints can give this powerup.
const int IT_KEY1 = BIT(6);
const int IT_KEY2 = BIT(7);
-const int IT_CTF_SHIELDED = BIT(8); // set for the flag shield
-
// special colorblend meaning in engine
const int IT_INVISIBILITY = BIT(9);
const int IT_INVINCIBLE = BIT(10);
// item masks
const int IT_PICKUPMASK = IT_UNLIMITED_AMMO | IT_UNLIMITED_SUPERWEAPONS | IT_JETPACK | IT_FUEL_REGEN; // strength and invincible are handled separately
+// item networking
+const int ISF_LOCATION = BIT(1);
+const int ISF_MODEL = BIT(2);
+const int ISF_STATUS = BIT(3);
+const int ISF_COLORMAP = BIT(4);
+const int ISF_DROP = BIT(5);
+const int ISF_ANGLES = BIT(6);
+const int ISF_SIZE = BIT(7);
+
+REGISTER_NET_LINKED(ENT_CLIENT_ITEM)
+
+// item status
+.int ItemStatus;
+const int ITS_STAYWEP = BIT(0);
+const int ITS_ANIMATE1 = BIT(1);
+const int ITS_ANIMATE2 = BIT(2);
+const int ITS_AVAILABLE = BIT(3);
+const int ITS_ALLOWFB = BIT(4);
+const int ITS_ALLOWSI = BIT(5);
+const int ITS_GLOW = BIT(6);
+
+.float fade_start;
+.float fade_end;
+
+.string mdl;
+#endif
+
#ifdef SVQC
.float strength_finished; // NOTE: this field is used only by map entities, it does not directly apply the strength stat
.float invincible_finished; // ditto
#include "pickup.qh"
#include <common/items/all.qh>
#ifdef SVQC
- #include <common/t_items.qh>
+ #include <server/items/items.qh>
#include <server/resources.qh>
#endif
ENDCLASS(Armor)
#ifdef SVQC
- #include <common/t_items.qh>
+ #include <server/items/items.qh>
#endif
#ifdef GAMEQC
ENDCLASS(Health)
#ifdef SVQC
- #include <common/t_items.qh>
+ #include <server/items/items.qh>
#endif
#ifdef GAMEQC
#pragma once
#ifdef SVQC
- #include <common/t_items.qh>
+ #include <server/items/items.qh>
#endif
#include "ammo.qh"
#ifdef SVQC
// For FL_POWERUP
- #include <server/constants.qh>
+ #include <common/constants.qh>
#endif
#include "pickup.qh"
this.m_color = '0 0 1';
this.m_waypoint = _("Strength");
this.m_waypointblink = 2;
+#ifdef GAMEQC
this.m_itemid = IT_STRENGTH;
+#endif
#ifdef SVQC
this.m_iteminit = powerup_strength_init;
#endif
this.m_color = '1 0 1';
this.m_waypoint = _("Shield");
this.m_waypointblink = 2;
+#ifdef GAMEQC
this.m_itemid = IT_INVINCIBLE;
+#endif
#ifdef SVQC
this.m_iteminit = powerup_shield_init;
#endif
#include "mapinfo.qh"
#if defined(CSQC)
- #include "../client/defs.qh"
#include "util.qh"
#include <common/weapons/_all.qh>
#elif defined(MENUQC)
}
}
-Gametype MapInfo_Type_FromString(string gtype)
+Gametype MapInfo_Type_FromString(string gtype, bool dowarn)
{
string replacement = "";
switch (gtype)
case "assault": replacement = "as"; break;
case "race": replacement = "rc"; break;
}
- if (replacement != "" && WARN_COND)
+ if (replacement != "")
{
- LOG_WARNF("MapInfo_Type_FromString (probably %s): using deprecated name '%s'. Should use '%s'.", MapInfo_Map_bspname, gtype, replacement);
+ 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;
}
FOREACH(Gametypes, it.mdl == gtype, return it);
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);
void MapInfo_Shutdown(); // call this in the shutdown handler
#define MAPINFO_SETTEMP_ACL_USER cvar_string("g_mapinfo_settemp_acl")
-#define MAPINFO_SETTEMP_ACL_SYSTEM "-g_mapinfo_* -rcon_* -_* -g_ban* -r_water +*"
+#define MAPINFO_SETTEMP_ACL_SYSTEM "-g_mapinfo_* -rcon_* -_* -g_ban* +*"
// generated file; do not modify
+#include <common/mapobjects/bgmscript.qc>
#include <common/mapobjects/models.qc>
#include <common/mapobjects/platforms.qc>
#include <common/mapobjects/subs.qc>
// generated file; do not modify
+#include <common/mapobjects/bgmscript.qh>
#include <common/mapobjects/models.qh>
#include <common/mapobjects/platforms.qh>
#include <common/mapobjects/subs.qh>
--- /dev/null
+#include "bgmscript.qh"
--- /dev/null
+#pragma once
+
+entityclass(BGMScript);
+classfield(BGMScript) .string bgmscript;
+classfield(BGMScript) .float bgmscriptattack;
+classfield(BGMScript) .float bgmscriptdecay;
+classfield(BGMScript) .float bgmscriptsustain;
+classfield(BGMScript) .float bgmscriptrelease;
//----------------
// STATES & ACTIVE
//----------------
-#ifdef CSQC
-// this stuff is defined in the server side engine VM, so we must define it separately here
const int STATE_TOP = 0;
const int STATE_BOTTOM = 1;
const int STATE_UP = 2;
const int STATE_DOWN = 3;
+.int active;
+.void (entity this, int act_state) setactive;
const int ACTIVE_NOT = 0;
const int ACTIVE_ACTIVE = 1;
const int ACTIVE_IDLE = 2;
const int ACTIVE_BUSY = 2;
const int ACTIVE_TOGGLE = 3;
-#endif
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;
#include "breakable.qh"
#ifdef SVQC
-#include <server/g_damage.qh>
+#include <server/damage.qh>
#include <server/bot/api.qh>
#include <common/csqcmodel_settings.qh>
#include <lib/csqcmodel/sv_model.qh>
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(); }
+
+#ifdef SVQC
+IntrusiveList g_ladders;
+STATIC_INIT(g_ladders) { g_ladders = IL_NEW(); }
+#endif
+
.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;
WriteVector(MSG_ENTITY, this.size);
- WriteAngle(MSG_ENTITY, this.mangle_x);
- WriteAngle(MSG_ENTITY, this.mangle_y);
- WriteAngle(MSG_ENTITY, this.mangle_z);
+ WriteAngleVector(MSG_ENTITY, this.mangle);
WriteShort(MSG_ENTITY, this.speed);
WriteShort(MSG_ENTITY, this.height);
this.size = ReadVector();
- this.mangle_x = ReadAngle();
- this.mangle_y = ReadAngle();
- this.mangle_z = ReadAngle();
+ this.mangle = ReadAngleVector();
this.speed = ReadShort();
this.height = ReadShort();
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);
}
}
Brush model that spins in place on one axis (default Z).
speed : speed to rotate (in degrees per second)
noise : path/name of looping .wav file to play.
-dmg : Do this mutch dmg every .dmgtime intervall when blocked
+dmg : Do this much damage every .dmgtime interval when blocked
dmgtime : See above.
*/
#include "stardust.qh"
#ifdef SVQC
+void func_stardust_think(entity this)
+{
+ this.nextthink = time + 0.25;
+ CSQCMODEL_AUTOUPDATE(this);
+}
spawnfunc(func_stardust)
{
+ if(this.model != "") { precache_model(this.model); _setmodel(this, this.model); }
+
this.effects = EF_STARDUST;
CSQCMODEL_AUTOINIT(this);
+
+ setthink(this, func_stardust_think);
+ this.nextthink = time + 0.25;
}
#endif
WriteVector(MSG_ENTITY, this.view_ofs);
- WriteAngle(MSG_ENTITY, this.mangle_x);
- WriteAngle(MSG_ENTITY, this.mangle_y);
- WriteAngle(MSG_ENTITY, this.mangle_z);
+ WriteAngleVector(MSG_ENTITY, this.mangle);
WriteShort(MSG_ENTITY, this.speed);
WriteShort(MSG_ENTITY, this.height);
this.view_ofs = ReadVector();
- this.mangle_x = ReadAngle();
- this.mangle_y = ReadAngle();
- this.mangle_z = ReadAngle();
+ this.mangle = ReadAngleVector();
this.speed = ReadShort();
this.height = ReadShort();
const int TRAIN_CURVE = BIT(0);
const int TRAIN_TURN = BIT(1);
const int TRAIN_NEEDACTIVATION = BIT(2);
-
-#ifdef CSQC
-.float dmgtime;
-#endif
vector func_vectormamamam_origin(entity o, float timestep)
{
- vector v, p;
- float flags;
+ vector p;
entity e;
-
- flags = o.spawnflags;
- v = '0 0 0';
+ int myflags = o.spawnflags;
+ vector v = '0 0 0';
e = o.wp00;
if(e)
{
p = e.origin + timestep * e.velocity;
- if(flags & PROJECT_ON_TARGETNORMAL)
+ if(myflags & PROJECT_ON_TARGETNORMAL)
v = v + (p * o.targetnormal) * o.targetnormal * o.targetfactor;
else
v = v + (p - (p * o.targetnormal) * o.targetnormal) * o.targetfactor;
if(e)
{
p = e.origin + timestep * e.velocity;
- if(flags & PROJECT_ON_TARGET2NORMAL)
+ if(myflags & PROJECT_ON_TARGET2NORMAL)
v = v + (p * o.target2normal) * o.target2normal * o.target2factor;
else
v = v + (p - (p * o.target2normal) * o.target2normal) * o.target2factor;
if(e)
{
p = e.origin + timestep * e.velocity;
- if(flags & PROJECT_ON_TARGET3NORMAL)
+ if(myflags & PROJECT_ON_TARGET3NORMAL)
v = v + (p * o.target3normal) * o.target3normal * o.target3factor;
else
v = v + (p - (p * o.target3normal) * o.target3normal) * o.target3factor;
if(e)
{
p = e.origin + timestep * e.velocity;
- if(flags & PROJECT_ON_TARGET4NORMAL)
+ if(myflags & PROJECT_ON_TARGET4NORMAL)
v = v + (p * o.target4normal) * o.target4normal * o.target4factor;
else
v = v + (p - (p * o.target4normal) * o.target4normal) * o.target4factor;
void func_vectormamamam_controller_think(entity this)
{
- this.nextthink = time + vectormamamam_timestep;
+ this.nextthink = time + VECTORMAMAMAM_TIMESTEP;
if(this.owner.active != ACTIVE_ACTIVE)
{
}
if(this.owner.classname == "func_vectormamamam") // don't brake stuff if the func_vectormamamam was killtarget'ed
- this.owner.velocity = (this.owner.destvec + func_vectormamamam_origin(this.owner, vectormamamam_timestep) - this.owner.origin) * 10;
+ this.owner.velocity = (this.owner.destvec + func_vectormamamam_origin(this.owner, VECTORMAMAMAM_TIMESTEP) - this.owner.origin) * 10;
}
void func_vectormamamam_findtarget(entity this)
{
- if(this.target != "")
+ if(this.target && this.target != "")
this.wp00 = find(NULL, targetname, this.target);
- if(this.target2 != "")
+ if(this.target2 && this.target2 != "")
this.wp01 = find(NULL, targetname, this.target2);
- if(this.target3 != "")
+ if(this.target3 && this.target3 != "")
this.wp02 = find(NULL, targetname, this.target3);
- if(this.target4 != "")
+ if(this.target4 && this.target4 != "")
this.wp03 = find(NULL, targetname, this.target4);
if(!this.wp00 && !this.wp01 && !this.wp02 && !this.wp03)
this.destvec = this.origin - func_vectormamamam_origin(this, 0);
- entity controller;
- controller = new(func_vectormamamam_controller);
+ entity controller = new(func_vectormamamam_controller);
controller.owner = this;
controller.nextthink = time + 1;
setthink(controller, func_vectormamamam_controller_think);
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);
}
}
this.target4normal = normalize(this.target4normal);
setblocked(this, generic_plat_blocked);
- if(this.dmg && (this.message == ""))
+ if(this.dmg && (!this.message || this.message == ""))
this.message = " was squished";
- if(this.dmg && (this.message == ""))
+ if(this.dmg && (!this.message2 || this.message2 == ""))
this.message2 = "was squished by";
if(this.dmg && (!this.dmgtime))
this.dmgtime = 0.25;
#pragma once
-
const int PROJECT_ON_TARGETNORMAL = BIT(0);
const int PROJECT_ON_TARGET2NORMAL = BIT(1);
const int PROJECT_ON_TARGET3NORMAL = BIT(2);
const int PROJECT_ON_TARGET4NORMAL = BIT(3);
-const float vectormamamam_timestep = 0.1;
+const float VECTORMAMAMAM_TIMESTEP = 0.1;
#include "dynlight.qh"
#ifdef SVQC
-#include <server/defs.qh>
+#include <common/weapons/_all.qh>
+#include <common/stats.qh>
#include <server/miscfunctions.qh>
const float LOOP = 1;
REGISTER_NET_LINKED(ENT_CLIENT_LASER)
#ifdef SVQC
-.float modelscale;
void misc_laser_aim(entity this)
{
vector a;
}
else
{
- WriteAngle(MSG_ENTITY, this.mangle_x);
- WriteAngle(MSG_ENTITY, this.mangle_y);
+ WriteAngleVector2D(MSG_ENTITY, this.mangle);
}
}
if(sendflags & SF_LASER_UPDATE_ACTIVE)
}
#elif defined(CSQC)
-// a laser goes from origin in direction angles
-// it has color 'beam_color'
-// and stops when something is in the way
-entityclass(Laser);
-classfield(Laser) .int cnt; // end effect
-classfield(Laser) .vector colormod;
-classfield(Laser) .int state; // on-off
-classfield(Laser) .int count; // flags for the laser
-classfield(Laser) .vector velocity; // laser endpoint if it is FINITE
-classfield(Laser) .float alpha;
-classfield(Laser) .float scale; // scaling factor of the thickness
-classfield(Laser) .float modelscale; // scaling factor of the dlight
-
void Draw_Laser(entity this)
{
if(this.active == ACTIVE_NOT)
}
else
{
- this.angles_x = ReadAngle();
- this.angles_y = ReadAngle();
+ this.angles = ReadAngleVector2D();
}
}
if(sendflags & SF_LASER_UPDATE_ACTIVE)
#pragma once
+// a laser goes from origin in direction angles
+// it has color 'beam_color'
+// and stops when something is in the way
+entityclass(Laser);
+classfield(Laser) .int cnt; // end effect
+classfield(Laser) .vector colormod;
+classfield(Laser) .int state; // on-off
+classfield(Laser) .int count; // flags for the laser
+classfield(Laser) .vector velocity; // laser endpoint if it is FINITE
+classfield(Laser) .float alpha;
+classfield(Laser) .float scale; // scaling factor of the thickness
+classfield(Laser) .float modelscale; // scaling factor of the dlight
const int LASER_FINITE = BIT(1);
const int LASER_NOTRACE = BIT(2);
WriteCoord(MSG_ENTITY, this.speed);
WriteString(MSG_ENTITY, this.targetname);
WriteVector(MSG_ENTITY, this.origin);
-
- WriteAngle(MSG_ENTITY, this.mangle_x);
- WriteAngle(MSG_ENTITY, this.mangle_y);
- WriteAngle(MSG_ENTITY, this.mangle_z);
+ WriteAngleVector(MSG_ENTITY, this.mangle);
}
return true;
this.speed = ReadCoord();
this.targetname = strzone(ReadString());
this.origin = ReadVector();
-
- this.mangle_x = ReadAngle();
- this.mangle_y = ReadAngle();
- this.mangle_z = ReadAngle();
+ this.mangle = ReadAngleVector();
setorigin(this, this.origin);
#include "models.qh"
#ifdef SVQC
-#include <server/defs.qh>
+#include <common/weapons/_all.qh>
+#include <common/stats.qh>
#include <server/miscfunctions.qh>
#include <common/net_linked.qh>
#include "subs.qh"
#include "triggers.qh"
-
-entityclass(BGMScript);
-classfield(BGMScript) .string bgmscript;
-classfield(BGMScript) .float bgmscriptattack;
-classfield(BGMScript) .float bgmscriptdecay;
-classfield(BGMScript) .float bgmscriptsustain;
-classfield(BGMScript) .float bgmscriptrelease;
+#include "bgmscript.qh"
#include <common/constants.qh>
-#include "../../lib/csqcmodel/sv_model.qh"
-
-.float modelscale;
+#include <lib/csqcmodel/sv_model.qh>
void g_model_setcolormaptoactivator(entity this, entity actor, entity trigger)
{
if(sf & BIT(2))
{
if(sf & 0x10)
- {
- WriteAngle(MSG_ENTITY, this.angles.x);
- WriteAngle(MSG_ENTITY, this.angles.y);
- WriteAngle(MSG_ENTITY, this.angles.z);
- }
+ WriteAngleVector(MSG_ENTITY, this.angles);
}
if(sf & BIT(3))
// non-solid brush entities:
spawnfunc(func_illusionary) { G_MODEL_INIT (this, SOLID_NOT) } // Q1 name (WARNING: MISPREDICTED)
spawnfunc(func_clientillusionary) { G_CLIENTMODEL_INIT(this, SOLID_NOT) } // brush entity
-spawnfunc(func_static) { G_MODEL_INIT (this, SOLID_NOT) } // DEPRECATED old alias name from some other game
// solid brush entities
spawnfunc(func_wall) { G_MODEL_INIT (this, SOLID_BSP) } // Q1 name
spawnfunc(func_clientwall) { G_CLIENTMODEL_INIT(this, SOLID_BSP) } // brush entity (WARNING: MISPREDICTED)
+spawnfunc(func_static) { G_MODEL_INIT (this, SOLID_BSP) } // DEPRECATED old alias name from some other game
#elif defined(CSQC)
.float alpha;
.float scale;
if(f & 4)
{
if(f & 0x10)
- {
- this.angles_x = ReadAngle();
- this.angles_y = ReadAngle();
- this.angles_z = ReadAngle();
- }
+ this.angles = ReadAngleVector();
else
this.angles = '0 0 0';
}
#pragma once
+.float modelscale;
+
#ifdef CSQC
entityclass(Wall);
classfield(Wall) .float lip;
classfield(Wall) .float loddistance1, loddistance2;
classfield(Wall) .vector saved;
+void Ent_Wall_Draw(entity this);
+
+void Ent_Wall_Remove(entity this);
+#endif
+
// Needed for interactive clientwalls
.bool inactive; // Clientwall disappears when inactive
.float alpha_max, alpha_min;
// fade_vertical_offset is a vertival offset for player position
.float fade_start, fade_end, fade_vertical_offset;
.float default_solid;
-
-void Ent_Wall_Draw(entity this);
-
-void Ent_Wall_Remove(entity this);
-#endif
const int PLAT_LOW_TRIGGER = BIT(0);
+.float dmg;
+.float dmgtime;
.float dmgtime2;
+.float phase;
+
void plat_center_touch(entity this, entity toucher);
void plat_outside_touch(entity this, entity toucher);
void plat_trigger_use(entity this, entity actor, entity trigger);
void plat_go_up(entity this);
void plat_go_down(entity this);
void plat_crush(entity this, entity blocker);
-
-.float dmg;
}
if(this.gametype != "")
- MapInfo_SwitchGameType(MapInfo_Type_FromString(this.gametype));
+ MapInfo_SwitchGameType(MapInfo_Type_FromString(this.gametype, false));
if (this.chmap == "")
{
#include "kill.qh"
-#include "location.qh"
-#ifdef SVQC
+#ifdef SVQC
void target_kill_use(entity this, entity actor, entity trigger)
{
+ if(this.active != ACTIVE_ACTIVE)
+ return;
+
if(actor.takedamage == DAMAGE_NO)
return;
Damage(actor, this, trigger, 1000, DEATH_HURTTRIGGER.m_id, DMG_NOWEP, actor.origin, '0 0 0');
}
-spawnfunc(target_kill)
+void target_kill_reset(entity this)
{
- this.classname = "target_kill";
+ this.active = ACTIVE_ACTIVE;
+}
+spawnfunc(target_kill)
+{
if (this.message == "")
this.message = "was in the wrong place";
+ if (this.message2 == "")
+ this.message2 = "was thrown into a world of hurt by";
+
this.use = target_kill_use;
+ this.reset = target_kill_reset;
+ this.active = ACTIVE_ACTIVE;
}
-
#endif
#pragma once
+
+#ifdef SVQC
+IntrusiveList g_locations;
+STATIC_INIT(g_locations) { g_locations = IL_NEW(); }
+#endif
#elif defined(SVQC)
#include <common/constants.qh>
#include <common/net_linked.qh>
- #include <server/constants.qh>
- #include <server/defs.qh>
+ #include <common/weapons/_all.qh>
+ #include <common/stats.qh>
#endif
REGISTER_NET_TEMP(TE_CSQC_TARGET_MUSIC)
#elif defined(MENUQC)
#elif defined(SVQC)
#include <common/util.qh>
- #include <server/defs.qh>
+ #include <common/weapons/_all.qh>
+ #include <common/stats.qh>
+ #include <server/world.qh>
#endif
#ifdef SVQC
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 "../util.qh"
#include <server/weapons/csqcprojectile.qh>
#include <server/autocvars.qh>
- #include <server/constants.qh>
- #include <server/defs.qh>
+ #include <common/weapons/_all.qh>
+ #include <common/stats.qh>
#include "../deathtypes/all.qh"
+ #include <server/main.qh>
#include "../turrets/sv_turrets.qh"
#include "../vehicles/all.qh"
- #include "../mapinfo.qh"
+ #include <common/gamemodes/_mod.qh>
#include <server/anticheat.qh>
#endif
#define TELEPORT_FLAGS_PORTAL (TELEPORT_FLAG_SOUND | TELEPORT_FLAG_PARTICLES | TELEPORT_FLAG_TDEATH | TELEPORT_FLAG_FORCE_TDEATH)
#define TELEPORT_FLAGS_TELEPORTER (TELEPORT_FLAG_SOUND | TELEPORT_FLAG_PARTICLES | TELEPORT_FLAG_TDEATH)
+.float teleportable;
// types for .teleportable entity setting
const int TELEPORT_NORMAL = 1; // play sounds/effects etc
const int TELEPORT_SIMPLE = 2; // only do teleport, nothing special
#include "counter.qh"
-#ifdef SVQC
-void counter_reset(entity this);
+#ifdef SVQC
void counter_use(entity this, entity actor, entity trigger)
{
+ if(this.active != ACTIVE_ACTIVE)
+ return;
+
entity store = this;
if(this.spawnflags & COUNTER_PER_PLAYER)
{
setthink(this, func_null);
this.nextthink = 0;
this.counter_cnt = 0;
+ this.active = ACTIVE_ACTIVE;
}
/*QUAKED spawnfunc_trigger_counter (.5 .5 .5) ? nomessage COUNTER_FIRE_AT_COUNT
this.counter_cnt = 0;
this.use = counter_use;
this.reset = counter_reset;
+ this.active = ACTIVE_ACTIVE;
}
#endif
#pragma once
#ifdef SVQC
-spawnfunc(trigger_counter);
+void counter_reset(entity this);
.float counter_cnt;
#include "delay.qh"
+
#ifdef SVQC
void delay_delayeduse(entity this)
{
void delay_use(entity this, entity actor, entity trigger)
{
+ if(this.active != ACTIVE_ACTIVE)
+ return;
+
this.enemy = actor;
this.goalentity = trigger;
setthink(this, delay_delayeduse);
this.enemy = this.goalentity = NULL;
setthink(this, func_null);
this.nextthink = 0;
+ this.active = ACTIVE_ACTIVE;
}
spawnfunc(trigger_delay)
this.use = delay_use;
this.reset = delay_reset;
+ this.active = ACTIVE_ACTIVE;
}
#endif
#include "flipflop.qh"
+
#ifdef SVQC
/*QUAKED spawnfunc_trigger_flipflop (.5 .5 .5) (-8 -8 -8) (8 8 8) START_ENABLED
"Flip-flop" trigger gate... lets only every second trigger event through
*/
void flipflop_use(entity this, entity actor, entity trigger)
{
+ if(this.active != ACTIVE_ACTIVE)
+ return;
+
this.state = !this.state;
if(this.state)
SUB_UseTargets(this, actor, trigger);
spawnfunc(trigger_flipflop)
{
- if(this.spawnflags & START_ENABLED)
- {
- this.state = true;
- }
+ this.active = ACTIVE_ACTIVE;
+ this.state = (this.spawnflags & START_ENABLED);
this.use = flipflop_use;
this.reset = spawnfunc_trigger_flipflop; // perfect resetter
}
-
#endif
#include "gamestart.qh"
+
#ifdef SVQC
void gamestart_use(entity this, entity actor, entity trigger)
{
SUB_UseTargets(this, this, trigger);
- delete(this);
-}
-
-void gamestart_use_this(entity this)
-{
- gamestart_use(this, NULL, NULL);
+ delete(this); // TODO: deleting this means it can't be used upon map reset!
}
spawnfunc(trigger_gamestart)
this.nextthink = game_starttime + this.wait;
}
else
- InitializeEntity(this, gamestart_use_this, INITPRIO_FINDTARGET);
+ InitializeEntity(this, adaptor_think2use, INITPRIO_FINDTARGET);
}
-
#endif
#pragma once
+#ifdef SVQC
const int HURT_SLOW = BIT(4);
+
+bool tracebox_hits_trigger_hurt(vector start, vector e_min, vector e_max, vector end);
+#endif
// TODO: split target_push and put it in the target folder
#ifdef SVQC
#include <common/physics/movetypes/movetypes.qh>
+#include <server/main.qh>
void trigger_push_use(entity this, entity actor, entity trigger)
{
WriteByte(MSG_ENTITY, this.active);
WriteCoord(MSG_ENTITY, this.height);
- WriteVector(MSG_ENTITY, this.movedir);
-
trigger_common_write(this, true);
return true;
WriteString(MSG_ENTITY, this.targetname);
WriteVector(MSG_ENTITY, this.origin);
- WriteAngle(MSG_ENTITY, this.angles_x);
- WriteAngle(MSG_ENTITY, this.angles_y);
- WriteAngle(MSG_ENTITY, this.angles_z);
+ WriteAngleVector(MSG_ENTITY, this.angles);
return true;
}
this.active = ReadByte();
this.height = ReadCoord();
- this.movedir = ReadVector();
-
trigger_common_read(this, true);
this.entremove = trigger_remove_generic;
this.targetname = strzone(ReadString());
this.origin = ReadVector();
- this.angles_x = ReadAngle();
- this.angles_y = ReadAngle();
- this.angles_z = ReadAngle();
+ this.angles = ReadAngleVector();
return = true;
trigger_keylock_link(this);
}
#elif defined(CSQC)
-void keylock_remove(entity this)
-{
- strfree(this.target);
- strfree(this.target2);
- strfree(this.target3);
- strfree(this.target4);
- strfree(this.killtarget);
- strfree(this.targetname);
-}
-
NET_HANDLE(ENT_CLIENT_KEYLOCK, bool isnew)
{
this.itemkeys = ReadInt24_t();
return = true;
this.classname = "trigger_keylock";
- this.entremove = keylock_remove;
+ this.entremove = trigger_remove_generic;
}
#endif
return; // only players
}
- // TODO: restructure this so that trigger_secret is more independent
- if (this.classname == "trigger_secret")
- {
- if (!IS_PLAYER(this.enemy))
- return;
- found_secrets = found_secrets + 1;
- WriteByte (MSG_ALL, SVC_FOUNDSECRET);
- }
-
- if (this.noise)
+ if (this.noise && this.noise != "")
{
_sound (this.enemy, CH_TRIGGER, this.noise, VOL_BASE, ATTEN_NORM);
}
else if (this.sounds == 3)
this.noise = "misc/trigger1.wav";
- if(this.noise)
+ if(this.noise && this.noise != "")
precache_sound(this.noise);
if (!this.wait)
#include "relay_activators.qh"
+
#ifdef SVQC
void relay_activators_use(entity this, entity actor, entity trigger)
{
+ if(this.active != ACTIVE_ACTIVE)
+ return;
+
for(entity trg = NULL; (trg = find(trg, targetname, this.target)); )
{
if (trg.setactive)
}
}
+void relay_activators_init(entity this)
+{
+ this.reset = relay_activators_init; // doubles as a reset function
+ this.active = ACTIVE_ACTIVE;
+ this.use = relay_activators_use;
+}
+
spawnfunc(relay_activate)
{
this.cnt = ACTIVE_ACTIVE;
- this.use = relay_activators_use;
+ relay_activators_init(this);
}
spawnfunc(relay_deactivate)
{
this.cnt = ACTIVE_NOT;
- this.use = relay_activators_use;
+ relay_activators_init(this);
}
spawnfunc(relay_activatetoggle)
{
this.cnt = ACTIVE_TOGGLE;
- this.use = relay_activators_use;
+ relay_activators_init(this);
}
#endif
#include "relay_if.qh"
+
#ifdef SVQC
void trigger_relay_if_use(entity this, entity actor, entity trigger)
{
#include "relay_teamcheck.qh"
+
#ifdef SVQC
void trigger_relay_teamcheck_use(entity this, entity actor, entity trigger)
{
#elif defined(MENUQC)
#elif defined(SVQC)
#include <common/util.qh>
- #include <server/defs.qh>
+ #include <common/weapons/_all.qh>
+ #include <common/stats.qh>
#endif
#ifdef SVQC
-void secrets_setstatus(entity this)
-{
- // TODO: use global stats!
- STAT(SECRETS_TOTAL, this) = secrets_total;
- STAT(SECRETS_FOUND, this) = secrets_found;
-}
-
/**
* A secret has been found (maybe :P)
*/
if (!IS_PLAYER(toucher))
return;
+ EXACTTRIGGER_TOUCH(this, toucher);
+
// update secrets found counter
secrets_found += 1;
- //print("Secret found: ", ftos(secret_counter.cnt), "/");
- //print(ftos(secret_counter.count), "\n");
- // centerprint message (multi_touch() doesn't always call centerprint())
- centerprint(toucher, this.message);
- this.message = "";
+ // message and noise handled by SUB_UseTargets
+ SUB_UseTargets(this, toucher, toucher);
- // handle normal trigger features
- multi_touch(this, toucher);
// we can't just delete(this) here, because this is a touch function
// called while C code is looping through area links...
- //delete(this);
+ settouch(this, func_null);
+}
+
+#if 0
+void trigger_secret_reset(entity this)
+{
+ secrets_found = 0;
+ settouch(this, trigger_secret_touch);
}
+#endif
/*QUAKED trigger_secret (.5 .5 .5) ?
Variable sized secret trigger. Can be targeted at one or more entities.
secrets_total += 1;
// add default message
- if (this.message == "")
+ if (!this.message || this.message == "")
this.message = "You found a secret!";
// set default sound
- if (this.noise == "")
- if (!this.sounds)
+ if ((!this.noise || this.noise == "") && !this.sounds)
this.sounds = 1; // misc/secret.wav
- // this entity can't be a target itself!!!!
- this.targetname = "";
+ switch(this.sounds)
+ {
+ case 1: this.noise = "misc/secret.wav"; break;
+ case 2: this.noise = strzone(SND(TALK)); break;
+ case 3: this.noise = "misc/trigger1.wav"; break;
+ }
- // you can't just shoot a room to find it, can you?
- SetResourceExplicit(this, RES_HEALTH, 0);
+ if(this.noise && this.noise != "")
+ precache_sound(this.noise);
- // a secret can not be delayed
+ // a secret cannot be delayed
this.delay = 0;
- // convert this trigger to trigger_once
- //this.classname = "trigger_once";
- spawnfunc_trigger_once(this);
+ EXACTTRIGGER_INIT;
- // take over the touch() function, so we can mark secret as found
settouch(this, trigger_secret_touch);
- // ignore triggering;
- this.use = func_null;
+// NOTE: old maps don't expect secrets to reset, so enabling resetting can cause issues!
+#if 0
+ this.reset = trigger_secret_reset;
+#endif
}
#endif
#pragma once
-#ifdef SVQC
-
-/**
- * Total number of secrets on the map.
- */
-float secrets_total;
-
-/**
- * Total numbe of secrets found on the map.
- */
-float secrets_found;
+#ifdef SVQC
+// Total number of secrets on the map.
+int secrets_total;
-/**
- * update secrets status.
- */
-void secrets_setstatus(entity this);
+// Total numbe of secrets found on the map.
+int secrets_found;
#endif
#elif defined(SVQC)
#include <lib/warpzone/util_server.qh>
#include <common/weapons/_all.qh>
- #include <server/defs.qh>
+ #include <common/weapons/_all.qh>
+ #include <common/stats.qh>
#include <common/deathtypes/all.qh>
#endif
#elif defined(MENUQC)
#elif defined(SVQC)
#include <lib/warpzone/util_server.qh>
- #include <server/defs.qh>
+ #include <common/mapobjects/triggers.qh>
+ #include <common/weapons/_all.qh>
+ #include <common/stats.qh>
#endif
REGISTER_NET_LINKED(ENT_CLIENT_VIEWLOC)
WriteVector(MSG_ENTITY, this.origin);
- WriteAngle(MSG_ENTITY, this.angles_x);
- WriteAngle(MSG_ENTITY, this.angles_y);
- WriteAngle(MSG_ENTITY, this.angles_z);
+ WriteAngleVector(MSG_ENTITY, this.angles);
return true;
}
this.origin = ReadVector();
setorigin(this, this.origin);
- this.movedir_x = ReadAngle();
- this.movedir_y = ReadAngle();
- this.movedir_z = ReadAngle();
+ this.movedir = ReadAngleVector();
return = true;
.float lip;
+// handy fields used by a lot of the codebase, but more importantly used by map objects
+.float cnt;
+.float count;
+
// used elsewhere (will fix)
#ifdef SVQC
+.string message2;
+
void trigger_common_write(entity this, bool withtarget);
string trigger_magicear_processmessage_forallears(entity source, float teamsay, entity privatesay, string msgin);
void trigger_common_read(entity this, bool withtarget);
void trigger_remove_generic(entity this);
-.float active;
.string target;
.string targetname;
#endif
#include "sv_minigames.qh"
#include "minigames.qh"
+#include <server/gamelog.qh>
+
void player_clear_minigame(entity player)
{
CS(player).active_minigame = NULL;
#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;
#ifdef SVQC
#include "sv_monsters.qh"
-#include <server/g_damage.qh>
+#include <server/damage.qh>
#include <server/bot/api.qh>
#include <server/weapons/common.qh>
#include <server/weapons/tracing.qh>
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
#include "../physics/movelib.qh"
#include "../weapons/_mod.qh"
#include <server/autocvars.qh>
-#include <server/defs.qh>
+#include <common/weapons/_all.qh>
+#include <common/stats.qh>
+#include <server/damage.qh>
#include "../deathtypes/all.qh"
+#include <server/items/items.qh>
#include <server/mutators/_mod.qh>
#include <server/steerlib.qh>
+#include <server/main.qh>
#include "../turrets/sv_turrets.qh"
#include "../turrets/util.qh"
#include "../vehicles/all.qh"
#include <server/campaign.qh>
+#include <server/cheats.qh>
#include <server/command/_mod.qh>
+#include <common/items/_mod.qh>
+#include <common/mapobjects/teleporters.qh>
#include "../mapobjects/triggers.qh"
#include <lib/csqcmodel/sv_model.qh>
#include <server/round_handler.qh>
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)
{
if(Monster_ValidTarget(this, it))
{
- // if it's a player, use the view origin as reference (stolen from RadiusDamage functions in g_damage.qc)
+ // if it's a player, use the view origin as reference (stolen from RadiusDamage functions in damage.qc)
vector targ_center = CENTER_OR_VIEWOFS(it);
if(closest_target)
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.monsterdef); }
.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)
int animbits = deadbits;
if(STAT(FROZEN, this))
animbits |= ANIMSTATE_FROZEN;
- if(this.crouch)
+ if(IS_DUCKED(this))
animbits |= ANIMSTATE_DUCK; // not that monsters can crouch currently...
animdecide_setstate(this, animbits, false);
animdecide_setimplicitstate(this, (IS_ONGROUND(this)));
this.last_enemycheck = time + 1; // check for enemies every second
}
- Monster mon = REGISTRY_GET(Monsters, this.monsterid);
+ Monster mon = this.monsterdef;
if(mon.mr_think(mon, this))
{
Monster_Move(this, this.speed2, this.speed, this.stopspeed);
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);
#pragma once
+#include "all.qh"
+
// stats networking
int monsters_total;
int monsters_killed;
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);
#undef _MSOUND
float GetMonsterSoundSampleField_notFound;
+
+IntrusiveList g_monsters;
+STATIC_INIT(g_monsters) { g_monsters = IL_NEW(); }
+
+IntrusiveList g_monster_targets;
+STATIC_INIT(g_monster_targets) { g_monster_targets = IL_NEW(); }
#include "all.qh"
#include "sv_monsters.qh"
#include <server/autocvars.qh>
- #include <server/defs.qh>
+ #include <common/weapons/_all.qh>
+ #include <common/stats.qh>
+ #include <server/weapons/common.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);
+#include "sv_monsters.qh"
#include "sv_spawner.qh"
#include "sv_spawn.qh"
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)
#include "sv_breakablehook.qh"
#include <common/deathtypes/all.qh>
-#include <server/g_hook.qh>
+#include <server/hook.qh>
REGISTER_MUTATOR(breakablehook, cvar("g_breakablehook"));
#include <common/mapobjects/target/music.qh>
#include <common/gamemodes/_mod.qh>
+#include <server/items/items.qh>
+#include <server/main.qh>
void buffs_DelayedInit(entity this);
this.m_color = '1 0 0';
this.m_waypoint = _("Extra life");
this.m_waypointblink = 2;
+#ifdef SVQC
this.m_itemid = IT_RESOURCE;
+#endif
}
SPAWNFUNC_ITEM(item_extralife, ITEM_ExtraLife)
this.m_color = '0 0 1';
this.m_waypoint = _("Invisibility");
this.m_waypointblink = 2;
+#ifdef GAMEQC
this.m_itemid = IT_STRENGTH;
+#endif
#ifdef SVQC
this.m_iteminit = powerup_invisibility_init;
#endif
this.m_color = '1 0 1';
this.m_waypoint = _("Speed");
this.m_waypointblink = 2;
+#ifdef GAMEQC
this.m_itemid = IT_INVINCIBLE;
+#endif
#ifdef SVQC
this.m_iteminit = powerup_speed_init;
#endif
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;
#include "sv_new_toys.qh"
#include "../random_items/sv_random_items.qh"
+#include <server/weapons/spawning.qh>
/*
#include "sv_nix.qh"
+#include <server/weapons/selection.qh>
+
//string autocvar_g_nix;
int autocvar_g_balance_nix_ammo_cells;
int autocvar_g_balance_nix_ammo_plasma;
}
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);
#include "sv_spawn_near_teammate.qh"
+#include <common/mapobjects/trigger/hurt.qh>
+
#include <lib/float.qh>
string autocvar_g_spawn_near_teammate;
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)
#include <common/net_linked.qh>
#include <common/teams.qh>
#include <server/autocvars.qh>
- #include <server/constants.qh>
- #include <server/defs.qh>
+ #include <server/world.qh>
#include <server/mutators/_mod.qh>
#endif
// generated file; do not modify
#include <common/physics/movetypes/follow.qc>
#include <common/physics/movetypes/movetypes.qc>
+#include <common/physics/movetypes/push.qc>
#include <common/physics/movetypes/step.qc>
#include <common/physics/movetypes/toss.qc>
#include <common/physics/movetypes/walk.qc>
// generated file; do not modify
#include <common/physics/movetypes/follow.qh>
#include <common/physics/movetypes/movetypes.qh>
+#include <common/physics/movetypes/push.qh>
#include <common/physics/movetypes/step.qh>
#include <common/physics/movetypes/toss.qh>
#include <common/physics/movetypes/walk.qh>
#include "walk.qc"
#include "step.qc"
#include "follow.qc"
+#include "push.qc"
#include "movetypes.qc"
void set_movetype(entity this, int mt)
{
this.move_movetype = mt;
- if (mt == MOVETYPE_PHYSICS || mt == MOVETYPE_PUSH || mt == MOVETYPE_FAKEPUSH) {
+ if (mt == MOVETYPE_PHYSICS) {
this.move_qcphysics = false;
}
if(!IL_CONTAINS(g_moveables, this))
IL_PUSH(g_moveables, this); // add it to the moveable entities list (even if it doesn't move!) logic: if an object never sets its movetype, we assume it never does anything notable
- this.movetype = (this.move_qcphysics) ? MOVETYPE_NONE : mt;
+ this.movetype = (this.move_qcphysics) ? MOVETYPE_QCENTITY : mt;
}
#elif defined(CSQC)
void set_movetype(entity this, int mt)
}
#endif
+bool _Movetype_NudgeOutOfSolid_PivotIsKnownGood(entity this, vector pivot) // SV_NudgeOutOfSolid_PivotIsKnownGood
+{
+ vector stuckorigin = this.origin;
+ vector goodmins = pivot, goodmaxs = pivot;
+ for(int bump = 0; bump < 6; bump++)
+ {
+ int coord = 2 - (bump >> 1);
+ int dir = (bump & 1);
+
+ for(int subbump = 0; ; ++subbump)
+ {
+ vector testorigin = stuckorigin;
+ if(dir)
+ {
+ // pushing maxs
+ switch(coord)
+ {
+ case 0: testorigin.x += this.maxs_x - goodmaxs.x; break;
+ case 1: testorigin.y += this.maxs_y - goodmaxs.y; break;
+ case 2: testorigin.z += this.maxs_z - goodmaxs.z; break;
+ }
+ }
+ else
+ {
+ // pushing mins
+ switch(coord)
+ {
+ case 0: testorigin.x += this.mins_x - goodmins.x; break;
+ case 1: testorigin.y += this.mins_y - goodmins.y; break;
+ case 2: testorigin.z += this.mins_z - goodmins.z; break;
+ }
+ }
+
+ tracebox(stuckorigin, goodmins, goodmaxs, testorigin, MOVE_NOMONSTERS, this);
+ if(trace_startsolid && trace_ent.solid == SOLID_BSP) // NOTE: this checks for bmodelstartsolid in the engine
+ {
+ // BAD BAD, can't fix that
+ return false;
+ }
+
+ if(trace_fraction >= 1)
+ break; // it WORKS!
+
+ if(subbump >= 10)
+ {
+ // BAD BAD, can't fix that
+ return false;
+ }
+
+ // we hit something... let's move out of it
+ vector move = trace_endpos - testorigin;
+ float nudge = (trace_plane_normal * move) + 0.03125; // FIXME cvar this constant
+ stuckorigin = stuckorigin + nudge * trace_plane_normal;
+ }
+
+ if(dir)
+ {
+ // pushing maxs
+ switch(coord)
+ {
+ case 0: goodmaxs.x = this.maxs_x; break;
+ case 1: goodmaxs.y = this.maxs_y; break;
+ case 2: goodmaxs.z = this.maxs_z; break;
+ }
+ }
+ else
+ {
+ // pushing mins
+ switch(coord)
+ {
+ case 0: goodmins.x = this.mins_x; break;
+ case 1: goodmins.y = this.mins_y; break;
+ case 2: goodmins.z = this.mins_z; break;
+ }
+ }
+ }
+
+ // WE WIN
+ this.origin = stuckorigin;
+
+ return true;
+}
+
void _Movetype_WallFriction(entity this, vector stepnormal) // SV_WallFriction
{
/*float d, i;
if(dt <= 0)
return 0;
- int blocked = 0;
+ int blockedflag = 0;
int i, j, numplanes = 0;
float time_left = dt, grav = 0;
vector push;
{
// we got teleported by a touch function
// let's abort the move
- blocked |= 8;
+ blockedflag |= 8;
break;
}
if(trace_plane_normal.z > 0.7)
{
// floor
- blocked |= 1;
+ blockedflag |= 1;
if(!trace_ent)
{
if(!_Movetype_PushEntity(this, steppush, true, false))
{
- blocked |= 8;
+ blockedflag |= 8;
break;
}
if(!_Movetype_PushEntity(this, push, true, false))
{
- blocked |= 8;
+ blockedflag |= 8;
break;
}
float trace2_fraction = trace_fraction;
steppush = vec3(0, 0, org.z - this.origin_z);
if(!_Movetype_PushEntity(this, steppush, true, false))
{
- blocked |= 8;
+ blockedflag |= 8;
break;
}
else
{
// step - return it to caller
- blocked |= 2;
+ blockedflag |= 2;
// save the trace for player extrafriction
if(applystepnormal)
move_stepnormal = trace_plane_normal;
{
// this shouldn't really happen
this.velocity = '0 0 0';
- blocked = 3;
+ blockedflag = 3;
break;
}
if(numplanes != 2)
{
this.velocity = '0 0 0';
- blocked = 7;
+ blockedflag = 7;
break;
}
vector dir = cross(planes[0], planes[1]);
}
// LordHavoc: this came from QW and allows you to get out of water more easily
- if(GAMEPLAYFIX_EASIERWATERJUMP(this) && (this.flags & FL_WATERJUMP) && !(blocked & 8))
+ if(GAMEPLAYFIX_EASIERWATERJUMP(this) && (this.flags & FL_WATERJUMP) && !(blockedflag & 8))
this.velocity = primal_velocity;
- if(PHYS_WALLCLIP(this) && this.pm_time && !(this.flags & FL_WATERJUMP) && !(blocked & 8))
+ if(PHYS_WALLCLIP(this) && this.pm_time && !(this.flags & FL_WATERJUMP) && !(blockedflag & 8))
this.velocity = primal_velocity;
if(applygravity)
}
}
- return blocked;
+ return blockedflag;
}
void _Movetype_CheckVelocity(entity this) // SV_CheckVelocity
return this.dphitcontentsmask;
else if(this.solid == SOLID_SLIDEBOX)
{
- if(this.flags & 32) // TODO: FL_MONSTER
+ if(this.flags & FL_MONSTER)
return DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_MONSTERCLIP;
else
return DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_PLAYERCLIP;
return (this.origin == last_origin); // false if teleported by touch
}
-
-.float ltime;
-.void() blocked;
-
void _Movetype_Physics_Frame(entity this, float movedt)
{
this.move_didgravity = -1;
{
case MOVETYPE_PUSH:
case MOVETYPE_FAKEPUSH:
- LOG_DEBUG("Physics: Lacking QuakeC support for Push movetype, FIX ME by using engine physics!");
+ _Movetype_Physics_Push(this, movedt);
break;
case MOVETYPE_NONE:
break;
this.angles = this.angles + movedt * this.avelocity;
break;
case MOVETYPE_STEP:
+ if (GAMEPLAYFIX_UNSTICKPLAYERS(this) == 2)
+ _Movetype_CheckStuck(this);
_Movetype_Physics_Step(this, movedt);
break;
case MOVETYPE_WALK:
case MOVETYPE_FLY:
case MOVETYPE_FLY_WORLDONLY:
+ if (movedt > 0 && GAMEPLAYFIX_UNSTICKPLAYERS(this) == 2)
+ _Movetype_CheckStuck(this);
_Movetype_Physics_Walk(this, movedt);
break;
case MOVETYPE_TOSS:
case MOVETYPE_BOUNCE:
case MOVETYPE_BOUNCEMISSILE:
case MOVETYPE_FLYMISSILE:
+ if (GAMEPLAYFIX_UNSTICKPLAYERS(this) == 2)
+ _Movetype_CheckStuck(this);
_Movetype_Physics_Toss(this, movedt);
break;
case MOVETYPE_PHYSICS:
void Movetype_Physics_NoMatchTicrate(entity this, float movedt, bool isclient) // to be run every move frame
{
+ bool didmove = (this.move_time != 0);
this.move_time = time;
if(isclient)
_Movetype_Physics_ClientFrame(this, movedt);
else
+ {
+ // this doesn't apply to clients, and only applies to unmatched entities
+ // don't run think/move on newly spawned projectiles as it messes up
+ // movement interpolation and rocket trails, and is inconsistent with
+ // respect to entities spawned in the same frame
+ // (if an ent spawns a higher numbered ent, it moves in the same frame,
+ // but if it spawns a lower numbered ent, it doesn't - this never moves
+ // ents in the first frame regardless)
+ if(!didmove && GAMEPLAYFIX_DELAYPROJECTILES(this) > 0)
+ return;
_Movetype_Physics_Frame(this, movedt);
+ }
if(wasfreed(this))
return;
#define GAMEPLAYFIX_NOAIRBORNCORPSE(s) STAT(GAMEPLAYFIX_NOAIRBORNCORPSE)
#define NOAIRBORNCORPSE_ALLOWSUSPENDED(s) STAT(NOAIRBORNCORPSE_ALLOWSUSPENDED)
#define UPWARD_VELOCITY_CLEARS_ONGROUND(s) STAT(GAMEPLAYFIX_UPVELOCITYCLEARSONGROUND)
+#define GAMEPLAYFIX_DELAYPROJECTILES(s) STAT(GAMEPLAYFIX_DELAYPROJECTILES)
#define PHYS_STEPHEIGHT(s) STAT(MOVEVARS_STEPHEIGHT)
// set by _Movetype_FlyMove
vector move_stepnormal;
+bool _Movetype_NudgeOutOfSolid_PivotIsKnownGood(entity this, vector pivot);
void _Movetype_WallFriction(entity this, vector stepnormal);
int _Movetype_FlyMove(entity this, float dt, bool applygravity, bool applystepnormal, float stepheight);
void _Movetype_CheckVelocity(entity this);
const int MOVETYPE_PHYSICS = 32;
const int MOVETYPE_FLY_WORLDONLY = 33;
-const int FL_ITEM = 256;
-const int FL_ONGROUND = 512;
#elif defined(SVQC)
const int MOVETYPE_ANGLENOCLIP = 1;
const int MOVETYPE_ANGLECLIP = 2;
#endif
const int MOVETYPE_QCPLAYER = 150; // QC-driven player physics, no think functions!
-
-const int FL_ONSLICK = BIT(20);
+const int MOVETYPE_QCENTITY = 151; // QC-driven entity physics, some think functions!
const int MOVETYPE_FAKEPUSH = 13;
--- /dev/null
+#include "push.qh"
+void _Movetype_PushMove(entity this, float dt) // SV_PushMove
+{
+ if(this.velocity == '0 0 0' && this.avelocity == '0 0 0')
+ {
+ this.ltime += dt;
+ return;
+ }
+
+ switch(this.solid)
+ {
+ // LadyHavoc: valid pusher types
+ case SOLID_BSP:
+ case SOLID_BBOX:
+ case SOLID_SLIDEBOX:
+ case SOLID_CORPSE: // LadyHavoc: this would be weird...
+ break;
+ // LadyHavoc: no collisions
+ case SOLID_NOT:
+ case SOLID_TRIGGER:
+ {
+ this.origin = this.origin + dt * this.velocity;
+ this.angles = this.angles + dt * this.avelocity;
+ this.angles_x -= 360.0 * floor(this.angles_x * (1.0 / 360.0));
+ this.angles_y -= 360.0 * floor(this.angles_y * (1.0 / 360.0));
+ this.angles_z -= 360.0 * floor(this.angles_z * (1.0 / 360.0));
+ this.ltime += dt;
+ _Movetype_LinkEdict(this, false);
+ return;
+ }
+ default:
+ {
+ LOG_INFOF("_Movetype_Physics_Push: entity #%d, unrecognized solid type %d", etof(this), this.solid);
+ return;
+ }
+ }
+ if(!this.modelindex)
+ {
+ LOG_INFOF("_Movetype_Physics_Push: entity #%d has an invalid modelindex %d", etof(this), this.modelindex);
+ return;
+ }
+
+ bool rotated = ((vlen2(this.angles) + vlen2(this.avelocity)) > 0);
+
+ vector move1 = this.velocity * dt;
+ vector moveangle = this.avelocity * dt;
+
+ vector a = -moveangle;
+ vector forward, left, up;
+ MAKE_VECTORS(a, forward, left, up);
+ left *= -1; // actually make it left!
+
+ vector pushorig = this.origin;
+ vector pushang = this.angles;
+ float pushltime = this.ltime;
+
+ // move the pusher to its final position
+
+ this.origin = this.origin + dt * this.velocity;
+ this.angles = this.angles + dt * this.avelocity;
+ this.ltime += dt;
+ _Movetype_LinkEdict(this, false); // pulls absmin/absmax from the engine
+
+ if(this.move_movetype == MOVETYPE_FAKEPUSH) // Tenebrae's MOVETYPE_PUSH variant that doesn't push...
+ {
+ this.angles_x -= 360.0 * floor(this.angles_x * (1.0 / 360.0));
+ this.angles_y -= 360.0 * floor(this.angles_y * (1.0 / 360.0));
+ this.angles_z -= 360.0 * floor(this.angles_z * (1.0 / 360.0));
+ return;
+ }
+
+ IL_CLEAR(g_pushmove_moved); // make sure it's not somehow uncleared
+
+ for(entity check = findradius((this.absmin + this.absmax) * 0.5, vlen(this.absmax - this.absmin) * 0.5 + 1); check; check = check.chain)
+ {
+ switch(check.move_movetype)
+ {
+ case MOVETYPE_NONE:
+ case MOVETYPE_PUSH:
+ case MOVETYPE_FOLLOW:
+ case MOVETYPE_NOCLIP:
+ case MOVETYPE_FLY_WORLDONLY:
+ continue;
+ default:
+ break;
+ }
+
+ if(check.owner == this || this.owner == check)
+ continue;
+
+ // if the entity is standing on the pusher, it will definitely be moved
+ // if the entity is not standing on the pusher, but is in the pusher's
+ // final position, move it
+ if (!IS_ONGROUND(check) || check.groundentity != this)
+ {
+ tracebox(check.origin, check.mins, check.maxs, check.origin, MOVE_NOMONSTERS, check);
+ if(!trace_startsolid)
+ continue;
+ }
+ vector pivot = check.mins + 0.5 * (check.maxs - check.mins);
+ vector move;
+
+ if(rotated)
+ {
+ vector org = check.origin - this.origin;
+ org = org + pivot;
+
+ vector org2;
+ org2.x = (org * forward);
+ org2.y = (org * left);
+ org2.z = (org * up);
+ move = org2 - org;
+ move = move + move1;
+ }
+ else
+ move = move1;
+
+ check.moved_from = check.origin;
+ check.moved_fromangles = check.angles;
+ IL_PUSH(g_pushmove_moved, check);
+
+ // physics objects need better collisions than this code can do
+ if(check.move_movetype == MOVETYPE_PHYSICS)
+ {
+ check.origin = check.origin + move;
+ _Movetype_LinkEdict(check, true);
+ continue;
+ }
+
+ // try moving the contacted entity
+ int savesolid = this.solid;
+ this.solid = SOLID_NOT;
+ if(!_Movetype_PushEntity(check, move, true, true))
+ {
+ // entity "check" got teleported
+ check.angles_y += trace_fraction * moveangle.y;
+ this.solid = savesolid;
+ continue; // pushed enough
+ }
+ // FIXME: turn players specially
+ check.angles_y += trace_fraction * moveangle.y;
+ this.solid = savesolid;
+
+ // this trace.fraction < 1 check causes items to fall off of pushers
+ // if they pass under or through a wall
+ // the groundentity check causes items to fall off of ledges
+ if(check.move_movetype != MOVETYPE_WALK && (trace_fraction < 1 || check.groundentity != this))
+ UNSET_ONGROUND(check);
+
+ // if it is still inside the pusher, block
+ tracebox(check.origin, check.mins, check.maxs, check.origin, MOVE_NOMONSTERS, check);
+ if(trace_startsolid)
+ {
+ if(_Movetype_NudgeOutOfSolid_PivotIsKnownGood(check, pivot))
+ {
+ // hack to invoke all necessary movement triggers
+ _Movetype_PushEntity(check, '0 0 0', true, true);
+ // we could fix it or entity "check" was telported
+ continue;
+ }
+
+ // still inside pusher, so it's really blocked
+
+ // fail the move
+ if(check.mins_x == check.maxs_x)
+ continue;
+ if(check.solid == SOLID_NOT || check.solid == SOLID_TRIGGER)
+ {
+ // corpse
+ check.mins_x = check.mins_y = 0;
+ check.maxs = check.mins;
+ continue;
+ }
+
+ this.origin = pushorig;
+ this.angles = pushang;
+ this.ltime = pushltime;
+ _Movetype_LinkEdict(this, false);
+
+ // move back any entities we already moved
+ IL_EACH(g_pushmove_moved, true,
+ {
+ check.origin = check.moved_from;
+ check.angles = check.moved_fromangles;
+ _Movetype_LinkEdict(check, false);
+ });
+
+ // if the pusher has a "blocked" function, call it, otherwise just stay in place until the obstacle is gone
+ if(getblocked(this))
+ getblocked(this)(this, check);
+ break;
+ }
+ }
+ this.angles_x -= 360.0 * floor(this.angles_x * (1.0 / 360.0));
+ this.angles_y -= 360.0 * floor(this.angles_y * (1.0 / 360.0));
+ this.angles_z -= 360.0 * floor(this.angles_z * (1.0 / 360.0));
+ IL_CLEAR(g_pushmove_moved); // clean up
+}
+
+void _Movetype_Physics_Push(entity this, float dt) // SV_Physics_Pusher
+{
+ float oldltime = this.ltime;
+ float movetime = dt;
+ if(this.nextthink < this.ltime + dt)
+ {
+ movetime = this.nextthink - this.ltime;
+ if(movetime < 0)
+ movetime = 0;
+ }
+
+ if(movetime)
+ {
+ // advances this.ltime if not blocked
+ _Movetype_PushMove(this, movetime);
+ }
+
+ if(this.nextthink > oldltime && this.nextthink <= this.ltime)
+ {
+ this.nextthink = 0;
+ getthink(this)(this);
+ }
+}
--- /dev/null
+#pragma once
+
+void _Movetype_Physics_Push(entity this, float dt);
+
+.vector moved_from, moved_fromangles;
+
+IntrusiveList g_pushmove_moved;
+STATIC_INIT(g_pushmove_moved) { g_pushmove_moved = IL_NEW(); }
+
+#ifdef CSQC
+.float ltime;
+#endif
if (dt <= 0)
return;
- if (GAMEPLAYFIX_UNSTICKPLAYERS(this))
+ if (GAMEPLAYFIX_UNSTICKPLAYERS(this) == 1)
_Movetype_CheckStuck(this);
bool applygravity = (!_Movetype_CheckWater(this) && this.move_movetype == MOVETYPE_WALK && !(this.flags & FL_WATERJUMP));
#ifdef SVQC
+#include <server/client.qh>
#include <server/miscfunctions.qh>
+#include <common/mapobjects/defs.qh>
#include "../mapobjects/trigger/viewloc.qh"
+#include <server/main.qh>
// client side physics
bool Physics_Valid(string thecvar)
STAT(MOVEVARS_HIGHSPEED, this) = autocvar_g_movement_highspeed;
MUTATOR_CALLHOOK(PlayerPhysics_UpdateStats, this);
- float maxspd_mod = PHYS_HIGHSPEED(this) * ((this.swampslug.active) ? this.swampslug.swamp_slowdown : 1);
+ float maxspd_mod = PHYS_HIGHSPEED(this) * ((this.swampslug.active == ACTIVE_ACTIVE) ? this.swampslug.swamp_slowdown : 1);
STAT(MOVEVARS_MAXSPEED, this) = Physics_ClientOption(this, "maxspeed", autocvar_sv_maxspeed) * maxspd_mod; // also slow walking
if (autocvar_g_movement_highspeed_q3_compat) {
STAT(MOVEVARS_AIRACCEL_QW, this) = Physics_ClientOption(this, "airaccel_qw", autocvar_sv_airaccel_qw);
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];
#define WAS_ONGROUND(s) boolean((s).lastflags & FL_ONGROUND)
#define WAS_ONSLICK(s) boolean((s).lastflags & FL_ONSLICK)
+#define IS_DUCKED(s) (boolean((s).flags & FL_DUCKED))
+#define SET_DUCKED(s) ((s).flags |= FL_DUCKED)
+#define UNSET_DUCKED(s) ((s).flags &= ~FL_DUCKED)
+
#define ITEMS_STAT(s) ((s).items)
.float teleport_time;
string autocvar_cl_jumpspeedcap_min;
string autocvar_cl_jumpspeedcap_max;
- const int FL_WATERJUMP = 2048; // player jumping out of water
- const int FL_JUMPRELEASED = 4096; // for jump debouncing
-
.float watertype;
.float waterlevel;
.int items;
#define PHYS_INPUT_BUTTON_BUTTON15(s) boolean(input_buttons & BIT(17))
#define PHYS_INPUT_BUTTON_BUTTON16(s) boolean(input_buttons & BIT(18))
- #define IS_DUCKED(s) (boolean((s).flags & FL_DUCKED))
- #define SET_DUCKED(s) ((s).flags |= FL_DUCKED)
- #define UNSET_DUCKED(s) ((s).flags &= ~FL_DUCKED)
-
#define PHYS_INVEHICLE(s) (boolean(hud != HUD_NORMAL))
#define PHYS_JUMPSPEEDCAP_MIN autocvar_cl_jumpspeedcap_min
.string jumpspeedcap_min;
.string jumpspeedcap_max;
+ // footstep interval
+ .float nextstep;
+
#define PHYS_INPUT_ANGLES(s) ((s).v_angle)
#define PHYS_WORLD_ANGLES(s) ((s).angles)
#define PHYS_INPUT_BUTTON_BUTTON15(s) (CS(s).button15)
#define PHYS_INPUT_BUTTON_BUTTON16(s) (CS(s).button16)
- #define IS_DUCKED(s) ((s).crouch)
- #define SET_DUCKED(s) ((s).crouch = true)
- #define UNSET_DUCKED(s) ((s).crouch = false)
-
#define PHYS_INVEHICLE(s) (boolean((s).vehicle != NULL))
#define PHYS_JUMPSPEEDCAP_MIN autocvar_sv_jumpspeedcap_min
#include "constants.qh"
#include "util.qh"
#include <common/weapons/_all.qh>
+ #include <server/client.qh>
#include "../server/anticheat.qh"
- #include "../server/defs.qh"
+ #include <common/stats.qh>
#include "../server/scores.qh"
+ #include <server/world.qh>
#include "../server/weapons/accuracy.qh"
#endif
* G: game type
* O: mod name (icon request) as in server browser
* M: map name
- * I: match ID (see "matchid" in g_world.qc)
+ * I: match ID (see "matchid" in world.qc)
* S: "hostname" of the server
* C: number of "unpure" cvar changes
* U: UDP port number of the server
--- /dev/null
+#include "replicate.qh"
--- /dev/null
+#pragma once
+
+// TODO: sort/merge these!
+#if defined(CSQC)
+ float autoswitch;
+ bool cvar_cl_allow_uid2name;
+ float cvar_cl_allow_uidtracking;
+ bool cvar_cl_allow_uidranking;
+ float cvar_cl_autoscreenshot;
+ float cvar_cl_autotaunt;
+ float cvar_cl_clippedspectating;
+ int cvar_cl_gunalign;
+ float cvar_cl_handicap;
+ float cvar_cl_jetpack_jump;
+ float cvar_cl_movement_track_canjump;
+ float cvar_cl_noantilag;
+ string cvar_cl_physics;
+ float cvar_cl_voice_directional;
+ float cvar_cl_voice_directional_taunt_attenuation;
+ float cvar_cl_weaponimpulsemode;
+
+ string cvar_g_xonoticversion;
+ string cvar_cl_weaponpriority;
+ string cvar_cl_weaponpriorities[10];
+ float cvar_cl_cts_noautoswitch;
+ bool cvar_cl_weapon_switch_reload;
+ bool cvar_cl_weapon_switch_fallback_to_impulse;
+#elif defined(SVQC)
+ .float cvar_cl_handicap;
+ .int cvar_cl_gunalign;
+ .float cvar_cl_clippedspectating;
+ .float cvar_cl_autoscreenshot;
+ .float cvar_cl_jetpack_jump;
+ .float cvar_cl_movement_track_canjump;
+ //.float cvar_cl_newusekeysupported;
+ .float cvar_cl_cts_noautoswitch;
+ .bool cvar_cl_weapon_switch_reload;
+ .bool cvar_cl_weapon_switch_fallback_to_impulse;
+
+ .string cvar_g_xonoticversion;
+ .string cvar_cl_weaponpriority;
+ .string cvar_cl_weaponpriorities[10];
+ .float cvar_cl_noantilag;
+
+ // WEAPONTODO
+ .float autoswitch;
+ .float cvar_cl_weaponimpulsemode;
+
+ .float cvar_cl_allow_uid2name;
+ .float cvar_cl_allow_uidtracking;
+ .bool cvar_cl_allow_uidranking;
+
+ .string cvar_cl_physics;
+
+ // autotaunt system
+ .float cvar_cl_autotaunt;
+ .float cvar_cl_voice_directional;
+ .float cvar_cl_voice_directional_taunt_attenuation;
+#endif
+
+#ifdef GAMEQC
+REPLICATE(autoswitch, bool, "cl_autoswitch");
+REPLICATE(cvar_cl_allow_uid2name, bool, "cl_allow_uid2name");
+REPLICATE(cvar_cl_allow_uidranking, bool, "cl_allow_uidranking");
+REPLICATE(cvar_cl_autoscreenshot, int, "cl_autoscreenshot");
+REPLICATE(cvar_cl_autotaunt, float, "cl_autotaunt");
+REPLICATE(cvar_cl_clippedspectating, bool, "cl_clippedspectating");
+REPLICATE(cvar_cl_gunalign, int, "cl_gunalign");
+REPLICATE(cvar_cl_handicap, float, "cl_handicap");
+REPLICATE(cvar_cl_jetpack_jump, bool, "cl_jetpack_jump");
+REPLICATE(cvar_cl_movement_track_canjump, bool, "cl_movement_track_canjump");
+REPLICATE(cvar_cl_noantilag, bool, "cl_noantilag");
+REPLICATE(cvar_cl_physics, string, "cl_physics");
+REPLICATE(cvar_cl_voice_directional, int, "cl_voice_directional");
+REPLICATE(cvar_cl_voice_directional_taunt_attenuation, float, "cl_voice_directional_taunt_attenuation");
+REPLICATE(cvar_cl_weaponimpulsemode, int, "cl_weaponimpulsemode");
+REPLICATE(cvar_g_xonoticversion, string, "g_xonoticversion");
+REPLICATE(cvar_cl_cts_noautoswitch, bool, "cl_cts_noautoswitch");
+REPLICATE(cvar_cl_weapon_switch_reload, bool, "cl_weapon_switch_reload");
+REPLICATE(cvar_cl_weapon_switch_fallback_to_impulse, bool, "cl_weapon_switch_fallback_to_impulse");
+/*
+// cvar cl_newusekeysupported doesn't exist
+float cvar_cl_newusekeysupported;
+REPLICATE(cvar_cl_newusekeysupported, bool, "cl_newusekeysupported");
+*/
+#ifdef CSQC
+// handled specially on the server
+REPLICATE(cvar_cl_allow_uidtracking, float, "cl_allow_uidtracking");
+#endif
+
+REPLICATE(cvar_cl_weaponpriority, string, "cl_weaponpriority");
+
+REPLICATE(cvar_cl_weaponpriorities[0], string, "cl_weaponpriority0");
+REPLICATE(cvar_cl_weaponpriorities[1], string, "cl_weaponpriority1");
+REPLICATE(cvar_cl_weaponpriorities[2], string, "cl_weaponpriority2");
+REPLICATE(cvar_cl_weaponpriorities[3], string, "cl_weaponpriority3");
+REPLICATE(cvar_cl_weaponpriorities[4], string, "cl_weaponpriority4");
+REPLICATE(cvar_cl_weaponpriorities[5], string, "cl_weaponpriority5");
+REPLICATE(cvar_cl_weaponpriorities[6], string, "cl_weaponpriority6");
+REPLICATE(cvar_cl_weaponpriorities[7], string, "cl_weaponpriority7");
+REPLICATE(cvar_cl_weaponpriorities[8], string, "cl_weaponpriority8");
+REPLICATE(cvar_cl_weaponpriorities[9], string, "cl_weaponpriority9");
+#endif
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;
#ifdef SVQC
#include <server/autocvars.qh>
#include <server/client.qh>
+#include <common/mapobjects/trigger/secret.qh>
#endif
// Full list of all stat constants, included in a single location for easy reference
#ifdef SVQC
float W_WeaponRateFactor(entity this);
float game_stopped;
-float game_starttime;
-float round_starttime;
+float game_starttime; //point in time when the countdown to game start is over
+float round_starttime; //point in time when the countdown to round start is over
bool autocvar_g_allow_oldvortexbeam;
int autocvar_leadlimit;
#endif
REGISTER_STAT(VEHICLESTAT_RELOAD2, int)
REGISTER_STAT(VEHICLESTAT_W2MODE, int)
REGISTER_STAT(NADE_TIMER, float)
-REGISTER_STAT(SECRETS_TOTAL, float)
-REGISTER_STAT(SECRETS_FOUND, float)
+REGISTER_STAT(SECRETS_TOTAL, int, secrets_total)
+REGISTER_STAT(SECRETS_FOUND, int, secrets_found)
REGISTER_STAT(RESPAWN_TIME, float)
REGISTER_STAT(ROUNDSTARTTIME, float, round_starttime)
REGISTER_STAT(MONSTERS_TOTAL, int)
int autocvar_sv_gameplayfix_stepdown = 2;
float autocvar_sv_gameplayfix_stepdown_maxspeed = 0;
int autocvar_sv_gameplayfix_stepmultipletimes = 1;
-int autocvar_sv_gameplayfix_unstickplayers = 1;
+int autocvar_sv_gameplayfix_unstickplayers = 2;
int autocvar_sv_gameplayfix_fixedcheckwatertransition = 1;
int autocvar_sv_gameplayfix_slidemoveprojectiles = 1;
int autocvar_sv_gameplayfix_grenadebouncedownslopes = 1;
int autocvar_sv_gameplayfix_noairborncorpse = 1;
int autocvar_sv_gameplayfix_noairborncorpse_allowsuspendeditems = 1;
+int autocvar_sv_gameplayfix_delayprojectiles = 0;
#endif
REGISTER_STAT(GAMEPLAYFIX_DOWNTRACEONGROUND, int, autocvar_sv_gameplayfix_downtracesupportsongroundflag)
REGISTER_STAT(GAMEPLAYFIX_EASIERWATERJUMP, int, autocvar_sv_gameplayfix_easierwaterjump)
REGISTER_STAT(GAMEPLAYFIX_GRENADEBOUNCESLOPES, int, autocvar_sv_gameplayfix_grenadebouncedownslopes)
REGISTER_STAT(GAMEPLAYFIX_NOAIRBORNCORPSE, int, autocvar_sv_gameplayfix_noairborncorpse)
REGISTER_STAT(NOAIRBORNCORPSE_ALLOWSUSPENDED, int, autocvar_sv_gameplayfix_noairborncorpse_allowsuspendeditems)
+REGISTER_STAT(GAMEPLAYFIX_DELAYPROJECTILES, int, autocvar_sv_gameplayfix_delayprojectiles)
REGISTER_STAT(MOVEVARS_JUMPSTEP, int, cvar("sv_jumpstep"))
REGISTER_STAT(NOSTEP, int, cvar("sv_nostep"))
+++ /dev/null
-#include "t_items.qh"
-
-#include "items/_mod.qh"
-
-#if defined(SVQC)
-
- #include "../server/bot/api.qh"
-
- #include <server/mutators/_mod.qh>
-
- #include "../server/weapons/common.qh"
- #include "../server/weapons/selection.qh"
- #include "../server/weapons/weaponsystem.qh"
-
- #include "constants.qh"
- #include <common/deathtypes/all.qh>
- #include <common/notifications/all.qh>
- #include "mapobjects/subs.qh"
- #include "util.qh"
-
- #include <common/monsters/_mod.qh>
-
- #include <common/weapons/_all.qh>
-
- #include <common/mutators/mutator/buffs/buffs.qh>
- #include <common/mutators/mutator/buffs/sv_buffs.qh>
-
- #include "../lib/warpzone/util_server.qh"
-#elif defined(CSQC)
- #include "physics/movetypes/movetypes.qh"
- #include <common/weapons/_all.qh>
- #include "../lib/csqcmodel/cl_model.qh"
- #include "../lib/csqcmodel/common.qh"
-#endif
-
-REGISTER_NET_LINKED(ENT_CLIENT_ITEM)
-
-#ifdef CSQC
-bool autocvar_cl_ghost_items_vehicle = true;
-.vector item_glowmod;
-.bool item_simple; // probably not really needed, but better safe than sorry
-void Item_SetAlpha(entity this)
-{
- bool veh_hud = (hud && autocvar_cl_ghost_items_vehicle);
-
- if(!veh_hud && (this.ItemStatus & ITS_AVAILABLE))
- {
- this.alpha = 1;
- this.colormod = '1 1 1';
- this.glowmod = this.item_glowmod;
- }
- else
- {
- this.alpha = autocvar_cl_ghost_items;
- this.colormod = this.glowmod = autocvar_cl_ghost_items_color;
- }
-
- if((!veh_hud) && (this.ItemStatus & ITS_STAYWEP))
- {
- this.colormod = this.glowmod = autocvar_cl_weapon_stay_color;
- this.alpha = autocvar_cl_weapon_stay_alpha;
- }
-
- this.drawmask = ((this.alpha <= 0) ? 0 : MASK_NORMAL);
-}
-
-void ItemDraw(entity this)
-{
- if(this.gravity)
- {
- Movetype_Physics_MatchServer(this, false);
- if(IS_ONGROUND(this))
- { // For some reason avelocity gets set to '0 0 0' here ...
- this.oldorigin = this.origin;
- this.gravity = 0;
-
- if(autocvar_cl_animate_items)
- { // ... so reset it if animations are requested.
- if(this.ItemStatus & ITS_ANIMATE1)
- this.avelocity = '0 180 0';
-
- if(this.ItemStatus & ITS_ANIMATE2)
- this.avelocity = '0 -90 0';
- }
-
- // delay is for blocking item's position for a while;
- // it's a workaround for dropped weapons that receive the position
- // another time right after they spawn overriding animation position
- this.onground_time = time + 0.5;
- }
- }
- else if (autocvar_cl_animate_items && !this.item_simple) // no bobbing applied to simple items, for consistency's sake (no visual difference between ammo and weapons)
- {
- if(this.ItemStatus & ITS_ANIMATE1)
- {
- this.angles += this.avelocity * frametime;
- float fade_in = bound(0, time - this.onground_time, 1);
- setorigin(this, this.oldorigin + fade_in * ('0 0 10' + '0 0 8' * sin((time - this.onground_time) * 2)));
- }
-
- if(this.ItemStatus & ITS_ANIMATE2)
- {
- this.angles += this.avelocity * frametime;
- float fade_in = bound(0, time - this.onground_time, 1);
- setorigin(this, this.oldorigin + fade_in * ('0 0 8' + '0 0 4' * sin((time - this.onground_time) * 3)));
- }
- }
-
- Item_SetAlpha(this);
-}
-
-void Item_PreDraw(entity this)
-{
- if(warpzone_warpzones_exist)
- {
- setpredraw(this, func_null); // no need to keep running this
- return;
- }
- float alph;
- vector org = getpropertyvec(VF_ORIGIN);
- //if(!checkpvs(org, this)) // this makes sense as long as we don't support recursive warpzones
- //alph = 0; // this shouldn't be needed, since items behind walls are culled anyway
- if(this.fade_start)
- {
- if(vdist(org - this.origin, >, this.fade_end))
- alph = 0; // save on some processing
- else if(vdist(org - this.origin, <, this.fade_start))
- alph = 1; // more processing saved
- else
- alph = bound(0, (this.fade_end - vlen(org - this.origin - 0.5 * (this.mins + this.maxs))) / (this.fade_end - this.fade_start), 1);
- }
- else
- alph = 1;
- //printf("%v <-> %v\n", view_origin, this.origin + 0.5 * (this.mins + this.maxs));
- if(!hud && (this.ItemStatus & ITS_AVAILABLE))
- this.alpha = alph;
- if(alph <= 0)
- this.drawmask = 0;
- //else
- //this.drawmask = MASK_NORMAL; // reset by the setalpha function
-}
-
-void ItemRemove(entity this)
-{
- strfree(this.mdl);
-}
-
-HashMap ENT_CLIENT_ITEM_simple;
-STATIC_INIT(ENT_CLIENT_ITEM_simple)
-{
- HM_NEW(ENT_CLIENT_ITEM_simple);
-}
-SHUTDOWN(ENT_CLIENT_ITEM_simple)
-{
- HM_DELETE(ENT_CLIENT_ITEM_simple);
-}
-
-NET_HANDLE(ENT_CLIENT_ITEM, bool isnew)
-{
- int sf = ReadByte();
-
- if(sf & ISF_LOCATION)
- {
- this.origin = ReadVector();
- setorigin(this, this.origin);
- this.oldorigin = this.origin;
- }
-
- if(sf & ISF_ANGLES)
- {
- this.angles_x = ReadAngle();
- this.angles_y = ReadAngle();
- this.angles_z = ReadAngle();
- }
-
- if(sf & ISF_SIZE)
- {
- setsize(this, '-16 -16 0', '16 16 48');
- }
-
- if(sf & ISF_STATUS) // need to read/write status first so model can handle simple, fb etc.
- {
- this.ItemStatus = ReadByte();
-
- Item_SetAlpha(this);
-
- if(this.ItemStatus & ITS_ALLOWFB)
- this.effects |= EF_FULLBRIGHT;
- else
- this.effects &= ~EF_FULLBRIGHT;
-
- if(this.ItemStatus & ITS_GLOW)
- {
- if(this.ItemStatus & ITS_AVAILABLE)
- this.effects |= (EF_ADDITIVE | EF_FULLBRIGHT);
- else
- this.effects &= ~(EF_ADDITIVE | EF_FULLBRIGHT);
- }
- }
-
- if(sf & ISF_MODEL)
- {
- this.drawmask = MASK_NORMAL;
- set_movetype(this, MOVETYPE_TOSS);
- if (isnew) IL_PUSH(g_drawables, this);
- this.draw = ItemDraw;
- this.solid = SOLID_TRIGGER;
- //this.flags |= FL_ITEM;
-
- this.fade_end = ReadShort();
- this.fade_start = ReadShort();
- if(!warpzone_warpzones_exist && this.fade_start && !autocvar_cl_items_nofade)
- setpredraw(this, Item_PreDraw);
-
- strfree(this.mdl);
-
- string _fn = ReadString();
- this.item_simple = false; // reset it!
-
- if(autocvar_cl_simple_items && (this.ItemStatus & ITS_ALLOWSI))
- {
- string _fn2 = substring(_fn, 0 , strlen(_fn) -4);
- this.item_simple = true;
-
- #define extensions(x) \
- x(md3) \
- x(dpm) \
- x(iqm) \
- x(mdl) \
- /**/
- #define tryext(ext) { \
- string s = strcat(_fn2, autocvar_cl_simpleitems_postfix, "." #ext); \
- string cached = HM_gets(ENT_CLIENT_ITEM_simple, s); \
- if (cached == "") { \
- HM_sets(ENT_CLIENT_ITEM_simple, s, cached = fexists(s) ? "1" : "0"); \
- } \
- if (cached != "0") { \
- strcpy(this.mdl, s); \
- break; \
- } \
- }
- do {
- extensions(tryext);
- this.item_simple = false;
- LOG_TRACEF("Simple item requested for %s but no model exists for it", _fn);
- } while (0);
- #undef tryext
- #undef extensions
- }
-
- if(!this.item_simple)
- strcpy(this.mdl, _fn);
-
- if(this.mdl == "")
- LOG_WARNF("this.mdl is unset for item %s", this.classname);
-
- precache_model(this.mdl);
- _setmodel(this, this.mdl);
-
- setsize(this, '-16 -16 0', '16 16 48');
- }
-
- if(sf & ISF_COLORMAP)
- {
- this.colormap = ReadShort();
- this.item_glowmod_x = ReadByte() / 255.0;
- this.item_glowmod_y = ReadByte() / 255.0;
- this.item_glowmod_z = ReadByte() / 255.0;
- }
-
- if(sf & ISF_DROP)
- {
- this.gravity = 1;
- this.pushable = true;
- //this.angles = '0 0 0';
- set_movetype(this, MOVETYPE_TOSS);
- this.velocity = ReadVector();
- setorigin(this, this.oldorigin);
-
- if(!this.move_time)
- {
- this.move_time = time;
- this.spawntime = time;
- }
- else
- this.move_time = max(this.move_time, time);
- }
-
- if(autocvar_cl_animate_items)
- {
- if(this.ItemStatus & ITS_ANIMATE1)
- this.avelocity = '0 180 0';
-
- if(this.ItemStatus & ITS_ANIMATE2)
- this.avelocity = '0 -90 0';
- }
-
- this.entremove = ItemRemove;
-
- return true;
-}
-
-#endif
-
-#ifdef SVQC
-bool ItemSend(entity this, entity to, int sf)
-{
- if(this.gravity)
- sf |= ISF_DROP;
- else
- sf &= ~ISF_DROP;
-
- WriteHeader(MSG_ENTITY, ENT_CLIENT_ITEM);
- WriteByte(MSG_ENTITY, sf);
-
- //WriteByte(MSG_ENTITY, this.cnt);
- if(sf & ISF_LOCATION)
- {
- WriteVector(MSG_ENTITY, this.origin);
- }
-
- if(sf & ISF_ANGLES)
- {
- WriteAngle(MSG_ENTITY, this.angles_x);
- WriteAngle(MSG_ENTITY, this.angles_y);
- WriteAngle(MSG_ENTITY, this.angles_z);
- }
-
- // sets size on the client, unused on server
- //if(sf & ISF_SIZE)
-
- if(sf & ISF_STATUS)
- WriteByte(MSG_ENTITY, this.ItemStatus);
-
- if(sf & ISF_MODEL)
- {
- WriteShort(MSG_ENTITY, this.fade_end);
- WriteShort(MSG_ENTITY, this.fade_start);
-
- if(this.mdl == "")
- LOG_TRACE("^1WARNING!^7 this.mdl is unset for item ", this.classname, "expect a crash just about now");
-
- WriteString(MSG_ENTITY, this.mdl);
- }
-
-
- if(sf & ISF_COLORMAP)
- {
- WriteShort(MSG_ENTITY, this.colormap);
- WriteByte(MSG_ENTITY, this.glowmod.x * 255.0);
- WriteByte(MSG_ENTITY, this.glowmod.y * 255.0);
- WriteByte(MSG_ENTITY, this.glowmod.z * 255.0);
- }
-
- if(sf & ISF_DROP)
- {
- WriteVector(MSG_ENTITY, this.velocity);
- }
-
- return true;
-}
-
-void ItemUpdate(entity this)
-{
- this.oldorigin = this.origin;
- this.SendFlags |= ISF_LOCATION;
-}
-
-void UpdateItemAfterTeleport(entity this)
-{
- if(getSendEntity(this) == ItemSend)
- ItemUpdate(this);
-}
-
-bool have_pickup_item(entity this)
-{
- if(this.itemdef.instanceOfPowerup)
- {
- if(autocvar_g_powerups > 0)
- return true;
- if(autocvar_g_powerups == 0)
- return false;
- }
- else
- {
- if(autocvar_g_pickup_items > 0)
- return true;
- if(autocvar_g_pickup_items == 0)
- return false;
- if(g_weaponarena)
- if(STAT(WEAPONS, this) || this.itemdef.instanceOfAmmo) // no item or ammo pickups in weaponarena
- return false;
- }
- return true;
-}
-
-void Item_Show(entity e, int mode)
-{
- e.effects &= ~(EF_ADDITIVE | EF_STARDUST | EF_FULLBRIGHT | EF_NODEPTHTEST);
- e.ItemStatus &= ~ITS_STAYWEP;
- entity def = e.itemdef;
- if (mode > 0)
- {
- // make the item look normal, and be touchable
- e.model = e.mdl;
- e.solid = SOLID_TRIGGER;
- e.spawnshieldtime = 1;
- e.ItemStatus |= ITS_AVAILABLE;
- }
- else if (mode < 0)
- {
- // hide the item completely
- e.model = string_null;
- e.solid = SOLID_NOT;
- e.spawnshieldtime = 1;
- e.ItemStatus &= ~ITS_AVAILABLE;
- }
- else
- {
- bool nostay = def.instanceOfWeaponPickup ? !!(def.m_weapon.m_wepset & WEPSET_SUPERWEAPONS) : false // no weapon-stay on superweapons
- || e.team // weapon stay isn't supported for teamed weapons
- ;
- if(def.instanceOfWeaponPickup && !nostay && g_weapon_stay)
- {
- // make the item translucent and not touchable
- e.model = e.mdl;
- e.solid = SOLID_TRIGGER; // can STILL be picked up!
- e.effects |= EF_STARDUST;
- e.spawnshieldtime = 0; // field indicates whether picking it up may give you anything other than the weapon
- e.ItemStatus |= (ITS_AVAILABLE | ITS_STAYWEP);
- }
- else
- {
- //setmodel(e, "null");
- e.solid = SOLID_NOT;
- e.colormod = '0 0 0';
- //e.glowmod = e.colormod;
- e.spawnshieldtime = 1;
- e.ItemStatus &= ~ITS_AVAILABLE;
- }
- }
-
- if (def.m_glow)
- e.ItemStatus |= ITS_GLOW;
-
- if (autocvar_g_nodepthtestitems)
- e.effects |= EF_NODEPTHTEST;
-
- if (autocvar_g_fullbrightitems)
- e.ItemStatus |= ITS_ALLOWFB;
- else
- e.ItemStatus &= ~ITS_ALLOWFB;
-
- if (autocvar_sv_simple_items)
- e.ItemStatus |= ITS_ALLOWSI;
-
- // relink entity (because solid may have changed)
- setorigin(e, e.origin);
- e.SendFlags |= ISF_STATUS;
-}
-
-void Item_Think(entity this)
-{
- this.nextthink = time;
- if(this.origin != this.oldorigin)
- ItemUpdate(this);
-}
-
-bool Item_ItemsTime_SpectatorOnly(GameItem it);
-bool Item_ItemsTime_Allow(GameItem it);
-float Item_ItemsTime_UpdateTime(entity e, float t);
-void Item_ItemsTime_SetTime(entity e, float t);
-void Item_ItemsTime_SetTimesForAllPlayers();
-
-void Item_Respawn(entity this)
-{
- Item_Show(this, 1);
- sound(this, CH_TRIGGER, this.itemdef.m_respawnsound, VOL_BASE, ATTEN_NORM); // play respawn sound
- setorigin(this, this.origin);
-
- if (Item_ItemsTime_Allow(this.itemdef) || (STAT(WEAPONS, this) & WEPSET_SUPERWEAPONS))
- {
- float t = Item_ItemsTime_UpdateTime(this, 0);
- Item_ItemsTime_SetTime(this, t);
- Item_ItemsTime_SetTimesForAllPlayers();
- }
-
- setthink(this, Item_Think);
- this.nextthink = time;
-
- //Send_Effect(EFFECT_ITEM_RESPAWN, this.origin + this.mins_z * '0 0 1' + '0 0 48', '0 0 0', 1);
- Send_Effect(EFFECT_ITEM_RESPAWN, CENTER_OR_VIEWOFS(this), '0 0 0', 1);
-}
-
-void Item_RespawnCountdown(entity this)
-{
- if(this.item_respawncounter >= ITEM_RESPAWN_TICKS)
- {
- if(this.waypointsprite_attached)
- WaypointSprite_Kill(this.waypointsprite_attached);
- Item_Respawn(this);
- }
- else
- {
- this.nextthink = time + 1;
- this.item_respawncounter += 1;
- if(this.item_respawncounter == 1)
- {
- do {
- {
- entity wi = REGISTRY_GET(Weapons, this.weapon);
- if (wi != WEP_Null) {
- entity wp = WaypointSprite_Spawn(WP_Weapon, 0, 0, this, '0 0 64', NULL, 0, this, waypointsprite_attached, true, RADARICON_Weapon);
- wp.wp_extra = wi.m_id;
- break;
- }
- }
- {
- entity ii = this.itemdef;
- if (ii != NULL) {
- entity wp = WaypointSprite_Spawn(WP_Item, 0, 0, this, '0 0 64', NULL, 0, this, waypointsprite_attached, true, RADARICON_Item);
- wp.wp_extra = ii.m_id;
- break;
- }
- }
- } while (0);
- bool mutator_returnvalue = MUTATOR_CALLHOOK(Item_RespawnCountdown, this);
- if(this.waypointsprite_attached)
- {
- GameItem def = this.itemdef;
- if (Item_ItemsTime_SpectatorOnly(def) && !mutator_returnvalue)
- WaypointSprite_UpdateRule(this.waypointsprite_attached, 0, SPRITERULE_SPECTATOR);
- WaypointSprite_UpdateBuildFinished(this.waypointsprite_attached, time + ITEM_RESPAWN_TICKS);
- }
- }
-
- if(this.waypointsprite_attached)
- {
- FOREACH_CLIENT(IS_REAL_CLIENT(it), {
- 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
- }
- });
-
- WaypointSprite_Ping(this.waypointsprite_attached);
- //WaypointSprite_UpdateHealth(this.waypointsprite_attached, this.item_respawncounter);
- }
- }
-}
-
-void Item_RespawnThink(entity this)
-{
- this.nextthink = time;
- if(this.origin != this.oldorigin)
- ItemUpdate(this);
-
- if(time >= this.wait)
- Item_Respawn(this);
-}
-
-void Item_ScheduleRespawnIn(entity e, float t)
-{
- // if the respawn time is longer than 10 seconds, show a waypoint, otherwise, just respawn normally
- if ((Item_ItemsTime_Allow(e.itemdef) || (STAT(WEAPONS, e) & WEPSET_SUPERWEAPONS) || MUTATOR_CALLHOOK(Item_ScheduleRespawn, e, t)) && (t - ITEM_RESPAWN_TICKS) > 0)
- {
- setthink(e, Item_RespawnCountdown);
- e.nextthink = time + max(0, t - ITEM_RESPAWN_TICKS);
- e.scheduledrespawntime = e.nextthink + ITEM_RESPAWN_TICKS;
- e.item_respawncounter = 0;
- if(Item_ItemsTime_Allow(e.itemdef) || (STAT(WEAPONS, e) & WEPSET_SUPERWEAPONS))
- {
- t = Item_ItemsTime_UpdateTime(e, e.scheduledrespawntime);
- Item_ItemsTime_SetTime(e, t);
- Item_ItemsTime_SetTimesForAllPlayers();
- }
- }
- else
- {
- setthink(e, Item_RespawnThink);
- e.nextthink = time;
- e.scheduledrespawntime = time + t;
- e.wait = time + t;
-
- if(Item_ItemsTime_Allow(e.itemdef) || (STAT(WEAPONS, e) & WEPSET_SUPERWEAPONS))
- {
- t = Item_ItemsTime_UpdateTime(e, e.scheduledrespawntime);
- Item_ItemsTime_SetTime(e, t);
- Item_ItemsTime_SetTimesForAllPlayers();
- }
- }
-}
-
-AUTOCVAR(g_pickup_respawntime_scaling_reciprocal, float, 0.0, "Multiply respawn time by `reciprocal / (p + offset) + linear` where `p` is the current number of players, takes effect with 2 or more players present, `reciprocal` (with `offset` and `linear` set to 0) can be used to achieve a constant number of items spawned *per player*");
-AUTOCVAR(g_pickup_respawntime_scaling_offset, float, 0.0, "Multiply respawn time by `reciprocal / (p + offset) + linear` where `p` is the current number of players, takes effect with 2 or more players present, `offset` offsets the curve left or right - the results are not intuitive and I recommend plotting the respawn time and the number of items per player to see what's happening");
-AUTOCVAR(g_pickup_respawntime_scaling_linear, float, 1.0, "Multiply respawn time by `reciprocal / (p + offset) + linear` where `p` is the current number of players, takes effect with 2 or more players present, `linear` can be used to simply scale the respawn time linearly");
-
-/// Adjust respawn time according to the number of players.
-float adjust_respawntime(float normal_respawntime) {
- float r = autocvar_g_pickup_respawntime_scaling_reciprocal;
- float o = autocvar_g_pickup_respawntime_scaling_offset;
- float l = autocvar_g_pickup_respawntime_scaling_linear;
-
- if (r == 0 && l == 1) {
- return normal_respawntime;
- }
-
- entity balance = TeamBalance_CheckAllowedTeams(NULL);
- TeamBalance_GetTeamCounts(balance, NULL);
- int players = 0;
- for (int i = 1; i <= NUM_TEAMS; ++i)
- {
- if (TeamBalance_IsTeamAllowed(balance, i))
- {
- players += TeamBalance_GetNumberOfPlayers(balance, i);
- }
- }
- TeamBalance_Destroy(balance);
-
- if (players >= 2) {
- return normal_respawntime * (r / (players + o) + l);
- } else {
- return normal_respawntime;
- }
-}
-
-void Item_ScheduleRespawn(entity e)
-{
- if(e.respawntime > 0)
- {
- Item_Show(e, 0);
-
- float adjusted_respawntime = adjust_respawntime(e.respawntime);
- //LOG_INFOF("item %s will respawn in %f", e.classname, adjusted_respawntime);
-
- // range: adjusted_respawntime - respawntimejitter .. adjusted_respawntime + respawntimejitter
- float respawn_in = adjusted_respawntime + crandom() * e.respawntimejitter;
- Item_ScheduleRespawnIn(e, respawn_in);
- }
- else // if respawntime is -1, this item does not respawn
- Item_Show(e, -1);
-}
-
-AUTOCVAR(g_pickup_respawntime_initial_random, int, 1,
- "For items that don't start spawned: 0: spawn after their normal respawntime; 1: spawn after `random * respawntime` with the *same* random; 2: same as 1 but each item has separate random");
-
-void Item_ScheduleInitialRespawn(entity e)
-{
- Item_Show(e, 0);
-
- float spawn_in;
- if (autocvar_g_pickup_respawntime_initial_random == 0)
- {
- // range: respawntime .. respawntime + respawntimejitter
- spawn_in = e.respawntime + random() * e.respawntimejitter;
- }
- else
- {
- float rnd;
- if (autocvar_g_pickup_respawntime_initial_random == 1)
- {
- static float shared_random = 0;
- // NOTE this code works only if items are scheduled at the same time (normal case)
- // NOTE2 random() can't return exactly 1 so this check always work as intended
- if (!shared_random || floor(time) > shared_random)
- shared_random = floor(time) + random();
- rnd = shared_random - floor(time);
- }
- else
- rnd = random();
-
- // range:
- // if respawntime >= ITEM_RESPAWN_TICKS: ITEM_RESPAWN_TICKS .. respawntime + respawntimejitter
- // else: 0 .. ITEM_RESPAWN_TICKS
- // this is to prevent powerups spawning unexpectedly without waypoints
- spawn_in = ITEM_RESPAWN_TICKS + rnd * (e.respawntime + e.respawntimejitter - ITEM_RESPAWN_TICKS);
- }
-
- Item_ScheduleRespawnIn(e, max(0, game_starttime - time) + ((e.respawntimestart) ? e.respawntimestart : spawn_in));
-}
-
-void GiveRandomWeapons(entity receiver, int num_weapons, string weapon_names,
- entity ammo_entity)
-{
- if (num_weapons == 0)
- {
- return;
- }
- int num_potential_weapons = tokenize_console(weapon_names);
- for (int give_attempt = 0; give_attempt < num_weapons; ++give_attempt)
- {
- RandomSelection_Init();
- for (int weapon_index = 0; weapon_index < num_potential_weapons;
- ++weapon_index)
- {
- string weapon = argv(weapon_index);
- FOREACH(Weapons, it != WEP_Null,
- {
- // Finding a weapon which player doesn't have.
- if (!(STAT(WEAPONS, receiver) & it.m_wepset) && (it.netname == weapon))
- {
- RandomSelection_AddEnt(it, 1, 1);
- break;
- }
- });
- }
- if (RandomSelection_chosen_ent == NULL)
- {
- return;
- }
- STAT(WEAPONS, receiver) |= RandomSelection_chosen_ent.m_wepset;
- if (RandomSelection_chosen_ent.ammo_type == RES_NONE)
- {
- continue;
- }
- if (GetResource(receiver,
- RandomSelection_chosen_ent.ammo_type) != 0)
- {
- continue;
- }
- GiveResource(receiver, RandomSelection_chosen_ent.ammo_type,
- GetResource(ammo_entity,
- RandomSelection_chosen_ent.ammo_type));
- }
-}
-
-bool Item_GiveAmmoTo(entity item, entity player, int res_type, float ammomax)
-{
- float amount = GetResource(item, res_type);
- if (amount == 0)
- {
- return false;
- }
- float player_amount = GetResource(player, res_type);
- if (item.spawnshieldtime)
- {
- if ((player_amount >= ammomax) && (item.pickup_anyway <= 0))
- return false;
- }
- else if (g_weapon_stay == 2)
- {
- ammomax = min(amount, ammomax);
- if(player_amount >= ammomax)
- return false;
- }
- else
- return false;
- if (amount < 0)
- TakeResourceWithLimit(player, res_type, -amount, ammomax);
- else
- GiveResourceWithLimit(player, res_type, amount, ammomax);
- return true;
-}
-
-bool Item_GiveTo(entity item, entity player)
-{
- // if nothing happens to player, just return without taking the item
- int _switchweapon = 0;
- // in case the player has autoswitch enabled do the following:
- // if the player is using their best weapon before items are given, they
- // probably want to switch to an even better weapon after items are given
-
- if(CS(player).autoswitch)
- {
- for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
- {
- .entity weaponentity = weaponentities[slot];
- if(player.(weaponentity).m_weapon != WEP_Null || slot == 0)
- {
- if(player.(weaponentity).m_switchweapon == w_getbestweapon(player, weaponentity))
- _switchweapon |= BIT(slot);
-
- if(!(STAT(WEAPONS, player) & WepSet_FromWeapon(player.(weaponentity).m_switchweapon)))
- _switchweapon |= BIT(slot);
- }
- }
- }
- bool pickedup = false;
- pickedup |= Item_GiveAmmoTo(item, player, RES_HEALTH, item.max_health);
- pickedup |= Item_GiveAmmoTo(item, player, RES_ARMOR, item.max_armorvalue);
- pickedup |= Item_GiveAmmoTo(item, player, RES_SHELLS, g_pickup_shells_max);
- pickedup |= Item_GiveAmmoTo(item, player, RES_BULLETS, g_pickup_nails_max);
- pickedup |= Item_GiveAmmoTo(item, player, RES_ROCKETS, g_pickup_rockets_max);
- pickedup |= Item_GiveAmmoTo(item, player, RES_CELLS, g_pickup_cells_max);
- pickedup |= Item_GiveAmmoTo(item, player, RES_PLASMA, g_pickup_plasma_max);
- pickedup |= Item_GiveAmmoTo(item, player, RES_FUEL, g_pickup_fuel_max);
- if (item.itemdef.instanceOfWeaponPickup)
- {
- WepSet w;
- w = STAT(WEAPONS, item);
- w &= ~STAT(WEAPONS, player);
-
- if (w || (item.spawnshieldtime && item.pickup_anyway > 0))
- {
- pickedup = true;
- FOREACH(Weapons, it != WEP_Null, {
- if(w & (it.m_wepset))
- {
- for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
- {
- .entity weaponentity = weaponentities[slot];
- if(player.(weaponentity).m_weapon != WEP_Null || slot == 0)
- W_DropEvent(wr_pickup, player, it.m_id, item, weaponentity);
- }
- W_GiveWeapon(player, it.m_id);
- }
- });
- }
- }
-
- if (item.itemdef.instanceOfPowerup)
- {
- if ((item.itemdef == ITEM_JetpackRegen) && !(player.items & IT_FUEL_REGEN))
- Send_Notification(NOTIF_ONE, player, MSG_CENTER, CENTER_ITEM_FUELREGEN_GOT);
- else if ((item.itemdef == ITEM_Jetpack) && !(player.items & IT_JETPACK))
- Send_Notification(NOTIF_ONE, player, MSG_CENTER, CENTER_ITEM_JETPACK_GOT);
- }
-
- int its;
- if((its = (item.items - (item.items & player.items)) & IT_PICKUPMASK))
- {
- pickedup = true;
- player.items |= its;
- // TODO: we probably want to show a message in the console, but not this one!
- //Send_Notification(NOTIF_ONE, player, MSG_INFO, INFO_ITEM_WEAPON_GOT, item.netname);
- }
-
- if (item.strength_finished)
- {
- pickedup = true;
- STAT(STRENGTH_FINISHED, player) = max(STAT(STRENGTH_FINISHED, player), time) + item.strength_finished;
- }
- if (item.invincible_finished)
- {
- pickedup = true;
- STAT(INVINCIBLE_FINISHED, player) = max(STAT(INVINCIBLE_FINISHED, player), time) + item.invincible_finished;
- }
- if (item.superweapons_finished)
- {
- pickedup = true;
- STAT(SUPERWEAPONS_FINISHED, player) = max(STAT(SUPERWEAPONS_FINISHED, player), time) + item.superweapons_finished;
- }
-
- // always eat teamed entities
- if(item.team)
- pickedup = true;
-
- if (!pickedup)
- return false;
-
- // crude hack to enforce switching weapons
- if(g_cts && item.itemdef.instanceOfWeaponPickup && !CS(player).cvar_cl_cts_noautoswitch)
- {
- for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
- {
- .entity weaponentity = weaponentities[slot];
- if(player.(weaponentity).m_weapon != WEP_Null || slot == 0)
- W_SwitchWeapon_Force(player, REGISTRY_GET(Weapons, item.weapon), weaponentity);
- }
- return true;
- }
-
- if(_switchweapon)
- {
- for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
- {
- .entity weaponentity = weaponentities[slot];
- if(_switchweapon & BIT(slot))
- if(player.(weaponentity).m_switchweapon != w_getbestweapon(player, weaponentity))
- W_SwitchWeapon_Force(player, w_getbestweapon(player, weaponentity), weaponentity);
- }
- }
-
- return true;
-}
-
-void Item_Touch(entity this, entity toucher)
-{
- // remove the item if it's currnetly in a NODROP brush or hits a NOIMPACT surface (such as sky)
- if (Item_IsLoot(this))
- {
- if (ITEM_TOUCH_NEEDKILL())
- {
- delete(this);
- return;
- }
- }
-
- if(!(toucher.flags & FL_PICKUPITEMS)
- || STAT(FROZEN, toucher)
- || IS_DEAD(toucher)
- || (this.solid != SOLID_TRIGGER)
- || (this.owner == toucher)
- || (time < this.item_spawnshieldtime)
- ) { return; }
-
- switch (MUTATOR_CALLHOOK(ItemTouch, this, toucher))
- {
- case MUT_ITEMTOUCH_RETURN: { return; }
- case MUT_ITEMTOUCH_PICKUP: { toucher = M_ARGV(1, entity); goto pickup; }
- }
-
- toucher = M_ARGV(1, entity);
-
- if (Item_IsExpiring(this))
- {
- this.strength_finished = max(0, this.strength_finished - time);
- this.invincible_finished = max(0, this.invincible_finished - time);
- this.superweapons_finished = max(0, this.superweapons_finished - time);
- }
- bool gave = ITEM_HANDLE(Pickup, this.itemdef, this, toucher);
- if (!gave)
- {
- if (Item_IsExpiring(this))
- {
- // undo what we did above
- this.strength_finished += time;
- this.invincible_finished += time;
- this.superweapons_finished += time;
- }
- return;
- }
-
-LABEL(pickup)
-
- if(this.target && this.target != "" && this.target != "###item###") // defrag support
- SUB_UseTargets(this, toucher, NULL);
-
- STAT(LAST_PICKUP, toucher) = time;
-
- Send_Effect(EFFECT_ITEM_PICKUP, CENTER_OR_VIEWOFS(this), '0 0 0', 1);
- _sound (toucher, (this.itemdef.instanceOfPowerup ? CH_TRIGGER_SINGLE : CH_TRIGGER), (this.item_pickupsound ? this.item_pickupsound : Sound_fixpath(this.item_pickupsound_ent)), VOL_BASE, ATTEN_NORM);
-
- MUTATOR_CALLHOOK(ItemTouched, this, toucher);
- if (wasfreed(this))
- {
- return;
- }
-
- if (Item_IsLoot(this))
- {
- delete(this);
- return;
- }
- if (!this.spawnshieldtime)
- {
- return;
- }
- entity e;
- if (this.team)
- {
- RandomSelection_Init();
- IL_EACH(g_items, it.team == this.team,
- {
- if (it.itemdef) // is a registered item
- {
- Item_Show(it, -1);
- it.scheduledrespawntime = 0;
- RandomSelection_AddEnt(it, it.cnt, 0);
- }
- });
- e = RandomSelection_chosen_ent;
- Item_Show(e, 1); // reset its state so it is visible (extra sendflags doesn't matter, this happens anyway)
- }
- else
- e = this;
- Item_ScheduleRespawn(e);
-}
-
-void Item_Reset(entity this)
-{
- Item_Show(this, !this.state);
- setorigin(this, this.origin);
-
- if (Item_IsLoot(this))
- {
- return;
- }
- setthink(this, Item_Think);
- this.nextthink = time;
- if (this.waypointsprite_attached)
- {
- WaypointSprite_Kill(this.waypointsprite_attached);
- }
- if (this.itemdef.instanceOfPowerup || (STAT(WEAPONS, this) & WEPSET_SUPERWEAPONS)) // do not spawn powerups initially!
- {
- Item_ScheduleInitialRespawn(this);
- }
-}
-
-void Item_FindTeam(entity this)
-{
- entity e;
-
- if(this.effects & EF_NODRAW)
- {
- // marker for item team search
- LOG_TRACE("Initializing item team ", ftos(this.team));
- RandomSelection_Init();
- IL_EACH(g_items, it.team == this.team,
- {
- if(it.itemdef) // is a registered item
- RandomSelection_AddEnt(it, it.cnt, 0);
- });
-
- e = RandomSelection_chosen_ent;
- if (!e)
- return;
-
- IL_EACH(g_items, it.team == this.team,
- {
- if(it.itemdef) // is a registered item
- {
- if(it != e)
- {
- // make it non-spawned
- Item_Show(it, -1);
- it.state = 1; // state 1 = initially hidden item, apparently
- }
- else
- Item_Reset(it);
- it.effects &= ~EF_NODRAW;
- }
- });
- }
-}
-
-// Savage: used for item garbage-collection
-void RemoveItem(entity this)
-{
- if(wasfreed(this) || !this) { return; }
- Send_Effect(EFFECT_ITEM_PICKUP, CENTER_OR_VIEWOFS(this), '0 0 0', 1);
- delete(this);
-}
-
-// pickup evaluation functions
-// these functions decide how desirable an item is to the bots
-
-float generic_pickupevalfunc(entity player, entity item) {return item.bot_pickupbasevalue;}
-
-float weapon_pickupevalfunc(entity player, entity item)
-{
- // See if I have it already
- if(STAT(WEAPONS, player) & STAT(WEAPONS, item))
- {
- // If I can pick it up
- if(!item.spawnshieldtime)
- return 0;
- return ammo_pickupevalfunc(player, item);
- }
-
- // reduce weapon value if bot already got a good arsenal
- float c = 1;
- int weapons_value = 0;
- FOREACH(Weapons, it != WEP_Null && (STAT(WEAPONS, player) & it.m_wepset), {
- weapons_value += it.bot_pickupbasevalue;
- });
- c -= bound(0, weapons_value / 20000, 1) * 0.5;
-
- return item.bot_pickupbasevalue * c;
-}
-
-float ammo_pickupevalfunc(entity player, entity item)
-{
- bool need_shells = false, need_nails = false, need_rockets = false, need_cells = false, need_plasma = false, need_fuel = false;
- entity wpn = NULL;
- float c = 0;
- float rating = 0;
-
- // Detect needed ammo
- if(item.itemdef.instanceOfWeaponPickup)
- {
- entity ammo = NULL;
- if(GetResource(item, RES_SHELLS)) { need_shells = true; ammo = ITEM_Shells; }
- else if(GetResource(item, RES_BULLETS)) { need_nails = true; ammo = ITEM_Bullets; }
- else if(GetResource(item, RES_ROCKETS)) { need_rockets = true; ammo = ITEM_Rockets; }
- else if(GetResource(item, RES_CELLS)) { need_cells = true; ammo = ITEM_Cells; }
- else if(GetResource(item, RES_PLASMA)) { need_plasma = true; ammo = ITEM_Plasma; }
- else if(GetResource(item, RES_FUEL)) { need_fuel = true; ammo = ITEM_JetpackFuel; }
-
- if(!ammo)
- return 0;
- wpn = item;
- rating = ammo.m_botvalue;
- }
- else
- {
- FOREACH(Weapons, it != WEP_Null, {
- if(!(STAT(WEAPONS, player) & (it.m_wepset)))
- continue;
-
- switch(it.ammo_type)
- {
- case RES_SHELLS: need_shells = true; break;
- case RES_BULLETS: need_nails = true; break;
- case RES_ROCKETS: need_rockets = true; break;
- case RES_CELLS: need_cells = true; break;
- case RES_PLASMA: need_plasma = true; break;
- case RES_FUEL: need_fuel = true; break;
- }
- });
- rating = item.bot_pickupbasevalue;
- }
-
- float noammorating = 0.5;
-
- if ((need_shells) && GetResource(item, RES_SHELLS) && (GetResource(player, RES_SHELLS) < g_pickup_shells_max))
- c = GetResource(item, RES_SHELLS) / max(noammorating, GetResource(player, RES_SHELLS));
-
- if ((need_nails) && GetResource(item, RES_BULLETS) && (GetResource(player, RES_BULLETS) < g_pickup_nails_max))
- c = GetResource(item, RES_BULLETS) / max(noammorating, GetResource(player, RES_BULLETS));
-
- if ((need_rockets) && GetResource(item, RES_ROCKETS) && (GetResource(player, RES_ROCKETS) < g_pickup_rockets_max))
- c = GetResource(item, RES_ROCKETS) / max(noammorating, GetResource(player, RES_ROCKETS));
-
- if ((need_cells) && GetResource(item, RES_CELLS) && (GetResource(player, RES_CELLS) < g_pickup_cells_max))
- c = GetResource(item, RES_CELLS) / max(noammorating, GetResource(player, RES_CELLS));
-
- if ((need_plasma) && GetResource(item, RES_PLASMA) && (GetResource(player, RES_PLASMA) < g_pickup_plasma_max))
- c = GetResource(item, RES_PLASMA) / max(noammorating, GetResource(player, RES_PLASMA));
-
- if ((need_fuel) && GetResource(item, RES_FUEL) && (GetResource(player, RES_FUEL) < g_pickup_fuel_max))
- c = GetResource(item, RES_FUEL) / max(noammorating, GetResource(player, RES_FUEL));
-
- rating *= min(c, 2);
- if(wpn)
- rating += wpn.bot_pickupbasevalue * 0.1;
- return rating;
-}
-
-float healtharmor_pickupevalfunc(entity player, entity item)
-{
- float c = 0;
- float rating = item.bot_pickupbasevalue;
-
- float itemarmor = GetResource(item, RES_ARMOR);
- float itemhealth = GetResource(item, RES_HEALTH);
-
- if(item.item_group)
- {
- itemarmor *= min(4, item.item_group_count);
- itemhealth *= min(4, item.item_group_count);
- }
-
- if (itemarmor && (GetResource(player, RES_ARMOR) < item.max_armorvalue))
- c = itemarmor / max(1, GetResource(player, RES_ARMOR) * 2/3 + GetResource(player, RES_HEALTH) * 1/3);
-
- if (itemhealth && (GetResource(player, RES_HEALTH) < item.max_health))
- c = itemhealth / max(1, GetResource(player, RES_HEALTH));
-
- rating *= min(2, c);
- return rating;
-}
-
-void Item_Damage(entity this, entity inflictor, entity attacker, float damage, int deathtype, .entity weaponentity, vector hitloc, vector force)
-{
- if(ITEM_DAMAGE_NEEDKILL(deathtype))
- RemoveItem(this);
-}
-
-void item_use(entity this, entity actor, entity trigger)
-{
- // use the touch function to handle collection
- gettouch(this)(this, actor);
-}
-
-void _StartItem(entity this, entity def, float defaultrespawntime, float defaultrespawntimejitter)
-{
- string itemname = def.m_name;
- Model itemmodel = def.m_model;
- Sound pickupsound = def.m_sound;
- float(entity player, entity item) pickupevalfunc = def.m_pickupevalfunc;
- float pickupbasevalue = def.m_botvalue;
- int itemflags = def.m_itemflags;
-
- startitem_failed = false;
-
- this.item_model_ent = itemmodel;
- this.item_pickupsound_ent = pickupsound;
-
- if(def.m_iteminit)
- def.m_iteminit(def, this);
-
- if(!this.respawntime) // both need to be set
- {
- this.respawntime = defaultrespawntime;
- this.respawntimejitter = defaultrespawntimejitter;
- }
-
- if(!this.pickup_anyway && def.m_pickupanyway)
- this.pickup_anyway = def.m_pickupanyway();
-
- int itemid = def.m_itemid;
- this.items = itemid;
- int weaponid = def.instanceOfWeaponPickup ? def.m_weapon.m_id : 0;
- this.weapon = weaponid;
-
- if(!this.fade_end)
- {
- this.fade_start = autocvar_g_items_mindist;
- this.fade_end = autocvar_g_items_maxdist;
- }
-
- if(weaponid)
- STAT(WEAPONS, this) = WepSet_FromWeapon(REGISTRY_GET(Weapons, weaponid));
-
- this.flags = FL_ITEM | itemflags;
- IL_PUSH(g_items, this);
-
- if(MUTATOR_CALLHOOK(FilterItem, this)) // error means we do not want the item
- {
- startitem_failed = true;
- delete(this);
- return;
- }
-
- precache_model(this.model);
- precache_sound(this.item_pickupsound);
-
- if (Item_IsLoot(this))
- {
- this.reset = SUB_Remove;
- set_movetype(this, MOVETYPE_TOSS);
-
- // Savage: remove thrown items after a certain period of time ("garbage collection")
- setthink(this, RemoveItem);
- this.nextthink = time + 20;
-
- this.takedamage = DAMAGE_YES;
- this.event_damage = Item_Damage;
-
- if (Item_IsExpiring(this))
- {
- // if item is worthless after a timer, have it expire then
- this.nextthink = max(this.strength_finished, this.invincible_finished, this.superweapons_finished);
- }
-
- // don't drop if in a NODROP zone (such as lava)
- traceline(this.origin, this.origin, MOVE_NORMAL, this);
- if (trace_dpstartcontents & DPCONTENTS_NODROP)
- {
- startitem_failed = true;
- delete(this);
- return;
- }
- }
- else
- {
- if(!have_pickup_item(this))
- {
- startitem_failed = true;
- delete(this);
- return;
- }
-
- if(this.angles != '0 0 0')
- this.SendFlags |= ISF_ANGLES;
-
- this.reset = Item_Reset;
- // it's a level item
- if(this.spawnflags & 1)
- this.noalign = 1;
- if (this.noalign > 0)
- set_movetype(this, MOVETYPE_NONE);
- else
- set_movetype(this, MOVETYPE_TOSS);
- // do item filtering according to game mode and other things
- if (this.noalign <= 0)
- {
- // first nudge it off the floor a little bit to avoid math errors
- setorigin(this, this.origin + '0 0 1');
- // set item size before we spawn a spawnfunc_waypoint
- setsize(this, def.m_mins, def.m_maxs);
- this.SendFlags |= ISF_SIZE;
- // note droptofloor returns false if stuck/or would fall too far
- if (!this.noalign)
- droptofloor(this);
- waypoint_spawnforitem(this);
- }
-
- /*
- * can't do it that way, as it would break maps
- * TODO make a target_give like entity another way, that perhaps has
- * the weapon name in a key
- if(this.targetname)
- {
- // target_give not yet supported; maybe later
- print("removed targeted ", this.classname, "\n");
- startitem_failed = true;
- delete(this);
- return;
- }
- */
-
- if(this.targetname != "" && (this.spawnflags & 16))
- this.use = item_use;
-
- if(autocvar_spawn_debug >= 2)
- {
- // why not flags & fl_item?
- FOREACH_ENTITY_RADIUS(this.origin, 3, it.is_item, {
- LOG_TRACE("XXX Found duplicated item: ", itemname, vtos(this.origin));
- LOG_TRACE(" vs ", it.netname, vtos(it.origin));
- error("Mapper sucks.");
- });
- this.is_item = true;
- }
-
- weaponsInMap |= WepSet_FromWeapon(REGISTRY_GET(Weapons, weaponid));
-
- if ( def.instanceOfPowerup
- || def.instanceOfWeaponPickup
- || (def.instanceOfHealth && def != ITEM_HealthSmall)
- || (def.instanceOfArmor && def != ITEM_ArmorSmall)
- || (itemid & (IT_KEY1 | IT_KEY2))
- )
- {
- if(!this.target || this.target == "")
- this.target = "###item###"; // for finding the nearest item using findnearest
- }
-
- Item_ItemsTime_SetTime(this, 0);
- }
-
- this.bot_pickup = true;
- this.bot_pickupevalfunc = pickupevalfunc;
- this.bot_pickupbasevalue = pickupbasevalue;
- this.mdl = this.model ? this.model : strzone(this.item_model_ent.model_str());
- this.netname = itemname;
- settouch(this, Item_Touch);
- setmodel(this, MDL_Null); // precision set below
- //this.effects |= EF_LOWPRECISION;
-
- setsize (this, this.pos1 = def.m_mins, this.pos2 = def.m_maxs);
-
- this.SendFlags |= ISF_SIZE;
-
- if (!(this.spawnflags & 1024)) {
- if(def.instanceOfPowerup)
- this.ItemStatus |= ITS_ANIMATE1;
-
- if(GetResource(this, RES_ARMOR) || GetResource(this, RES_HEALTH))
- this.ItemStatus |= ITS_ANIMATE2;
- }
-
- if(Item_IsLoot(this))
- this.gravity = 1;
-
- if(def.instanceOfWeaponPickup)
- {
- if (!Item_IsLoot(this)) // if dropped, colormap is already set up nicely
- this.colormap = 1024; // color shirt=0 pants=0 grey
- if (!(this.spawnflags & 1024))
- this.ItemStatus |= ITS_ANIMATE1;
- this.SendFlags |= ISF_COLORMAP;
- }
-
- this.state = 0;
- if(this.team)
- {
- if(!this.cnt)
- this.cnt = 1; // item probability weight
-
- this.effects |= EF_NODRAW; // marker for item team search
- InitializeEntity(this, Item_FindTeam, INITPRIO_FINDTARGET);
- }
- else
- Item_Reset(this);
-
- Net_LinkEntity(this, !(def.instanceOfPowerup || def.instanceOfHealth || def.instanceOfArmor), 0, ItemSend);
-
- // call this hook after everything else has been done
- if (MUTATOR_CALLHOOK(Item_Spawn, this))
- {
- startitem_failed = true;
- delete(this);
- return;
- }
-
- setItemGroup(this);
-}
-
-void StartItem(entity this, GameItem def)
-{
- def = def.m_spawnfunc_hookreplace(def, this);
- if (def.spawnflags & ITEM_FLAG_MUTATORBLOCKED)
- {
- delete(this);
- return;
- }
- this.classname = def.m_canonical_spawnfunc;
- _StartItem(
- this,
- this.itemdef = def,
- def.m_respawntime(), // defaultrespawntime
- def.m_respawntimejitter() // defaultrespawntimejitter
- );
-}
-
-#define IS_SMALL(def) ((def.instanceOfHealth && def == ITEM_HealthSmall) || (def.instanceOfArmor && def == ITEM_ArmorSmall))
-int group_count = 1;
-
-void setItemGroup(entity this)
-{
- if(!IS_SMALL(this.itemdef) || Item_IsLoot(this))
- return;
-
- FOREACH_ENTITY_RADIUS(this.origin, 120, (it != this) && IS_SMALL(it.itemdef),
- {
- if(!this.item_group)
- {
- if(!it.item_group)
- {
- it.item_group = group_count;
- group_count++;
- }
- this.item_group = it.item_group;
- }
- else // spawning item is already part of a item_group X
- {
- if(!it.item_group)
- it.item_group = this.item_group;
- else if(it.item_group != this.item_group) // found an item near the spawning item that is part of a different item_group Y
- {
- int grY = it.item_group;
- // move all items of item_group Y to item_group X
- IL_EACH(g_items, IS_SMALL(it.itemdef),
- {
- if(it.item_group == grY)
- it.item_group = this.item_group;
- });
- }
- }
- });
-}
-
-void setItemGroupCount()
-{
- for (int k = 1; k <= group_count; k++)
- {
- int count = 0;
- IL_EACH(g_items, IS_SMALL(it.itemdef) && it.item_group == k, { count++; });
- if (count)
- IL_EACH(g_items, IS_SMALL(it.itemdef) && it.item_group == k, { it.item_group_count = count; });
- }
-}
-
-void target_items_use(entity this, entity actor, entity trigger)
-{
- if(Item_IsLoot(actor))
- {
- EXACTTRIGGER_TOUCH(this, trigger);
- delete(actor);
- return;
- }
-
- if (!IS_PLAYER(actor) || IS_DEAD(actor))
- return;
-
- if(trigger.solid == SOLID_TRIGGER)
- {
- EXACTTRIGGER_TOUCH(this, trigger);
- }
-
- IL_EACH(g_items, it.enemy == actor && Item_IsLoot(it),
- {
- delete(it);
- });
-
- if(GiveItems(actor, 0, tokenize_console(this.netname)))
- centerprint(actor, this.message);
-}
-
-spawnfunc(target_items)
-{
- this.use = target_items_use;
- if(!this.strength_finished)
- this.strength_finished = autocvar_g_balance_powerup_strength_time;
- if(!this.invincible_finished)
- this.invincible_finished = autocvar_g_balance_powerup_invincible_time;
- if(!this.superweapons_finished)
- this.superweapons_finished = autocvar_g_balance_superweapons_time;
-
- string str;
- int n = tokenize_console(this.netname);
- if(argv(0) == "give")
- {
- str = substring(this.netname, argv_start_index(1), argv_end_index(-1) - argv_start_index(1));
- }
- else
- {
- for(int j = 0; j < n; ++j)
- {
- // this is from a time when unlimited superweapons were handled together with ammo in some parts of the code
- if (argv(j) == "unlimited_ammo") this.items |= IT_UNLIMITED_AMMO | IT_UNLIMITED_SUPERWEAPONS;
- else if(argv(j) == "unlimited_weapon_ammo") this.items |= IT_UNLIMITED_AMMO;
- else if(argv(j) == "unlimited_superweapons") this.items |= IT_UNLIMITED_SUPERWEAPONS;
- else if(argv(j) == "strength") this.items |= ITEM_Strength.m_itemid;
- else if(argv(j) == "invincible") this.items |= ITEM_Shield.m_itemid;
- else if(argv(j) == "superweapons") this.items |= IT_SUPERWEAPON;
- else if(argv(j) == "jetpack") this.items |= ITEM_Jetpack.m_itemid;
- else if(argv(j) == "fuel_regen") this.items |= ITEM_JetpackRegen.m_itemid;
- else
- {
- FOREACH(Buffs, it != BUFF_Null,
- {
- string s = Buff_UndeprecateName(argv(j));
- if(s == it.netname)
- {
- STAT(BUFFS, this) |= (it.m_itemid);
- if(!STAT(BUFF_TIME, this))
- STAT(BUFF_TIME, this) = it.m_time(it);
- break;
- }
- });
- FOREACH(Weapons, it != WEP_Null, {
- string s = W_UndeprecateName(argv(j));
- if(s == it.netname)
- {
- STAT(WEAPONS, this) |= (it.m_wepset);
- if(this.spawnflags == 0 || this.spawnflags == 2)
- it.wr_init(it);
- break;
- }
- });
- }
- }
-
- string itemprefix, valueprefix;
- if(this.spawnflags == 0)
- {
- itemprefix = "";
- valueprefix = "";
- }
- else if(this.spawnflags == 1)
- {
- itemprefix = "max ";
- valueprefix = "max ";
- }
- else if(this.spawnflags == 2)
- {
- itemprefix = "min ";
- valueprefix = "min ";
- }
- else if(this.spawnflags == 4)
- {
- itemprefix = "minus ";
- valueprefix = "max ";
- }
- else
- {
- error("invalid spawnflags");
- itemprefix = valueprefix = string_null;
- }
-
- str = "";
- str = sprintf("%s %s%d %s", str, itemprefix, boolean(this.items & IT_UNLIMITED_AMMO), "unlimited_weapon_ammo");
- str = sprintf("%s %s%d %s", str, itemprefix, boolean(this.items & IT_UNLIMITED_SUPERWEAPONS), "unlimited_superweapons");
- str = sprintf("%s %s%d %s", str, valueprefix, this.strength_finished * boolean(this.items & ITEM_Strength.m_itemid), "strength");
- str = sprintf("%s %s%d %s", str, valueprefix, this.invincible_finished * boolean(this.items & ITEM_Shield.m_itemid), "invincible");
- str = sprintf("%s %s%d %s", str, valueprefix, this.superweapons_finished * boolean(this.items & IT_SUPERWEAPON), "superweapons");
- str = sprintf("%s %s%d %s", str, itemprefix, boolean(this.items & ITEM_Jetpack.m_itemid), "jetpack");
- str = sprintf("%s %s%d %s", str, itemprefix, boolean(this.items & ITEM_JetpackRegen.m_itemid), "fuel_regen");
- float res;
- res = GetResource(this, RES_SHELLS); if(res != 0) str = sprintf("%s %s%d %s", str, valueprefix, max(0, res), "shells");
- res = GetResource(this, RES_BULLETS); if(res != 0) str = sprintf("%s %s%d %s", str, valueprefix, max(0, res), "nails");
- res = GetResource(this, RES_ROCKETS); if(res != 0) str = sprintf("%s %s%d %s", str, valueprefix, max(0, res), "rockets");
- res = GetResource(this, RES_CELLS); if(res != 0) str = sprintf("%s %s%d %s", str, valueprefix, max(0, res), "cells");
- res = GetResource(this, RES_PLASMA); if(res != 0) str = sprintf("%s %s%d %s", str, valueprefix, max(0, res), "plasma");
- res = GetResource(this, RES_FUEL); if(res != 0) str = sprintf("%s %s%d %s", str, valueprefix, max(0, res), "fuel");
- res = GetResource(this, RES_HEALTH); if(res != 0) str = sprintf("%s %s%d %s", str, valueprefix, max(0, res), "health");
- res = GetResource(this, RES_ARMOR); if(res != 0) str = sprintf("%s %s%d %s", str, valueprefix, max(0, res), "armor");
- // HACK: buffs share a single timer, so we need to include enabled buffs AFTER disabled ones to avoid loss
- FOREACH(Buffs, it != BUFF_Null && !(STAT(BUFFS, this) & it.m_itemid), str = sprintf("%s %s%d %s", str, valueprefix, max(0, STAT(BUFF_TIME, this)), it.netname));
- FOREACH(Buffs, it != BUFF_Null && (STAT(BUFFS, this) & it.m_itemid), str = sprintf("%s %s%d %s", str, valueprefix, max(0, STAT(BUFF_TIME, this)), it.netname));
- FOREACH(Weapons, it != WEP_Null, str = sprintf("%s %s%d %s", str, itemprefix, !!(STAT(WEAPONS, this) & (it.m_wepset)), it.netname));
- }
- this.netname = strzone(str);
-
- n = tokenize_console(this.netname);
- for(int j = 0; j < n; ++j)
- {
- FOREACH(Weapons, it != WEP_Null && W_UndeprecateName(argv(j)) == it.netname, {
- it.wr_init(it);
- break;
- });
- }
-}
-
-float GiveWeapon(entity e, float wpn, float op, float val)
-{
- WepSet v0, v1;
- WepSet s = WepSet_FromWeapon(REGISTRY_GET(Weapons, wpn));
- v0 = (STAT(WEAPONS, e) & s);
- switch(op)
- {
- case OP_SET:
- if(val > 0)
- STAT(WEAPONS, e) |= s;
- else
- STAT(WEAPONS, e) &= ~s;
- break;
- case OP_MIN:
- case OP_PLUS:
- if(val > 0)
- STAT(WEAPONS, e) |= s;
- break;
- case OP_MAX:
- if(val <= 0)
- STAT(WEAPONS, e) &= ~s;
- break;
- case OP_MINUS:
- if(val > 0)
- STAT(WEAPONS, e) &= ~s;
- break;
- }
- v1 = (STAT(WEAPONS, e) & s);
- return (v0 != v1);
-}
-
-bool GiveBuff(entity e, Buff thebuff, int op, int val)
-{
- bool had_buff = (STAT(BUFFS, e) & thebuff.m_itemid);
- float new_buff_time = ((had_buff) ? STAT(BUFF_TIME, e) : 0);
- switch (op)
- {
- case OP_SET:
- new_buff_time = val;
- break;
- case OP_MIN:
- new_buff_time = max(new_buff_time, val);
- break;
- case OP_MAX:
- new_buff_time = min(new_buff_time, val);
- break;
- case OP_PLUS:
- new_buff_time += val;
- break;
- case OP_MINUS:
- new_buff_time -= val;
- break;
- }
- if(new_buff_time <= 0)
- {
- if(had_buff)
- STAT(BUFF_TIME, e) = new_buff_time;
- STAT(BUFFS, e) &= ~thebuff.m_itemid;
- }
- else
- {
- STAT(BUFF_TIME, e) = new_buff_time;
- STAT(BUFFS, e) = thebuff.m_itemid; // NOTE: replaces any existing buffs on the player!
- }
- bool have_buff = (STAT(BUFFS, e) & thebuff.m_itemid);
- return (had_buff != have_buff);
-}
-
-void GiveSound(entity e, float v0, float v1, float t, Sound snd_incr, Sound snd_decr)
-{
- if(v1 == v0)
- return;
- if(v1 <= v0 - t)
- {
- if(snd_decr != NULL)
- sound (e, CH_TRIGGER, snd_decr, VOL_BASE, ATTEN_NORM);
- }
- else if(v0 >= v0 + t)
- {
- if(snd_incr != NULL)
- sound (e, CH_TRIGGER, snd_incr, VOL_BASE, ATTEN_NORM);
- }
-}
-
-void GiveRot(entity e, float v0, float v1, .float rotfield, float rottime, .float regenfield, float regentime)
-{
- if(v0 < v1)
- e.(rotfield) = max(e.(rotfield), time + rottime);
- else if(v0 > v1)
- e.(regenfield) = max(e.(regenfield), time + regentime);
-}
-bool GiveResourceValue(entity e, int res_type, int op, int val)
-{
- int v0 = GetResource(e, res_type);
- float new_val = 0;
- switch (op)
- {
- // min 100 cells = at least 100 cells
- case OP_SET: new_val = val; break;
- case OP_MIN: new_val = max(v0, val); break;
- case OP_MAX: new_val = min(v0, val); break;
- case OP_PLUS: new_val = v0 + val; break;
- case OP_MINUS: new_val = v0 - val; break;
- default: return false;
- }
-
- return SetResourceExplicit(e, res_type, new_val);
-}
-
-float GiveItems(entity e, float beginarg, float endarg)
-{
- float got, i, val, op;
- string cmd;
-
- val = 999;
- op = OP_SET;
-
- got = 0;
-
- int _switchweapon = 0;
-
- if(CS(e).autoswitch)
- {
- for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
- {
- .entity weaponentity = weaponentities[slot];
- if(e.(weaponentity).m_weapon != WEP_Null || slot == 0)
- if(e.(weaponentity).m_switchweapon == w_getbestweapon(e, weaponentity))
- _switchweapon |= BIT(slot);
- }
- }
-
- STAT(STRENGTH_FINISHED, e) = max(0, STAT(STRENGTH_FINISHED, e) - time);
- STAT(INVINCIBLE_FINISHED, e) = max(0, STAT(INVINCIBLE_FINISHED, e) - time);
- STAT(SUPERWEAPONS_FINISHED, e) = max(0, STAT(SUPERWEAPONS_FINISHED, e) - time);
- STAT(BUFF_TIME, e) = max(0, STAT(BUFF_TIME, e) - time);
-
- PREGIVE(e, items);
- PREGIVE_WEAPONS(e);
- PREGIVE(e, stat_STRENGTH_FINISHED);
- PREGIVE(e, stat_INVINCIBLE_FINISHED);
- PREGIVE(e, stat_SUPERWEAPONS_FINISHED);
- PREGIVE_RESOURCE(e, RES_BULLETS);
- PREGIVE_RESOURCE(e, RES_CELLS);
- PREGIVE_RESOURCE(e, RES_PLASMA);
- PREGIVE_RESOURCE(e, RES_SHELLS);
- PREGIVE_RESOURCE(e, RES_ROCKETS);
- PREGIVE_RESOURCE(e, RES_FUEL);
- PREGIVE_RESOURCE(e, RES_ARMOR);
- PREGIVE_RESOURCE(e, RES_HEALTH);
-
- for(i = beginarg; i < endarg; ++i)
- {
- cmd = argv(i);
-
- if(cmd == "0" || stof(cmd))
- {
- val = stof(cmd);
- continue;
- }
- switch(cmd)
- {
- case "no":
- op = OP_MAX;
- val = 0;
- continue;
- case "max":
- op = OP_MAX;
- continue;
- case "min":
- op = OP_MIN;
- continue;
- case "plus":
- op = OP_PLUS;
- continue;
- case "minus":
- op = OP_MINUS;
- continue;
- case "ALL":
- got += GiveBit(e, items, ITEM_JetpackRegen.m_itemid, op, val);
- got += GiveValue(e, stat_STRENGTH_FINISHED, op, val);
- got += GiveValue(e, stat_INVINCIBLE_FINISHED, op, val);
- got += GiveValue(e, stat_SUPERWEAPONS_FINISHED, op, val);
- got += GiveBit(e, items, IT_UNLIMITED_AMMO | IT_UNLIMITED_SUPERWEAPONS, op, val);
- case "all":
- got += GiveBit(e, items, ITEM_Jetpack.m_itemid, op, val);
- got += GiveResourceValue(e, RES_HEALTH, op, val);
- got += GiveResourceValue(e, RES_ARMOR, op, val);
- case "allweapons":
- FOREACH(Weapons, it != WEP_Null && !(it.spawnflags & (WEP_FLAG_MUTATORBLOCKED | WEP_FLAG_SPECIALATTACK)), got += GiveWeapon(e, it.m_id, op, val));
- //case "allbuffs": // all buffs makes a player god, do not want!
- //FOREACH(Buffs, it != BUFF_Null, got += GiveBuff(e, it.m_itemid, op, val));
- case "allammo":
- got += GiveResourceValue(e, RES_CELLS, op, val);
- got += GiveResourceValue(e, RES_PLASMA, op, val);
- got += GiveResourceValue(e, RES_SHELLS, op, val);
- got += GiveResourceValue(e, RES_BULLETS, op, val);
- got += GiveResourceValue(e, RES_ROCKETS, op, val);
- got += GiveResourceValue(e, RES_FUEL, op, val);
- break;
- case "unlimited_ammo":
- // this is from a time when unlimited superweapons were handled together with ammo in some parts of the code
- got += GiveBit(e, items, IT_UNLIMITED_AMMO | IT_UNLIMITED_SUPERWEAPONS, op, val);
- break;
- case "unlimited_weapon_ammo":
- got += GiveBit(e, items, IT_UNLIMITED_AMMO, op, val);
- break;
- case "unlimited_superweapons":
- got += GiveBit(e, items, IT_UNLIMITED_SUPERWEAPONS, op, val);
- break;
- case "jetpack":
- got += GiveBit(e, items, ITEM_Jetpack.m_itemid, op, val);
- break;
- case "fuel_regen":
- got += GiveBit(e, items, ITEM_JetpackRegen.m_itemid, op, val);
- break;
- case "strength":
- got += GiveValue(e, stat_STRENGTH_FINISHED, op, val);
- break;
- case "invincible":
- got += GiveValue(e, stat_INVINCIBLE_FINISHED, op, val);
- break;
- case "superweapons":
- got += GiveValue(e, stat_SUPERWEAPONS_FINISHED, op, val);
- break;
- case "cells":
- got += GiveResourceValue(e, RES_CELLS, op, val);
- break;
- case "plasma":
- got += GiveResourceValue(e, RES_PLASMA, op, val);
- break;
- case "shells":
- got += GiveResourceValue(e, RES_SHELLS, op, val);
- break;
- case "nails":
- case "bullets":
- got += GiveResourceValue(e, RES_BULLETS, op, val);
- break;
- case "rockets":
- got += GiveResourceValue(e, RES_ROCKETS, op, val);
- break;
- case "health":
- got += GiveResourceValue(e, RES_HEALTH, op, val);
- break;
- case "armor":
- got += GiveResourceValue(e, RES_ARMOR, op, val);
- break;
- case "fuel":
- got += GiveResourceValue(e, RES_FUEL, op, val);
- break;
- default:
- FOREACH(Buffs, it != BUFF_Null && buff_Available(it) && Buff_UndeprecateName(cmd) == it.netname,
- {
- got += GiveBuff(e, it, op, val);
- break;
- });
- FOREACH(Weapons, it != WEP_Null && W_UndeprecateName(cmd) == it.netname, {
- got += GiveWeapon(e, it.m_id, op, val);
- break;
- });
- break;
- }
- val = 999;
- op = OP_SET;
- }
-
- POSTGIVE_BIT(e, items, ITEM_JetpackRegen.m_itemid, SND_ITEMPICKUP, SND_Null);
- POSTGIVE_BIT(e, items, IT_UNLIMITED_SUPERWEAPONS, SND_POWERUP, SND_POWEROFF);
- POSTGIVE_BIT(e, items, IT_UNLIMITED_AMMO, SND_POWERUP, SND_POWEROFF);
- POSTGIVE_BIT(e, items, ITEM_Jetpack.m_itemid, SND_ITEMPICKUP, SND_Null);
- FOREACH(Weapons, it != WEP_Null, {
- POSTGIVE_WEAPON(e, it, SND_WEAPONPICKUP, SND_Null);
- if(!(save_weapons & (it.m_wepset)))
- if(STAT(WEAPONS, e) & (it.m_wepset))
- it.wr_init(it);
- });
- POSTGIVE_VALUE(e, stat_STRENGTH_FINISHED, 1, SND_POWERUP, SND_POWEROFF);
- POSTGIVE_VALUE(e, stat_INVINCIBLE_FINISHED, 1, SND_Shield, SND_POWEROFF);
- //POSTGIVE_VALUE(e, stat_SUPERWEAPONS_FINISHED, 1, SND_Null, SND_Null);
- POSTGIVE_RESOURCE(e, RES_BULLETS, 0, SND_ITEMPICKUP, SND_Null);
- POSTGIVE_RESOURCE(e, RES_CELLS, 0, SND_ITEMPICKUP, SND_Null);
- POSTGIVE_RESOURCE(e, RES_PLASMA, 0, SND_ITEMPICKUP, SND_Null);
- POSTGIVE_RESOURCE(e, RES_SHELLS, 0, SND_ITEMPICKUP, SND_Null);
- POSTGIVE_RESOURCE(e, RES_ROCKETS, 0, SND_ITEMPICKUP, SND_Null);
- POSTGIVE_RES_ROT(e, RES_FUEL, 1, pauserotfuel_finished, autocvar_g_balance_pause_fuel_rot, pauseregen_finished, autocvar_g_balance_pause_fuel_regen, SND_ITEMPICKUP, SND_Null);
- POSTGIVE_RES_ROT(e, RES_ARMOR, 1, pauserotarmor_finished, autocvar_g_balance_pause_armor_rot, pauseregen_finished, autocvar_g_balance_pause_health_regen, SND_ARMOR25, SND_Null);
- POSTGIVE_RES_ROT(e, RES_HEALTH, 1, pauserothealth_finished, autocvar_g_balance_pause_health_rot, pauseregen_finished, autocvar_g_balance_pause_health_regen, SND_MEGAHEALTH, SND_Null);
-
- if(STAT(SUPERWEAPONS_FINISHED, e) <= 0)
- if(!g_weaponarena && (STAT(WEAPONS, e) & WEPSET_SUPERWEAPONS))
- STAT(SUPERWEAPONS_FINISHED, e) = autocvar_g_balance_superweapons_time;
-
- if(STAT(STRENGTH_FINISHED, e) <= 0)
- STAT(STRENGTH_FINISHED, e) = 0;
- else
- STAT(STRENGTH_FINISHED, e) += time;
- if(STAT(INVINCIBLE_FINISHED, e) <= 0)
- STAT(INVINCIBLE_FINISHED, e) = 0;
- else
- STAT(INVINCIBLE_FINISHED, e) += time;
- if(STAT(SUPERWEAPONS_FINISHED, e) <= 0)
- STAT(SUPERWEAPONS_FINISHED, e) = 0;
- else
- STAT(SUPERWEAPONS_FINISHED, e) += time;
- if(STAT(BUFF_TIME, e) <= 0)
- STAT(BUFF_TIME, e) = 0;
- else
- STAT(BUFF_TIME, e) += time;
-
- for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
- {
- .entity weaponentity = weaponentities[slot];
- if(e.(weaponentity).m_weapon != WEP_Null || slot == 0)
- if(!(STAT(WEAPONS, e) & WepSet_FromWeapon(e.(weaponentity).m_switchweapon)))
- _switchweapon |= BIT(slot);
- }
-
- if(_switchweapon)
- {
- for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
- {
- .entity weaponentity = weaponentities[slot];
- if(_switchweapon & BIT(slot))
- {
- Weapon wep = w_getbestweapon(e, weaponentity);
- if(wep != e.(weaponentity).m_switchweapon)
- W_SwitchWeapon_Force(e, wep, weaponentity);
- }
- }
- }
-
- return got;
-}
-#endif
+++ /dev/null
-#pragma once
-
-const int AMMO_COUNT = 4; // amount of ammo types to show in the ammo panel
-
-// item networking
-const int ISF_LOCATION = BIT(1);
-const int ISF_MODEL = BIT(2);
-const int ISF_STATUS = BIT(3);
- const int ITS_STAYWEP = BIT(0);
- const int ITS_ANIMATE1 = BIT(1);
- const int ITS_ANIMATE2 = BIT(2);
- const int ITS_AVAILABLE = BIT(3);
- const int ITS_ALLOWFB = BIT(4);
- const int ITS_ALLOWSI = BIT(5);
- const int ITS_GLOW = BIT(6);
-const int ISF_COLORMAP = BIT(4);
-const int ISF_DROP = BIT(5);
-const int ISF_ANGLES = BIT(6);
-const int ISF_SIZE = BIT(7);
-
-.int ItemStatus;
-
-.float onground_time;
-.float fade_start;
-.float fade_end;
-
-#ifdef SVQC
-void StartItem(entity this, entity a);
-.int item_group;
-.int item_group_count;
-#endif
-
-#ifdef CSQC
-
-bool autocvar_cl_items_nofade;
-float autocvar_cl_animate_items = 1;
-float autocvar_cl_ghost_items = 0.45;
-vector autocvar_cl_ghost_items_color = '-1 -1 -1';
-vector autocvar_cl_weapon_stay_color = '2 0.5 0.5';
-float autocvar_cl_weapon_stay_alpha = 0.75;
-float autocvar_cl_simple_items = 0;
-string autocvar_cl_simpleitems_postfix = "_simple";
-.float spawntime;
-.float gravity;
-.vector colormod;
-
-void ItemDraw(entity this);
-
-#endif
-#ifdef SVQC
-
-float autocvar_sv_simple_items;
-bool ItemSend(entity this, entity to, int sf);
-
-bool have_pickup_item(entity this);
-
-const float ITEM_RESPAWN_TICKS = 10;
-
-.float max_armorvalue;
-.float pickup_anyway;
-
-.float item_respawncounter;
-
-void Item_Show (entity e, int mode);
-
-void Item_Respawn (entity this);
-
-void Item_RespawnCountdown(entity this);
-void Item_ScheduleRespawnIn(entity e, float t);
-
-void Item_ScheduleRespawn(entity e);
-
-void Item_ScheduleInitialRespawn(entity e);
-
-/// \brief Give several random weapons and ammo to the entity.
-/// \param[in,out] receiver Entity to give weapons to.
-/// \param[in] num_weapons Number of weapons to give.
-/// \param[in] weapon_names Names of weapons to give separated by spaces.
-/// \param[in] ammo Entity containing the ammo amount for each possible weapon.
-/// \return No return.
-void GiveRandomWeapons(entity receiver, int num_weapons, string weapon_names, entity ammo_entity);
-
-bool Item_GiveAmmoTo(entity item, entity player, int res_type, float ammomax);
-
-bool Item_GiveTo(entity item, entity player);
-
-void Item_Touch(entity this, entity toucher);
-
-void Item_Reset(entity this);
-
-void Item_FindTeam(entity this);
-// Savage: used for item garbage-collection
-
-bool ItemSend(entity this, entity to, int sf);
-void ItemUpdate(entity this);
-
-void UpdateItemAfterTeleport(entity this);
-
-// pickup evaluation functions
-// these functions decide how desirable an item is to the bots
-
-float generic_pickupevalfunc(entity player, entity item);// {return item.bot_pickupbasevalue;} // WEAPONTODO
-
-float weapon_pickupevalfunc(entity player, entity item);
-float ammo_pickupevalfunc(entity player, entity item);
-float healtharmor_pickupevalfunc(entity player, entity item);
-
-.bool is_item;
-.entity itemdef;
-void _StartItem(entity this, entity def, float defaultrespawntime, float defaultrespawntimejitter);
-
-void setItemGroup(entity this);
-void setItemGroupCount();
-
-float GiveWeapon(entity e, float wpn, float op, float val);
-
-float GiveBit(entity e, .float fld, float bit, float op, float val);
-
-float GiveValue(entity e, .float fld, float op, float val);
-
-void GiveSound(entity e, float v0, float v1, float t, Sound snd_incr, Sound snd_decr);
-
-void GiveRot(entity e, float v0, float v1, .float rotfield, float rottime, .float regenfield, float regentime);
-
-spawnfunc(target_items);
-
-#define PREGIVE_WEAPONS(e) WepSet save_weapons; save_weapons = STAT(WEAPONS, e)
-#define PREGIVE(e,f) float save_##f; save_##f = (e).f
-#define PREGIVE_RESOURCE(e,f) float save_##f = GetResource((e), (f))
-#define POSTGIVE_WEAPON(e,b,snd_incr,snd_decr) GiveSound((e), !!(save_weapons & WepSet_FromWeapon(b)), !!(STAT(WEAPONS, e) & WepSet_FromWeapon(b)), 0, snd_incr, snd_decr)
-#define POSTGIVE_BIT(e,f,b,snd_incr,snd_decr) GiveSound((e), save_##f & (b), (e).f & (b), 0, snd_incr, snd_decr)
-#define POSTGIVE_RESOURCE(e,f,t,snd_incr,snd_decr) GiveSound((e), save_##f, GetResource((e), (f)), t, snd_incr, snd_decr)
-#define POSTGIVE_RES_ROT(e,f,t,rotfield,rottime,regenfield,regentime,snd_incr,snd_decr) GiveRot((e),save_##f,GetResource((e),(f)),rotfield,rottime,regenfield,regentime);GiveSound((e),save_##f,GetResource((e),(f)),t,snd_incr,snd_decr)
-#define POSTGIVE_VALUE(e,f,t,snd_incr,snd_decr) GiveSound((e), save_##f, (e).f, t, snd_incr, snd_decr)
-#define POSTGIVE_VALUE_ROT(e,f,t,rotfield,rottime,regenfield,regentime,snd_incr,snd_decr) GiveRot((e), save_##f, (e).f, rotfield, rottime, regenfield, regentime); GiveSound((e), save_##f, (e).f, t, snd_incr, snd_decr)
-
-float GiveItems(entity e, float beginarg, float endarg);
-#endif
this.origin = ReadVector();
setorigin(this, this.origin);
- this.angles_x = ReadAngle();
- this.angles_y = ReadAngle();
+ this.angles = ReadAngleVector2D();
turret_construct(this, isnew);
this.colormap = 1024;
#include "sv_turrets.qh"
#ifdef SVQC
#include <server/autocvars.qh>
+#include <server/bot/api.qh>
+#include <server/damage.qh>
+#include <server/weapons/common.qh>
+#include <server/weapons/weaponsystem.qh>
+#include <common/mapobjects/defs.qh>
// Generic aiming
vector turret_aim_generic(entity this)
bool turret_send(entity this, entity to, float sf)
{
-
WriteHeader(MSG_ENTITY, ENT_CLIENT_TURRET);
WriteByte(MSG_ENTITY, sf);
if(sf & TNSF_SETUP)
WriteVector(MSG_ENTITY, this.origin);
- WriteAngle(MSG_ENTITY, this.angles_x);
- WriteAngle(MSG_ENTITY, this.angles_y);
+ WriteAngleVector2D(MSG_ENTITY, this.angles);
}
if(sf & TNSF_ANG)
this.event_damage = func_null;
#ifdef TURRET_DEBUG
float d;
- d = RadiusDamage (this, this.owner, this.owner.shot_dmg, 0, this.owner.shot_radius, this, NULL, this.owner.shot_force, this.totalfrags, DMG_NOWEP, NULL);
+ d = RadiusDamage (this, this.owner, this.owner.shot_dmg, 0, this.owner.shot_radius, this, NULL, this.owner.shot_force, this.projectiledeathtype, DMG_NOWEP, NULL);
this.owner.tur_debug_dmg_t_h = this.owner.tur_debug_dmg_t_h + d;
this.owner.tur_debug_dmg_t_f = this.owner.tur_debug_dmg_t_f + this.owner.shot_dmg;
#else
- RadiusDamage (this, this.realowner, this.owner.shot_dmg, 0, this.owner.shot_radius, this, NULL, this.owner.shot_force, this.totalfrags, DMG_NOWEP, NULL);
+ RadiusDamage (this, this.realowner, this.owner.shot_dmg, 0, this.owner.shot_radius, this, NULL, this.owner.shot_force, this.projectiledeathtype, DMG_NOWEP, NULL);
#endif
delete(this);
}
IL_PUSH(g_projectiles, proj);
IL_PUSH(g_bot_dodge, proj);
proj.enemy = actor.enemy;
- proj.totalfrags = _death;
+ proj.projectiledeathtype = _death;
PROJECTILE_MAKETRIGGER(proj);
if(_health)
{
vector tvt_tadv; // turret angle diff vector, updated by a successful call to turret_validate_target
float tvt_thadf; // turret head angle diff float, updated by a successful call to turret_validate_target
float tvt_dist; // turret distance, updated by a successful call to turret_validate_target
+
+IntrusiveList g_turrets;
+STATIC_INIT(g_turrets) { g_turrets = IL_NEW(); }
setorigin(this, this.enemy.origin + randomvec() * this.owner.shot_radius);
#ifdef TURRET_DEBUG
- float d = RadiusDamage (this, this.owner, this.owner.shot_dmg, this.owner.shot_dmg, this.owner.shot_radius, this, NULL, this.owner.shot_force, this.totalfrags, DMG_NOWEP, NULL);
+ float d = RadiusDamage (this, this.owner, this.owner.shot_dmg, this.owner.shot_dmg, this.owner.shot_radius, this, NULL, this.owner.shot_force, this.projectiledeathtype, DMG_NOWEP, NULL);
this.owner.tur_debug_dmg_t_h = this.owner.tur_debug_dmg_t_h + d;
this.owner.tur_debug_dmg_t_f = this.owner.tur_debug_dmg_t_f + this.owner.shot_dmg;
#else
- RadiusDamage (this, this.realowner, this.owner.shot_dmg, this.owner.shot_dmg, this.owner.shot_radius, this, NULL, this.owner.shot_force, this.totalfrags, DMG_NOWEP, NULL);
+ RadiusDamage (this, this.realowner, this.owner.shot_dmg, this.owner.shot_dmg, this.owner.shot_radius, this, NULL, this.owner.shot_force, this.projectiledeathtype, DMG_NOWEP, NULL);
#endif
delete(this);
}
#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
#include "sv_vehicles.qh"
+#include <server/bot/api.qh>
+#include <server/damage.qh>
+#include <server/world.qh>
+#include <server/items/items.qh>
+#include <common/items/_mod.qh>
+#include <common/mapobjects/defs.qh>
+#include <common/mapobjects/teleporters.qh>
+#include <common/mapobjects/triggers.qh>
+#include <server/main.qh>
+#include <server/weapons/common.qh>
+
bool SendAuxiliaryXhair(entity this, entity to, int sf)
{
WriteHeader(MSG_ENTITY, ENT_CLIENT_AUXILIARYXHAIR);
PROJECTILE_TOUCH(this, toucher);
this.event_damage = func_null;
- RadiusDamage (this, this.realowner, this.shot_dmg, 0, this.shot_radius, this, NULL, this.shot_force, this.totalfrags, DMG_NOWEP, toucher);
+ RadiusDamage (this, this.realowner, this.shot_dmg, 0, this.shot_radius, this, NULL, this.shot_force, this.projectiledeathtype, DMG_NOWEP, toucher);
delete(this);
}
proj.shot_dmg = _dmg;
proj.shot_radius = _radi;
proj.shot_force = _force;
- proj.totalfrags = _deahtype;
+ proj.projectiledeathtype = _deahtype;
proj.solid = SOLID_BBOX;
set_movetype(proj, MOVETYPE_FLYMISSILE);
proj.flags = FL_PROJECTILE;
WriteByte (MSG_ONE, SVC_SETVIEWPORT);
WriteEntity( MSG_ONE, player);
+ // NOTE: engine networked
WriteByte (MSG_ONE, SVC_SETVIEWANGLES);
WriteAngle(MSG_ONE, 0);
WriteAngle(MSG_ONE, vehic.angles_y);
veh.vehicle_hudmodel.viewmodelforclient = pl;
- pl.crouch = false;
+ UNSET_DUCKED(pl);
pl.view_ofs = STAT(PL_VIEW_OFS, pl);
setsize(pl, STAT(PL_MIN, pl), STAT(PL_MAX, pl));
WriteByte (MSG_ONE, SVC_SETVIEWPORT);
WriteEntity(MSG_ONE, veh.vehicle_viewport);
+ // NOTE: engine networked
WriteByte (MSG_ONE, SVC_SETVIEWANGLES);
if(veh.tur_head)
{
return false;
if(!this.tur_head)
- {
info.vr_precache(info);
- IL_PUSH(g_vehicles, this);
- }
if(this.targetname && this.targetname != "")
{
.float dmg_time;
+.float pain_frame;
+
.float play_time;
.int volly_counter;
WriteByte(MSG_ONE, SVC_SETVIEWPORT);
WriteEntity(MSG_ONE, player);
+ // NOTE: engine networked
WriteByte(MSG_ONE, SVC_SETVIEWANGLES);
WriteAngle(MSG_ONE, 0);
WriteAngle(MSG_ONE, vehic.angles.y);
WriteByte(MSG_ONE, SVC_SETVIEWPORT);
WriteEntity(MSG_ONE, gunner.vehicle_viewport);
+ // NOTE: engine networked
WriteByte(MSG_ONE, SVC_SETVIEWANGLES);
WriteAngle(MSG_ONE, gunner.angles_x + vehic.angles_x); // tilt
WriteAngle(MSG_ONE, gunner.angles_y + vehic.angles_y); // yaw
#include "racer.qh"
+#if defined(SVQC)
+ #include <common/gamemodes/gamemode/ctf/sv_ctf.qh>
+#endif
+
#ifdef GAMEQC
#ifdef SVQC
vector autocvar_g_vehicle_racer_bouncepain = '200 0.15 150';
.float racer_watertime;
+.float racer_air_finished; // TODO: use a standard air meter for entities
var .vector(entity this, string tag_name, float spring_length, float max_power) racer_force_from_tag;
{
uforce = autocvar_g_vehicle_racer_water_upforcedamper;
- if(PHYS_INPUT_BUTTON_CROUCH(player) && time < this.air_finished)
+ if(PHYS_INPUT_BUTTON_CROUCH(player) && time < this.racer_air_finished)
this.velocity_z += 30;
else
this.velocity_z += 200;
void racer_fire_rocket_aim(entity this, entity player, string tagname, entity trg)
{
vector v = gettaginfo(this, gettagindex(this, tagname));
- racer_fire_rocket(player, v, v_forward, trg);
+ racer_fire_rocket(this, player, v, v_forward, trg);
}
bool racer_frame(entity this, float dt)
int cont = Mod_Q1BSP_SuperContentsFromNativeContents(pointcontents(vehic.origin));
if(!(cont & DPCONTENTS_WATER))
- vehic.air_finished = 0;
- else if (!vehic.air_finished)
- vehic.air_finished = time + autocvar_g_vehicle_racer_water_time;
+ vehic.racer_air_finished = 0;
+ else if (!vehic.racer_air_finished)
+ vehic.racer_air_finished = time + autocvar_g_vehicle_racer_water_time;
if(IS_DEAD(vehic))
{
}
}
- if(!weaponLocked(player))
+ if (!weaponLocked(player) && !weaponUseForbidden(player))
if(time > vehic.delay)
if(PHYS_INPUT_BUTTON_ATCK2(player))
{
#ifdef SVQC
-void racer_fire_rocket(entity player, vector org, vector dir, entity trg);
+void racer_fire_rocket(entity this, entity player, vector org, vector dir, entity trg);
METHOD(RacerAttack, wr_think, void(entity thiswep, entity actor, .entity weaponentity, int fire))
{
bool isPlayer = IS_PLAYER(actor);
veh.vehicle_energy -= autocvar_g_vehicle_racer_cannon_cost;
veh.wait = time;
}
- string tagname = (veh.cnt)
- ? (veh.cnt = 0, "tag_fire1")
- : (veh.cnt = 1, "tag_fire2");
- vector vshotorg = gettaginfo(veh, gettagindex(veh, tagname));
- w_shotorg = vshotorg;
- w_shotdir = v_forward;
- // Fix z-aim (for chase mode)
- crosshair_trace(player);
- w_shotdir.z = normalize(trace_endpos - vshotorg).z * 0.5;
-
+ if(!isPlayer)
+ {
+ string tagname = (veh.cnt)
+ ? (veh.cnt = 0, "tag_fire1")
+ : (veh.cnt = 1, "tag_fire2");
+ vector vshotorg = gettaginfo(veh, gettagindex(veh, tagname));
+ w_shotorg = vshotorg;
+ w_shotdir = v_forward;
+
+ // Fix z-aim (for chase mode)
+ crosshair_trace(player);
+ w_shotdir.z = normalize(trace_endpos - vshotorg).z * 0.5;
+ }
if (isPlayer) W_SetupShot_Dir(player, weaponentity, v_forward, false, 0, SND_Null, CH_WEAPON_B, 0, DEATH_VH_WAKI_GUN.m_id);
vector org = w_shotorg;
vector dir = w_shotdir;
- entity bolt = vehicles_projectile(veh, EFFECT_RACER_MUZZLEFLASH, SND_LASERGUN_FIRE,
+ entity bolt = vehicles_projectile(((veh) ? veh : player), EFFECT_RACER_MUZZLEFLASH, SND_LASERGUN_FIRE,
org, normalize(v_forward + randomvec() * autocvar_g_vehicle_racer_cannon_spread) * autocvar_g_vehicle_racer_cannon_speed,
autocvar_g_vehicle_racer_cannon_damage, autocvar_g_vehicle_racer_cannon_radius, autocvar_g_vehicle_racer_cannon_force, 0,
DEATH_VH_WAKI_GUN.m_id, PROJECTILE_WAKICANNON, 0, true, true, player);
if (fire & 2)
if (!isPlayer || weapon_prepareattack(thiswep, actor, weaponentity, false, 0.2)) {
if (isPlayer) W_SetupShot_Dir(actor, weaponentity, v_forward, false, 0, SND_Null, CH_WEAPON_B, 0, DEATH_VH_WAKI_ROCKET.m_id);
- racer_fire_rocket(player, w_shotorg, w_shotdir, NULL);
+ racer_fire_rocket(((veh) ? veh : player), player, w_shotorg, w_shotdir, NULL);
weapon_thinkf(actor, weaponentity, WFRAME_FIRE2, 0, w_ready);
}
}
void racer_rocket_tracker(entity this);
void racer_rocket_groundhugger(entity this);
-void racer_fire_rocket(entity player, vector org, vector dir, entity trg)
+void racer_fire_rocket(entity this, entity player, vector org, vector dir, entity trg)
{
- entity rocket = vehicles_projectile(player.vehicle, EFFECT_RACER_ROCKETLAUNCH, SND_ROCKET_FIRE,
+ entity rocket = vehicles_projectile(this, EFFECT_RACER_ROCKETLAUNCH, SND_ROCKET_FIRE,
org, dir * autocvar_g_vehicle_racer_rocket_speed,
autocvar_g_vehicle_racer_rocket_damage, autocvar_g_vehicle_racer_rocket_radius, autocvar_g_vehicle_racer_rocket_force, 3,
DEATH_VH_WAKI_ROCKET.m_id, PROJECTILE_WAKIROCKET, 20, false, false, player);
// TODO: move into implementation
#ifdef SVQC
-void racer_fire_rocket(entity player, vector org, vector dir, entity trg);
+void racer_fire_rocket(entity this, entity player, vector org, vector dir, entity trg);
#endif
#ifdef SVQC
#include "raptor.qh"
+#if defined(SVQC)
+ #include <common/gamemodes/gamemode/ctf/sv_ctf.qh>
+#endif
+
#ifdef GAMEQC
#ifdef SVQC
bool incoming = false;
IL_EACH(g_projectiles, it.enemy == vehic,
{
- if(MISSILE_IS_TRACKING(it))
+ if(it.missile_flags & MIF_GUIDED_TRACKING)
if(vdist(vehic.origin - it.origin, <, 2 * autocvar_g_vehicle_raptor_flare_range))
{
incoming = true;
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;
#include "spiderbot.qh"
+#if defined(SVQC)
+ #include <common/gamemodes/gamemode/ctf/sv_ctf.qh>
+#endif
+
#ifdef GAMEQC
const int SBRM_FIRST = 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);
#include "util.qh"
#if defined(CSQC)
- #include "../client/defs.qh"
+ #include <client/main.qh>
#include "constants.qh"
#elif defined(MENUQC)
#elif defined(SVQC)
- #include "../server/defs.qh"
+ #include <common/weapons/_all.qh>
+ #include <common/stats.qh>
#endif
// client movement
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)
#define WEAPONS_ALL_C
#if defined(CSQC)
- #include <client/defs.qh>
#include "../constants.qh"
#include "../stats.qh"
#include <lib/warpzone/anglestransform.qh>
#include <common/util.qh>
#include "../monsters/_mod.qh"
#include "config.qh"
+ #include <server/weapons/common.qh>
#include <server/weapons/csqcprojectile.qh>
#include <server/weapons/tracing.qh>
- #include "../t_items.qh"
+ #include <server/items/spawning.qh>
#include <server/autocvars.qh>
- #include <server/constants.qh>
- #include <server/defs.qh>
#include "../notifications/all.qh"
#include "../deathtypes/all.qh"
#include <server/mutators/_mod.qh>
#include <server/command/_mod.qh>
#include <lib/csqcmodel/sv_model.qh>
#include <server/portals.qh>
- #include <server/g_hook.qh>
+ #include <server/hook.qh>
#endif
#ifdef GAMEQC
#include "calculations.qc"
* 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 = forward * vecs.x + right * -vecs.y + up * vecs.z;
+ vector org = rlplayer.origin + rlplayer.view_ofs + dv;
+
+ 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>
// read cvars from weapon settings
+// cvars are created as such: g_balance_wepname_name
#define WEP_CVAR(wepname, name) (_wep_##wepname.wepvar_##name)
#define WEP_CVAR_PRI(wepname, name) WEP_CVAR(wepname, primary_##name)
#define WEP_CVAR_SEC(wepname, name) WEP_CVAR(wepname, secondary_##name)
.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) */
#define SPAWNFUNC_WEAPON(name, weapon) \
spawnfunc(name) { weapon_defaultspawnfunc(this, weapon); }
+#define SPAWNFUNC_WEAPON_COND(name, cond, wep1, wep2) \
+ spawnfunc(name) \
+ { \
+ entity wep = (cond) ? wep1 : wep2; \
+ weapon_defaultspawnfunc(this, wep); \
+ }
+
#else
#define SPAWNFUNC_WEAPON(name, weapon)
}
if(sf & ARC_SF_BEAMDIR) // beam direction
{
- WriteAngle(MSG_ENTITY, this.beam_dir.x);
- WriteAngle(MSG_ENTITY, this.beam_dir.y);
- WriteAngle(MSG_ENTITY, this.beam_dir.z);
+ WriteAngleVector(MSG_ENTITY, this.beam_dir);
}
if(sf & ARC_SF_BEAMTYPE) // beam type
{
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;
if(sf & ARC_SF_BEAMDIR) // beam direction
{
- this.angles_x = ReadAngle();
- this.angles_y = ReadAngle();
- this.angles_z = ReadAngle();
+ this.angles = ReadAngleVector();
}
if(sf & ARC_SF_BEAMTYPE) // beam type
/* 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 = WEP_CVAR_PRI(hlac, spread_min) + (WEP_CVAR_PRI(hlac, spread_add) * actor.(weaponentity).misc_bulletcounter);
spread = min(spread,WEP_CVAR_PRI(hlac, spread_max));
- if(actor.crouch)
+ if(IS_DUCKED(actor))
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 = WEP_CVAR_SEC(hlac, spread);
- if(actor.crouch)
+ if(IS_DUCKED(actor))
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);
.float minelayer_detonate, mine_explodeanyway;
.float mine_time;
.vector mine_orientation;
+
+IntrusiveList g_mines;
+STATIC_INIT(g_mines) { g_mines = IL_NEW(); }
#endif
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);
.float porto_forbidden;
void W_Porto_Fail(entity this, float failhard);
+void W_Porto_Remove (entity p);
#endif
#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);
// BLAST CONE CALCULATION
// ========================
- // if it's a player, use the view origin as reference (stolen from RadiusDamage functions in g_damage.qc)
+ // if it's a player, use the view origin as reference (stolen from RadiusDamage functions in damage.qc)
center = CENTER_OR_VIEWOFS(head);
// find the closest point on the enemy to the center of the attack
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);
SPAWNFUNC_WEAPON(weapon_nex, WEP_VORTEX)
#ifdef SVQC
+.float vortex_charge_rottime;
+
.float vortex_lasthit;
void W_Vortex_Charge(entity actor, .entity weaponentity, float dt);
\
PROP(false, porto_v_angle_held, WEPENT_SET_NORMAL, \
{ WriteByte(chan, this.porto_v_angle_held); if(this.porto_v_angle_held) { \
- WriteAngle(chan, this.owner.porto_v_angle.x); WriteAngle(chan, this.owner.porto_v_angle.y); \
+ WriteAngleVector2D(chan, this.owner.porto_v_angle); \
} }, \
{ (viewmodels[this.m_wepent_slot]).angles_held_status = ReadByte(); if((viewmodels[this.m_wepent_slot]).angles_held_status) { \
- (viewmodels[this.m_wepent_slot]).angles_held = vec2(ReadAngle(), ReadAngle()); } \
+ (viewmodels[this.m_wepent_slot]).angles_held = ReadAngleVector2D(); } \
else { (viewmodels[this.m_wepent_slot]).angles_held = '0 0 0'; } }) \
\
PROP(false, tuba_instrument, WEPENT_SET_NORMAL, \
#define STAT_MOVEVARS_TIMESCALE _STAT_MOVEVARS_TIMESCALE
#define STAT_MOVEVARS_GRAVITY _STAT_MOVEVARS_GRAVITY
+#define drawpic drawpic_builtin
+#define drawstring drawstring_builtin
+#define drawcharacter drawcharacter_builtin
+#define drawfill drawfill_builtin
+#define drawsetcliparea drawsetcliparea_builtin
+#define drawcolorcodedstring drawcolorcodedstring_builtin
+#define drawcolorcodedstring2 drawcolorcodedstring2_builtin
+#define stringwidth stringwidth_builtin
+
#include "upstream/csprogsdefs.qc"
#undef true
#define use use1
.void(entity this, entity actor, entity trigger) use;
-#define touch move_touch
+
+#undef drawpic
+#undef drawstring
+#undef drawcharacter
+#undef drawfill
+#undef drawsetcliparea
+#undef drawcolorcodedstring
+#undef drawcolorcodedstring2
+#undef stringwidth
void(vector ang) _makevectors_hidden = #1;
vector(float skel, float bonenum) _skel_get_boneabs_hidden = #270;
void() break_to_debugger = #6;
float() random = #7;
-void(entity e, float chan, string samp) sound = #8;
+void(entity e, float chan, string samp, float volume, float atten, ...) sound = #8;
vector(vector v) normalize = #9;
void(string e) error = #10;
void(string e) objerror = #11;
vector (vector v) cs_unproject = #310;
vector (vector v) cs_project = #311;
-void(float width, vector pos1, vector pos2, float flag) drawline = #315;
+void(float width, vector pos1, vector pos2, vector rgb, float alpha, float flag) drawline = #315;
float(string name) iscachedpic = #316;
string(string name, ...) precache_pic = #317;
string(string name) precache_cubemap = #317;
vector(string picname) draw_getimagesize = #318;
void(string name) freepic = #319;
-float(vector position, float character, vector scale, vector rgb, float alpha, float flag) drawcharacter_builtin = #320;
-float(vector position, string text, vector scale, vector rgb, float alpha, float flag) drawstring_builtin = #321;
-float(vector position, string pic, vector size, vector rgb, float alpha, float flag) drawpic_builtin = #322;
-float(vector position, vector size, vector rgb, float alpha, float flag) drawfill_builtin = #323;
-void(float x, float y, float width, float height) drawsetcliparea_builtin = #324;
+float(vector position, float character, vector scale, vector rgb, float alpha, float flag) drawcharacter = #320;
+float(vector position, string text, vector scale, vector rgb, float alpha, float flag) drawstring = #321;
+float(vector position, string pic, vector size, vector rgb, float alpha, float flag) drawpic = #322;
+float(vector position, vector size, vector rgb, float alpha, float flag) drawfill = #323;
+void(float x, float y, float width, float height) drawsetcliparea = #324;
void(void) drawresetcliparea = #325;
-float(vector position, string text, vector scale, float alpha, float flag) drawcolorcodedstring_builtin = #326;
-vector(vector position, string text, vector scale, vector rgb, float alpha, float flag) drawcolorcodedstring2_builtin = #326;
+float(vector position, string text, vector scale, float alpha, float flag) drawcolorcodedstring = #326;
+vector(vector position, string text, vector scale, vector rgb, float alpha, float flag) drawcolorcodedstring2 = #326;
float(float stnum) getstatf = #330;
float(float stnum, ...) getstati = #331; // can optionally take first bit and count
string() ReadString = #366;
float() ReadFloat = #367;
-// LordHavoc's range #400-#499
+// LadyHavoc's range #400-#499
void(entity from, entity to) copyentity = #400;
entity(.string fld, string match) findchain = #402;
float(float c, float s) atan2 = #474;
float(float a) tan = #475;
float(string s) strippedstringlen = #476;
-float(string s) strlennocol = #476; // This is the correct name for the function, but not removing the decolorizedstring mapping.
+float(string s) strlennocol = #476; // This is the correct name for the function, but not removing the strippedstringlen mapping.
string(string s) decolorizedstring = #477;
string(string s) strdecolorize = #477; // This is the correct name for the function, but not removing the decolorizedstring mapping.
string(float uselocaltime, string format, ...) strftime = #478;
// fix_* parms let you fix badly made fonts by applying some transformations to them
// fix_scale : per-character center-oriented scale (doesn't change line height at all)
// fix_voffset : vertical offset for each character, it's a multiplier to character height
-float stringwidth_builtin(string text, float allowColorCodes, vector size) = #327; // get a width of string with given font and char size
+float stringwidth(string text, float allowColorCodes, vector size) = #327; // get a width of string with given font and char size
float stringwidth_menu(string text, float allowColorCodes, vector size) = #468; // in menu.dat it has different builtin #
//description: engine support for custom fonts in console, hud, qc etc.
// limits:
//DP_QC_ASINACOSATANATAN2TAN
//idea: Urre
-//darkplaces implementation: LordHavoc
+//darkplaces implementation: LadyHavoc
//constant definitions:
float DEG2RAD = 0.0174532925199432957692369076848861271344287188854172545609719144;
float RAD2DEG = 57.2957795130823208767981548141051703324054724665643215491602438612;
//see DP_END_GETSOUNDTIME for similar functionality but for entity sound channels
//DP_QC_TOKENIZEBYSEPARATOR
-//idea: Electro, SavageX, LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: Electro, SavageX, LadyHavoc
+//darkplaces implementation: LadyHavoc
//builtin definitions:
float(string s, string separator1, ...) tokenizebyseparator = #479;
//description:
//notes: these constants are given as optional second argument to precache_pic()
//DP_QC_TRACE_MOVETYPE_WORLDONLY
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//constant definitions:
float MOVE_WORLDONLY = 3;
//description:
float(entity num) num_for_edict = #512;
//DP_TRACE_HITCONTENTSMASK_SURFACEINFO
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//globals:
.float dphitcontentsmask; // if non-zero on the entity passed to traceline/tracebox/tracetoss this will override the normal collidable contents rules and instead hit these contents values (for example AI can use tracelines that hit DONOTENTER if it wants to, by simply changing this field on the entity passed to traceline), this affects normal movement as well as trace calls
float trace_dpstartcontents; // DPCONTENTS_ value at start position of trace
//logarithm
//FTE_CSQC_SKELETONOBJECTS
-//idea: Spike, LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: Spike, LadyHavoc
+//darkplaces implementation: LadyHavoc
//builtin definitions:
// all skeleton numbers are 1-based (0 being no skeleton)
// all bone numbers are 1-based (0 being invalid)
//function definitions:
void coverage() = #642; // Reports a coverage event. The engine counts for each of the calls to this builtin whether it has been called.
+//DP_QC_FS_SEARCH_PACKFILE
+//idea: Mario
+//darkplaces implementation: Mario
+//builtin definitions:
+float(string pattern, float caseinsensitive, float quiet, string packfile) search_packfile_begin = #444;
+//description:
+//extension to search_begin (DP_QC_FS_SEARCH), performs a filename search with the specified pattern (for example "maps/*.bsp") and stores the results in a search slot (minimum of 128 supported by any engine with this extension), the other functions take this returned search slot number, be sure to search_free when done (they are also freed on progs reload).
+//only searches for files within the specified packfile, which is expected to match the results of whichpack().
+
// assorted builtins
const float STAT_MOVEVARS_TICRATE = 240;
const float STAT_MOVEVARS_TIMESCALE = 241;
//checkextension function
//idea: expected by almost everyone
-//darkplaces implementation: LordHavoc
+//darkplaces implementation: LadyHavoc
float(string s) checkextension = #99;
//description:
//check if (cvar("pr_checkextension")) before calling this, this is the only
//BX_WAL_SUPPORT
//idea: id Software
-//darkplaces implementation: LordHavoc
+//darkplaces implementation: LadyHavoc
//description:
//indicates the engine supports .wal textures for filenames in the textures/ directory
//(note: DarkPlaces has supported this since 2001 or 2002, but did not advertise it as an extension, then I noticed Betwix was advertising it and added the extension accordingly)
//DP_BUTTONCHAT
//idea: Vermeulen
-//darkplaces implementation: LordHavoc
+//darkplaces implementation: LadyHavoc
//field definitions:
.float buttonchat;
//description:
//DP_BUTTONUSE
//idea: id Software
-//darkplaces implementation: LordHavoc
+//darkplaces implementation: LadyHavoc
//field definitions:
.float buttonuse;
//client console commands:
//made +use and -use commands work, they now control the .buttonuse field (.button1 was used by many mods for other purposes).
//DP_CL_LOADSKY
-//idea: Nehahra, LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: Nehahra, LadyHavoc
+//darkplaces implementation: LadyHavoc
//client console commands:
//"loadsky" (parameters: "basename", example: "mtnsun_" would load "mtnsun_up.tga" and "mtnsun_rt.tga" and similar names, use "" to revert to quake sky, note: this is the same as Quake2 skybox naming)
//description:
//DP_CON_SET
//idea: id Software
-//darkplaces implementation: LordHavoc
+//darkplaces implementation: LadyHavoc
//description:
//indicates this engine supports the "set" console command which creates or sets a non-archived cvar (not saved to config.cfg on exit), it is recommended that set and seta commands be placed in default.cfg for mod-specific cvars.
//DP_CON_SETA
//idea: id Software
-//darkplaces implementation: LordHavoc
+//darkplaces implementation: LadyHavoc
//description:
//indicates this engine supports the "seta" console command which creates or sets an archived cvar (saved to config.cfg on exit), it is recommended that set and seta commands be placed in default.cfg for mod-specific cvars.
//indicates this engine supports console commandlines containing $cvarname which will expand to the contents of that cvar as a parameter, for instance say my fov is $fov, will say "my fov is 90", or similar.
//DP_CON_STARTMAP
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//description:
//adds two engine-called aliases named startmap_sp and startmap_dm which are called when the engine tries to start a singleplayer game from the menu (startmap_sp) or the -listen or -dedicated options are used or the engine is a dedicated server (uses startmap_dm), these allow a mod or game to specify their own map instead of start, and also distinguish between singleplayer and -listen/-dedicated, also these need not be a simple "map start" command, they can do other things if desired, startmap_sp and startmap_dm both default to "map start".
//DP_EF_ADDITIVE
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//effects bit:
float EF_ADDITIVE = 32;
//description:
//DP_EF_BLUE
//idea: id Software
-//darkplaces implementation: LordHavoc
+//darkplaces implementation: LadyHavoc
//effects bit:
float EF_BLUE = 64;
//description:
//entity emits blue light (used for quad)
//DP_EF_DOUBLESIDED
-//idea: LordHavoc
-//darkplaces implementation: [515] and LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: [515] and LadyHavoc
//effects bit:
float EF_DOUBLESIDED = 32768;
//description:
//force dynamic model light on the entity, even if it's a BSP model (or anything else with lightmaps or light colors)
//DP_EF_FLAME
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//effects bit:
float EF_FLAME = 1024;
//description:
//entity is on fire
//DP_EF_FULLBRIGHT
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//effects bit:
float EF_FULLBRIGHT = 512;
//description:
//DP_EF_NODEPTHTEST
//idea: Supa
-//darkplaces implementation: LordHavoc
+//darkplaces implementation: LadyHavoc
//effects bit:
float EF_NODEPTHTEST = 8192;
//description:
//DP_EF_NODRAW
//idea: id Software
-//darkplaces implementation: LordHavoc
+//darkplaces implementation: LadyHavoc
//effects bit:
float EF_NODRAW = 16;
//description:
//DP_EF_NOGUNBOB
//idea: Chris Page, Dresk
-//darkplaces implementation: LordHAvoc
+//darkplaces implementation: LadyHavoc
//effects bit:
float EF_NOGUNBOB = 256;
//description:
//disabling gun bobbing on view-relative models meant to be part of the heads up display. (note: if fov is changed these entities may be off-screen, or too near the center of the screen, so use fov 90 in this case)
//DP_EF_NOSHADOW
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//effects bit:
float EF_NOSHADOW = 4096;
//description:
//DP_EF_RED
//idea: id Software
-//darkplaces implementation: LordHavoc
+//darkplaces implementation: LadyHavoc
//effects bit:
float EF_RED = 128;
//description:
//DP_EF_STARDUST
//idea: MythWorks Inc
-//darkplaces implementation: LordHavoc
+//darkplaces implementation: LadyHavoc
//effects bit:
float EF_STARDUST = 2048;
//description:
//DP_ENT_ALPHA
//idea: Nehahra
-//darkplaces implementation: LordHavoc
+//darkplaces implementation: LadyHavoc
//fields:
.float alpha;
//description:
//controls opacity of the entity, 0.0 is forced to be 1.0 (otherwise everything would be invisible), use -1 if you want to make something invisible, 1.0 is solid (like normal).
//DP_ENT_COLORMOD
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//field definition:
.vector colormod;
//description:
//controls color of the entity, '0 0 0', is forced to be '1 1 1' (otherwise everything would be black), used for tinting objects, for instance using '1 0.6 0.4' on an ogre would give you an orange ogre (order is red green blue), note the colors can go up to '8 8 8' (8x as bright as normal).
//DP_ENT_CUSTOMCOLORMAP
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//description:
//if .colormap is set to 1024 + pants + shirt * 16, those colors will be used for colormapping the entity, rather than looking up a colormap by player number.
/*
//NOTE: no longer supported by darkplaces because all entities are delta compressed now
//DP_ENT_DELTACOMPRESS // no longer supported
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//effects bit:
float EF_DELTA = 8388608;
//description:
*/
//DP_ENT_EXTERIORMODELTOCLIENT
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//fields:
.entity exteriormodeltoclient;
//description:
//the entity is visible to all clients with one exception: if the specified client is using first person view (not using chase_active) the entity will not be shown. Also if tag attachments are supported any entities attached to the player entity will not be drawn in first person.
//DP_ENT_GLOW
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//field definitions:
.float glow_color;
.float glow_size;
//customizable glowing light effect on the entity, glow_color is a paletted (8bit) color in the range 0-255 (note: 0 and 254 are white), glow_size is 0 or higher (up to the engine what limit to cap it to, darkplaces imposes a 1020 limit), if glow_trail is true it will leave a trail of particles of the same color as the light.
//DP_ENT_GLOWMOD
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//field definition:
.vector glowmod;
//description:
//controls color of the entity's glow texture (fullbrights), '0 0 0', is forced to be '1 1 1' (otherwise everything would be black), used for tinting objects, see colormod (same color restrictions apply).
//DP_ENT_LOWPRECISION
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//effects bit:
float EF_LOWPRECISION = 4194304;
//description:
//uses low quality origin coordinates, reducing network traffic compared to the default high precision, intended for numerous objects (projectiles/gibs/bullet holes/etc).
//DP_ENT_SCALE
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//field definitions:
.float scale;
//description:
//controls rendering scale of the object, 0 is forced to be 1, darkplaces uses 1/16th accuracy and a limit of 15.9375, can be used to make an object larger or smaller.
//DP_ENT_TRAILEFFECTNUM
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//field definitions:
.float traileffectnum;
//description:
//this will do both the dlight and particle trail as described in the effect, basically equivalent to trailparticles() in CSQC but performed on a server entity.
//DP_ENT_VIEWMODEL
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//field definitions:
.entity viewmodelforclient;
//description:
//this is a very special capability, attachs the entity to the view of the client specified, origin and angles become relative to the view of that client, all effects can be used (multiple skins on a weapon model etc)... the entity is not visible to any other client.
//DP_GFX_EXTERNALTEXTURES
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//description:
//loads external textures found in various directories (tenebrae compatible)...
/*
//DP_GFX_EXTERNALTEXTURES_PERMAPTEXTURES
//idea: Fuh?
-//darkplaces implementation: LordHavoc
+//darkplaces implementation: LadyHavoc
//description:
//Q1BSP and HLBSP map loading loads external textures found in textures/<mapname>/ as well as textures/.
//Where mapname is the bsp filename minus the extension (typically .bsp) and minus maps/ if it is in maps/ (any other path is not removed)
//progs/something/blah.bsp uses textures in the directory textures/progs/something/blah/ and falls back to textures/
//DP_GFX_FOG
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//worldspawn fields:
//"fog" (parameters: "density red green blue", example: "0.1 0.3 0.3 0.3")
//description:
//DP_GFX_QUAKE3MODELTAGS
//idea: id Software
-//darkplaces implementation: LordHavoc
+//darkplaces implementation: LadyHavoc
//field definitions:
.entity tag_entity; // entity this is attached to (call setattachment to set this)
.float tag_index; // which tag on that entity (0 is relative to the entity, > 0 is an index into the tags on the model if it has any) (call setattachment to set this)
//note 5: if an entity is attached to the player entity it will not be drawn in first person.
//DP_GFX_SKINFILES
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//description:
//alias models (mdl, md2, md3) can have .skin files to replace conventional texture naming, these have a naming format such as:
//progs/test.md3_0.skin
//other commands might be added someday but it is not expected.
//DP_GFX_SKYBOX
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//worldspawn fields:
//"sky" (parameters: "basename", example: "mtnsun_" would load "mtnsun_up.tga" and "mtnsun_rt.tga" and similar names, note: "sky" is also used the same way by Quake2)
//description:
// note: beware that str2chr() could return value bigger than 255 once utf8 is enabled
//DP_HALFLIFE_MAP
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//description:
//simply indicates that the engine supports HalfLife maps (BSP version 30, NOT the QER RGBA ones which are also version 30).
//DP_HALFLIFE_MAP_CVAR
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//cvars:
//halflifebsp 0/1
//description:
//engine sets this cvar when loading a map to indicate if it is halflife format or not.
//DP_HALFLIFE_SPRITE
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//description:
//simply indicates that the engine supports HalfLife sprites.
//DP_INPUTBUTTONS
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//field definitions:
.float button3;
.float button4;
// that other engines (which do not support this extension) could connect to a game and misunderstand this kind of lightstyle syntax
//DP_LITSPRITES
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//description:
//indicates this engine supports lighting on sprites, any sprite with ! in its filename (both on disk and in the qc) will be lit rather than having forced EF_FULLBRIGHT (EF_FULLBRIGHT on the entity can still force these sprites to not be lit).
//DP_LITSUPPORT
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//description:
//indicates this engine loads .lit files for any quake1 format .bsp files it loads to enhance maps with colored lighting.
//implementation description: these files begin with the header QLIT followed by version number 1 (as little endian 32bit), the rest of the file is a replacement lightmaps lump, except being 3x as large as the lightmaps lump of the map it matches up with (and yes the between-lightmap padding is expanded 3x to keep this consistent), so the lightmap offset in each surface is simply multiplied by 3 during loading to properly index the lit data, and the lit file is loaded instead of the lightmap lump, other renderer changes are needed to display these of course... see the litsupport.zip sample code (almost a tutorial) at http://icculus.org/twilight/darkplaces for more information.
//DP_MONSTERWALK
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//description:
//MOVETYPE_WALK is permitted on non-clients, so bots can move smoothly, run off ledges, etc, just like a real player.
//networked. useful for shared CSQC entities.
//DP_MOVETYPEFOLLOW
-//idea: id Software, LordHavoc (redesigned)
-//darkplaces implementation: LordHavoc
+//idea: id Software, LadyHavoc (redesigned)
+//darkplaces implementation: LadyHavoc
//movetype definitions:
float MOVETYPE_FOLLOW = 12;
//description:
//DP_QC_ASINACOSATANATAN2TAN
//idea: Urre
-//darkplaces implementation: LordHavoc
+//darkplaces implementation: LadyHavoc
//constant definitions:
float DEG2RAD = 0.0174532925199432957692369076848861271344287188854172545609719144;
float RAD2DEG = 57.2957795130823208767981548141051703324054724665643215491602438612;
//equivalent to changeyaw, ent is normally self. (this was a Q2 builtin)
//DP_QC_COPYENTITY
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//builtin definitions:
void(entity from, entity to) copyentity = #400;
//description:
float(float caseinsensitive, string s, ...) crc16 = #494;
//DP_QC_CVAR_DEFSTRING
-//idea: id Software (Doom3), LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: id Software (Doom3), LadyHavoc
+//darkplaces implementation: LadyHavoc
//builtin definitions:
string(string s) cvar_defstring = #482;
//description:
//DP_QC_CVAR_STRING
//idea: VorteX
-//DarkPlaces implementation: VorteX, LordHavoc
+//DarkPlaces implementation: VorteX, LadyHavoc
//builtin definitions:
string(string s) cvar_string = #448;
//description:
//DP_QC_EDICT_NUM
//idea: 515
-//DarkPlaces implementation: LordHavoc
+//DarkPlaces implementation: LadyHavoc
//builtin definitions:
entity(float entnum) edict_num = #459;
float(entity ent) wasfreed = #353; // same as in EXT_CSQC extension
//listening port.
//DP_QC_FINDCHAIN
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//builtin definitions:
entity(.string fld, string match) findchain = #402;
//description:
//DP_QC_FINDCHAINFLAGS
//idea: Sajt
-//darkplaces implementation: LordHavoc
+//darkplaces implementation: LadyHavoc
//builtin definitions:
entity(.float fld, float match) findchainflags = #450;
//description:
//similar to findflags() but returns a chain of entities like findradius.
//DP_QC_FINDCHAINFLOAT
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//builtin definitions:
entity(.entity fld, entity match) findchainentity = #403;
entity(.float fld, float match) findchainfloat = #403;
//DP_QC_FINDFLAGS
//idea: Sajt
-//darkplaces implementation: LordHavoc
+//darkplaces implementation: LadyHavoc
//builtin definitions:
entity(entity start, .float fld, float match) findflags = #449;
//description:
//finds an entity with the specified flag set in the field, similar to find()
//DP_QC_FINDFLOAT
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//builtin definitions:
entity(entity start, .entity fld, entity match) findentity = #98;
entity(entity start, .float fld, float match) findfloat = #98;
//search_getfilename returns a filename from the search.
//DP_QC_GETLIGHT
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//builtin definitions:
vector(vector org) getlight = #92;
//description:
//returns the lighting at the requested location (in color), 0-255 range (can exceed 255).
//DP_QC_GETSURFACE
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//builtin definitions:
float(entity e, float s) getsurfacenumpoints = #434;
vector(entity e, float s, float n) getsurfacepoint = #435;
//function to query triangles of a surface
//DP_QC_GETTAGINFO
-//idea: VorteX, LordHavoc
+//idea: VorteX, LadyHavoc
//DarkPlaces implementation: VorteX
//builtin definitions:
float(entity ent, string tagname) gettagindex = #451;
//logarithm
//DP_QC_MINMAXBOUND
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//builtin definitions:
float(float a, float b, ...) min = #94;
float(float a, float b, float c) min3 = #94;
//bound clamps the value to the range and returns it.
//DP_QC_MULTIPLETEMPSTRINGS
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//description:
//this extension makes all builtins returning tempstrings (ftos for example)
//cycle through a pool of multiple tempstrings (at least 16), allowing
float(entity num) num_for_edict = #512;
//DP_QC_RANDOMVEC
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//builtin definitions:
vector() randomvec = #91;
//description:
//returns a vector of length < 1, much quicker version of this QC: do {v_x = random()*2-1;v_y = random()*2-1;v_z = random()*2-1;} while(vlen(v) > 1)
//DP_QC_SINCOSSQRTPOW
-//idea: id Software, LordHavoc
-//darkplaces implementation: id Software, LordHavoc
+//idea: id Software, LadyHavoc
+//darkplaces implementation: id Software, LadyHavoc
//builtin definitions:
float(float val) sin = #60;
float(float val) cos = #61;
// the + flag.
//DP_QC_STRFTIME
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//builtin definitions:
string(float uselocaltime, string format, ...) strftime = #478;
//description:
//DP_QC_STRING_CASE_FUNCTIONS
//idea: Dresk
-//darkplaces implementation: LordHavoc / Dresk
+//darkplaces implementation: LadyHavoc / Dresk
//builtin definitions:
string(string s) strtolower = #480; // returns the passed in string in pure lowercase form
string(string s) strtoupper = #481; // returns the passed in string in pure uppercase form
//provides simple string uppercase and lowercase functions
//DP_QC_TOKENIZEBYSEPARATOR
-//idea: Electro, SavageX, LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: Electro, SavageX, LadyHavoc
+//darkplaces implementation: LadyHavoc
//builtin definitions:
float(string s, string separator1, ...) tokenizebyseparator = #479;
//description:
//simulates movement of the entity as if it is MOVETYPE_TOSS and starting with it's current state (location, velocity, etc), returns relevant trace_ variables (trace_fraction is always 0, all other values are supported - trace_ent, trace_endpos, trace_plane_normal), does not actually alter the entity.
//DP_QC_TRACE_MOVETYPE_HITMODEL
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//constant definitions:
float MOVE_HITMODEL = 4;
//description:
//allows traces to hit alias models (not sprites!) instead of entity boxes, use as the nomonsters parameter to trace functions, note that you can hit invisible model entities (alpha < 0 or EF_NODRAW or model "", it only checks modelindex)
//DP_QC_TRACE_MOVETYPE_WORLDONLY
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//constant definitions:
float MOVE_WORLDONLY = 3;
//description:
//DP_QC_UNLIMITEDTEMPSTRINGS
//idea: divVerent
-//darkplaces implementation: LordHavoc
+//darkplaces implementation: LadyHavoc
//description:
//this extension alters Quake behavior such that instead of reusing a single
//tempstring (or multiple) there are an unlimited number of tempstrings, which
//this is basically a poor man's garbage collection system for strings.
//DP_QC_VECTOANGLES_WITH_ROLL
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//builtin definitions:
vector(vector forward, vector up) vectoangles2 = #51; // same number as vectoangles
//description:
//note: just like normal vectoangles you need to negate the pitch of the returned angles if you want to feed them to makevectors or assign to self.v_angle
//DP_QC_VECTORVECTORS
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//builtin definitions:
void(vector dir) vectorvectors = #432;
//description:
float(string url, float id, string content_type, string delim, float buf) uri_postbuf = #513;
//DP_SKELETONOBJECTS
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//description:
//this extension indicates that FTE_CSQC_SKELETONOBJECTS functionality is available in server QC (as well as CSQC).
//DP_QUAKE2_MODEL
//idea: quake community
-//darkplaces implementation: LordHavoc
+//darkplaces implementation: LadyHavoc
//description:
//shows that the engine supports Quake2 .md2 files.
//DP_QUAKE2_SPRITE
-//idea: LordHavoc
+//idea: LadyHavoc
//darkplaces implementation: Elric
//description:
//shows that the engine supports Quake2 .sp2 files.
//DP_QUAKE3_MAP
//idea: quake community
-//darkplaces implementation: LordHavoc
+//darkplaces implementation: LadyHavoc
//description:
//shows that the engine supports Quake3 .bsp files.
//DP_QUAKE3_MODEL
//idea: quake community
-//darkplaces implementation: LordHavoc
+//darkplaces implementation: LadyHavoc
//description:
//shows that the engine supports Quake3 .md3 files.
//DP_REGISTERCVAR
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//builtin definitions:
float(string name, string value) registercvar = #93;
//description:
//NOTE: DP_CON_SET is much better.
//DP_SND_DIRECTIONLESSATTNNONE
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//description:
//make sounds with ATTN_NONE have no spatialization (enabling easy use as music sources).
//the engine supports loading Ogg Vorbis sound files. Use either the .ogg filename directly, or a .wav of the same name (will try to load the .wav first and then .ogg).
//DP_SND_STEREOWAV
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//description:
//the engine supports stereo WAV files. (useful with DP_SND_DIRECTIONLESSATTNNONE for music)
// - subtitles
//DP_VIDEO_DPV
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//console commands:
// playvideo <videoname> - start playing video
// stopvideo - stops current video
// 18 7 "I'll hack you from crotch to gizzard and feed what's left of you to your brides..."
//DP_SOLIDCORPSE
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//solid definitions:
float SOLID_CORPSE = 5;
//description:
//the entity will not collide with SOLID_CORPSE and SOLID_SLIDEBOX entities (and likewise they will not collide with it), this is useful if you want dead bodies that are shootable but do not obstruct movement by players and monsters, note that if you traceline with a SOLID_SLIDEBOX entity as the ignoreent, it will ignore SOLID_CORPSE entities, this is desirable for visibility and movement traces, but not for bullets, for the traceline to hit SOLID_CORPSE you must temporarily force the player (or whatever) to SOLID_BBOX and then restore to SOLID_SLIDEBOX after the traceline.
//DP_SPRITE32
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//description:
//the engine supports .spr32 sprites.
//DP_SV_BOTCLIENT
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//constants:
float CLIENTTYPE_DISCONNECTED = 0;
float CLIENTTYPE_REAL = 1;
//allows qc to customize MOVETYPE_BOUNCE a bit
//DP_SV_CLIENTCAMERA
-//idea: LordHavoc, others
+//idea: LadyHavoc, others
//darkplaces implementation: Black
//field definitions:
.entity clientcamera; // override camera entity
//allows another entity to be the camera for a client, for example a remote camera, this is similar to sending svc_setview manually except that it also changes the network culling appropriately.
//DP_SV_CLIENTCOLORS
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//field definitions:
.float clientcolors; // colors of the client (format: pants + shirt * 16)
//description:
//allows qc to read and modify the client colors associated with a client entity (not particularly useful on other entities), and automatically sends out any appropriate network updates if changed
//DP_SV_CLIENTNAME
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//description:
//allows qc to modify the client's .netname, and automatically sends out any appropriate network updates if changed
//DP_SV_CUSTOMIZEENTITYFORCLIENT
-//idea: LordHavoc
-//darkplaces implementation: [515] and LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: [515] and LadyHavoc
//field definitions:
.float() customizeentityforclient; // self = this entity, other = client entity
//description:
//implementation notes:
//entity customization is done before per-client culling (visibility for instance) because the entity may be doing setorigin to display itself in different locations on different clients, may be altering its .modelindex, .effects and other fields important to culling, so customized entities increase cpu usage (non-customized entities can use all the early culling they want however, as they are not changing on a per client basis).
+//DP_SV_DISABLECLIENTPREDICTION
+//idea: LadyHavoc, Mario
+//darkplaces implementation: LadyHavoc, Mario
+//field definitions:
+.float disableclientprediction;
+//description:
+//By default, player entities are enabled for prediction by the engine if the
+//engine assumes the client can sensibly predict them. As the NQ and DarkPlaces
+//protocol does not network movetype, this in particular allows for client
+//prediction only if movetype == MOVETYPE_WALK.
+//Setting this field to 1 disables prediction in any case - this is useful when
+//the client cannot sensibly predict the server's idea of how the player moves
+//(common in case of pure serverside grappling hook or jetpack
+//implementations).
+//Setting this field to -1 forces prediction even if the server assumes the
+//client cannot predict the current movetype of a player entity (obviously,
+//this then requires matching client-side prediction code in CSQC, as the
+//engine's own client prediction will sure not handle these cases right due to
+//not knowing the serverside value of movetype). This is allowed in combination
+//with the following movetypes:
+// MOVETYPE_NONE (useful to have full QC control over movement)
+// MOVETYPE_WALK (redundant but harmless)
+// MOVETYPE_STEP
+// MOVETYPE_FLY (useful for spectators)
+// MOVETYPE_TOSS
+// MOVETYPE_NOCLIP (useful for spectators)
+// MOVETYPE_FLYMISSILE
+// MOVETYPE_BOUNCE
+// MOVETYPE_BOUNCEMISSILE
+// MOVETYPE_FLY_WORLDONLY (useful for spectators)
+
//DP_SV_DISCARDABLEDEMO
//idea: parasti
//darkplaces implementation: parasti
// discarding demos is enabled (the cvar sv_autodemo_perclient_discardable is set)
//DP_SV_DRAWONLYTOCLIENT
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//field definitions:
.entity drawonlytoclient;
//description:
//DP_SV_DROPCLIENT
//idea: FrikaC
-//darkplaces implementation: LordHavoc
+//darkplaces implementation: LadyHavoc
//builtin definitions:
void(entity clent) dropclient = #453;
//description:
//causes the server to immediately drop the client, more reliable than stuffcmd(clent, "disconnect\n"); which could be intentionally ignored by the client engine
//DP_SV_EFFECT
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//builtin definitions:
void(vector org, string modelname, float startframe, float endframe, float framerate) effect = #404;
//SVC definitions:
// SV_OnEntityPostSpawnFunction is called ONLY after its spawn function or SV_OnEntityNoSpawnFunction was called, and skipped if the entity got removed by either.
//DP_SV_MODELFLAGS_AS_EFFECTS
-//idea: LordHavoc, Dresk
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc, Dresk
+//darkplaces implementation: LadyHavoc
//field definitions:
.float modelflags;
//constant definitions:
// provides the netaddress of the associated entity (ie. 127.0.0.1) and "null/botclient" if the netconnection of the entity is invalid
//DP_SV_NODRAWTOCLIENT
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//field definitions:
.entity nodrawtoclient;
//description:
//the entity is not visible to the specified client.
//DP_SV_PING
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//field definitions:
.float ping;
//description:
//continuously updated field indicating client's ping (based on average of last 16 packet time differences).
//DP_SV_PING_PACKETLOSS
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//field definitions:
.float ping_packetloss;
.float ping_movementloss;
//DP_SV_POINTPARTICLES
//idea: Spike
-//darkplaces implementation: LordHavoc
+//darkplaces implementation: LadyHavoc
//function definitions:
float(string effectname) particleeffectnum = #335; // same as in CSQC
void(entity ent, float effectnum, vector start, vector end) trailparticles = #336; // same as in CSQC
//warning: server must have same order of effects in effectinfo.txt as client does or the numbers would not match up, except for standard quake effects which are always the same numbers.
//DP_SV_PUNCHVECTOR
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//field definitions:
.vector punchvector;
//description:
//offsets client view in worldspace, similar to view_ofs but all 3 components are used and are sent with at least 8 bits of fraction, this allows the view to be kicked around by damage or hard landings or whatever else, note that unlike punchangle this is not faded over time, it is up to the mod to fade it (see also DP_SV_PLAYERPHYSICS).
//DP_SV_PLAYERPHYSICS
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//field definitions:
.vector movement;
//cvar definitions:
//.movement vector contains the movement input from the player, allowing QC to do as it wishs with the input, and SV_PlayerPhysics will completely replace the player physics if present (works for all MOVETYPE's), see darkplaces mod source for example of this function (in playermovement.qc, adds HalfLife ladders support, as well as acceleration/deceleration while airborn (rather than the quake sudden-stop while airborn), and simplifies the physics a bit)
//DP_PHYSICS_ODE
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//globals:
//new movetypes:
const float MOVETYPE_PHYSICS = 32; // need to be set before any physics_* builtins applied
// for a force:
// force vector to apply
//field definitions:
-//DP_SV_DISABLECLIENTPREDICTION
-//idea: LordHavoc, Mario
-//darkplaces implementation: LordHavoc, Mario
-//field definitions:
-.float disableclientprediction;
-//description:
-//By default, player entities are enabled for prediction by the engine if the
-//engine assumes the client can sensibly predict them. As the NQ and DarkPlaces
-//protocol does not network movetype, this in particular allows for client
-//prediction only if movetype == MOVETYPE_WALK.
-//Setting this field to 1 disables prediction in any case - this is useful when
-//the client cannot sensibly predict the server's idea of how the player moves
-//(common in case of pure serverside grappling hook or jetpack
-//implementations).
-//Setting this field to -1 forces prediction even if the server assumes the
-//client cannot predict the current movetype of a player entity (obviously,
-//this then requires matching client-side prediction code in CSQC, as the
-//engine's own client prediction will sure not handle these cases right due to
-//not knowing the serverside value of movetype). This is allowed in combination
-//with the following movetypes:
-// MOVETYPE_NONE (useful to have full QC control over movement)
-// MOVETYPE_WALK (redundant but harmless)
-// MOVETYPE_STEP
-// MOVETYPE_FLY (useful for spectators)
-// MOVETYPE_TOSS
-// MOVETYPE_NOCLIP (useful for spectators)
-// MOVETYPE_FLYMISSILE
-// MOVETYPE_BOUNCE
-// MOVETYPE_BOUNCEMISSILE
-// MOVETYPE_FLY_WORLDONLY (useful for spectators)
-
.float geomtype; // see GEOMTYPE_*, a more correct way to set collision shape, allows to set SOLID_CORPSE and trimesh collisions
.float maxcontacts; // maximum number of contacts to make for this object, lesser = faster (but setting it too low will could make object pass though walls), default is 16, maximum is 32
.float mass; // ODE mass, standart value is 1
//DP_SV_PRINT
//idea: id Software (QuakeWorld Server)
-//darkplaces implementation: Black, LordHavoc
+//darkplaces implementation: Black, LadyHavoc
void(string s, ...) print = #339; // same number as in EXT_CSQC
//description:
//this is identical to dprint except that it always prints regardless of the developer cvar.
//DP_SV_PRECACHEANYTIME
//idea: id Software (Quake2)
-//darkplaces implementation: LordHavoc
+//darkplaces implementation: LadyHavoc
//description:
//this extension allows precache_model and precache_sound (and any variants) to be used during the game (with automatic messages to clients to precache the new model/sound indices), also setmodel/sound/ambientsound can be called without precaching first (they will cause an automatic precache).
//DP_SV_ROTATINGBMODEL
//idea: id Software
-//darkplaces implementation: LordHavoc
+//darkplaces implementation: LadyHavoc
//description:
//this extension merely indicates that MOVETYPE_PUSH supports avelocity, allowing rotating brush models to be created, they rotate around their origin (needs rotation supporting qbsp/light utilities because id ones expected bmodel entity origins to be '0 0 0', recommend setting "origin" key in the entity fields in the map before compiling, there may be other methods depending on your qbsp, most are more complicated however).
//tip: level designers can create a func_wall with an origin, and avelocity (for example "avelocity" "0 90 0"), and "nextthink" "99999999" to make a rotating bmodel without any qc modifications, such entities will be solid in stock quake but will not rotate)
//DP_SV_SETCOLOR
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//builtin definitions:
void(entity ent, float colors) setcolor = #401;
//engine called QC functions (optional):
//the color format is pants + shirt * 16 (0-255 potentially)
//DP_SV_SLOWMO
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//cvars:
//"slowmo" (0+, default 1)
//description:
void(float to, string s) WriteUnterminatedString = #456;
//description:
//like WriteString, but does not write a terminating 0 after the string. This means you can include things like a player's netname in the middle of a string sent over the network. Just be sure to end it up with either a call to WriteString (which includes the trailing 0) or WriteByte(0) to terminate it yourself.
-//A historical note: this extension was suggested by FrikaC years ago, more recently Shadowalker has been badmouthing LordHavoc and Spike for stealing 'his' extension writestring2 which does exactly the same thing but uses a different builtin number and name and extension string, this argument hinges on the idea that it was his idea in the first place, which is incorrect as FrikaC first suggested it and used a rough equivalent of it in his FrikBot mod years ago involving WriteByte calls on each character.
+//A historical note: this extension was suggested by FrikaC years ago, more recently Shadowalker has been badmouthing LadyHavoc and Spike for stealing 'his' extension writestring2 which does exactly the same thing but uses a different builtin number and name and extension string, this argument hinges on the idea that it was his idea in the first place, which is incorrect as FrikaC first suggested it and used a rough equivalent of it in his FrikBot mod years ago involving WriteByte calls on each character.
//DP_TE_BLOOD
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//builtin definitions:
void(vector org, vector velocity, float howmany) te_blood = #405;
//temp entity definitions:
//creates a blood effect.
//DP_TE_BLOODSHOWER
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//builtin definitions:
void(vector mincorner, vector maxcorner, float explosionspeed, float howmany) te_bloodshower = #406;
//temp entity definitions:
//creates an exploding shower of blood, for making gibbings more convincing.
//DP_TE_CUSTOMFLASH
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//builtin definitions:
void(vector org, float radius, float lifetime, vector color) te_customflash = #417;
//temp entity definitions:
//creates a customized light flash.
//DP_TE_EXPLOSIONRGB
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//builtin definitions:
void(vector org, vector color) te_explosionrgb = #407;
//temp entity definitions:
//creates a colored explosion effect.
//DP_TE_FLAMEJET
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//builtin definitions:
void(vector org, vector vel, float howmany) te_flamejet = #457;
//temp entity definitions:
//creates a single puff of flame particles. (not very useful really)
//DP_TE_PARTICLECUBE
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//builtin definitions:
void(vector mincorner, vector maxcorner, vector vel, float howmany, float color, float gravityflag, float randomveljitter) te_particlecube = #408;
//temp entity definitions:
//creates a cloud of particles, useful for forcefields but quite customizable.
//DP_TE_PARTICLERAIN
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//builtin definitions:
void(vector mincorner, vector maxcorner, vector vel, float howmany, float color) te_particlerain = #409;
//temp entity definitions:
//creates a shower of rain, the rain will appear either at the top (if falling down) or bottom (if falling up) of the cube.
//DP_TE_PARTICLESNOW
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//builtin definitions:
void(vector mincorner, vector maxcorner, vector vel, float howmany, float color) te_particlesnow = #410;
//temp entity definitions:
//creates a shower of snow, the snow will appear either at the top (if falling down) or bottom (if falling up) of the cube, low velocities are advisable for convincing snow.
//DP_TE_PLASMABURN
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//builtin definitions:
void(vector org) te_plasmaburn = #433;
//temp entity definitions:
//creates a small light flash (radius 200, time 0.2) and marks the walls.
//DP_TE_QUADEFFECTS1
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//builtin definitions:
void(vector org) te_gunshotquad = #412;
void(vector org) te_spikequad = #413;
//all of these just take a location, and are equivalent in function (but not appearance :) to the original TE_GUNSHOT, etc.
//DP_TE_SMALLFLASH
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//builtin definitions:
void(vector org) te_smallflash = #416;
//temp entity definitions:
//creates a small light flash (radius 200, time 0.2).
//DP_TE_SPARK
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//builtin definitions:
void(vector org, vector vel, float howmany) te_spark = #411;
//temp entity definitions:
//creates a shower of sparks and a smoke puff.
//DP_TE_STANDARDEFFECTBUILTINS
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//builtin definitions:
void(vector org) te_gunshot = #418;
void(vector org) te_spike = #419;
//to make life easier on mod coders.
//DP_TRACE_HITCONTENTSMASK_SURFACEINFO
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//globals:
.float dphitcontentsmask; // if non-zero on the entity passed to traceline/tracebox/tracetoss this will override the normal collidable contents rules and instead hit these contents values (for example AI can use tracelines that hit DONOTENTER if it wants to, by simply changing this field on the entity passed to traceline), this affects normal movement as well as trace calls
float trace_dpstartcontents; // DPCONTENTS_ value at start position of trace
//little information in the trace_ variables as it was not moving at the time)
//DP_VIEWZOOM
-//idea: LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: LadyHavoc
+//darkplaces implementation: LadyHavoc
//field definitions:
.float viewzoom;
//description:
//FRIK_FILE
//idea: FrikaC
-//darkplaces implementation: LordHavoc
+//darkplaces implementation: LadyHavoc
//builtin definitions:
float(string s) stof = #81; // get numerical value from a string
float(string filename, float mode) fopen = #110; // opens a file inside quake/gamedir/data/ (mode is FILE_READ, FILE_APPEND, or FILE_WRITE), returns fhandle >= 0 if successful, or fhandle < 0 if unable to open file for any reason
//NOTE: substring is upgraded by FTE_STRINGS extension with negative start/length handling identical to php 5.2.0
//FTE_CSQC_SKELETONOBJECTS
-//idea: Spike, LordHavoc
-//darkplaces implementation: LordHavoc
+//idea: Spike, LadyHavoc
+//darkplaces implementation: LadyHavoc
//builtin definitions:
// all skeleton numbers are 1-based (0 being no skeleton)
// all bone numbers are 1-based (0 being invalid)
//KRIMZON_SV_PARSECLIENTCOMMAND
//idea: KrimZon
-//darkplaces implementation: KrimZon, LordHavoc
+//darkplaces implementation: KrimZon, LadyHavoc
//engine-called QC prototypes:
//void(string s) SV_ParseClientCommand;
//builtin definitions:
//NEH_CMD_PLAY2
//idea: Nehahra
-//darkplaces implementation: LordHavoc
+//darkplaces implementation: LadyHavoc
//description:
//shows that the engine supports the "play2" console command (plays a sound without spatialization).
//NEH_RESTOREGAME
//idea: Nehahra
-//darkplaces implementation: LordHavoc
+//darkplaces implementation: LadyHavoc
//engine-called QC prototypes:
//void() RestoreGame;
//description:
//NXQ_GFX_LETTERBOX
//idea: nxQuake
-//darkplaces implementation: LordHavoc
+//darkplaces implementation: LadyHavoc
//description:
//shows that the engine supports the "r_letterbox" console variable, set to values in the range 0-100 this restricts the view vertically (and turns off sbar and crosshair), value is a 0-100 percentage of how much to constrict the view, <=0 = normal view height, 25 = 75% of normal view height, 50 = 50%, 75 = 25%, >=100 = no view
//PRYDON_CLIENTCURSOR
//idea: FrikaC
-//darkplaces implementation: LordHavoc
+//darkplaces implementation: LadyHavoc
//effects bit:
float EF_SELECTABLE = 16384; // allows cursor to highlight entity (brighten)
//field definitions:
//TENEBRAE_GFX_DLIGHTS
//idea: Tenebrae
-//darkplaces implementation: LordHavoc
+//darkplaces implementation: LadyHavoc
//fields:
.float light_lev; // radius (does not affect brightness), typical value 350
.vector color; // color (does not affect radius), typical value '1 1 1' (bright white), can be up to '255 255 255' (nuclear blast)
//TW_SV_STEPCONTROL
//idea: Transfusion
-//darkplaces implementation: LordHavoc
+//darkplaces implementation: LadyHavoc
//cvars:
//sv_jumpstep (0/1, default 1)
//sv_stepheight (default 18)
//DP_QC_STRINGBUFFERS
//idea: ??
-//darkplaces implementation: LordHavoc
+//darkplaces implementation: LadyHavoc
//functions to manage string buffer objects - that is, arbitrary length string arrays that are handled by the engine
float() buf_create = #460;
void(float bufhandle) buf_del = #461;
float MOVETYPE_USER_LAST = 191;
//description:
//user defined movetypes can be added between the start and end points, without producing unknown movetype warnings
+
+//DP_RM_CLIPGROUP
+//idea: Akari
+//darkplaces implementation: Akari
+//field definitions:
+.float clipgroup;
+//description:
+//If two entities have this field set to the same non-zero integer value, they won't collide with each other.
+
+//idea: eukara
+//darkplaces implementation: Cloudwalk
+// Do NOT use in production yet.
+string __fullspawndata;
+//description:
+// http://icculus.org/finger/marco?date=2019-01-25&time=05-38-02
+
+//DP_QC_FS_SEARCH_PACKFILE
+//idea: Mario
+//darkplaces implementation: Mario
+//builtin definitions:
+float(string pattern, float caseinsensitive, float quiet, string packfile) search_packfile_begin = #444;
+//description:
+//extension to search_begin (DP_QC_FS_SEARCH), performs a filename search with the specified pattern (for example "maps/*.bsp") and stores the results in a search slot (minimum of 128 supported by any engine with this extension), the other functions take this returned search slot number, be sure to search_free when done (they are also freed on progs reload).
+//only searches for files within the specified packfile, which is expected to match the results of whichpack().
float K_MOUSE14 = 527;
float K_MOUSE15 = 528;
float K_MOUSE16 = 529;
+
float drawcolorcodedstring(vector position, string text, vector scale, float alpha, float flag) = #467;
vector drawcolorcodedstring2(vector position, string text, vector scale, vector rgb, float alpha, float flag) = #467;
-
+
float drawpic(vector position, string pic, vector size, vector rgb, float alpha, float flag) = #456;
float drawfill(vector position, vector size, vector rgb, float alpha, float flag) = #457;
//DP_QC_STRINGBUFFERS
//idea: ??
-//darkplaces implementation: LordHavoc
+//darkplaces implementation: LadyHavoc
//functions to manage string buffer objects - that is, arbitrary length string arrays that are handled by the engine
float() buf_create = #440;
void(float bufhandle) buf_del = #441;
//DP_QC_STRING_CASE_FUNCTIONS
//idea: Dresk
-//darkplaces implementation: LordHavoc / Dresk
+//darkplaces implementation: LadyHavoc / Dresk
//builtin definitions:
string(string s) strtolower = #480; // returns the passed in string in pure lowercase form
string(string s) strtoupper = #481; // returns the passed in string in pure uppercase form
//function definitions:
void coverage() = #642; // Reports a coverage event. The engine counts for each of the calls to this builtin whether it has been called.
+//DP_QC_FS_SEARCH_PACKFILE
+//idea: Mario
+//darkplaces implementation: Mario
+//builtin definitions:
+float(string pattern, float caseinsensitive, float quiet, string packfile) search_packfile_begin = #444;
+//description:
+//extension to search_begin (DP_QC_FS_SEARCH), performs a filename search with the specified pattern (for example "maps/*.bsp") and stores the results in a search slot (minimum of 128 supported by any engine with this extension), the other functions take this returned search slot number, be sure to search_free when done (they are also freed on progs reload).
+//only searches for files within the specified packfile, which is expected to match the results of whichpack().
+
// assorted undocumented extensions
string(string, float) netaddress_resolve = #625;
string(string search, string replace, string subject) strreplace = #484;
+string(string search, string replace, string subject) strireplace = #485;
string(float uselocaltime, string format, ...) strftime = #478;
float(string s) tokenize_console = #514;
float(float i) argv_start_index = #515;
// #5 was removed
void() break_to_debugger = #6;
float() random = #7; // returns 0 - 1
-void(entity e, float chan, string samp, float vol, float atten) sound = #8;
+void(entity e, float chan, string samp, float volume, ...) sound = #8;
vector(vector v) normalize = #9;
void(string e, ...) error = #10;
void(string e, ...) objerror = #11;
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));
float smoothtime = bound(0, time - smooth_prevtime, 0.1);
smooth_prevtime = max(smooth_prevtime, drawtime); // drawtime is the previous frame's time at this point
- if(this.csqcmodel_teleported || !(this.pmove_flags & PMF_ONGROUND) || autocvar_cl_stairsmoothspeed <= 0)
+ if(this.csqcmodel_teleported || !(this.pmove_flags & PMF_ONGROUND) || autocvar_cl_stairsmoothspeed <= 0 || this.ground_networkentity)
stairsmoothz = v.z;
else
{
//const int PMF_DUCKED = 4;
//const int PMF_ONGROUND = 8;
-const int FL_DUCKED = BIT(19);
-
void CSQCPlayer_SetCamera();
float CSQCPlayer_PreUpdate(entity this);
float CSQCPlayer_PostUpdate(entity this);
#include "i18n.qh"
#include "vector.qh"
- float vid_conwidth;
+ noref float vid_conwidth;
+ noref float vid_conheight;
void Draw_CylindricLine(vector from, vector to, float thickness, string texture, float aspect, float shift, vector rgb, float theAlpha, float drawflag, vector vieworg)
{
#define ReadFloat() ReadCoord()
#define ReadVector() vec3(ReadFloat(), ReadFloat(), ReadFloat())
#define ReadVector2D() vec2(ReadFloat(), ReadFloat())
+ #define ReadAngleVector() vec3(ReadAngle(), ReadAngle(), ReadAngle())
+ #define ReadAngleVector2D() vec2(ReadAngle(), ReadAngle())
int Readbits(int num)
{
#define WriteFloat(to, f) WriteCoord(to, f)
#define WriteVector(to, v) MACRO_BEGIN WriteFloat(to, v.x); WriteFloat(to, v.y); WriteFloat(to, v.z); MACRO_END
#define WriteVector2D(to, v) MACRO_BEGIN WriteFloat(to, v.x); WriteFloat(to, v.y); MACRO_END
+ #define WriteAngleVector(to, v) MACRO_BEGIN WriteAngle(to, v.x); WriteAngle(to, v.y); WriteAngle(to, v.z); MACRO_END
+ #define WriteAngleVector2D(to, v) MACRO_BEGIN WriteAngle(to, v.x); WriteAngle(to, v.y); MACRO_END
void Writebits(float dst, float val, int num)
{
#ifdef GAMEQC
SELFWRAP(blocked, void, (), (entity this, entity blocker), (this, other))
#define setblocked(e, f) SELFWRAP_SET(blocked, e, f)
-#define blocked stopusingthis
+#define getblocked(e) SELFWRAP_GET(blocked, e)
#endif
SELFWRAP(predraw, void, (), (entity this), (this))
#include "common.qh"
#if defined(CSQC)
- #include <common/t_items.qh>
+ #include <client/items/items.qh>
#elif defined(MENUQC)
#elif defined(SVQC)
#include <common/weapons/_all.qh>
#include <common/constants.qh>
#include <common/net_linked.qh>
#include <common/mapobjects/subs.qh>
+ #include <common/mapobjects/teleporters.qh>
#include <common/util.qh>
- #include <server/constants.qh>
- #include <server/defs.qh>
+ #include <common/weapons/_all.qh>
+ #include <common/stats.qh>
#include <server/utils.qh>
#endif
else
cvar_set(me.cvarName, ftos((cvar(me.cvarName) & 240) + me.cvarValueFloat));
}
- // TODO on an apply button, read _cl_color and execute the color command for it
}
void XonoticColorButton_draw(entity me)
{
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);
entity e, pms, label, box;
float i;
entity profileApplyButton = makeXonoticCommandButton(_("Apply immediately"), '0 0 0',
- "color -1 -1;"
+ "color -1 -1;" // apply colors contained in _cl_color
"name \"$_cl_name\";"
"playermodel $_cl_playermodel;"
"playerskin $_cl_playerskin;"
e.addValue(e, _("Never"), "0");
e.addValue(e, _("In non teamplay modes only"), "1");
e.addValue(e, _("Always"), "2");
+ e.addValue(e, _("Only in Duel"), "3");
e.configureXonoticTextSliderValues(e);
me.TR(me);
me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Body fading:")));
e.addValue(e, _("Fast ADSL"), "40000");
e.addValue(e, _("Broadband"), "66666");
e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Server queries/s:")));
- me.TD(me, 1, 2, e = makeXonoticSlider(20, 100, 10, "net_slist_queriespersecond"));
me.TR(me);
me.TR(me);
me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Downloads:")));
e.addValue(e, ZCTX(_("DF^All")), "2");
e.configureXonoticTextSliderValues(e);
me.TR(me);
+ if(cvar_type("gl_vbo") & CVAR_TYPEFLAG_ENGINE)
+ {
me.TD(me, 1, 3, e = makeXonoticTextLabel(0, _("Vertex Buffer Objects (VBOs)")));
me.TR(me);
me.TDempty(me, 0.2);
_("Make use of Vertex Buffer Objects to store static geometry in video memory for faster rendering")));
me.TD(me, 1, 1.9, e = makeXonoticRadioButton_T(1, "gl_vbo", "1", _("Vertices and Triangles"),
_("Make use of Vertex Buffer Objects to store static geometry in video memory for faster rendering")));
+ }
me.gotoRC(me, 0, 3.2); me.setFirstColumn(me, me.currentColumn);
me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Brightness:")));
me.TD(me, 1, 3, e = makeXonoticCheckBox_T(0, "gl_finish", _("Wait for GPU to finish each frame"),
_("Make the CPU wait for the GPU to finish each frame, can help with some strange input or video lag on some machines")));
me.TR(me);
+ if(cvar_type("vid_gl20") & CVAR_TYPEFLAG_ENGINE)
+ {
me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "vid_gl20", _("Use OpenGL 2.0 shaders (GLSL)")));
e.applyButton = videoApplyButton;
+ }
if(cvar("developer") > 0)
{
me.TR(me);
#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>
+++ /dev/null
-void LOG_TRACE(string s, ...) = #25;
-string ftos(float f) = #26;
-string vtos(vector v) = #27;
-void error(string e) = #10;
-float test();
-
-spawnfunc(worldspawn)
-{
- float r;
- LOG_TRACE("TESTCASE: START");
- r = test();
- if(r == 1)
- error("TESTCASE: PASS");
- else if(r == 0)
- error("TESTCASE: FAIL");
- else
- error("TESTCASE: INVALID");
-}
+++ /dev/null
-../../progs-testcase.dat
-../server/sys.qh
-framework.qc
-testcase.qc
+++ /dev/null
-#!/bin/sh
-
-if [ "$#" -lt 3 ]; then
- echo "Usage: $0 'float test() { if(fail) return 0; else if(good) return 1; else return -1; }' ./darkplaces-dedicated basement +sv_cheats 1"
- exit 125
-fi
-
-case "$0" in
- */*)
- dir=${0%/*}
- ;;
- *)
- dir=`pwd`
- ;;
-esac
-testcase=$1; shift
-engine=$1; shift
-map=$1; shift
-echo "$testcase" > "$dir/testcase.qc"
-if ( cd $dir && fteqcc ); then
- set -- "$engine" -xonotic -basedir "$dir/../../.." +sv_progs progs-testcase.dat "$@" +map "$map"
- if [ -n "$GDB_ME" ]; then
- cmdfile=`mktemp`
- {
- echo "break VM_dprint"
- echo "run"
- echo "delete 1"
- echo "finish"
- } > "$cmdfile"
- gdb -x "$cmdfile" --args "$@"
- rm -f "$cmdfile"
- exit 0
- else
- r=`"$@" | tee /dev/stderr`
- fi
- case "$r" in
- *"TESTCASE: PASS"*)
- echo "PASS detected"
- exit 0
- ;;
- *"TESTCASE: FAIL"*)
- echo "FAIL detected"
- exit 1
- ;;
- *"TESTCASE: INVALID"*)
- echo "INVALID detected"
- exit 125
- ;;
- *)
- echo "Running failed"
- exit 125
- ;;
- esac
-else
- echo "Compilation failed"
- exit 125
-fi
#include <server/cheats.qc>
#include <server/client.qc>
#include <server/clientkill.qc>
-#include <server/g_damage.qc>
-#include <server/g_hook.qc>
-#include <server/g_world.qc>
+#include <server/damage.qc>
+#include <server/hook.qc>
+#include <server/world.qc>
+#include <server/gamelog.qc>
#include <server/handicap.qc>
#include <server/impulse.qc>
#include <server/ipban.qc>
-#include <server/items.qc>
+#include <server/main.qc>
#include <server/mapvoting.qc>
#include <server/matrix.qc>
#include <server/miscfunctions.qc>
#include <server/scores_rules.qc>
#include <server/spawnpoints.qc>
#include <server/steerlib.qc>
-#ifdef SVQC
- #include <server/sv_main.qc>
-#endif
#include <server/teamplay.qc>
#include <server/tests.qc>
#include <server/bot/_mod.inc>
#include <server/command/_mod.inc>
#include <server/compat/_mod.inc>
+#include <server/items/_mod.inc>
#include <server/mutators/_mod.inc>
#include <server/pathlib/_mod.inc>
#include <server/weapons/_mod.inc>
#include <server/cheats.qh>
#include <server/client.qh>
#include <server/clientkill.qh>
-#include <server/g_damage.qh>
-#include <server/g_hook.qh>
-#include <server/g_world.qh>
+#include <server/damage.qh>
+#include <server/hook.qh>
+#include <server/world.qh>
+#include <server/gamelog.qh>
#include <server/handicap.qh>
#include <server/impulse.qh>
#include <server/ipban.qh>
-#include <server/items.qh>
+#include <server/main.qh>
#include <server/mapvoting.qh>
#include <server/matrix.qh>
#include <server/miscfunctions.qh>
#include <server/scores_rules.qh>
#include <server/spawnpoints.qh>
#include <server/steerlib.qh>
-#ifdef SVQC
- #include <server/sv_main.qh>
-#endif
#include <server/teamplay.qh>
#include <server/tests.qh>
#include <server/bot/_mod.qh>
#include <server/command/_mod.qh>
#include <server/compat/_mod.qh>
+#include <server/items/_mod.qh>
#include <server/mutators/_mod.qh>
#include <server/pathlib/_mod.qh>
#include <server/weapons/_mod.qh>
#include "antilag.qh"
#include "autocvars.qh"
-#include "defs.qh"
+#include <common/weapons/_all.qh>
+#include <common/stats.qh>
+#include <server/client.qh>
+#include <server/gamelog.qh>
+#include <server/main.qh>
#include "miscfunctions.qh"
#include "command/common.qh"
#if defined(CSQC)
#elif defined(MENUQC)
#elif defined(SVQC)
- #include <server/defs.qh>
+ #include <common/weapons/_all.qh>
+ #include <common/stats.qh>
+ #include <server/weapons/common.qh>
#include <common/state.qh>
+ #include <common/monsters/sv_monsters.qh>
#include <common/vehicles/all.qh>
#include <lib/warpzone/common.qh>
#include "antilag.qh"
#pragma once
-#include <server/defs.qh>
+#include <common/weapons/_all.qh>
+#include <common/stats.qh>
#include <common/weapons/_all.qh>
#include <common/physics/player.qh>
+bool bot_waypoints_for_items;
+
const int WAYPOINTFLAG_GENERATED = BIT(23);
const int WAYPOINTFLAG_ITEM = BIT(22);
const int WAYPOINTFLAG_TELEPORT = BIT(21); // teleports, warpzones and jumppads
.float ignoregoaltime;
.entity ignoregoal;
+bool bots_would_leave;
+
+int player_count;
+int currentbots;
+
.entity bot_basewaypoint;
.bool navigation_dynamicgoal;
void navigation_dynamicgoal_init(entity this, bool initially_static);
void waypoint_getSymmetricalOrigin_cmd(entity caller, bool save, int arg_idx);
void waypoint_getSymmetricalAxis_cmd(entity caller, bool save, int arg_idx);
+
+IntrusiveList g_waypoints;
+IntrusiveList g_bot_targets;
+IntrusiveList g_bot_dodge;
+STATIC_INIT(botapi)
+{
+ g_waypoints = IL_NEW();
+ g_bot_targets = IL_NEW();
+ g_bot_dodge = IL_NEW();
+}
#include "aim.qh"
-#include <server/defs.qh>
+#include <common/weapons/_all.qh>
+#include <common/stats.qh>
#include "cvars.qh"
#include "../../autocvars.qh"
#include "../../campaign.qh"
#include "../../client.qh"
-#include "../../constants.qh"
-#include "../../defs.qh"
+#include <common/stats.qh>
+#include <server/world.qh>
+#include <server/damage.qh>
#include "../../race.qh"
-#include <common/t_items.qh>
+#include <server/items/items.qh>
#include <server/mutators/_mod.qh>
#include "roles.qh"
-#include <server/defs.qh>
+#include <server/bot/api.qh>
+#include <server/client.qh>
+#include <common/weapons/_all.qh>
+#include <common/stats.qh>
+#include <server/damage.qh>
+#include <server/items/items.qh>
#include <server/miscfunctions.qh>
+#include <server/weapons/selection.qh>
+#include <server/weapons/weaponsystem.qh>
#include "../cvars.qh"
#include "../aim.qh"
#include <common/mapobjects/func/ladder.qh>
#include <common/mapobjects/teleporters.qh>
+#include <common/mapobjects/trigger/hurt.qh>
#include <common/mapobjects/trigger/jumppads.qh>
#include <lib/warpzone/common.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)
{
#include "roles.qh"
-#include <server/defs.qh>
+#include <common/weapons/_all.qh>
+#include <common/stats.qh>
#include <server/miscfunctions.qh>
-#include <server/items.qh>
+#include <server/items/items.qh>
+#include <server/items/spawning.qh>
#include <server/resources.qh>
#include "havocbot.qh"
#include "navigation.qh"
-#include <server/defs.qh>
+#include <server/bot/api.qh>
+#include <common/weapons/_all.qh>
+#include <common/stats.qh>
#include <server/miscfunctions.qh>
#include "cvars.qh"
#include "bot.qh"
#include "waypoints.qh"
-#include <common/t_items.qh>
+#include <server/items/items.qh>
#include <common/items/_mod.qh>
#include <common/constants.qh>
#include <common/net_linked.qh>
#include <common/mapobjects/func/ladder.qh>
+#include <common/mapobjects/trigger/hurt.qh>
#include <common/mapobjects/trigger/jumppads.qh>
.float speed;
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 "scripting.qh"
-#include <server/defs.qh>
+#include <common/weapons/_all.qh>
+#include <common/stats.qh>
#include <server/miscfunctions.qh>
+#include <server/weapons/selection.qh>
+#include <server/weapons/weaponsystem.qh>
#include "cvars.qh"
#include <common/state.qh>
+#include <common/gamemodes/gamemode/ctf/sv_ctf.qh>
#include <common/physics/player.qh>
#include <common/wepent.qh>
#include "waypoints.qh"
-#include <server/defs.qh>
+#include <common/weapons/_all.qh>
+#include <common/stats.qh>
+#include <server/items/items.qh>
#include <server/miscfunctions.qh>
+#include <server/spawnpoints.qh>
#include "cvars.qh"
#include "bot.qh"
#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>
#include "campaign.qh"
-#include "defs.qh"
+#include <common/weapons/_all.qh>
+#include <common/stats.qh>
#include "cheats.qh"
#include "miscfunctions.qh"
-#include "g_world.qh"
+#include "world.qh"
#include "../common/campaign_common.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 "cheats.qh"
-#include <server/defs.qh>
+#include <common/weapons/_all.qh>
+#include <common/stats.qh>
#include <server/miscfunctions.qh>
#include <common/effects/all.qh>
#include <server/resources.qh>
+#include <server/main.qh>
-#include "g_damage.qh"
+#include "damage.qh"
#include "clientkill.qh"
#include "player.qh"
#include "race.qh"
#include "../common/monsters/_mod.qh"
+#include <common/items/_mod.qh>
+
#include <common/weapons/_all.qh>
#include "../common/mapobjects/subs.qh"
const float CHRAME_DRAG = 8;
+// speedrun: when 1, player auto teleports back when capture timeout happens
+.bool speedrunning;
+
+.entity personal;
+
+.int grab; // 0 = can't grab, 1 = owner can grab, 2 = owner and team mates can grab, 3 = anyone can grab
+
bool drag_undraggable(entity draggee, entity dragger);
.bool(entity this, entity dragger) draggable;
#include "client.qh"
-#include <server/defs.qh>
+#include <common/weapons/_all.qh>
+#include <common/stats.qh>
#include <server/miscfunctions.qh>
#include <common/effects/all.qh>
#include "anticheat.qh"
#include "teamplay.qh"
#include "spawnpoints.qh"
#include "resources.qh"
-#include "g_damage.qh"
+#include "damage.qh"
#include "handicap.qh"
-#include "g_hook.qh"
+#include "hook.qh"
#include "command/common.qh"
#include "command/vote.qh"
#include "clientkill.qh"
#include "cheats.qh"
-#include "g_world.qh"
+#include "world.qh"
+#include <server/gamelog.qh>
#include "race.qh"
+#include <server/main.qh>
#include "antilag.qh"
#include "campaign.qh"
#include "command/common.qh"
#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>
#include "../common/vehicles/all.qh"
#include "weapons/hitplot.qh"
+#include "weapons/selection.qh"
#include "weapons/weaponsystem.qh"
#include "../common/net_notice.qh"
#include "../common/items/_mod.qh"
+#include <common/gamemodes/gamemode/nexball/sv_nexball.qh>
+
#include "../common/mutators/mutator/waypoints/all.qh"
#include "../common/mutators/mutator/instagib/sv_instagib.qh"
#include <common/gamemodes/_mod.qh>
#include <common/mutators/mutator/overkill/oknex.qh>
+#include <common/weapons/weapon/vortex.qh>
+
STATIC_METHOD(Client, Add, void(Client this, int _team))
{
ClientConnect(this);
{
if(!player) { return; } // not sure how, but best to be safe
+ int spec_count = 0;
FOREACH_CLIENT(IS_REAL_CLIENT(it) && IS_SPEC(it) && it != to && it.enemy == player,
{
+ if(spec_count >= MAX_SPECTATORS)
+ break;
WriteByte(MSG_ENTITY, num_for_edict(it));
+ ++spec_count;
});
}
this.alpha = 0;
this.scale = 0;
this.fade_time = 0;
- this.pain_frame = 0;
this.pain_finished = 0;
STAT(STRENGTH_FINISHED, this) = 0;
STAT(INVINCIBLE_FINISHED, this) = 0;
STAT(SUPERWEAPONS_FINISHED, this) = 0;
- this.air_finished = 0;
+ STAT(AIR_FINISHED, this) = 0;
//this.dphitcontentsmask = 0;
this.dphitcontentsmask = DPCONTENTS_SOLID;
if (autocvar_g_playerclip_collisions)
setthink(this, func_null);
this.nextthink = 0;
this.deadflag = DEAD_NO;
- this.crouch = false;
+ UNSET_DUCKED(this);
STAT(REVIVE_PROGRESS, this) = 0;
this.revival_time = 0;
this.draggable = drag_undraggable;
bool q3dfcompat = autocvar_sv_q3defragcompat && autocvar_sv_q3defragcompat_changehitbox;
this.scale = ((q3dfcompat) ? 0.9 : autocvar_sv_player_scale);
this.fade_time = 0;
- this.pain_frame = 0;
this.pain_finished = 0;
this.pushltime = 0;
setthink(this, func_null); // players have no think function
STAT(BUFFS, this) = 0;
STAT(BUFF_TIME, this) = 0;
- this.air_finished = 0;
+ STAT(AIR_FINISHED, this) = 0;
this.waterlevel = WATERLEVEL_NONE;
this.watertype = CONTENT_EMPTY;
this.spawnpoint_targ = NULL;
- this.crouch = false;
+ UNSET_DUCKED(this);
this.view_ofs = STAT(PL_VIEW_OFS, this);
setsize(this, STAT(PL_MIN, this), STAT(PL_MAX, this));
this.spawnorigin = spot.origin;
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);
}
}
+void calculate_player_respawn_time(entity this)
+{
+ if(MUTATOR_CALLHOOK(CalculateRespawnTime, this))
+ return;
+
+ float gametype_setting_tmp;
+ float sdelay_max = GAMETYPE_DEFAULTED_SETTING(respawn_delay_max);
+ float sdelay_small = GAMETYPE_DEFAULTED_SETTING(respawn_delay_small);
+ float sdelay_large = GAMETYPE_DEFAULTED_SETTING(respawn_delay_large);
+ float sdelay_small_count = GAMETYPE_DEFAULTED_SETTING(respawn_delay_small_count);
+ float sdelay_large_count = GAMETYPE_DEFAULTED_SETTING(respawn_delay_large_count);
+ float waves = GAMETYPE_DEFAULTED_SETTING(respawn_waves);
+
+ float pcount = 1; // Include myself whether or not team is already set right and I'm a "player".
+ if (teamplay)
+ {
+ FOREACH_CLIENT(IS_PLAYER(it) && it != this, {
+ if(it.team == this.team)
+ ++pcount;
+ });
+ if (sdelay_small_count == 0)
+ sdelay_small_count = 1;
+ if (sdelay_large_count == 0)
+ sdelay_large_count = 1;
+ }
+ else
+ {
+ FOREACH_CLIENT(IS_PLAYER(it) && it != this, {
+ ++pcount;
+ });
+ if (sdelay_small_count == 0)
+ {
+ if (IS_INDEPENDENT_PLAYER(this))
+ {
+ // Players play independently. No point in requiring enemies.
+ sdelay_small_count = 1;
+ }
+ else
+ {
+ // Players play AGAINST each other. Enemies required.
+ sdelay_small_count = 2;
+ }
+ }
+ if (sdelay_large_count == 0)
+ {
+ if (IS_INDEPENDENT_PLAYER(this))
+ {
+ // Players play independently. No point in requiring enemies.
+ sdelay_large_count = 1;
+ }
+ else
+ {
+ // Players play AGAINST each other. Enemies required.
+ sdelay_large_count = 2;
+ }
+ }
+ }
+
+ float sdelay;
+
+ if (pcount <= sdelay_small_count)
+ sdelay = sdelay_small;
+ else if (pcount >= sdelay_large_count)
+ sdelay = sdelay_large;
+ else // NOTE: this case implies sdelay_large_count > sdelay_small_count.
+ sdelay = sdelay_small + (sdelay_large - sdelay_small) * (pcount - sdelay_small_count) / (sdelay_large_count - sdelay_small_count);
+
+ if(waves)
+ this.respawn_time = ceil((time + sdelay) / waves) * waves;
+ else
+ this.respawn_time = time + sdelay;
+
+ if(sdelay < sdelay_max)
+ this.respawn_time_max = time + sdelay_max;
+ else
+ this.respawn_time_max = this.respawn_time;
+
+ if((sdelay + waves >= 5.0) && (this.respawn_time - time > 1.75))
+ this.respawn_countdown = 10; // first number to count down from is 10
+ else
+ this.respawn_countdown = -1; // do not count down
+
+ if(autocvar_g_forced_respawn)
+ this.respawn_flags = this.respawn_flags | RESPAWN_FORCE;
+}
// LordHavoc: this hack will be removed when proper _pants/_shirt layers are
// added to the model skins
STAT(STRENGTH_FINISHED, this) = STAT(STRENGTH_FINISHED, spectatee);
STAT(INVINCIBLE_FINISHED, this) = STAT(INVINCIBLE_FINISHED, spectatee);
STAT(SUPERWEAPONS_FINISHED, this) = STAT(SUPERWEAPONS_FINISHED, spectatee);
- this.air_finished = spectatee.air_finished;
+ STAT(AIR_FINISHED, this) = STAT(AIR_FINISHED, spectatee);
STAT(PRESSED_KEYS, this) = STAT(PRESSED_KEYS, spectatee);
STAT(WEAPONS, this) = STAT(WEAPONS, spectatee);
this.punchangle = spectatee.punchangle;
this.dmg_team = max(0, this.dmg_team - autocvar_g_teamdamage_resetspeed * frametime);
}
- secrets_setstatus(this);
monsters_setstatus(this);
return true;
if(IS_DEAD(this) || game_stopped || time < game_starttime || this.vehicle
|| STAT(FROZEN, this) || this.watertype != CONTENT_WATER)
{
- this.air_finished = 0;
+ STAT(AIR_FINISHED, this) = 0;
return;
}
if (this.waterlevel != WATERLEVEL_SUBMERGED)
{
- if(this.air_finished && this.air_finished < time)
+ if(STAT(AIR_FINISHED, this) && STAT(AIR_FINISHED, this) < time)
PlayerSound(this, playersound_gasp, CH_PLAYER, VOL_BASE, VOICETYPE_PLAYERSOUND);
- this.air_finished = 0;
+ STAT(AIR_FINISHED, this) = 0;
}
else
{
- if (!this.air_finished)
- this.air_finished = time + autocvar_g_balance_contents_drowndelay;
- if (this.air_finished < time)
+ if (!STAT(AIR_FINISHED, this))
+ STAT(AIR_FINISHED, this) = time + autocvar_g_balance_contents_drowndelay;
+ if (STAT(AIR_FINISHED, this) < time)
{ // drown!
if (this.pain_finished < time)
{
this.solid = SOLID_NOT;
this.takedamage = DAMAGE_NO;
set_movetype(this, MOVETYPE_NONE);
+ CS(this).teamkill_complain = 0;
+ CS(this).teamkill_soundtime = 0;
+ CS(this).teamkill_soundsource = NULL;
}
if (IS_PLAYER(this)) {
#pragma once
#include "utils.qh"
+#include <common/replicate.qh>
#include <common/sounds/all.qh>
+// WEAPONTODO
+.string weaponorder_byimpulse;
+
+.entity clientdata;
+
+.float jointime; // time of connecting
+.float startplaytime; // time of switching from spectator to player
+.float alivetime; // time of being alive
+.float motd_actived_time; // used for both motd and campaign_message
+
+.bool wasplayer;
+
+.int spectatee_status;
+.bool zoomstate;
+
+.bool just_joined;
+
+.int pressedkeys;
+
+.int playerid;
+
+.string playermodel;
+.string playerskin;
+
void ClientState_attach(entity this);
IntrusiveList g_players;
return false;
}
+int autocvar__independent_players;
+bool independent_players;
+#define INDEPENDENT_PLAYERS (autocvar__independent_players ? (autocvar__independent_players > 0) : independent_players)
+#define IS_INDEPENDENT_PLAYER(e) ((e).solid == SOLID_TRIGGER)
+#define MAKE_INDEPENDENT_PLAYER(e) (((e).solid = SOLID_TRIGGER), ((e).frags = FRAGS_PLAYER_OUT_OF_GAME))
+
+.int killcount;
+
+//flood fields
+.float nickspamtime; // time of last nick change
+.float nickspamcount;
+.float floodcontrol_chat;
+.float floodcontrol_chatteam;
+.float floodcontrol_chattell;
+.float floodcontrol_voice;
+.float floodcontrol_voiceteam;
+
+// respawning
+.int respawn_flags;
+.float respawn_time;
+.float respawn_time_max;
+
+.float respawn_countdown; // next number to count
+
+const int RESPAWN_FORCE = BIT(0);
+const int RESPAWN_SILENT = BIT(1);
+const int RESPAWN_DENY = BIT(2);
+
+float blockSpectators; // if set, new or existing spectators or observers will be removed unless they become a player within g_maxplayers_spectator_blocktime seconds
+.float spectatortime; // point in time since the client is spectating or observing
+
+.bool player_blocked;
+
+const int SVC_SETVIEW = 5; // TODO: move to dpdefs where this belongs!
+
+// TODO: standardise resource regeneration
+.float pauseregen_finished;
+.float pauserothealth_finished;
+.float pauserotarmor_finished;
+.float pauserotfuel_finished;
+
+// idle kicking
+float sv_maxidle;
+float sv_maxidle_spectatorsareidle;
+int sv_maxidle_slots;
+bool sv_maxidle_slots_countbots;
+
+// g_<gametype>_str:
+// If 0, default is used.
+// If <0, 0 is used.
+// Otherwise, g_str (default value) is used.
+// For consistency, negative values there are mapped to zero too.
+#define GAMETYPE_DEFAULTED_SETTING(str) \
+ ((gametype_setting_tmp = cvar(strcat("g_", GetGametype(), "_" #str))), \
+ (gametype_setting_tmp < 0) ? 0 \
+ : (gametype_setting_tmp == 0 || autocvar_g_respawn_delay_forced) ? max(0, autocvar_g_##str) \
+ : gametype_setting_tmp)
+
+void calculate_player_respawn_time(entity this);
+
bool PlayerInList(entity player, string list);
+void ClientData_Touch(entity e);
+
+int nJoinAllowed(entity this, entity ignore);
+
+void FixIntermissionClient(entity e);
+
+void checkSpectatorBlock(entity this);
+
+void PlayerUseKey(entity this);
+
+void FixClientCvars(entity e);
+
+// called when a client connects, useful for updating sounds and such of static objects
+.void(entity this, entity player) init_for_player;
+
+IntrusiveList g_initforplayer;
+STATIC_INIT(g_initforplayer) { g_initforplayer = IL_NEW(); }
+
/// \brief Print the string to the client's chat.
/// \param[in] client Client to print to.
/// \param[in] text Text to print.
#define SPECTATE_COPYFIELD(fld) SPECTATE_COPY() { this.(fld) = spectatee.(fld); }
int Say(entity source, int teamsay, entity privatesay, string msgin, bool floodcontrol);
+
+const int MAX_SPECTATORS = 7;
#include "clientkill.qh"
-#include <server/defs.qh>
+#include <common/weapons/_all.qh>
+#include <common/stats.qh>
+#include <server/client.qh>
+#include <server/player.qh>
-#include "g_damage.qh"
+#include "damage.qh"
#include "teamplay.qh"
#include <common/vehicles/sv_vehicles.qh>
+#include <common/mapobjects/triggers.qh>
#include <common/notifications/all.qh>
#include <common/stats.qh>
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;
#include "banning.qh"
-#include <server/defs.qh>
+#include <common/weapons/_all.qh>
+#include <common/stats.qh>
#include <server/miscfunctions.qh>
#include <common/state.qh>
#include <common/command/_mod.qh>
#include "cmd.qh"
-#include <server/defs.qh>
+#include <server/world.qh>
#include <server/miscfunctions.qh>
#include <common/command/_mod.qh>
#include "common.qh"
-#include <server/defs.qh>
+#include <server/client.qh>
+#include <common/weapons/_all.qh>
+#include <common/stats.qh>
+#include <server/world.qh>
#include <server/miscfunctions.qh>
#include <common/command/_mod.qh>
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)));
.float allowed_timeouts; // contains the number of allowed timeouts for each player
.vector lastV_angle; // used when pausing the game in order to force the player to keep his old view angle fixed
-// allow functions to be used in other code like g_world.qc and teamplay.qc
+// allow functions to be used in other code like world.qc and teamplay.qc
void timeout_handler_think(entity this);
// used by common/command/generic.qc:GenericCommand_dumpcommands to list all commands into a .txt file
#include "getreplies.qh"
-#include <server/defs.qh>
+#include <common/weapons/_all.qh>
+#include <common/stats.qh>
+#include <server/world.qh>
#include <server/miscfunctions.qh>
#include <common/command/_mod.qh>
#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>
// Last updated: December 30th, 2011
// =========================================================
-// These strings are set usually during init in g_world.qc,
+// These strings are set usually during init in world.qc,
// or also by some game modes or other functions manually,
// and their purpose is to output information to clients
// without using any extra processing time.
string top_uids[LADDER_SIZE];
float top_scores[LADDER_SIZE];
-// allow functions to be used in other code like g_world.qc and race.qc
+// allow functions to be used in other code like world.qc and race.qc
string getrecords(float page);
string getrankings();
string getladder();
#ifdef RADARMAP
#include <common/command/_mod.qh>
+#include <common/mapobjects/triggers.qh>
-#include "../g_world.qh"
+#include "../world.qh"
#include <common/util.qh>
#include "../campaign.qh"
#include "../client.qh"
#include "../player.qh"
-#include "../g_world.qh"
+#include "../world.qh"
#include "../ipban.qh"
#include "../teamplay.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 "vote.qh"
-#include <server/defs.qh>
+#include <server/client.qh>
+#include <common/weapons/_all.qh>
+#include <common/stats.qh>
+#include <server/gamelog.qh>
#include <server/miscfunctions.qh>
#include <common/command/_mod.qh>
#include "common.qh"
-#include "../g_damage.qh"
-#include "../g_world.qh"
+#include "../damage.qh"
+#include "../world.qh"
#include "../teamplay.qh"
#include "../race.qh"
#include "../round_handler.qh"
void ReadyRestart()
{
- if (MUTATOR_CALLHOOK(ReadyRestart_Deny) || game_stopped || race_completing) localcmd("restart\n");
+ if (MUTATOR_CALLHOOK(ReadyRestart_Deny) || intermission_running || race_completing) localcmd("restart\n");
else localcmd("\nsv_hook_readyrestart\n");
// Reset ALL scores, but only do that at the beginning of the countdown if sv_ready_restart_after_countdown is off!
{
print_to(caller, "^1Only connected clients can vote.");
}
- else if (timeout_status)
+ else if (timeout_status && vote_command != "timein")
{
print_to(caller, "^1You can not call a vote while a timeout is active.");
}
string vote_parsed_command; // command which is fixed after being parsed
string vote_parsed_display; // visual string which is fixed after being parsed
-// allow functions to be used in other code like g_world.qc and teamplay.qc
+// allow functions to be used in other code like world.qc and teamplay.qc
void VoteThink();
void VoteReset();
void VoteCommand(int request, entity caller, int argc, string vote_command);
float readyrestart_happened; // keeps track of whether a restart has already happened
float restart_mapalreadyrestarted; // bool, indicates whether reset_map() was already executed
.float ready; // flag for if a player is ready
+.int team_saved; // team number to restore upon map reset
+.void(entity this) reset; // if set, an entity is reset using this
+.void(entity this) reset2; // if set, an entity is reset using this (after calling ALL the reset functions for other entities)
void reset_map(float dorespawn);
void ReadyCount();
void ReadyRestart_force();
void VoteCount(float first_count);
void Nagger_Init();
+
+IntrusiveList g_saved_team;
+STATIC_INIT(g_saved_team) { g_saved_team = IL_NEW(); }
#include "quake.qh"
-#include <server/defs.qh>
+#include <common/weapons/_all.qh>
+#include <common/stats.qh>
#include <server/miscfunctions.qh>
#include <common/weapons/_all.qh>
#include "quake3.qh"
-#include <server/defs.qh>
+#include <server/client.qh>
+#include <common/weapons/_all.qh>
+#include <common/stats.qh>
#include <server/miscfunctions.qh>
-#include <server/items.qh>
+#include <server/items/items.qh>
+#include <server/items/spawning.qh>
#include <server/resources.qh>
-#include <common/t_items.qh>
+#include <common/gamemodes/_mod.qh>
+#include <common/gamemodes/gamemode/ctf/sv_ctf.qh>
#include <common/mapobjects/triggers.qh>
#include <common/mapobjects/trigger/counter.qh>
#include <common/mutators/mutator/buffs/buffs.qh>
//spawnfunc(item_doubler) /* handled by buffs mutator */
//spawnfunc(item_haste) /* handled by buffs mutator */
//spawnfunc(item_health) /* handled in t_quake.qc */
-//spawnfunc(item_health_large) /* handled in t_items.qc */
-//spawnfunc(item_health_small) /* handled in t_items.qc */
-//spawnfunc(item_health_mega) /* handled in t_items.qc */
+//spawnfunc(item_health_large) /* handled in items.qc */
+//spawnfunc(item_health_small) /* handled in items.qc */
+//spawnfunc(item_health_mega) /* handled in items.qc */
//spawnfunc(item_invis) /* handled by buffs mutator */
//spawnfunc(item_regen) /* handled by buffs mutator */
gametypename = "team";
if(g_ctf)
gametypename = "ctf";
+ if(g_ctf && ctf_oneflag)
+ gametypename = "oneflag";
if(g_duel)
gametypename = "tournament";
if(maxclients == 1)
gametypename = "single";
- // we do not have the other types (oneflag, obelisk, harvester, teamtournament)
+ // we do not have the other types (obelisk, harvester, teamtournament)
if(strstrofs(this.gametype, gametypename, 0) < 0)
return true;
}
#include "wop.qh"
-#include <server/defs.qh>
+#include <common/weapons/_all.qh>
+#include <common/stats.qh>
#include <server/miscfunctions.qh>
-#include <server/items.qh>
+#include <server/items/spawning.qh>
#include <common/weapons/_all.qh>
spawnfunc(item_haste);
+++ /dev/null
-#pragma once
-
-const int FL_WEAPON = BIT(13);
-const int FL_POWERUP = BIT(14);
-const int FL_PROJECTILE = BIT(15);
-const int FL_TOSSED = BIT(16);
-const int FL_NO_WEAPON_STAY = BIT(17);
-const int FL_SPAWNING = BIT(18);
-const int FL_PICKUPITEMS = BIT(19);
-
-const int SVC_SETVIEW = 5;
-
-const int RESPAWN_FORCE = BIT(0);
-const int RESPAWN_SILENT = BIT(1);
-const int RESPAWN_DENY = BIT(2);
-
-#define EFMASK_CHEAP (EF_ADDITIVE | EF_DOUBLESIDED | EF_FULLBRIGHT | EF_NODEPTHTEST | EF_NODRAW | EF_NOGUNBOB | EF_NOSHADOW | EF_LOWPRECISION | EF_SELECTABLE | EF_TELEPORT_BIT)
-
-const int NUM_PLAYERSKINS_TEAMPLAY = 3;
--- /dev/null
+#include "damage.qh"
+
+#include <common/effects/all.qh>
+#include "bot/api.qh"
+#include "hook.qh"
+#include <server/client.qh>
+#include <server/gamelog.qh>
+#include <server/items/items.qh>
+#include <server/mutators/_mod.qh>
+#include <server/main.qh>
+#include "teamplay.qh"
+#include "scores.qh"
+#include "spawnpoints.qh"
+#include "../common/state.qh"
+#include "../common/physics/player.qh"
+#include "resources.qh"
+#include "../common/vehicles/all.qh"
+#include "../common/items/_mod.qh"
+#include "../common/mutators/mutator/waypoints/waypointsprites.qh"
+#include "../common/mutators/mutator/instagib/sv_instagib.qh"
+#include "../common/mutators/mutator/buffs/buffs.qh"
+#include "weapons/accuracy.qh"
+#include "weapons/csqcprojectile.qh"
+#include "weapons/selection.qh"
+#include "../common/constants.qh"
+#include "../common/deathtypes/all.qh"
+#include <common/mapobjects/defs.qh>
+#include <common/mapobjects/triggers.qh>
+#include "../common/notifications/all.qh"
+#include "../common/physics/movetypes/movetypes.qh"
+#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"
+#include "../lib/warpzone/common.qh"
+
+void UpdateFrags(entity player, int f)
+{
+ GameRules_scoring_add_team(player, SCORE, f);
+}
+
+void GiveFrags(entity attacker, entity targ, float f, int deathtype, .entity weaponentity)
+{
+ // TODO route through PlayerScores instead
+ if(game_stopped) return;
+
+ if(f < 0)
+ {
+ if(targ == attacker)
+ {
+ // suicide
+ GameRules_scoring_add(attacker, SUICIDES, 1);
+ }
+ else
+ {
+ // teamkill
+ GameRules_scoring_add(attacker, TEAMKILLS, 1);
+ }
+ }
+ else
+ {
+ // regular frag
+ GameRules_scoring_add(attacker, KILLS, 1);
+ if(!warmup_stage && targ.playerid)
+ PlayerStats_GameReport_Event_Player(attacker, sprintf("kills-%d", targ.playerid), 1);
+ }
+
+ GameRules_scoring_add(targ, DEATHS, 1);
+
+ // FIXME fix the mess this is (we have REAL points now!)
+ if(MUTATOR_CALLHOOK(GiveFragsForKill, attacker, targ, f, deathtype, attacker.(weaponentity)))
+ f = M_ARGV(2, float);
+
+ attacker.totalfrags += f;
+
+ if(f)
+ UpdateFrags(attacker, f);
+}
+
+string AppendItemcodes(string s, entity player)
+{
+ for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
+ {
+ .entity weaponentity = weaponentities[slot];
+ int w = player.(weaponentity).m_weapon.m_id;
+ if(w == 0)
+ w = player.(weaponentity).cnt; // previous weapon
+ if(w != 0 || slot == 0)
+ s = strcat(s, ftos(w));
+ }
+ if(time < STAT(STRENGTH_FINISHED, player))
+ s = strcat(s, "S");
+ if(time < STAT(INVINCIBLE_FINISHED, player))
+ s = strcat(s, "I");
+ if(PHYS_INPUT_BUTTON_CHAT(player))
+ s = strcat(s, "T");
+ // TODO: include these codes as a flag on the item itself
+ MUTATOR_CALLHOOK(LogDeath_AppendItemCodes, player, s);
+ s = M_ARGV(1, string);
+ return s;
+}
+
+void LogDeath(string mode, int deathtype, entity killer, entity killed)
+{
+ string s;
+ if(!autocvar_sv_eventlog)
+ return;
+ s = strcat(":kill:", mode);
+ s = strcat(s, ":", ftos(killer.playerid));
+ s = strcat(s, ":", ftos(killed.playerid));
+ s = strcat(s, ":type=", Deathtype_Name(deathtype));
+ s = strcat(s, ":items=");
+ s = AppendItemcodes(s, killer);
+ if(killed != killer)
+ {
+ s = strcat(s, ":victimitems=");
+ s = AppendItemcodes(s, killed);
+ }
+ GameLogEcho(s);
+}
+
+void Obituary_SpecialDeath(
+ entity notif_target,
+ float murder,
+ int deathtype,
+ string s1, string s2, string s3,
+ float f1, float f2, float f3)
+{
+ if(!DEATH_ISSPECIAL(deathtype))
+ {
+ backtrace("Obituary_SpecialDeath called without a special deathtype?\n");
+ return;
+ }
+
+ entity deathent = REGISTRY_GET(Deathtypes, deathtype - DT_FIRST);
+ if (!deathent)
+ {
+ backtrace("Obituary_SpecialDeath: Could not find deathtype entity!\n");
+ return;
+ }
+
+ if(g_cts && deathtype == DEATH_KILL.m_id)
+ return; // TODO: somehow put this in CTS gamemode file!
+
+ Notification death_message = (murder) ? deathent.death_msgmurder : deathent.death_msgself;
+ if(death_message)
+ {
+ Send_Notification_WOCOVA(
+ NOTIF_ONE,
+ notif_target,
+ MSG_MULTI,
+ death_message,
+ s1, s2, s3, "",
+ f1, f2, f3, 0
+ );
+ Send_Notification_WOCOVA(
+ NOTIF_ALL_EXCEPT,
+ notif_target,
+ MSG_INFO,
+ death_message.nent_msginfo,
+ s1, s2, s3, "",
+ f1, f2, f3, 0
+ );
+ }
+}
+
+float Obituary_WeaponDeath(
+ entity notif_target,
+ float murder,
+ int deathtype,
+ string s1, string s2, string s3,
+ float f1, float f2)
+{
+ Weapon death_weapon = DEATH_WEAPONOF(deathtype);
+ if (death_weapon == WEP_Null)
+ return false;
+
+ w_deathtype = deathtype;
+ Notification death_message = ((murder) ? death_weapon.wr_killmessage(death_weapon) : death_weapon.wr_suicidemessage(death_weapon));
+ w_deathtype = false;
+
+ if (death_message)
+ {
+ Send_Notification_WOCOVA(
+ NOTIF_ONE,
+ notif_target,
+ MSG_MULTI,
+ death_message,
+ s1, s2, s3, "",
+ f1, f2, 0, 0
+ );
+ // send the info part to everyone
+ Send_Notification_WOCOVA(
+ NOTIF_ALL_EXCEPT,
+ notif_target,
+ MSG_INFO,
+ death_message.nent_msginfo,
+ s1, s2, s3, "",
+ f1, f2, 0, 0
+ );
+ }
+ else
+ {
+ LOG_TRACEF(
+ "Obituary_WeaponDeath(): ^1Deathtype ^7(%d)^1 has no notification for weapon %s!\n",
+ deathtype,
+ death_weapon.netname
+ );
+ }
+
+ return true;
+}
+
+bool frag_centermessage_override(entity attacker, entity targ, int deathtype, int kill_count_to_attacker, int kill_count_to_target, string attacker_name)
+{
+ if(deathtype == DEATH_FIRE.m_id)
+ {
+ Send_Notification(NOTIF_ONE, attacker, MSG_CHOICE, CHOICE_FRAG_FIRE, targ.netname, kill_count_to_attacker, (IS_BOT_CLIENT(targ) ? -1 : CS(targ).ping));
+ Send_Notification(NOTIF_ONE, targ, MSG_CHOICE, CHOICE_FRAGGED_FIRE, attacker_name, kill_count_to_target, GetResource(attacker, RES_HEALTH), GetResource(attacker, RES_ARMOR), (IS_BOT_CLIENT(attacker) ? -1 : CS(attacker).ping));
+ return true;
+ }
+
+ return MUTATOR_CALLHOOK(FragCenterMessage, attacker, targ, deathtype, kill_count_to_attacker, kill_count_to_target);
+}
+
+void Obituary(entity attacker, entity inflictor, entity targ, int deathtype, .entity weaponentity)
+{
+ // Sanity check
+ if (!IS_PLAYER(targ)) { backtrace("Obituary called on non-player?!\n"); return; }
+
+ // Declarations
+ float notif_firstblood = false;
+ float kill_count_to_attacker, kill_count_to_target;
+ bool notif_anonymous = false;
+ string attacker_name = attacker.netname;
+
+ // Set final information for the death
+ targ.death_origin = targ.origin;
+ string deathlocation = (autocvar_notification_server_allows_location ? NearestLocation(targ.death_origin) : "");
+
+ // Abort now if a mutator requests it
+ if (MUTATOR_CALLHOOK(ClientObituary, inflictor, attacker, targ, deathtype, attacker.(weaponentity))) { CS(targ).killcount = 0; return; }
+ notif_anonymous = M_ARGV(5, bool);
+
+ if(notif_anonymous)
+ attacker_name = "Anonymous player";
+
+ #ifdef NOTIFICATIONS_DEBUG
+ Debug_Notification(
+ sprintf(
+ "Obituary(%s, %s, %s, %s = %d);\n",
+ attacker_name,
+ inflictor.netname,
+ targ.netname,
+ Deathtype_Name(deathtype),
+ deathtype
+ )
+ );
+ #endif
+
+ // =======
+ // SUICIDE
+ // =======
+ if(targ == attacker)
+ {
+ if(DEATH_ISSPECIAL(deathtype))
+ {
+ if(deathtype == DEATH_TEAMCHANGE.m_id || deathtype == DEATH_AUTOTEAMCHANGE.m_id)
+ {
+ Obituary_SpecialDeath(targ, false, deathtype, targ.netname, deathlocation, "", targ.team, 0, 0);
+ }
+ else
+ {
+ switch(DEATH_ENT(deathtype))
+ {
+ case DEATH_MIRRORDAMAGE:
+ {
+ Obituary_SpecialDeath(targ, false, deathtype, targ.netname, deathlocation, "", CS(targ).killcount, 0, 0);
+ break;
+ }
+
+ default:
+ {
+ Obituary_SpecialDeath(targ, false, deathtype, targ.netname, deathlocation, "", CS(targ).killcount, 0, 0);
+ break;
+ }
+ }
+ }
+ }
+ else if (!Obituary_WeaponDeath(targ, false, deathtype, targ.netname, deathlocation, "", CS(targ).killcount, 0))
+ {
+ backtrace("SUICIDE: what the hell happened here?\n");
+ return;
+ }
+ LogDeath("suicide", deathtype, targ, targ);
+ if(deathtype != DEATH_AUTOTEAMCHANGE.m_id) // special case: don't negate frags if auto switched
+ GiveFrags(attacker, targ, -1, deathtype, weaponentity);
+ }
+
+ // ======
+ // MURDER
+ // ======
+ else if(IS_PLAYER(attacker))
+ {
+ if(SAME_TEAM(attacker, targ))
+ {
+ LogDeath("tk", deathtype, attacker, targ);
+ GiveFrags(attacker, targ, -1, deathtype, weaponentity);
+
+ CS(attacker).killcount = 0;
+
+ Send_Notification(NOTIF_ONE, attacker, MSG_CENTER, CENTER_DEATH_TEAMKILL_FRAG, targ.netname);
+ Send_Notification(NOTIF_ONE, targ, MSG_CENTER, CENTER_DEATH_TEAMKILL_FRAGGED, attacker_name);
+ Send_Notification(NOTIF_ALL, NULL, MSG_INFO, APP_TEAM_NUM(targ.team, INFO_DEATH_TEAMKILL), targ.netname, attacker_name, deathlocation, CS(targ).killcount);
+
+ // In this case, the death message will ALWAYS be "foo was betrayed by bar"
+ // No need for specific death/weapon messages...
+ }
+ else
+ {
+ LogDeath("frag", deathtype, attacker, targ);
+ GiveFrags(attacker, targ, 1, deathtype, weaponentity);
+
+ CS(attacker).taunt_soundtime = time + 1;
+ CS(attacker).killcount = CS(attacker).killcount + 1;
+
+ attacker.killsound += 1;
+
+ // TODO: improve SPREE_ITEM and KILL_SPREE_LIST
+ // these 2 macros are spread over multiple files
+ #define SPREE_ITEM(counta,countb,center,normal,gentle) \
+ case counta: \
+ Send_Notification(NOTIF_ONE, attacker, MSG_ANNCE, ANNCE_KILLSTREAK_##countb); \
+ if (!warmup_stage) \
+ PlayerStats_GameReport_Event_Player(attacker, PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_##counta, 1); \
+ break;
+
+ switch(CS(attacker).killcount)
+ {
+ KILL_SPREE_LIST
+ default: break;
+ }
+ #undef SPREE_ITEM
+
+ if(!warmup_stage && !checkrules_firstblood)
+ {
+ checkrules_firstblood = true;
+ notif_firstblood = true; // modify the current messages so that they too show firstblood information
+ PlayerStats_GameReport_Event_Player(attacker, PLAYERSTATS_ACHIEVEMENT_FIRSTBLOOD, 1);
+ PlayerStats_GameReport_Event_Player(targ, PLAYERSTATS_ACHIEVEMENT_FIRSTVICTIM, 1);
+
+ // tell spree_inf and spree_cen that this is a first-blood and first-victim event
+ kill_count_to_attacker = -1;
+ kill_count_to_target = -2;
+ }
+ else
+ {
+ kill_count_to_attacker = CS(attacker).killcount;
+ kill_count_to_target = 0;
+ }
+
+ if(targ.istypefrag)
+ {
+ Send_Notification(
+ NOTIF_ONE,
+ attacker,
+ MSG_CHOICE,
+ CHOICE_TYPEFRAG,
+ targ.netname,
+ kill_count_to_attacker,
+ (IS_BOT_CLIENT(targ) ? -1 : CS(targ).ping)
+ );
+ Send_Notification(
+ NOTIF_ONE,
+ targ,
+ MSG_CHOICE,
+ CHOICE_TYPEFRAGGED,
+ attacker_name,
+ kill_count_to_target,
+ GetResource(attacker, RES_HEALTH),
+ GetResource(attacker, RES_ARMOR),
+ (IS_BOT_CLIENT(attacker) ? -1 : CS(attacker).ping)
+ );
+ }
+ else if(!frag_centermessage_override(attacker, targ, deathtype, kill_count_to_attacker, kill_count_to_target, attacker_name))
+ {
+ Send_Notification(
+ NOTIF_ONE,
+ attacker,
+ MSG_CHOICE,
+ CHOICE_FRAG,
+ targ.netname,
+ kill_count_to_attacker,
+ (IS_BOT_CLIENT(targ) ? -1 : CS(targ).ping)
+ );
+ Send_Notification(
+ NOTIF_ONE,
+ targ,
+ MSG_CHOICE,
+ CHOICE_FRAGGED,
+ attacker_name,
+ kill_count_to_target,
+ GetResource(attacker, RES_HEALTH),
+ GetResource(attacker, RES_ARMOR),
+ (IS_BOT_CLIENT(attacker) ? -1 : CS(attacker).ping)
+ );
+ }
+
+ int f3 = 0;
+ if(deathtype == DEATH_BUFF.m_id)
+ f3 = buff_FirstFromFlags(STAT(BUFFS, attacker)).m_id;
+
+ if (!Obituary_WeaponDeath(targ, true, deathtype, targ.netname, attacker_name, deathlocation, CS(targ).killcount, kill_count_to_attacker))
+ Obituary_SpecialDeath(targ, true, deathtype, targ.netname, attacker_name, deathlocation, CS(targ).killcount, kill_count_to_attacker, f3);
+ }
+ }
+
+ // =============
+ // ACCIDENT/TRAP
+ // =============
+ else
+ {
+ switch(DEATH_ENT(deathtype))
+ {
+ // For now, we're just forcing HURTTRIGGER to behave as "DEATH_VOID" and giving it no special options...
+ // Later on you will only be able to make custom messages using DEATH_CUSTOM,
+ // and there will be a REAL DEATH_VOID implementation which mappers will use.
+ case DEATH_HURTTRIGGER:
+ {
+ Obituary_SpecialDeath(targ, false, deathtype,
+ targ.netname,
+ inflictor.message,
+ deathlocation,
+ CS(targ).killcount,
+ 0,
+ 0);
+ break;
+ }
+
+ case DEATH_CUSTOM:
+ {
+ Obituary_SpecialDeath(targ, false, deathtype,
+ targ.netname,
+ ((strstrofs(deathmessage, "%", 0) < 0) ? strcat("%s ", deathmessage) : deathmessage),
+ deathlocation,
+ CS(targ).killcount,
+ 0,
+ 0);
+ break;
+ }
+
+ default:
+ {
+ Obituary_SpecialDeath(targ, false, deathtype, targ.netname, deathlocation, "", CS(targ).killcount, 0, 0);
+ break;
+ }
+ }
+
+ LogDeath("accident", deathtype, targ, targ);
+ GiveFrags(targ, targ, -1, deathtype, weaponentity);
+
+ if(GameRules_scoring_add(targ, SCORE, 0) == -5)
+ {
+ Send_Notification(NOTIF_ONE, targ, MSG_ANNCE, ANNCE_ACHIEVEMENT_BOTLIKE);
+ if (!warmup_stage)
+ {
+ PlayerStats_GameReport_Event_Player(attacker, PLAYERSTATS_ACHIEVEMENT_BOTLIKE, 1);
+ }
+ }
+ }
+
+ // reset target kill count
+ CS(targ).killcount = 0;
+}
+
+void Ice_Think(entity this)
+{
+ if(!STAT(FROZEN, this.owner) || this.owner.iceblock != this)
+ {
+ delete(this);
+ return;
+ }
+ vector ice_org = this.owner.origin - '0 0 16';
+ if (this.origin != ice_org)
+ setorigin(this, ice_org);
+ this.nextthink = time;
+}
+
+void Freeze(entity targ, float revivespeed, int frozen_type, bool show_waypoint)
+{
+ if(!IS_PLAYER(targ) && !IS_MONSTER(targ)) // TODO: only specified entities can be freezed
+ return;
+
+ if(STAT(FROZEN, targ))
+ return;
+
+ float targ_maxhealth = ((IS_MONSTER(targ)) ? targ.max_health : start_health);
+
+ STAT(FROZEN, targ) = frozen_type;
+ STAT(REVIVE_PROGRESS, targ) = ((frozen_type == FROZEN_TEMP_DYING) ? 1 : 0);
+ SetResource(targ, RES_HEALTH, ((frozen_type == FROZEN_TEMP_DYING) ? targ_maxhealth : 1));
+ targ.revive_speed = revivespeed;
+ if(targ.bot_attack)
+ IL_REMOVE(g_bot_targets, targ);
+ targ.bot_attack = false;
+ targ.freeze_time = time;
+
+ entity ice = new(ice);
+ ice.owner = targ;
+ ice.scale = targ.scale;
+ // set_movetype(ice, MOVETYPE_FOLLOW) would rotate the ice model with the player
+ setthink(ice, Ice_Think);
+ ice.nextthink = time;
+ ice.frame = floor(random() * 21); // ice model has 20 different looking frames
+ setmodel(ice, MDL_ICE);
+ ice.alpha = 1;
+ ice.colormod = Team_ColorRGB(targ.team);
+ ice.glowmod = ice.colormod;
+ targ.iceblock = ice;
+ targ.revival_time = 0;
+
+ Ice_Think(ice);
+
+ RemoveGrapplingHooks(targ);
+
+ FOREACH_CLIENT(IS_PLAYER(it),
+ {
+ for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
+ {
+ .entity weaponentity = weaponentities[slot];
+ if(it.(weaponentity).hook.aiment == targ)
+ RemoveHook(it.(weaponentity).hook);
+ }
+ });
+
+ // add waypoint
+ if(MUTATOR_CALLHOOK(Freeze, targ, revivespeed, frozen_type) || show_waypoint)
+ WaypointSprite_Spawn(WP_Frozen, 0, 0, targ, '0 0 64', NULL, targ.team, targ, waypointsprite_attached, true, RADARICON_WAYPOINT);
+}
+
+void Unfreeze(entity targ, bool reset_health)
+{
+ if(!STAT(FROZEN, targ))
+ return;
+
+ if (reset_health && STAT(FROZEN, targ) != FROZEN_TEMP_DYING)
+ SetResource(targ, RES_HEALTH, ((IS_PLAYER(targ)) ? start_health : targ.max_health));
+
+ targ.pauseregen_finished = time + autocvar_g_balance_pause_health_regen;
+
+ STAT(FROZEN, targ) = 0;
+ STAT(REVIVE_PROGRESS, targ) = 0;
+ targ.revival_time = time;
+ if(!targ.bot_attack)
+ IL_PUSH(g_bot_targets, targ);
+ targ.bot_attack = true;
+
+ WaypointSprite_Kill(targ.waypointsprite_attached);
+
+ FOREACH_CLIENT(IS_PLAYER(it),
+ {
+ for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
+ {
+ .entity weaponentity = weaponentities[slot];
+ if(it.(weaponentity).hook.aiment == targ)
+ RemoveHook(it.(weaponentity).hook);
+ }
+ });
+
+ // remove the ice block
+ if(targ.iceblock)
+ delete(targ.iceblock);
+ targ.iceblock = NULL;
+
+ MUTATOR_CALLHOOK(Unfreeze, targ);
+}
+
+void Damage(entity targ, entity inflictor, entity attacker, float damage, int deathtype, .entity weaponentity, vector hitloc, vector force)
+{
+ float complainteamdamage = 0;
+ float mirrordamage = 0;
+ float mirrorforce = 0;
+
+ if (game_stopped || (IS_CLIENT(targ) && CS(targ).killcount == FRAGS_SPECTATOR))
+ return;
+
+ entity attacker_save = attacker;
+
+ // 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))
+ {
+ return;
+ }
+ }
+
+ if(deathtype == DEATH_KILL.m_id || deathtype == DEATH_TEAMCHANGE.m_id || deathtype == DEATH_AUTOTEAMCHANGE.m_id)
+ {
+ // exit the vehicle before killing (fixes a crash)
+ if(IS_PLAYER(targ) && targ.vehicle)
+ vehicles_exit(targ.vehicle, VHEF_RELEASE);
+
+ // These are ALWAYS lethal
+ // No damage modification here
+ // Instead, prepare the victim for his death...
+ SetResourceExplicit(targ, RES_ARMOR, 0);
+ targ.spawnshieldtime = 0;
+ SetResourceExplicit(targ, RES_HEALTH, 0.9); // this is < 1
+ targ.flags -= targ.flags & FL_GODMODE;
+ damage = 100000;
+ }
+ else if(deathtype == DEATH_MIRRORDAMAGE.m_id || deathtype == DEATH_NOAMMO.m_id)
+ {
+ // no processing
+ }
+ else
+ {
+ // nullify damage if teamplay is on
+ if(deathtype != DEATH_TELEFRAG.m_id)
+ if(IS_PLAYER(attacker))
+ {
+ if(IS_PLAYER(targ) && targ != attacker && (IS_INDEPENDENT_PLAYER(attacker) || IS_INDEPENDENT_PLAYER(targ)))
+ {
+ damage = 0;
+ force = '0 0 0';
+ }
+ else if(SAME_TEAM(attacker, targ))
+ {
+ if(autocvar_teamplay_mode == 1)
+ damage = 0;
+ else if(attacker != targ)
+ {
+ if(autocvar_teamplay_mode == 2)
+ {
+ if(IS_PLAYER(targ) && !IS_DEAD(targ))
+ {
+ attacker.dmg_team = attacker.dmg_team + damage;
+ complainteamdamage = attacker.dmg_team - autocvar_g_teamdamage_threshold;
+ }
+ }
+ else if(autocvar_teamplay_mode == 3)
+ damage = 0;
+ else if(autocvar_teamplay_mode == 4)
+ {
+ if(IS_PLAYER(targ) && !IS_DEAD(targ))
+ {
+ attacker.dmg_team = attacker.dmg_team + damage;
+ complainteamdamage = attacker.dmg_team - autocvar_g_teamdamage_threshold;
+ if(complainteamdamage > 0)
+ mirrordamage = autocvar_g_mirrordamage * complainteamdamage;
+ mirrorforce = autocvar_g_mirrordamage * vlen(force);
+ damage = autocvar_g_friendlyfire * damage;
+ // mirrordamage will be used LATER
+
+ if(autocvar_g_mirrordamage_virtual)
+ {
+ vector v = healtharmor_applydamage(GetResource(attacker, RES_ARMOR), autocvar_g_balance_armor_blockpercent, deathtype, mirrordamage);
+ attacker.dmg_take += v.x;
+ attacker.dmg_save += v.y;
+ attacker.dmg_inflictor = inflictor;
+ mirrordamage = v.z;
+ mirrorforce = 0;
+ }
+
+ if(autocvar_g_friendlyfire_virtual)
+ {
+ vector v = healtharmor_applydamage(GetResource(targ, RES_ARMOR), autocvar_g_balance_armor_blockpercent, deathtype, damage);
+ targ.dmg_take += v.x;
+ targ.dmg_save += v.y;
+ targ.dmg_inflictor = inflictor;
+ damage = 0;
+ if(!autocvar_g_friendlyfire_virtual_force)
+ force = '0 0 0';
+ }
+ }
+ else if(!targ.canteamdamage)
+ damage = 0;
+ }
+ }
+ }
+ }
+
+ if (!DEATH_ISSPECIAL(deathtype))
+ {
+ damage *= g_weapondamagefactor;
+ mirrordamage *= g_weapondamagefactor;
+ complainteamdamage *= g_weapondamagefactor;
+ force = force * g_weaponforcefactor;
+ mirrorforce *= g_weaponforcefactor;
+ }
+
+ // should this be changed at all? If so, in what way?
+ MUTATOR_CALLHOOK(Damage_Calculate, inflictor, attacker, targ, deathtype, damage, mirrordamage, force, attacker.(weaponentity));
+ damage = M_ARGV(4, float);
+ mirrordamage = M_ARGV(5, float);
+ force = M_ARGV(6, vector);
+
+ if(IS_PLAYER(targ) && damage > 0 && attacker)
+ {
+ for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
+ {
+ .entity went = weaponentities[slot];
+ if(targ.(went).hook && targ.(went).hook.aiment == attacker)
+ RemoveHook(targ.(went).hook);
+ }
+ }
+
+ if(STAT(FROZEN, targ) && !ITEM_DAMAGE_NEEDKILL(deathtype)
+ && deathtype != DEATH_TEAMCHANGE.m_id && deathtype != DEATH_AUTOTEAMCHANGE.m_id)
+ {
+ if(autocvar_g_frozen_revive_falldamage > 0 && deathtype == DEATH_FALL.m_id && damage >= autocvar_g_frozen_revive_falldamage)
+ {
+ Unfreeze(targ, false);
+ SetResource(targ, RES_HEALTH, autocvar_g_frozen_revive_falldamage_health);
+ Send_Effect(EFFECT_ICEORGLASS, targ.origin, '0 0 0', 3);
+ Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_FREEZETAG_REVIVED_FALL, targ.netname);
+ Send_Notification(NOTIF_ONE, targ, MSG_CENTER, CENTER_FREEZETAG_REVIVE_SELF);
+ }
+
+ damage = 0;
+ force *= autocvar_g_frozen_force;
+ }
+
+ if(IS_PLAYER(targ) && STAT(FROZEN, targ)
+ && ITEM_DAMAGE_NEEDKILL(deathtype) && !autocvar_g_frozen_damage_trigger)
+ {
+ Send_Effect(EFFECT_TELEPORT, targ.origin, '0 0 0', 1);
+
+ entity spot = SelectSpawnPoint(targ, false);
+ if(spot)
+ {
+ damage = 0;
+ targ.deadflag = DEAD_NO;
+
+ targ.angles = spot.angles;
+
+ targ.effects = 0;
+ targ.effects |= EF_TELEPORT_BIT;
+
+ targ.angles_z = 0; // never spawn tilted even if the spot says to
+ targ.fixangle = true; // turn this way immediately
+ targ.velocity = '0 0 0';
+ targ.avelocity = '0 0 0';
+ targ.punchangle = '0 0 0';
+ targ.punchvector = '0 0 0';
+ targ.oldvelocity = targ.velocity;
+
+ targ.spawnorigin = spot.origin;
+ setorigin(targ, spot.origin + '0 0 1' * (1 - targ.mins.z - 24));
+ // don't reset back to last position, even if new position is stuck in solid
+ targ.oldorigin = targ.origin;
+
+ Send_Effect(EFFECT_TELEPORT, targ.origin, '0 0 0', 1);
+ }
+ }
+
+ if(!MUTATOR_IS_ENABLED(mutator_instagib))
+ {
+ // apply strength multiplier
+ if (attacker.items & ITEM_Strength.m_itemid)
+ {
+ if(targ == attacker)
+ {
+ damage = damage * autocvar_g_balance_powerup_strength_selfdamage;
+ force = force * autocvar_g_balance_powerup_strength_selfforce;
+ }
+ else
+ {
+ damage = damage * autocvar_g_balance_powerup_strength_damage;
+ force = force * autocvar_g_balance_powerup_strength_force;
+ }
+ }
+
+ // apply invincibility multiplier
+ if (targ.items & ITEM_Shield.m_itemid)
+ {
+ damage = damage * autocvar_g_balance_powerup_invincible_takedamage;
+ if (targ != attacker)
+ {
+ force = force * autocvar_g_balance_powerup_invincible_takeforce;
+ }
+ }
+ }
+
+ if (targ == attacker)
+ damage = damage * autocvar_g_balance_selfdamagepercent; // Partial damage if the attacker hits himself
+
+ // count the damage
+ if(attacker)
+ if(!IS_DEAD(targ))
+ if(deathtype != DEATH_BUFF.m_id)
+ if(targ.takedamage == DAMAGE_AIM)
+ if(targ != attacker)
+ {
+ entity victim;
+ if(IS_VEHICLE(targ) && targ.owner)
+ victim = targ.owner;
+ else
+ victim = targ;
+
+ if(IS_PLAYER(victim) || (IS_TURRET(victim) && victim.active == ACTIVE_ACTIVE) || IS_MONSTER(victim) || MUTATOR_CALLHOOK(PlayHitsound, victim, attacker))
+ {
+ if(DIFF_TEAM(victim, attacker) && !STAT(FROZEN, victim))
+ {
+ if(damage > 0)
+ {
+ if(deathtype != DEATH_FIRE.m_id)
+ {
+ if(PHYS_INPUT_BUTTON_CHAT(victim))
+ attacker.typehitsound += 1;
+ else
+ attacker.damage_dealt += damage;
+ }
+
+ damage_goodhits += 1;
+ damage_gooddamage += damage;
+
+ if (!DEATH_ISSPECIAL(deathtype))
+ {
+ if(IS_PLAYER(targ)) // don't do this for vehicles
+ if(IsFlying(victim))
+ yoda = 1;
+ }
+ }
+ }
+ else if(IS_PLAYER(attacker))
+ {
+ // if enemy gets frozen in this frame and receives other damage don't
+ // play the typehitsound e.g. when hit by multiple bullets of the shotgun
+ if (deathtype != DEATH_FIRE.m_id && (!STAT(FROZEN, victim) || time > victim.freeze_time))
+ {
+ attacker.typehitsound += 1;
+ }
+ if(complainteamdamage > 0)
+ if(time > CS(attacker).teamkill_complain)
+ {
+ CS(attacker).teamkill_complain = time + 5;
+ CS(attacker).teamkill_soundtime = time + 0.4;
+ CS(attacker).teamkill_soundsource = targ;
+ }
+ }
+ }
+ }
+ }
+
+ // apply push
+ if (targ.damageforcescale)
+ if (force)
+ if (!IS_PLAYER(targ) || time >= targ.spawnshieldtime || targ == attacker)
+ {
+ vector farce = damage_explosion_calcpush(targ.damageforcescale * force, targ.velocity, autocvar_g_balance_damagepush_speedfactor);
+ if(targ.move_movetype == MOVETYPE_PHYSICS)
+ {
+ entity farcent = new(farce);
+ farcent.enemy = targ;
+ farcent.movedir = farce * 10;
+ if(targ.mass)
+ farcent.movedir = farcent.movedir * targ.mass;
+ farcent.origin = hitloc;
+ farcent.forcetype = FORCETYPE_FORCEATPOS;
+ farcent.nextthink = time + 0.1;
+ setthink(farcent, SUB_Remove);
+ }
+ else if(targ.move_movetype != MOVETYPE_NOCLIP)
+ {
+ targ.velocity = targ.velocity + farce;
+ }
+ UNSET_ONGROUND(targ);
+ UpdateCSQCProjectile(targ);
+ }
+ // apply damage
+ if (damage != 0 || (targ.damageforcescale && force))
+ if (targ.event_damage)
+ targ.event_damage (targ, inflictor, attacker, damage, deathtype, weaponentity, hitloc, force);
+
+ // apply mirror damage if any
+ if(!autocvar_g_mirrordamage_onlyweapons || DEATH_WEAPONOF(deathtype) != WEP_Null)
+ if(mirrordamage > 0 || mirrorforce > 0)
+ {
+ attacker = attacker_save;
+
+ force = normalize(attacker.origin + attacker.view_ofs - hitloc) * mirrorforce;
+ Damage(attacker, inflictor, attacker, mirrordamage, DEATH_MIRRORDAMAGE.m_id, weaponentity, attacker.origin, force);
+ }
+}
+
+float RadiusDamageForSource (entity inflictor, vector inflictororigin, vector inflictorvelocity, entity attacker, float coredamage, float edgedamage, float rad, entity cantbe, entity mustbe,
+ float inflictorselfdamage, float forceintensity, float forcezscale, int deathtype, .entity weaponentity, entity directhitentity)
+ // Returns total damage applies to creatures
+{
+ entity targ;
+ vector force;
+ float total_damage_to_creatures;
+ entity next;
+ float tfloordmg;
+ float tfloorforce;
+
+ float stat_damagedone;
+
+ if(RadiusDamage_running)
+ {
+ backtrace("RadiusDamage called recursively! Expect stuff to go HORRIBLY wrong.");
+ return 0;
+ }
+
+ RadiusDamage_running = 1;
+
+ tfloordmg = autocvar_g_throughfloor_damage;
+ tfloorforce = autocvar_g_throughfloor_force;
+
+ total_damage_to_creatures = 0;
+
+ if(deathtype != (WEP_HOOK.m_id | HITTYPE_SECONDARY | HITTYPE_BOUNCE)) // only send gravity bomb damage once
+ if(!(deathtype & HITTYPE_SOUND)) // do not send radial sound damage (bandwidth hog)
+ {
+ force = inflictorvelocity;
+ if(force == '0 0 0')
+ force = '0 0 -1';
+ else
+ force = normalize(force);
+ if(forceintensity >= 0)
+ Damage_DamageInfo(inflictororigin, coredamage, edgedamage, rad, forceintensity * force, deathtype, 0, attacker);
+ else
+ Damage_DamageInfo(inflictororigin, coredamage, edgedamage, -rad, (-forceintensity) * force, deathtype, 0, attacker);
+ }
+
+ stat_damagedone = 0;
+
+ targ = WarpZone_FindRadius (inflictororigin, rad + MAX_DAMAGEEXTRARADIUS, false);
+ while (targ)
+ {
+ next = targ.chain;
+ if ((targ != inflictor) || inflictorselfdamage)
+ if (((cantbe != targ) && !mustbe) || (mustbe == targ))
+ if (targ.takedamage)
+ {
+ vector nearest;
+ vector diff;
+ float power;
+
+ // LordHavoc: measure distance to nearest point on target (not origin)
+ // (this guarentees 100% damage on a touch impact)
+ nearest = targ.WarpZone_findradius_nearest;
+ diff = targ.WarpZone_findradius_dist;
+ // round up a little on the damage to ensure full damage on impacts
+ // and turn the distance into a fraction of the radius
+ power = 1 - ((vlen (diff) - bound(MIN_DAMAGEEXTRARADIUS, targ.damageextraradius, MAX_DAMAGEEXTRARADIUS)) / rad);
+ //bprint(" ");
+ //bprint(ftos(power));
+ //if (targ == attacker)
+ // print(ftos(power), "\n");
+ if (power > 0)
+ {
+ float finaldmg;
+ if (power > 1)
+ power = 1;
+ finaldmg = coredamage * power + edgedamage * (1 - power);
+ if (finaldmg > 0)
+ {
+ float a;
+ float c;
+ vector hitloc;
+ vector myblastorigin;
+ vector center;
+
+ myblastorigin = WarpZone_TransformOrigin(targ, inflictororigin);
+
+ // if it's a player, use the view origin as reference
+ center = CENTER_OR_VIEWOFS(targ);
+
+ force = normalize(center - myblastorigin);
+ force = force * (finaldmg / coredamage) * forceintensity;
+ hitloc = nearest;
+
+ // apply special scaling along the z axis if set
+ // NOTE: 0 value is not allowed for compatibility, in the case of weapon cvars not being set
+ if(forcezscale)
+ force.z *= forcezscale;
+
+ if(targ != directhitentity)
+ {
+ float hits;
+ float total;
+ float hitratio;
+ float mininv_f, mininv_d;
+
+ // test line of sight to multiple positions on box,
+ // and do damage if any of them hit
+ hits = 0;
+
+ // we know: max stddev of hitratio = 1 / (2 * sqrt(n))
+ // so for a given max stddev:
+ // n = (1 / (2 * max stddev of hitratio))^2
+
+ mininv_d = (finaldmg * (1-tfloordmg)) / autocvar_g_throughfloor_damage_max_stddev;
+ mininv_f = (vlen(force) * (1-tfloorforce)) / autocvar_g_throughfloor_force_max_stddev;
+
+ if(autocvar_g_throughfloor_debug)
+ LOG_INFOF("THROUGHFLOOR: D=%f F=%f max(dD)=1/%f max(dF)=1/%f", finaldmg, vlen(force), mininv_d, mininv_f);
+
+
+ total = 0.25 * (max(mininv_f, mininv_d) ** 2);
+
+ if(autocvar_g_throughfloor_debug)
+ LOG_INFOF(" steps=%f", total);
+
+
+ if (IS_PLAYER(targ))
+ total = ceil(bound(autocvar_g_throughfloor_min_steps_player, total, autocvar_g_throughfloor_max_steps_player));
+ else
+ total = ceil(bound(autocvar_g_throughfloor_min_steps_other, total, autocvar_g_throughfloor_max_steps_other));
+
+ if(autocvar_g_throughfloor_debug)
+ LOG_INFOF(" steps=%f dD=%f dF=%f", total, finaldmg * (1-tfloordmg) / (2 * sqrt(total)), vlen(force) * (1-tfloorforce) / (2 * sqrt(total)));
+
+ for(c = 0; c < total; ++c)
+ {
+ //traceline(targ.WarpZone_findradius_findorigin, nearest, MOVE_NOMONSTERS, inflictor);
+ WarpZone_TraceLine(inflictororigin, WarpZone_UnTransformOrigin(targ, nearest), MOVE_NOMONSTERS, inflictor);
+ if (trace_fraction == 1 || trace_ent == targ)
+ {
+ ++hits;
+ if (hits > 1)
+ hitloc = hitloc + nearest;
+ else
+ hitloc = nearest;
+ }
+ nearest.x = targ.origin.x + targ.mins.x + random() * targ.size.x;
+ nearest.y = targ.origin.y + targ.mins.y + random() * targ.size.y;
+ nearest.z = targ.origin.z + targ.mins.z + random() * targ.size.z;
+ }
+
+ nearest = hitloc * (1 / max(1, hits));
+ hitratio = (hits / total);
+ a = bound(0, tfloordmg + (1-tfloordmg) * hitratio, 1);
+ finaldmg = finaldmg * a;
+ a = bound(0, tfloorforce + (1-tfloorforce) * hitratio, 1);
+ force = force * a;
+
+ if(autocvar_g_throughfloor_debug)
+ LOG_INFOF(" D=%f F=%f", finaldmg, vlen(force));
+ }
+
+ //if (targ == attacker)
+ //{
+ // print("hits ", ftos(hits), " / ", ftos(total));
+ // print(" finaldmg ", ftos(finaldmg), " force ", vtos(force));
+ // print(" (", ftos(a), ")\n");
+ //}
+ if(finaldmg || force)
+ {
+ if(targ.iscreature)
+ {
+ total_damage_to_creatures += finaldmg;
+
+ if(accuracy_isgooddamage(attacker, targ))
+ stat_damagedone += finaldmg;
+ }
+
+ if(targ == directhitentity || DEATH_ISSPECIAL(deathtype))
+ Damage(targ, inflictor, attacker, finaldmg, deathtype, weaponentity, nearest, force);
+ else
+ Damage(targ, inflictor, attacker, finaldmg, deathtype | HITTYPE_SPLASH, weaponentity, nearest, force);
+ }
+ }
+ }
+ }
+ targ = next;
+ }
+
+ RadiusDamage_running = 0;
+
+ if(!DEATH_ISSPECIAL(deathtype))
+ accuracy_add(attacker, DEATH_WEAPONOF(deathtype), 0, min(coredamage, stat_damagedone));
+
+ return total_damage_to_creatures;
+}
+
+float RadiusDamage(entity inflictor, entity attacker, float coredamage, float edgedamage, float rad, entity cantbe, entity mustbe, float forceintensity, int deathtype, .entity weaponentity, entity directhitentity)
+{
+ return RadiusDamageForSource(inflictor, (inflictor.origin + (inflictor.mins + inflictor.maxs) * 0.5), inflictor.velocity, attacker, coredamage, edgedamage, rad,
+ cantbe, mustbe, false, forceintensity, 1, deathtype, weaponentity, directhitentity);
+}
+
+bool Heal(entity targ, entity inflictor, float amount, float limit)
+{
+ if(game_stopped || (IS_CLIENT(targ) && CS(targ).killcount == FRAGS_SPECTATOR) || STAT(FROZEN, targ) || IS_DEAD(targ))
+ return false;
+
+ bool healed = false;
+ if(targ.event_heal)
+ healed = targ.event_heal(targ, inflictor, amount, limit);
+ // TODO: additional handling? what if the healing kills them? should this abort if healing would do so etc
+ // TODO: healing fx!
+ // TODO: armor healing?
+ return healed;
+}
+
+float Fire_IsBurning(entity e)
+{
+ return (time < e.fire_endtime);
+}
+
+float Fire_AddDamage(entity e, entity o, float d, float t, float dt)
+{
+ float dps;
+ float maxtime, mintime, maxdamage, mindamage, maxdps, mindps, totaldamage, totaltime;
+
+ if(IS_PLAYER(e))
+ {
+ if(IS_DEAD(e))
+ return -1;
+ }
+ else
+ {
+ if(!e.fire_burner)
+ {
+ // print("adding a fire burner to ", e.classname, "\n");
+ e.fire_burner = new(fireburner);
+ setthink(e.fire_burner, fireburner_think);
+ e.fire_burner.nextthink = time;
+ e.fire_burner.owner = e;
+ }
+ }
+
+ t = max(t, 0.1);
+ dps = d / t;
+ if(Fire_IsBurning(e))
+ {
+ mintime = e.fire_endtime - time;
+ maxtime = max(mintime, t);
+
+ mindps = e.fire_damagepersec;
+ maxdps = max(mindps, dps);
+
+ if(maxtime > mintime || maxdps > mindps)
+ {
+ // Constraints:
+
+ // damage we have right now
+ mindamage = mindps * mintime;
+
+ // damage we want to get
+ maxdamage = mindamage + d;
+
+ // but we can't exceed maxtime * maxdps!
+ totaldamage = min(maxdamage, maxtime * maxdps);
+
+ // LEMMA:
+ // Look at:
+ // totaldamage = min(mindamage + d, maxtime * maxdps)
+ // We see:
+ // totaldamage <= maxtime * maxdps
+ // ==> totaldamage / maxdps <= maxtime.
+ // We also see:
+ // totaldamage / mindps = min(mindamage / mindps + d, maxtime * maxdps / mindps)
+ // >= min(mintime, maxtime)
+ // ==> totaldamage / maxdps >= mintime.
+
+ /*
+ // how long do we damage then?
+ // at least as long as before
+ // but, never exceed maxdps
+ totaltime = max(mintime, totaldamage / maxdps); // always <= maxtime due to lemma
+ */
+
+ // alternate:
+ // at most as long as maximum allowed
+ // but, never below mindps
+ totaltime = min(maxtime, totaldamage / mindps); // always >= mintime due to lemma
+
+ // assuming t > mintime, dps > mindps:
+ // we get d = t * dps = maxtime * maxdps
+ // totaldamage = min(maxdamage, maxtime * maxdps) = min(... + d, maxtime * maxdps) = maxtime * maxdps
+ // totaldamage / maxdps = maxtime
+ // totaldamage / mindps > totaldamage / maxdps = maxtime
+ // FROM THIS:
+ // a) totaltime = max(mintime, maxtime) = maxtime
+ // b) totaltime = min(maxtime, totaldamage / maxdps) = maxtime
+
+ // assuming t <= mintime:
+ // we get maxtime = mintime
+ // a) totaltime = max(mintime, ...) >= mintime, also totaltime <= maxtime by the lemma, therefore totaltime = mintime = maxtime
+ // b) totaltime = min(maxtime, ...) <= maxtime, also totaltime >= mintime by the lemma, therefore totaltime = mintime = maxtime
+
+ // assuming dps <= mindps:
+ // we get mindps = maxdps.
+ // With this, the lemma says that mintime <= totaldamage / mindps = totaldamage / maxdps <= maxtime.
+ // a) totaltime = max(mintime, totaldamage / maxdps) = totaldamage / maxdps
+ // b) totaltime = min(maxtime, totaldamage / mindps) = totaldamage / maxdps
+
+ e.fire_damagepersec = totaldamage / totaltime;
+ e.fire_endtime = time + totaltime;
+ if(totaldamage > 1.2 * mindamage)
+ {
+ e.fire_deathtype = dt;
+ if(e.fire_owner != o)
+ {
+ e.fire_owner = o;
+ e.fire_hitsound = false;
+ }
+ }
+ if(accuracy_isgooddamage(o, e))
+ accuracy_add(o, DEATH_WEAPONOF(dt), 0, max(0, totaldamage - mindamage));
+ return max(0, totaldamage - mindamage); // can never be negative, but to make sure
+ }
+ else
+ return 0;
+ }
+ else
+ {
+ e.fire_damagepersec = dps;
+ e.fire_endtime = time + t;
+ e.fire_deathtype = dt;
+ e.fire_owner = o;
+ e.fire_hitsound = false;
+ if(accuracy_isgooddamage(o, e))
+ accuracy_add(o, DEATH_WEAPONOF(dt), 0, d);
+ return d;
+ }
+}
+
+void Fire_ApplyDamage(entity e)
+{
+ float t, d, hi, ty;
+ entity o;
+
+ if (!Fire_IsBurning(e))
+ return;
+
+ for(t = 0, o = e.owner; o.owner && t < 16; o = o.owner, ++t);
+ if(IS_NOT_A_CLIENT(o))
+ o = e.fire_owner;
+
+ // water and slime stop fire
+ if(e.waterlevel)
+ if(e.watertype != CONTENT_LAVA)
+ e.fire_endtime = 0;
+
+ // ice stops fire
+ if(STAT(FROZEN, e))
+ e.fire_endtime = 0;
+
+ t = min(frametime, e.fire_endtime - time);
+ d = e.fire_damagepersec * t;
+
+ hi = e.fire_owner.damage_dealt;
+ ty = e.fire_owner.typehitsound;
+ Damage(e, e, e.fire_owner, d, e.fire_deathtype, DMG_NOWEP, e.origin, '0 0 0');
+ if(e.fire_hitsound && e.fire_owner)
+ {
+ e.fire_owner.damage_dealt = hi;
+ e.fire_owner.typehitsound = ty;
+ }
+ e.fire_hitsound = true;
+
+ if(!IS_INDEPENDENT_PLAYER(e) && !STAT(FROZEN, e))
+ {
+ IL_EACH(g_damagedbycontents, it.damagedbycontents && it != e,
+ {
+ if(!IS_DEAD(it) && it.takedamage && !IS_INDEPENDENT_PLAYER(it))
+ if(boxesoverlap(e.absmin, e.absmax, it.absmin, it.absmax))
+ {
+ t = autocvar_g_balance_firetransfer_time * (e.fire_endtime - time);
+ d = autocvar_g_balance_firetransfer_damage * e.fire_damagepersec * t;
+ Fire_AddDamage(it, o, d, t, DEATH_FIRE.m_id);
+ }
+ });
+ }
+}
+
+void Fire_ApplyEffect(entity e)
+{
+ if(Fire_IsBurning(e))
+ e.effects |= EF_FLAME;
+ else
+ e.effects &= ~EF_FLAME;
+}
+
+void fireburner_think(entity this)
+{
+ // for players, this is done in the regular loop
+ if(wasfreed(this.owner))
+ {
+ delete(this);
+ return;
+ }
+ Fire_ApplyEffect(this.owner);
+ if(!Fire_IsBurning(this.owner))
+ {
+ this.owner.fire_burner = NULL;
+ delete(this);
+ return;
+ }
+ Fire_ApplyDamage(this.owner);
+ this.nextthink = time;
+}
--- /dev/null
+#pragma once
+
+#if defined(CSQC)
+#elif defined(MENUQC)
+#elif defined(SVQC)
+ #include <common/weapons/_all.qh>
+ #include <common/stats.qh>
+ #include <server/items/items.qh>
+ #include <server/miscfunctions.qh>
+ #include <lib/warpzone/common.qh>
+ #include <common/constants.qh>
+ #include <common/teams.qh>
+ #include <common/util.qh>
+ #include <common/weapons/_all.qh>
+ #include "weapons/accuracy.qh"
+ #include "weapons/csqcprojectile.qh"
+ #include "weapons/selection.qh"
+ #include "autocvars.qh"
+ #include <common/notifications/all.qh>
+ #include <common/deathtypes/all.qh>
+ #include <server/mutators/_mod.qh>
+ #include <common/turrets/sv_turrets.qh>
+ #include <common/vehicles/all.qh>
+ #include <lib/csqcmodel/sv_model.qh>
+ #include <common/playerstats.qh>
+ #include "hook.qh"
+ #include "scores.qh"
+ #include "spawnpoints.qh"
+#endif
+
+.void(entity this, entity inflictor, entity attacker, float damage, int deathtype, .entity weaponentity, vector hitloc, vector force) event_damage;
+
+.bool(entity targ, entity inflictor, float amount, float limit) event_heal;
+
+.float dmg;
+.float dmg_edge;
+.float dmg_force;
+.float dmg_radius;
+
+bool Damage_DamageInfo_SendEntity(entity this, entity to, int sf);
+
+void Damage_DamageInfo(vector org, float coredamage, float edgedamage, float rad, vector force, int deathtype, float bloodtype, entity dmgowner);
+
+float checkrules_firstblood;
+
+.float damagedbycontents;
+.float damagedbytriggers;
+
+float yoda;
+float damage_goodhits;
+float damage_gooddamage;
+
+.float pain_finished; // Added by Supajoe
+
+.float dmg_team;
+.float teamkill_complain;
+.float teamkill_soundtime;
+.entity teamkill_soundsource;
+.entity pusher;
+.bool istypefrag;
+.float taunt_soundtime;
+
+.float spawnshieldtime;
+
+.int totalfrags;
+
+.bool canteamdamage;
+
+.vector death_origin;
+
+.float damage_dealt, typehitsound, killsound;
+
+// used for custom deathtype
+string deathmessage;
+
+float IsFlying(entity a);
+
+void UpdateFrags(entity player, int f);
+
+// NOTE: f=0 means still count as a (positive) kill, but count no frags for it
+void W_SwitchWeapon_Force(Player this, Weapon w, .entity weaponentity);
+void GiveFrags (entity attacker, entity targ, float f, int deathtype, .entity weaponentity);
+
+string AppendItemcodes(string s, entity player);
+
+void LogDeath(string mode, int deathtype, entity killer, entity killed);
+
+void Obituary_SpecialDeath(
+ entity notif_target,
+ float murder,
+ int deathtype,
+ string s1, string s2, string s3,
+ float f1, float f2, float f3);
+
+float w_deathtype;
+float Obituary_WeaponDeath(
+ entity notif_target,
+ float murder,
+ int deathtype,
+ string s1, string s2, string s3,
+ float f1, float f2);
+
+void Obituary(entity attacker, entity inflictor, entity targ, int deathtype, .entity weaponentity);
+
+// Frozen status effect
+//const int FROZEN_NOT = 0;
+const int FROZEN_NORMAL = 1;
+const int FROZEN_TEMP_REVIVING = 2;
+const int FROZEN_TEMP_DYING = 3;
+
+.float revival_time; // time at which player was last revived
+.float revive_speed; // NOTE: multiplier (anything above 1 is instaheal)
+.float freeze_time;
+.entity iceblock;
+.entity frozen_by; // for ice fields
+
+void Ice_Think(entity this);
+
+void Freeze(entity targ, float revivespeed, int frozen_type, bool show_waypoint);
+
+void Unfreeze(entity targ, bool reset_health);
+
+// WEAPONTODO
+#define DMG_NOWEP (weaponentities[0])
+
+// NOTE: the .weaponentity parameter can be set to DMG_NOWEP if the attack wasn't caused by a weapon or player
+void Damage (entity targ, entity inflictor, entity attacker, float damage, int deathtype, .entity weaponentity, vector hitloc, vector force);
+
+float RadiusDamage_running;
+float RadiusDamageForSource (entity inflictor, vector inflictororigin, vector inflictorvelocity, entity attacker, float coredamage, float edgedamage, float rad, entity cantbe, entity mustbe, float inflictorselfdamage, float forceintensity, float forcezscale, int deathtype, .entity weaponentity, entity directhitentity);
+ // Returns total damage applies to creatures
+
+float RadiusDamage (entity inflictor, entity attacker, float coredamage, float edgedamage, float rad, entity cantbe, entity mustbe, float forceintensity, int deathtype, .entity weaponentity, entity directhitentity);
+
+.float damageforcescale;
+const float MIN_DAMAGEEXTRARADIUS = 2;
+const float MAX_DAMAGEEXTRARADIUS = 16;
+.float damageextraradius;
+
+// Calls .event_heal on the target so that they can handle healing themselves
+// a limit of RES_LIMIT_NONE should be handled by the entity as its max health (if applicable)
+bool Heal(entity targ, entity inflictor, float amount, float limit);
+
+.float fire_damagepersec;
+.float fire_endtime;
+.float fire_deathtype;
+.entity fire_owner;
+.float fire_hitsound;
+.entity fire_burner;
+
+void fireburner_think(entity this);
+
+float Fire_IsBurning(entity e);
+
+float Fire_AddDamage(entity e, entity o, float d, float t, float dt);
+
+void Fire_ApplyDamage(entity e);
+
+void Fire_ApplyEffect(entity e);
+
+IntrusiveList g_damagedbycontents;
+STATIC_INIT(g_damagedbycontents) { g_damagedbycontents = IL_NEW(); }
+++ /dev/null
-#pragma once
-
-#include <common/weapons/_all.qh>
-#include <common/stats.qh>
-
-#define INDEPENDENT_ATTACK_FINISHED 1
-
-// Globals
-
-float g_footsteps, g_grappling_hook;
-float g_warmup_allguns;
-float g_warmup_allow_timeout;
-float warmup_stage;
-float g_jetpack;
-
-bool sv_ready_restart;
-bool sv_ready_restart_after_countdown;
-bool sv_ready_restart_repeatable;
-
-float sv_clones;
-float sv_foginterval;
-
-float player_count;
-float currentbots;
-float bots_would_leave;
-
-void UpdateFrags(entity player, int f);
-.int totalfrags;
-
-// flag set on worldspawn so that the code knows if it is dedicated or not
-float server_is_dedicated;
-
-// Fields
-
-.void(entity this, entity inflictor, entity attacker, float damage, int deathtype, .entity weaponentity, vector hitloc, vector force) event_damage;
-
-.bool(entity targ, entity inflictor, float amount, float limit) event_heal;
-
-//.string wad;
-//.string map;
-
-//.float worldtype;
-// Needed for dynamic clientwalls
-.bool inactive; // Clientwall disappears when inactive
-.float alpha_max, alpha_min;
-.float fade_start, fade_end, fade_vertical_offset;
-.float default_solid; // Variable to store default .solid for clientwalls
-
-.float pain_finished; //Added by Supajoe
-.float pain_frame; //"
-.float crouch; // Crouching or not?
-
-.float superweapons_finished; // NOTE: this field is used only by map entities, it does not directly apply the superweapons stat
-const .float air_finished = _STAT(AIR_FINISHED);
-
-.float cnt; // used in too many places
-.float count;
-//.float cnt2;
-
-.int respawn_flags;
-.float respawn_time;
-.float respawn_time_max;
-.float death_time;
-.float fade_time;
-.float fade_rate;
-
-void player_setupanimsformodel(entity this);
-
-.string mdl;
-
-.string playermodel;
-.string playerskin;
-
-.float species;
-
-.float scheduledrespawntime;
-.float respawntime;
-.float respawntimejitter;
-.float respawntimestart;
-//.float chasecam;
-
-.float damageforcescale;
-const float MIN_DAMAGEEXTRARADIUS = 2;
-const float MAX_DAMAGEEXTRARADIUS = 16;
-.float damageextraradius;
-
-//.float gravity;
-
-.float dmg;
-
-// for railgun damage (hitting multiple enemies)
-.bool railgunhit;
-.float railgunhitsolidbackup;
-.vector railgunhitloc;
-
-.float dmgtime;
-
-.float killcount;
-.float damage_dealt, typehitsound, killsound;
-
-.float watersound_finished;
-.float iscreature;
-.float damagedbycontents;
-.float damagedbytriggers;
-.float teleportable;
-.vector oldvelocity;
-
-.float pauseregen_finished;
-.float pauserothealth_finished;
-.float pauserotarmor_finished;
-.float pauserotfuel_finished;
-// string overrides entity
-.string item_pickupsound;
-.entity item_pickupsound_ent;
-.entity item_model_ent;
-
-// WEAPONTODO
-.float autoswitch;
-bool client_hasweapon(entity this, Weapon wpn, .entity weaponentity, float andammo, bool complain);
-void w_clear(Weapon thiswep, entity actor, .entity weaponentity, int fire);
-void w_ready(Weapon thiswep, entity actor, .entity weaponentity, int fire);
-// VorteX: standalone think for weapons, so normal think on weaponentity can be reserved by weaponflashes (which needs update even player dies)
-.float weapon_nextthink;
-.void(Weapon thiswep, entity actor, .entity weaponentity, int fire) weapon_think;
-
-
-// there is 2 weapon tics that can run in one server frame
-const int W_TICSPERFRAME = 2;
-
-void weapon_defaultspawnfunc(entity this, Weapon e);
-
-float intermission_running;
-float intermission_exittime;
-float alreadychangedlevel;
-
-// footstep interval
-.float nextstep;
-
-float blockSpectators; //if set, new or existing spectators or observers will be removed unless they become a player within g_maxplayers_spectator_blocktime seconds
-.float spectatortime; //point in time since the client is spectating or observing
-void checkSpectatorBlock(entity this);
-
-.float winning;
-.float jointime; // time of connecting
-.float startplaytime; // time of switching from spectator to player
-.float alivetime; // time of being alive
-.float motd_actived_time; // used for both motd and campaign_message
-
-int nJoinAllowed(entity this, entity ignore);
-
-.float spawnshieldtime;
-.float item_spawnshieldtime;
-
-.entity flagcarried;
-
-.int playerid;
-.float noalign; // if set to 1, the item or spawnpoint won't be dropped to the floor
-
-.vector death_origin;
-
-float default_player_alpha;
-float default_weapon_alpha;
-
-.float cvar_cl_handicap;
-.int cvar_cl_gunalign;
-.float cvar_cl_clippedspectating;
-.float cvar_cl_autoscreenshot;
-.float cvar_cl_jetpack_jump;
-.float cvar_cl_movement_track_canjump;
-.float cvar_cl_newusekeysupported;
-.float cvar_cl_cts_noautoswitch;
-.bool cvar_cl_weapon_switch_reload;
-.bool cvar_cl_weapon_switch_fallback_to_impulse;
-
-.string cvar_g_xonoticversion;
-.string cvar_cl_weaponpriority;
-.string cvar_cl_weaponpriorities[10];
-.float cvar_cl_noantilag;
-
-.string weaponorder_byimpulse;
-
-.float cvar_cl_allow_uid2name;
-.float cvar_cl_allow_uidtracking;
-.bool cvar_cl_allow_uidranking;
-.string stored_netname;
-
-string gamemode_name;
-
-string W_Apply_Weaponreplace(string in);
-
-void FixIntermissionClient(entity e);
-void FixClientCvars(entity e);
-
-.float respawn_countdown; // next number to count
-
-float bot_waypoints_for_items;
-
-.float attack_finished_for[REGISTRY_MAX(Weapons) * MAX_WEAPONSLOTS];
-.float attack_finished_single[MAX_WEAPONSLOTS];
-#if INDEPENDENT_ATTACK_FINISHED
-#define ATTACK_FINISHED_FOR(ent, w, slot) ((ent).(attack_finished_for[((w) - WEP_FIRST) * MAX_WEAPONSLOTS + (slot)]))
-#else
-#define ATTACK_FINISHED_FOR(ent, w, slot) ((ent).attack_finished_single[slot])
-#endif
-#define ATTACK_FINISHED(ent, w) ATTACK_FINISHED_FOR(ent, ent.(w).m_weapon.m_id, weaponslot(w))
-
-// speedrun: when 1, player auto teleports back when capture timeout happens
-.float speedrunning;
-
-// database
-float ServerProgsDB;
-float TemporaryDB;
-
-.int team_saved;
-
-bool some_spawn_has_been_used;
-int have_team_spawns; // 0 = no team spawns requested, -1 = team spawns requested but none found, 1 = team spawns requested and found
-int have_team_spawns_forteams; // if Xth bit is 1 then team X has spawns else it has no spawns; team 0 is the "no-team"
-
-.bool canteamdamage;
-
-void Damage (entity targ, entity inflictor, entity attacker, float damage, int deathtype, .entity weaponentity, vector hitloc, vector force);
-
-// WEAPONTODO
-#define DMG_NOWEP (weaponentities[0])
-
-float sv_maxidle;
-float sv_maxidle_spectatorsareidle;
-int sv_maxidle_slots;
-bool sv_maxidle_slots_countbots;
-
-float tracebox_hits_trigger_hurt(vector start, vector mi, vector ma, vector end);
-
-float next_pingtime;
-
-// autotaunt system
-.float cvar_cl_autotaunt;
-.float cvar_cl_voice_directional;
-.float cvar_cl_voice_directional_taunt_attenuation;
-
-int autocvar__independent_players;
-bool independent_players;
-#define INDEPENDENT_PLAYERS (autocvar__independent_players ? (autocvar__independent_players > 0) : independent_players)
-#define IS_INDEPENDENT_PLAYER(e) ((e).solid == SOLID_TRIGGER)
-#define MAKE_INDEPENDENT_PLAYER(e) (((e).solid = SOLID_TRIGGER), ((e).frags = FRAGS_PLAYER_OUT_OF_GAME))
-
-string clientstuff;
-.float phase;
-.int pressedkeys;
-
-.string fog;
-
-string cvar_changes;
-string cvar_purechanges;
-float cvar_purechanges_count;
-
-//float game_starttime; //point in time when the countdown to game start is over
-//float round_starttime; //point in time when the countdown to round start is over
-
-void W_Porto_Remove (entity p);
-
-.int projectiledeathtype;
-
-.string message2;
-
-// reset to 0 on weapon switch
-// may be useful to all weapons
-.float bulletcounter;
-
-// Nexball
-float g_nexball_meter_period;
-
-.void(entity this) reset; // if set, an entity is reset using this
-.void(entity this) reset2; // if set, an entity is reset using this (after calling ALL the reset functions for other entities)
-
-void ClientData_Touch(entity e);
-
-//vector debug_shotorg; // if non-zero, overrides the shot origin of all weapons
-
-.bool wasplayer;
-
-float servertime, serverprevtime, serverframetime;
-
-.float ammo_fuel;
-
-//flood fields
-.float nickspamtime; // time of last nick change
-.float nickspamcount;
-.float floodcontrol_chat;
-.float floodcontrol_chatteam;
-.float floodcontrol_chattell;
-.float floodcontrol_voice;
-.float floodcontrol_voiceteam;
-
-string matchid;
-
-bool radar_showennemies;
-
-.float weapon_load[REGISTRY_MAX(Weapons)];
-.int ammo_none; // used by the reloading system, must always be 0
-.int clip_load;
-.int old_clip_load;
-.int clip_size;
-
-.int minelayer_mines;
-.float vortex_charge;
-.float vortex_charge_rottime;
-.float vortex_chargepool_ammo;
-.float oknex_charge;
-.float oknex_charge_rottime;
-.float oknex_chargepool_ammo;
-.int hagar_load;
-
-.int grab; // 0 = can't grab, 1 = owner can grab, 2 = owner and team mates can grab, 3 = anyone can grab
-
-#define PROJECTILE_MAKETRIGGER(e) (e).solid = SOLID_CORPSE; (e).dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_CORPSE
-// when doing this, hagar can go through clones
-// #define PROJECTILE_MAKETRIGGER(e) (e).solid = SOLID_BBOX
-
-.int spectatee_status;
-.bool zoomstate;
-.int restriction;
-
-.entity clientdata;
-.entity personal;
-
-string deathmessage;
-
-.bool just_joined;
-
-.float cvar_cl_weaponimpulsemode;
-.int selectweapon; // last selected weapon of the player
-
-.float ballistics_density;
-
-//const int FROZEN_NOT = 0;
-const int FROZEN_NORMAL = 1;
-const int FROZEN_TEMP_REVIVING = 2;
-const int FROZEN_TEMP_DYING = 3;
-
-const int ACTIVE_NOT = 0;
-const int ACTIVE_ACTIVE = 1;
-const int ACTIVE_IDLE = 2;
-const int ACTIVE_BUSY = 2;
-const int ACTIVE_TOGGLE = 3;
-.int active;
-.void (entity this, int act_state) setactive;
-.entity realowner;
-
-//float serverflags;
-
-.bool player_blocked;
-
-.float revival_time; // time at which player was last revived
-.float revive_speed; // NOTE: multiplier (anything above 1 is instaheal)
-.float freeze_time;
-.entity iceblock;
-.entity frozen_by; // for ice fields
-
-.entity muzzle_flash;
-.float misc_bulletcounter; // replaces uzi & hlac bullet counter.
-
-void PlayerUseKey(entity this);
-
-USING(spawn_evalfunc_t, vector(entity this, entity player, entity spot, vector current));
-.spawn_evalfunc_t spawn_evalfunc;
-
-string modname;
-
-.int missile_flags;
-const int MIF_SPLASH = BIT(1);
-const int MIF_ARC = BIT(2);
-const int MIF_PROXY = BIT(3);
-const int MIF_GUIDED_MANUAL = BIT(4);
-const int MIF_GUIDED_HEAT = BIT(5);
-const int MIF_GUIDED_LASER = BIT(6);
-const int MIF_GUIDED_AI = BIT(7);
-const int MIF_GUIDED_TAG = BIT(7);
-const int MIF_GUIDED_ALL = MIF_GUIDED_MANUAL | MIF_GUIDED_HEAT | MIF_GUIDED_LASER | MIF_GUIDED_AI | MIF_GUIDED_TAG;
-const int MIF_GUIDED_TRACKING = MIF_GUIDED_HEAT | MIF_GUIDED_LASER | MIF_GUIDED_AI | MIF_GUIDED_TAG;
-const int MIF_GUIDED_CONFUSABLE = MIF_GUIDED_HEAT | MIF_GUIDED_AI;
-
-#define MISSILE_IS_CONFUSABLE(m) ((m.missile_flags & MIF_GUIDED_CONFUSABLE) ? true : false)
-#define MISSILE_IS_GUIDED(m) ((m.missile_flags & MIF_GUIDED_ALL) ? true : false)
-#define MISSILE_IS_TRACKING(m) ((m.missile_flags & MIF_GUIDED_TRACKING) ? true : false)
-
-////
-
-.string cvar_cl_physics;
-
-.void(entity this, entity player) init_for_player;
-
-.WepSet dual_weapons;
-
-IntrusiveList g_monsters;
-IntrusiveList g_waypoints;
-IntrusiveList g_vehicles;
-IntrusiveList g_turrets;
-IntrusiveList g_mines;
-IntrusiveList g_projectiles;
-IntrusiveList g_items;
-IntrusiveList g_initforplayer;
-IntrusiveList g_clones;
-IntrusiveList g_spawnpoints;
-IntrusiveList g_bot_targets;
-IntrusiveList g_bot_dodge;
-IntrusiveList g_damagedbycontents;
-IntrusiveList g_railgunhit;
-IntrusiveList g_ladders;
-IntrusiveList g_locations;
-IntrusiveList g_saved_team;
-IntrusiveList g_monster_targets;
-IntrusiveList g_pathlib_nodes;
-IntrusiveList g_moveables;
-STATIC_INIT(defs)
-{
- g_monsters = IL_NEW();
- g_waypoints = IL_NEW();
- g_vehicles = IL_NEW();
- g_turrets = IL_NEW();
- g_mines = IL_NEW();
- g_projectiles = IL_NEW();
- g_items = IL_NEW();
- g_initforplayer = IL_NEW();
- g_clones = IL_NEW();
- g_spawnpoints = IL_NEW();
- g_bot_targets = IL_NEW();
- g_bot_dodge = IL_NEW();
- g_damagedbycontents = IL_NEW();
- g_railgunhit = IL_NEW();
- g_ladders = IL_NEW();
- g_locations = IL_NEW();
- g_saved_team = IL_NEW();
- g_monster_targets = IL_NEW();
- g_pathlib_nodes = IL_NEW();
- g_moveables = IL_NEW();
-}
+++ /dev/null
-#include "g_damage.qh"
-
-#include <common/effects/all.qh>
-#include "bot/api.qh"
-#include "g_hook.qh"
-#include <server/mutators/_mod.qh>
-#include "teamplay.qh"
-#include "scores.qh"
-#include "spawnpoints.qh"
-#include "../common/state.qh"
-#include "../common/physics/player.qh"
-#include "../common/t_items.qh"
-#include "resources.qh"
-#include "../common/vehicles/all.qh"
-#include "../common/items/_mod.qh"
-#include "../common/mutators/mutator/waypoints/waypointsprites.qh"
-#include "../common/mutators/mutator/instagib/sv_instagib.qh"
-#include "../common/mutators/mutator/buffs/buffs.qh"
-#include "weapons/accuracy.qh"
-#include "weapons/csqcprojectile.qh"
-#include "weapons/selection.qh"
-#include "../common/constants.qh"
-#include "../common/deathtypes/all.qh"
-#include "../common/notifications/all.qh"
-#include "../common/physics/movetypes/movetypes.qh"
-#include "../common/playerstats.qh"
-#include "../common/teams.qh"
-#include "../common/util.qh"
-#include <common/gamemodes/rules.qh>
-#include <common/weapons/_all.qh>
-#include "../lib/csqcmodel/sv_model.qh"
-#include "../lib/warpzone/common.qh"
-
-void UpdateFrags(entity player, int f)
-{
- GameRules_scoring_add_team(player, SCORE, f);
-}
-
-void GiveFrags(entity attacker, entity targ, float f, int deathtype, .entity weaponentity)
-{
- // TODO route through PlayerScores instead
- if(game_stopped) return;
-
- if(f < 0)
- {
- if(targ == attacker)
- {
- // suicide
- GameRules_scoring_add(attacker, SUICIDES, 1);
- }
- else
- {
- // teamkill
- GameRules_scoring_add(attacker, TEAMKILLS, 1);
- }
- }
- else
- {
- // regular frag
- GameRules_scoring_add(attacker, KILLS, 1);
- if(!warmup_stage && targ.playerid)
- PlayerStats_GameReport_Event_Player(attacker, sprintf("kills-%d", targ.playerid), 1);
- }
-
- GameRules_scoring_add(targ, DEATHS, 1);
-
- // FIXME fix the mess this is (we have REAL points now!)
- if(MUTATOR_CALLHOOK(GiveFragsForKill, attacker, targ, f, deathtype, attacker.(weaponentity)))
- f = M_ARGV(2, float);
-
- attacker.totalfrags += f;
-
- if(f)
- UpdateFrags(attacker, f);
-}
-
-string AppendItemcodes(string s, entity player)
-{
- for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
- {
- .entity weaponentity = weaponentities[slot];
- int w = player.(weaponentity).m_weapon.m_id;
- if(w == 0)
- w = player.(weaponentity).cnt; // previous weapon
- if(w != 0 || slot == 0)
- s = strcat(s, ftos(w));
- }
- if(time < STAT(STRENGTH_FINISHED, player))
- s = strcat(s, "S");
- if(time < STAT(INVINCIBLE_FINISHED, player))
- s = strcat(s, "I");
- if(PHYS_INPUT_BUTTON_CHAT(player))
- s = strcat(s, "T");
- // TODO: include these codes as a flag on the item itself
- MUTATOR_CALLHOOK(LogDeath_AppendItemCodes, player, s);
- s = M_ARGV(1, string);
- return s;
-}
-
-void LogDeath(string mode, int deathtype, entity killer, entity killed)
-{
- string s;
- if(!autocvar_sv_eventlog)
- return;
- s = strcat(":kill:", mode);
- s = strcat(s, ":", ftos(killer.playerid));
- s = strcat(s, ":", ftos(killed.playerid));
- s = strcat(s, ":type=", Deathtype_Name(deathtype));
- s = strcat(s, ":items=");
- s = AppendItemcodes(s, killer);
- if(killed != killer)
- {
- s = strcat(s, ":victimitems=");
- s = AppendItemcodes(s, killed);
- }
- GameLogEcho(s);
-}
-
-void Obituary_SpecialDeath(
- entity notif_target,
- float murder,
- int deathtype,
- string s1, string s2, string s3,
- float f1, float f2, float f3)
-{
- if(!DEATH_ISSPECIAL(deathtype))
- {
- backtrace("Obituary_SpecialDeath called without a special deathtype?\n");
- return;
- }
-
- entity deathent = REGISTRY_GET(Deathtypes, deathtype - DT_FIRST);
- if (!deathent)
- {
- backtrace("Obituary_SpecialDeath: Could not find deathtype entity!\n");
- return;
- }
-
- if(g_cts && deathtype == DEATH_KILL.m_id)
- return; // TODO: somehow put this in CTS gamemode file!
-
- Notification death_message = (murder) ? deathent.death_msgmurder : deathent.death_msgself;
- if(death_message)
- {
- Send_Notification_WOCOVA(
- NOTIF_ONE,
- notif_target,
- MSG_MULTI,
- death_message,
- s1, s2, s3, "",
- f1, f2, f3, 0
- );
- Send_Notification_WOCOVA(
- NOTIF_ALL_EXCEPT,
- notif_target,
- MSG_INFO,
- death_message.nent_msginfo,
- s1, s2, s3, "",
- f1, f2, f3, 0
- );
- }
-}
-
-float Obituary_WeaponDeath(
- entity notif_target,
- float murder,
- int deathtype,
- string s1, string s2, string s3,
- float f1, float f2)
-{
- Weapon death_weapon = DEATH_WEAPONOF(deathtype);
- if (death_weapon == WEP_Null)
- return false;
-
- w_deathtype = deathtype;
- Notification death_message = ((murder) ? death_weapon.wr_killmessage(death_weapon) : death_weapon.wr_suicidemessage(death_weapon));
- w_deathtype = false;
-
- if (death_message)
- {
- Send_Notification_WOCOVA(
- NOTIF_ONE,
- notif_target,
- MSG_MULTI,
- death_message,
- s1, s2, s3, "",
- f1, f2, 0, 0
- );
- // send the info part to everyone
- Send_Notification_WOCOVA(
- NOTIF_ALL_EXCEPT,
- notif_target,
- MSG_INFO,
- death_message.nent_msginfo,
- s1, s2, s3, "",
- f1, f2, 0, 0
- );
- }
- else
- {
- LOG_TRACEF(
- "Obituary_WeaponDeath(): ^1Deathtype ^7(%d)^1 has no notification for weapon %s!\n",
- deathtype,
- death_weapon.netname
- );
- }
-
- return true;
-}
-
-bool frag_centermessage_override(entity attacker, entity targ, int deathtype, int kill_count_to_attacker, int kill_count_to_target)
-{
- if(deathtype == DEATH_FIRE.m_id)
- {
- Send_Notification(NOTIF_ONE, attacker, MSG_CHOICE, CHOICE_FRAG_FIRE, targ.netname, kill_count_to_attacker, (IS_BOT_CLIENT(targ) ? -1 : CS(targ).ping));
- Send_Notification(NOTIF_ONE, targ, MSG_CHOICE, CHOICE_FRAGGED_FIRE, attacker.netname, kill_count_to_target, GetResource(attacker, RES_HEALTH), GetResource(attacker, RES_ARMOR), (IS_BOT_CLIENT(attacker) ? -1 : CS(attacker).ping));
- return true;
- }
-
- return MUTATOR_CALLHOOK(FragCenterMessage, attacker, targ, deathtype, kill_count_to_attacker, kill_count_to_target);
-}
-
-void Obituary(entity attacker, entity inflictor, entity targ, int deathtype, .entity weaponentity)
-{
- // Sanity check
- if (!IS_PLAYER(targ)) { backtrace("Obituary called on non-player?!\n"); return; }
-
- // Declarations
- float notif_firstblood = false;
- float kill_count_to_attacker, kill_count_to_target;
-
- // Set final information for the death
- targ.death_origin = targ.origin;
- string deathlocation = (autocvar_notification_server_allows_location ? NearestLocation(targ.death_origin) : "");
-
- #ifdef NOTIFICATIONS_DEBUG
- Debug_Notification(
- sprintf(
- "Obituary(%s, %s, %s, %s = %d);\n",
- attacker.netname,
- inflictor.netname,
- targ.netname,
- Deathtype_Name(deathtype),
- deathtype
- )
- );
- #endif
-
- // =======
- // SUICIDE
- // =======
- if(targ == attacker)
- {
- if(DEATH_ISSPECIAL(deathtype))
- {
- if(deathtype == DEATH_TEAMCHANGE.m_id || deathtype == DEATH_AUTOTEAMCHANGE.m_id)
- {
- Obituary_SpecialDeath(targ, false, deathtype, targ.netname, deathlocation, "", targ.team, 0, 0);
- }
- else
- {
- switch(DEATH_ENT(deathtype))
- {
- case DEATH_MIRRORDAMAGE:
- {
- Obituary_SpecialDeath(targ, false, deathtype, targ.netname, deathlocation, "", CS(targ).killcount, 0, 0);
- break;
- }
-
- default:
- {
- Obituary_SpecialDeath(targ, false, deathtype, targ.netname, deathlocation, "", CS(targ).killcount, 0, 0);
- break;
- }
- }
- }
- }
- else if (!Obituary_WeaponDeath(targ, false, deathtype, targ.netname, deathlocation, "", CS(targ).killcount, 0))
- {
- backtrace("SUICIDE: what the hell happened here?\n");
- return;
- }
- LogDeath("suicide", deathtype, targ, targ);
- if(deathtype != DEATH_AUTOTEAMCHANGE.m_id) // special case: don't negate frags if auto switched
- GiveFrags(attacker, targ, -1, deathtype, weaponentity);
- }
-
- // ======
- // MURDER
- // ======
- else if(IS_PLAYER(attacker))
- {
- if(SAME_TEAM(attacker, targ))
- {
- LogDeath("tk", deathtype, attacker, targ);
- GiveFrags(attacker, targ, -1, deathtype, weaponentity);
-
- CS(attacker).killcount = 0;
-
- Send_Notification(NOTIF_ONE, attacker, MSG_CENTER, CENTER_DEATH_TEAMKILL_FRAG, targ.netname);
- Send_Notification(NOTIF_ONE, targ, MSG_CENTER, CENTER_DEATH_TEAMKILL_FRAGGED, attacker.netname);
- Send_Notification(NOTIF_ALL, NULL, MSG_INFO, APP_TEAM_NUM(targ.team, INFO_DEATH_TEAMKILL), targ.netname, attacker.netname, deathlocation, CS(targ).killcount);
-
- // In this case, the death message will ALWAYS be "foo was betrayed by bar"
- // No need for specific death/weapon messages...
- }
- else
- {
- LogDeath("frag", deathtype, attacker, targ);
- GiveFrags(attacker, targ, 1, deathtype, weaponentity);
-
- CS(attacker).taunt_soundtime = time + 1;
- CS(attacker).killcount = CS(attacker).killcount + 1;
-
- attacker.killsound += 1;
-
- // TODO: improve SPREE_ITEM and KILL_SPREE_LIST
- // these 2 macros are spread over multiple files
- #define SPREE_ITEM(counta,countb,center,normal,gentle) \
- case counta: \
- Send_Notification(NOTIF_ONE, attacker, MSG_ANNCE, ANNCE_KILLSTREAK_##countb); \
- if (!warmup_stage) \
- PlayerStats_GameReport_Event_Player(attacker, PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_##counta, 1); \
- break;
-
- switch(CS(attacker).killcount)
- {
- KILL_SPREE_LIST
- default: break;
- }
- #undef SPREE_ITEM
-
- if(!warmup_stage && !checkrules_firstblood)
- {
- checkrules_firstblood = true;
- notif_firstblood = true; // modify the current messages so that they too show firstblood information
- PlayerStats_GameReport_Event_Player(attacker, PLAYERSTATS_ACHIEVEMENT_FIRSTBLOOD, 1);
- PlayerStats_GameReport_Event_Player(targ, PLAYERSTATS_ACHIEVEMENT_FIRSTVICTIM, 1);
-
- // tell spree_inf and spree_cen that this is a first-blood and first-victim event
- kill_count_to_attacker = -1;
- kill_count_to_target = -2;
- }
- else
- {
- kill_count_to_attacker = CS(attacker).killcount;
- kill_count_to_target = 0;
- }
-
- if(targ.istypefrag)
- {
- Send_Notification(
- NOTIF_ONE,
- attacker,
- MSG_CHOICE,
- CHOICE_TYPEFRAG,
- targ.netname,
- kill_count_to_attacker,
- (IS_BOT_CLIENT(targ) ? -1 : CS(targ).ping)
- );
- Send_Notification(
- NOTIF_ONE,
- targ,
- MSG_CHOICE,
- CHOICE_TYPEFRAGGED,
- attacker.netname,
- kill_count_to_target,
- GetResource(attacker, RES_HEALTH),
- GetResource(attacker, RES_ARMOR),
- (IS_BOT_CLIENT(attacker) ? -1 : CS(attacker).ping)
- );
- }
- else if(!frag_centermessage_override(attacker, targ, deathtype, kill_count_to_attacker, kill_count_to_target))
- {
- Send_Notification(
- NOTIF_ONE,
- attacker,
- MSG_CHOICE,
- CHOICE_FRAG,
- targ.netname,
- kill_count_to_attacker,
- (IS_BOT_CLIENT(targ) ? -1 : CS(targ).ping)
- );
- Send_Notification(
- NOTIF_ONE,
- targ,
- MSG_CHOICE,
- CHOICE_FRAGGED,
- attacker.netname,
- kill_count_to_target,
- GetResource(attacker, RES_HEALTH),
- GetResource(attacker, RES_ARMOR),
- (IS_BOT_CLIENT(attacker) ? -1 : CS(attacker).ping)
- );
- }
-
- int f3 = 0;
- if(deathtype == DEATH_BUFF.m_id)
- f3 = buff_FirstFromFlags(STAT(BUFFS, attacker)).m_id;
-
- if (!Obituary_WeaponDeath(targ, true, deathtype, targ.netname, attacker.netname, deathlocation, CS(targ).killcount, kill_count_to_attacker))
- Obituary_SpecialDeath(targ, true, deathtype, targ.netname, attacker.netname, deathlocation, CS(targ).killcount, kill_count_to_attacker, f3);
- }
- }
-
- // =============
- // ACCIDENT/TRAP
- // =============
- else
- {
- switch(DEATH_ENT(deathtype))
- {
- // For now, we're just forcing HURTTRIGGER to behave as "DEATH_VOID" and giving it no special options...
- // Later on you will only be able to make custom messages using DEATH_CUSTOM,
- // and there will be a REAL DEATH_VOID implementation which mappers will use.
- case DEATH_HURTTRIGGER:
- {
- Obituary_SpecialDeath(targ, false, deathtype,
- targ.netname,
- inflictor.message,
- deathlocation,
- CS(targ).killcount,
- 0,
- 0);
- break;
- }
-
- case DEATH_CUSTOM:
- {
- Obituary_SpecialDeath(targ, false, deathtype,
- targ.netname,
- ((strstrofs(deathmessage, "%", 0) < 0) ? strcat("%s ", deathmessage) : deathmessage),
- deathlocation,
- CS(targ).killcount,
- 0,
- 0);
- break;
- }
-
- default:
- {
- Obituary_SpecialDeath(targ, false, deathtype, targ.netname, deathlocation, "", CS(targ).killcount, 0, 0);
- break;
- }
- }
-
- LogDeath("accident", deathtype, targ, targ);
- GiveFrags(targ, targ, -1, deathtype, weaponentity);
-
- if(GameRules_scoring_add(targ, SCORE, 0) == -5)
- {
- Send_Notification(NOTIF_ONE, targ, MSG_ANNCE, ANNCE_ACHIEVEMENT_BOTLIKE);
- if (!warmup_stage)
- {
- PlayerStats_GameReport_Event_Player(attacker, PLAYERSTATS_ACHIEVEMENT_BOTLIKE, 1);
- }
- }
- }
-
- // reset target kill count
- CS(targ).killcount = 0;
-}
-
-void Ice_Think(entity this)
-{
- if(!STAT(FROZEN, this.owner) || this.owner.iceblock != this)
- {
- delete(this);
- return;
- }
- vector ice_org = this.owner.origin - '0 0 16';
- if (this.origin != ice_org)
- setorigin(this, ice_org);
- this.nextthink = time;
-}
-
-void Freeze(entity targ, float revivespeed, int frozen_type, bool show_waypoint)
-{
- if(!IS_PLAYER(targ) && !IS_MONSTER(targ)) // TODO: only specified entities can be freezed
- return;
-
- if(STAT(FROZEN, targ))
- return;
-
- float targ_maxhealth = ((IS_MONSTER(targ)) ? targ.max_health : start_health);
-
- STAT(FROZEN, targ) = frozen_type;
- STAT(REVIVE_PROGRESS, targ) = ((frozen_type == FROZEN_TEMP_DYING) ? 1 : 0);
- SetResource(targ, RES_HEALTH, ((frozen_type == FROZEN_TEMP_DYING) ? targ_maxhealth : 1));
- targ.revive_speed = revivespeed;
- if(targ.bot_attack)
- IL_REMOVE(g_bot_targets, targ);
- targ.bot_attack = false;
- targ.freeze_time = time;
-
- entity ice = new(ice);
- ice.owner = targ;
- ice.scale = targ.scale;
- // set_movetype(ice, MOVETYPE_FOLLOW) would rotate the ice model with the player
- setthink(ice, Ice_Think);
- ice.nextthink = time;
- ice.frame = floor(random() * 21); // ice model has 20 different looking frames
- setmodel(ice, MDL_ICE);
- ice.alpha = 1;
- ice.colormod = Team_ColorRGB(targ.team);
- ice.glowmod = ice.colormod;
- targ.iceblock = ice;
- targ.revival_time = 0;
-
- Ice_Think(ice);
-
- RemoveGrapplingHooks(targ);
-
- FOREACH_CLIENT(IS_PLAYER(it),
- {
- for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
- {
- .entity weaponentity = weaponentities[slot];
- if(it.(weaponentity).hook.aiment == targ)
- RemoveHook(it.(weaponentity).hook);
- }
- });
-
- // add waypoint
- if(MUTATOR_CALLHOOK(Freeze, targ, revivespeed, frozen_type) || show_waypoint)
- WaypointSprite_Spawn(WP_Frozen, 0, 0, targ, '0 0 64', NULL, targ.team, targ, waypointsprite_attached, true, RADARICON_WAYPOINT);
-}
-
-void Unfreeze(entity targ, bool reset_health)
-{
- if(!STAT(FROZEN, targ))
- return;
-
- if (reset_health && STAT(FROZEN, targ) != FROZEN_TEMP_DYING)
- SetResource(targ, RES_HEALTH, ((IS_PLAYER(targ)) ? start_health : targ.max_health));
-
- targ.pauseregen_finished = time + autocvar_g_balance_pause_health_regen;
-
- STAT(FROZEN, targ) = 0;
- STAT(REVIVE_PROGRESS, targ) = 0;
- targ.revival_time = time;
- if(!targ.bot_attack)
- IL_PUSH(g_bot_targets, targ);
- targ.bot_attack = true;
-
- WaypointSprite_Kill(targ.waypointsprite_attached);
-
- FOREACH_CLIENT(IS_PLAYER(it),
- {
- for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
- {
- .entity weaponentity = weaponentities[slot];
- if(it.(weaponentity).hook.aiment == targ)
- RemoveHook(it.(weaponentity).hook);
- }
- });
-
- // remove the ice block
- if(targ.iceblock)
- delete(targ.iceblock);
- targ.iceblock = NULL;
-
- MUTATOR_CALLHOOK(Unfreeze, targ);
-}
-
-void Damage(entity targ, entity inflictor, entity attacker, float damage, int deathtype, .entity weaponentity, vector hitloc, vector force)
-{
- float complainteamdamage = 0;
- float mirrordamage = 0;
- float mirrorforce = 0;
-
- if (game_stopped || (IS_CLIENT(targ) && CS(targ).killcount == FRAGS_SPECTATOR))
- return;
-
- 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))
- {
- if(IS_PLAYER(targ) && SAME_TEAM(targ, attacker))
- {
- return;
- }
- }
-
- if(deathtype == DEATH_KILL.m_id || deathtype == DEATH_TEAMCHANGE.m_id || deathtype == DEATH_AUTOTEAMCHANGE.m_id)
- {
- // exit the vehicle before killing (fixes a crash)
- if(IS_PLAYER(targ) && targ.vehicle)
- vehicles_exit(targ.vehicle, VHEF_RELEASE);
-
- // These are ALWAYS lethal
- // No damage modification here
- // Instead, prepare the victim for his death...
- SetResourceExplicit(targ, RES_ARMOR, 0);
- targ.spawnshieldtime = 0;
- SetResourceExplicit(targ, RES_HEALTH, 0.9); // this is < 1
- targ.flags -= targ.flags & FL_GODMODE;
- damage = 100000;
- }
- else if(deathtype == DEATH_MIRRORDAMAGE.m_id || deathtype == DEATH_NOAMMO.m_id)
- {
- // no processing
- }
- else
- {
- // nullify damage if teamplay is on
- if(deathtype != DEATH_TELEFRAG.m_id)
- if(IS_PLAYER(attacker))
- {
- if(IS_PLAYER(targ) && targ != attacker && (IS_INDEPENDENT_PLAYER(attacker) || IS_INDEPENDENT_PLAYER(targ)))
- {
- damage = 0;
- force = '0 0 0';
- }
- else if(SAME_TEAM(attacker, targ))
- {
- if(autocvar_teamplay_mode == 1)
- damage = 0;
- else if(attacker != targ)
- {
- if(autocvar_teamplay_mode == 3)
- damage = 0;
- else if(autocvar_teamplay_mode == 4)
- {
- if(IS_PLAYER(targ) && !IS_DEAD(targ))
- {
- attacker.dmg_team = attacker.dmg_team + damage;
- complainteamdamage = attacker.dmg_team - autocvar_g_teamdamage_threshold;
- if(complainteamdamage > 0)
- mirrordamage = autocvar_g_mirrordamage * complainteamdamage;
- mirrorforce = autocvar_g_mirrordamage * vlen(force);
- damage = autocvar_g_friendlyfire * damage;
- // mirrordamage will be used LATER
-
- if(autocvar_g_mirrordamage_virtual)
- {
- vector v = healtharmor_applydamage(GetResource(attacker, RES_ARMOR), autocvar_g_balance_armor_blockpercent, deathtype, mirrordamage);
- attacker.dmg_take += v.x;
- attacker.dmg_save += v.y;
- attacker.dmg_inflictor = inflictor;
- mirrordamage = v.z;
- mirrorforce = 0;
- }
-
- if(autocvar_g_friendlyfire_virtual)
- {
- vector v = healtharmor_applydamage(GetResource(targ, RES_ARMOR), autocvar_g_balance_armor_blockpercent, deathtype, damage);
- targ.dmg_take += v.x;
- targ.dmg_save += v.y;
- targ.dmg_inflictor = inflictor;
- damage = 0;
- if(!autocvar_g_friendlyfire_virtual_force)
- force = '0 0 0';
- }
- }
- else if(!targ.canteamdamage)
- damage = 0;
- }
- }
- }
- }
-
- if (!DEATH_ISSPECIAL(deathtype))
- {
- damage *= g_weapondamagefactor;
- mirrordamage *= g_weapondamagefactor;
- complainteamdamage *= g_weapondamagefactor;
- force = force * g_weaponforcefactor;
- mirrorforce *= g_weaponforcefactor;
- }
-
- // should this be changed at all? If so, in what way?
- MUTATOR_CALLHOOK(Damage_Calculate, inflictor, attacker, targ, deathtype, damage, mirrordamage, force, attacker.(weaponentity));
- damage = M_ARGV(4, float);
- mirrordamage = M_ARGV(5, float);
- force = M_ARGV(6, vector);
-
- if(IS_PLAYER(targ) && damage > 0 && attacker)
- {
- for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
- {
- .entity went = weaponentities[slot];
- if(targ.(went).hook && targ.(went).hook.aiment == attacker)
- RemoveHook(targ.(went).hook);
- }
- }
-
- if(STAT(FROZEN, targ) && !ITEM_DAMAGE_NEEDKILL(deathtype)
- && deathtype != DEATH_TEAMCHANGE.m_id && deathtype != DEATH_AUTOTEAMCHANGE.m_id)
- {
- if(autocvar_g_frozen_revive_falldamage > 0 && deathtype == DEATH_FALL.m_id && damage >= autocvar_g_frozen_revive_falldamage)
- {
- Unfreeze(targ, false);
- SetResource(targ, RES_HEALTH, autocvar_g_frozen_revive_falldamage_health);
- Send_Effect(EFFECT_ICEORGLASS, targ.origin, '0 0 0', 3);
- Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_FREEZETAG_REVIVED_FALL, targ.netname);
- Send_Notification(NOTIF_ONE, targ, MSG_CENTER, CENTER_FREEZETAG_REVIVE_SELF);
- }
-
- damage = 0;
- force *= autocvar_g_frozen_force;
- }
-
- if(IS_PLAYER(targ) && STAT(FROZEN, targ)
- && ITEM_DAMAGE_NEEDKILL(deathtype) && !autocvar_g_frozen_damage_trigger)
- {
- Send_Effect(EFFECT_TELEPORT, targ.origin, '0 0 0', 1);
-
- entity spot = SelectSpawnPoint(targ, false);
- if(spot)
- {
- damage = 0;
- targ.deadflag = DEAD_NO;
-
- targ.angles = spot.angles;
-
- targ.effects = 0;
- targ.effects |= EF_TELEPORT_BIT;
-
- targ.angles_z = 0; // never spawn tilted even if the spot says to
- targ.fixangle = true; // turn this way immediately
- targ.velocity = '0 0 0';
- targ.avelocity = '0 0 0';
- targ.punchangle = '0 0 0';
- targ.punchvector = '0 0 0';
- targ.oldvelocity = targ.velocity;
-
- targ.spawnorigin = spot.origin;
- setorigin(targ, spot.origin + '0 0 1' * (1 - targ.mins.z - 24));
- // don't reset back to last position, even if new position is stuck in solid
- targ.oldorigin = targ.origin;
-
- Send_Effect(EFFECT_TELEPORT, targ.origin, '0 0 0', 1);
- }
- }
-
- if(!MUTATOR_IS_ENABLED(mutator_instagib))
- {
- // apply strength multiplier
- if (attacker.items & ITEM_Strength.m_itemid)
- {
- if(targ == attacker)
- {
- damage = damage * autocvar_g_balance_powerup_strength_selfdamage;
- force = force * autocvar_g_balance_powerup_strength_selfforce;
- }
- else
- {
- damage = damage * autocvar_g_balance_powerup_strength_damage;
- force = force * autocvar_g_balance_powerup_strength_force;
- }
- }
-
- // apply invincibility multiplier
- if (targ.items & ITEM_Shield.m_itemid)
- {
- damage = damage * autocvar_g_balance_powerup_invincible_takedamage;
- if (targ != attacker)
- {
- force = force * autocvar_g_balance_powerup_invincible_takeforce;
- }
- }
- }
-
- if (targ == attacker)
- damage = damage * autocvar_g_balance_selfdamagepercent; // Partial damage if the attacker hits himself
-
- // count the damage
- if(attacker)
- if(!IS_DEAD(targ))
- if(deathtype != DEATH_BUFF.m_id)
- if(targ.takedamage == DAMAGE_AIM)
- if(targ != attacker)
- {
- entity victim;
- if(IS_VEHICLE(targ) && targ.owner)
- victim = targ.owner;
- else
- victim = targ;
-
- if(IS_PLAYER(victim) || (IS_TURRET(victim) && victim.active == ACTIVE_ACTIVE) || IS_MONSTER(victim) || MUTATOR_CALLHOOK(PlayHitsound, victim, attacker))
- {
- if(DIFF_TEAM(victim, attacker) && !STAT(FROZEN, victim))
- {
- if(damage > 0)
- {
- if(deathtype != DEATH_FIRE.m_id)
- {
- if(PHYS_INPUT_BUTTON_CHAT(victim))
- attacker.typehitsound += 1;
- else
- attacker.damage_dealt += damage;
- }
-
- damage_goodhits += 1;
- damage_gooddamage += damage;
-
- if (!DEATH_ISSPECIAL(deathtype))
- {
- if(IS_PLAYER(targ)) // don't do this for vehicles
- if(IsFlying(victim))
- yoda = 1;
- }
- }
- }
- else if(IS_PLAYER(attacker))
- {
- // if enemy gets frozen in this frame and receives other damage don't
- // play the typehitsound e.g. when hit by multiple bullets of the shotgun
- if (deathtype != DEATH_FIRE.m_id && (!STAT(FROZEN, victim) || time > victim.freeze_time))
- {
- attacker.typehitsound += 1;
- }
- if(complainteamdamage > 0)
- if(time > CS(attacker).teamkill_complain)
- {
- CS(attacker).teamkill_complain = time + 5;
- CS(attacker).teamkill_soundtime = time + 0.4;
- CS(attacker).teamkill_soundsource = targ;
- }
- }
- }
- }
- }
-
- // apply push
- if (targ.damageforcescale)
- if (force)
- if (!IS_PLAYER(targ) || time >= targ.spawnshieldtime || targ == attacker)
- {
- vector farce = damage_explosion_calcpush(targ.damageforcescale * force, targ.velocity, autocvar_g_balance_damagepush_speedfactor);
- if(targ.move_movetype == MOVETYPE_PHYSICS)
- {
- entity farcent = new(farce);
- farcent.enemy = targ;
- farcent.movedir = farce * 10;
- if(targ.mass)
- farcent.movedir = farcent.movedir * targ.mass;
- farcent.origin = hitloc;
- farcent.forcetype = FORCETYPE_FORCEATPOS;
- farcent.nextthink = time + 0.1;
- setthink(farcent, SUB_Remove);
- }
- else
- {
- targ.velocity = targ.velocity + farce;
- }
- UNSET_ONGROUND(targ);
- UpdateCSQCProjectile(targ);
- }
- // apply damage
- if (damage != 0 || (targ.damageforcescale && force))
- if (targ.event_damage)
- targ.event_damage (targ, inflictor, attacker, damage, deathtype, weaponentity, hitloc, force);
-
- // apply mirror damage if any
- if(!autocvar_g_mirrordamage_onlyweapons || DEATH_WEAPONOF(deathtype) != WEP_Null)
- if(mirrordamage > 0 || mirrorforce > 0)
- {
- attacker = attacker_save;
-
- force = normalize(attacker.origin + attacker.view_ofs - hitloc) * mirrorforce;
- Damage(attacker, inflictor, attacker, mirrordamage, DEATH_MIRRORDAMAGE.m_id, weaponentity, attacker.origin, force);
- }
-}
-
-float RadiusDamageForSource (entity inflictor, vector inflictororigin, vector inflictorvelocity, entity attacker, float coredamage, float edgedamage, float rad, entity cantbe, entity mustbe,
- float inflictorselfdamage, float forceintensity, float forcezscale, int deathtype, .entity weaponentity, entity directhitentity)
- // Returns total damage applies to creatures
-{
- entity targ;
- vector force;
- float total_damage_to_creatures;
- entity next;
- float tfloordmg;
- float tfloorforce;
-
- float stat_damagedone;
-
- if(RadiusDamage_running)
- {
- backtrace("RadiusDamage called recursively! Expect stuff to go HORRIBLY wrong.");
- return 0;
- }
-
- RadiusDamage_running = 1;
-
- tfloordmg = autocvar_g_throughfloor_damage;
- tfloorforce = autocvar_g_throughfloor_force;
-
- 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)
- {
- force = inflictorvelocity;
- if(force == '0 0 0')
- force = '0 0 -1';
- else
- force = normalize(force);
- if(forceintensity >= 0)
- Damage_DamageInfo(inflictororigin, coredamage, edgedamage, rad, forceintensity * force, deathtype, 0, attacker);
- else
- Damage_DamageInfo(inflictororigin, coredamage, edgedamage, -rad, (-forceintensity) * force, deathtype, 0, attacker);
- }
-
- stat_damagedone = 0;
-
- targ = WarpZone_FindRadius (inflictororigin, rad + MAX_DAMAGEEXTRARADIUS, false);
- while (targ)
- {
- next = targ.chain;
- if ((targ != inflictor) || inflictorselfdamage)
- if (((cantbe != targ) && !mustbe) || (mustbe == targ))
- if (targ.takedamage)
- {
- vector nearest;
- vector diff;
- float power;
-
- // LordHavoc: measure distance to nearest point on target (not origin)
- // (this guarentees 100% damage on a touch impact)
- nearest = targ.WarpZone_findradius_nearest;
- diff = targ.WarpZone_findradius_dist;
- // round up a little on the damage to ensure full damage on impacts
- // and turn the distance into a fraction of the radius
- power = 1 - ((vlen (diff) - bound(MIN_DAMAGEEXTRARADIUS, targ.damageextraradius, MAX_DAMAGEEXTRARADIUS)) / rad);
- //bprint(" ");
- //bprint(ftos(power));
- //if (targ == attacker)
- // print(ftos(power), "\n");
- if (power > 0)
- {
- float finaldmg;
- if (power > 1)
- power = 1;
- finaldmg = coredamage * power + edgedamage * (1 - power);
- if (finaldmg > 0)
- {
- float a;
- float c;
- vector hitloc;
- vector myblastorigin;
- vector center;
-
- myblastorigin = WarpZone_TransformOrigin(targ, inflictororigin);
-
- // if it's a player, use the view origin as reference
- center = CENTER_OR_VIEWOFS(targ);
-
- force = normalize(center - myblastorigin);
- force = force * (finaldmg / coredamage) * forceintensity;
- hitloc = nearest;
-
- // apply special scaling along the z axis if set
- // NOTE: 0 value is not allowed for compatibility, in the case of weapon cvars not being set
- if(forcezscale)
- force.z *= forcezscale;
-
- if(targ != directhitentity)
- {
- float hits;
- float total;
- float hitratio;
- float mininv_f, mininv_d;
-
- // test line of sight to multiple positions on box,
- // and do damage if any of them hit
- hits = 0;
-
- // we know: max stddev of hitratio = 1 / (2 * sqrt(n))
- // so for a given max stddev:
- // n = (1 / (2 * max stddev of hitratio))^2
-
- mininv_d = (finaldmg * (1-tfloordmg)) / autocvar_g_throughfloor_damage_max_stddev;
- mininv_f = (vlen(force) * (1-tfloorforce)) / autocvar_g_throughfloor_force_max_stddev;
-
- if(autocvar_g_throughfloor_debug)
- LOG_INFOF("THROUGHFLOOR: D=%f F=%f max(dD)=1/%f max(dF)=1/%f", finaldmg, vlen(force), mininv_d, mininv_f);
-
-
- total = 0.25 * (max(mininv_f, mininv_d) ** 2);
-
- if(autocvar_g_throughfloor_debug)
- LOG_INFOF(" steps=%f", total);
-
-
- if (IS_PLAYER(targ))
- total = ceil(bound(autocvar_g_throughfloor_min_steps_player, total, autocvar_g_throughfloor_max_steps_player));
- else
- total = ceil(bound(autocvar_g_throughfloor_min_steps_other, total, autocvar_g_throughfloor_max_steps_other));
-
- if(autocvar_g_throughfloor_debug)
- LOG_INFOF(" steps=%f dD=%f dF=%f", total, finaldmg * (1-tfloordmg) / (2 * sqrt(total)), vlen(force) * (1-tfloorforce) / (2 * sqrt(total)));
-
- for(c = 0; c < total; ++c)
- {
- //traceline(targ.WarpZone_findradius_findorigin, nearest, MOVE_NOMONSTERS, inflictor);
- WarpZone_TraceLine(inflictororigin, WarpZone_UnTransformOrigin(targ, nearest), MOVE_NOMONSTERS, inflictor);
- if (trace_fraction == 1 || trace_ent == targ)
- {
- ++hits;
- if (hits > 1)
- hitloc = hitloc + nearest;
- else
- hitloc = nearest;
- }
- nearest.x = targ.origin.x + targ.mins.x + random() * targ.size.x;
- nearest.y = targ.origin.y + targ.mins.y + random() * targ.size.y;
- nearest.z = targ.origin.z + targ.mins.z + random() * targ.size.z;
- }
-
- nearest = hitloc * (1 / max(1, hits));
- hitratio = (hits / total);
- a = bound(0, tfloordmg + (1-tfloordmg) * hitratio, 1);
- finaldmg = finaldmg * a;
- a = bound(0, tfloorforce + (1-tfloorforce) * hitratio, 1);
- force = force * a;
-
- if(autocvar_g_throughfloor_debug)
- LOG_INFOF(" D=%f F=%f", finaldmg, vlen(force));
- }
-
- //if (targ == attacker)
- //{
- // print("hits ", ftos(hits), " / ", ftos(total));
- // print(" finaldmg ", ftos(finaldmg), " force ", vtos(force));
- // print(" (", ftos(a), ")\n");
- //}
- if(finaldmg || force)
- {
- if(targ.iscreature)
- {
- total_damage_to_creatures += finaldmg;
-
- if(accuracy_isgooddamage(attacker, targ))
- stat_damagedone += finaldmg;
- }
-
- if(targ == directhitentity || DEATH_ISSPECIAL(deathtype))
- Damage(targ, inflictor, attacker, finaldmg, deathtype, weaponentity, nearest, force);
- else
- Damage(targ, inflictor, attacker, finaldmg, deathtype | HITTYPE_SPLASH, weaponentity, nearest, force);
- }
- }
- }
- }
- targ = next;
- }
-
- RadiusDamage_running = 0;
-
- if(!DEATH_ISSPECIAL(deathtype))
- accuracy_add(attacker, DEATH_WEAPONOF(deathtype), 0, min(coredamage, stat_damagedone));
-
- return total_damage_to_creatures;
-}
-
-float RadiusDamage(entity inflictor, entity attacker, float coredamage, float edgedamage, float rad, entity cantbe, entity mustbe, float forceintensity, int deathtype, .entity weaponentity, entity directhitentity)
-{
- return RadiusDamageForSource(inflictor, (inflictor.origin + (inflictor.mins + inflictor.maxs) * 0.5), inflictor.velocity, attacker, coredamage, edgedamage, rad,
- cantbe, mustbe, false, forceintensity, 1, deathtype, weaponentity, directhitentity);
-}
-
-bool Heal(entity targ, entity inflictor, float amount, float limit)
-{
- if(game_stopped || (IS_CLIENT(targ) && CS(targ).killcount == FRAGS_SPECTATOR) || STAT(FROZEN, targ) || IS_DEAD(targ))
- return false;
-
- bool healed = false;
- if(targ.event_heal)
- healed = targ.event_heal(targ, inflictor, amount, limit);
- // TODO: additional handling? what if the healing kills them? should this abort if healing would do so etc
- // TODO: healing fx!
- // TODO: armor healing?
- return healed;
-}
-
-float Fire_IsBurning(entity e)
-{
- return (time < e.fire_endtime);
-}
-
-float Fire_AddDamage(entity e, entity o, float d, float t, float dt)
-{
- float dps;
- float maxtime, mintime, maxdamage, mindamage, maxdps, mindps, totaldamage, totaltime;
-
- if(IS_PLAYER(e))
- {
- if(IS_DEAD(e))
- return -1;
- }
- else
- {
- if(!e.fire_burner)
- {
- // print("adding a fire burner to ", e.classname, "\n");
- e.fire_burner = new(fireburner);
- setthink(e.fire_burner, fireburner_think);
- e.fire_burner.nextthink = time;
- e.fire_burner.owner = e;
- }
- }
-
- t = max(t, 0.1);
- dps = d / t;
- if(Fire_IsBurning(e))
- {
- mintime = e.fire_endtime - time;
- maxtime = max(mintime, t);
-
- mindps = e.fire_damagepersec;
- maxdps = max(mindps, dps);
-
- if(maxtime > mintime || maxdps > mindps)
- {
- // Constraints:
-
- // damage we have right now
- mindamage = mindps * mintime;
-
- // damage we want to get
- maxdamage = mindamage + d;
-
- // but we can't exceed maxtime * maxdps!
- totaldamage = min(maxdamage, maxtime * maxdps);
-
- // LEMMA:
- // Look at:
- // totaldamage = min(mindamage + d, maxtime * maxdps)
- // We see:
- // totaldamage <= maxtime * maxdps
- // ==> totaldamage / maxdps <= maxtime.
- // We also see:
- // totaldamage / mindps = min(mindamage / mindps + d, maxtime * maxdps / mindps)
- // >= min(mintime, maxtime)
- // ==> totaldamage / maxdps >= mintime.
-
- /*
- // how long do we damage then?
- // at least as long as before
- // but, never exceed maxdps
- totaltime = max(mintime, totaldamage / maxdps); // always <= maxtime due to lemma
- */
-
- // alternate:
- // at most as long as maximum allowed
- // but, never below mindps
- totaltime = min(maxtime, totaldamage / mindps); // always >= mintime due to lemma
-
- // assuming t > mintime, dps > mindps:
- // we get d = t * dps = maxtime * maxdps
- // totaldamage = min(maxdamage, maxtime * maxdps) = min(... + d, maxtime * maxdps) = maxtime * maxdps
- // totaldamage / maxdps = maxtime
- // totaldamage / mindps > totaldamage / maxdps = maxtime
- // FROM THIS:
- // a) totaltime = max(mintime, maxtime) = maxtime
- // b) totaltime = min(maxtime, totaldamage / maxdps) = maxtime
-
- // assuming t <= mintime:
- // we get maxtime = mintime
- // a) totaltime = max(mintime, ...) >= mintime, also totaltime <= maxtime by the lemma, therefore totaltime = mintime = maxtime
- // b) totaltime = min(maxtime, ...) <= maxtime, also totaltime >= mintime by the lemma, therefore totaltime = mintime = maxtime
-
- // assuming dps <= mindps:
- // we get mindps = maxdps.
- // With this, the lemma says that mintime <= totaldamage / mindps = totaldamage / maxdps <= maxtime.
- // a) totaltime = max(mintime, totaldamage / maxdps) = totaldamage / maxdps
- // b) totaltime = min(maxtime, totaldamage / mindps) = totaldamage / maxdps
-
- e.fire_damagepersec = totaldamage / totaltime;
- e.fire_endtime = time + totaltime;
- if(totaldamage > 1.2 * mindamage)
- {
- e.fire_deathtype = dt;
- if(e.fire_owner != o)
- {
- e.fire_owner = o;
- e.fire_hitsound = false;
- }
- }
- if(accuracy_isgooddamage(o, e))
- accuracy_add(o, DEATH_WEAPONOF(dt), 0, max(0, totaldamage - mindamage));
- return max(0, totaldamage - mindamage); // can never be negative, but to make sure
- }
- else
- return 0;
- }
- else
- {
- e.fire_damagepersec = dps;
- e.fire_endtime = time + t;
- e.fire_deathtype = dt;
- e.fire_owner = o;
- e.fire_hitsound = false;
- if(accuracy_isgooddamage(o, e))
- accuracy_add(o, DEATH_WEAPONOF(dt), 0, d);
- return d;
- }
-}
-
-void Fire_ApplyDamage(entity e)
-{
- float t, d, hi, ty;
- entity o;
-
- if (!Fire_IsBurning(e))
- return;
-
- for(t = 0, o = e.owner; o.owner && t < 16; o = o.owner, ++t);
- if(IS_NOT_A_CLIENT(o))
- o = e.fire_owner;
-
- // water and slime stop fire
- if(e.waterlevel)
- if(e.watertype != CONTENT_LAVA)
- e.fire_endtime = 0;
-
- // ice stops fire
- if(STAT(FROZEN, e))
- e.fire_endtime = 0;
-
- t = min(frametime, e.fire_endtime - time);
- d = e.fire_damagepersec * t;
-
- hi = e.fire_owner.damage_dealt;
- ty = e.fire_owner.typehitsound;
- Damage(e, e, e.fire_owner, d, e.fire_deathtype, DMG_NOWEP, e.origin, '0 0 0');
- if(e.fire_hitsound && e.fire_owner)
- {
- e.fire_owner.damage_dealt = hi;
- e.fire_owner.typehitsound = ty;
- }
- e.fire_hitsound = true;
-
- if(!IS_INDEPENDENT_PLAYER(e) && !STAT(FROZEN, e))
- {
- IL_EACH(g_damagedbycontents, it.damagedbycontents && it != e,
- {
- if(!IS_DEAD(it) && it.takedamage && !IS_INDEPENDENT_PLAYER(it))
- if(boxesoverlap(e.absmin, e.absmax, it.absmin, it.absmax))
- {
- t = autocvar_g_balance_firetransfer_time * (e.fire_endtime - time);
- d = autocvar_g_balance_firetransfer_damage * e.fire_damagepersec * t;
- Fire_AddDamage(it, o, d, t, DEATH_FIRE.m_id);
- }
- });
- }
-}
-
-void Fire_ApplyEffect(entity e)
-{
- if(Fire_IsBurning(e))
- e.effects |= EF_FLAME;
- else
- e.effects &= ~EF_FLAME;
-}
-
-void fireburner_think(entity this)
-{
- // for players, this is done in the regular loop
- if(wasfreed(this.owner))
- {
- delete(this);
- return;
- }
- Fire_ApplyEffect(this.owner);
- if(!Fire_IsBurning(this.owner))
- {
- this.owner.fire_burner = NULL;
- delete(this);
- return;
- }
- Fire_ApplyDamage(this.owner);
- this.nextthink = time;
-}
+++ /dev/null
-#pragma once
-
-#if defined(CSQC)
-#elif defined(MENUQC)
-#elif defined(SVQC)
- #include <server/defs.qh>
- #include <server/miscfunctions.qh>
- #include <lib/warpzone/common.qh>
- #include <common/constants.qh>
- #include <common/teams.qh>
- #include <common/util.qh>
- #include <common/weapons/_all.qh>
- #include "weapons/accuracy.qh"
- #include "weapons/csqcprojectile.qh"
- #include "weapons/selection.qh"
- #include <common/t_items.qh>
- #include "autocvars.qh"
- #include "constants.qh"
- #include "defs.qh"
- #include <common/notifications/all.qh>
- #include <common/deathtypes/all.qh>
- #include <server/mutators/_mod.qh>
- #include <common/turrets/sv_turrets.qh>
- #include <common/vehicles/all.qh>
- #include <lib/csqcmodel/sv_model.qh>
- #include <common/playerstats.qh>
- #include "g_hook.qh"
- #include "scores.qh"
- #include "spawnpoints.qh"
-#endif
-
-.float dmg;
-.float dmg_edge;
-.float dmg_force;
-.float dmg_radius;
-
-bool Damage_DamageInfo_SendEntity(entity this, entity to, int sf);
-
-void Damage_DamageInfo(vector org, float coredamage, float edgedamage, float rad, vector force, int deathtype, float bloodtype, entity dmgowner);
-
-float checkrules_firstblood;
-
-float yoda;
-float damage_goodhits;
-float damage_gooddamage;
-
-.float dmg_team;
-.float teamkill_complain;
-.float teamkill_soundtime;
-.entity teamkill_soundsource;
-.entity pusher;
-.bool istypefrag;
-.float taunt_soundtime;
-
-float IsFlying(entity a);
-
-void UpdateFrags(entity player, int f);
-
-// NOTE: f=0 means still count as a (positive) kill, but count no frags for it
-void W_SwitchWeapon_Force(Player this, Weapon w, .entity weaponentity);
-void GiveFrags (entity attacker, entity targ, float f, int deathtype, .entity weaponentity);
-
-string AppendItemcodes(string s, entity player);
-
-void LogDeath(string mode, int deathtype, entity killer, entity killed);
-
-void Obituary_SpecialDeath(
- entity notif_target,
- float murder,
- int deathtype,
- string s1, string s2, string s3,
- float f1, float f2, float f3);
-
-float w_deathtype;
-float Obituary_WeaponDeath(
- entity notif_target,
- float murder,
- int deathtype,
- string s1, string s2, string s3,
- float f1, float f2);
-
-void Obituary(entity attacker, entity inflictor, entity targ, int deathtype, .entity weaponentity);
-
-void Ice_Think(entity this);
-
-void Freeze(entity targ, float freeze_time, int frozen_type, bool show_waypoint);
-
-void Unfreeze(entity targ, bool reset_health);
-
-// NOTE: the .weaponentity parameter can be set to DMG_NOWEP if the attack wasn't caused by a weapon or player
-void Damage (entity targ, entity inflictor, entity attacker, float damage, int deathtype, .entity weaponentity, vector hitloc, vector force);
-
-float RadiusDamage_running;
-float RadiusDamageForSource (entity inflictor, vector inflictororigin, vector inflictorvelocity, entity attacker, float coredamage, float edgedamage, float rad, entity cantbe, entity mustbe, float inflictorselfdamage, float forceintensity, float forcezscale, int deathtype, .entity weaponentity, entity directhitentity);
- // Returns total damage applies to creatures
-
-float RadiusDamage (entity inflictor, entity attacker, float coredamage, float edgedamage, float rad, entity cantbe, entity mustbe, float forceintensity, int deathtype, .entity weaponentity, entity directhitentity);
-
-// Calls .event_heal on the target so that they can handle healing themselves
-// a limit of RES_LIMIT_NONE should be handled by the entity as its max health (if applicable)
-bool Heal(entity targ, entity inflictor, float amount, float limit);
-
-.float fire_damagepersec;
-.float fire_endtime;
-.float fire_deathtype;
-.entity fire_owner;
-.float fire_hitsound;
-.entity fire_burner;
-
-void fireburner_think(entity this);
-
-float Fire_IsBurning(entity e);
-
-float Fire_AddDamage(entity e, entity o, float d, float t, float dt);
-
-void Fire_ApplyDamage(entity e);
-
-void Fire_ApplyEffect(entity e);
+++ /dev/null
-#include "g_hook.qh"
-
-#include <server/defs.qh>
-#include <server/miscfunctions.qh>
-#include <common/effects/all.qh>
-#include "weapons/common.qh"
-#include "weapons/csqcprojectile.qh"
-#include "weapons/weaponsystem.qh"
-#include "weapons/selection.qh"
-#include "weapons/tracing.qh"
-#include "player.qh"
-#include "command/common.qh"
-#include "round_handler.qh"
-#include "../common/state.qh"
-#include "../common/physics/player.qh"
-#include "../common/vehicles/all.qh"
-#include "../common/constants.qh"
-#include "../common/util.qh"
-#include <common/net_linked.qh>
-#include <common/weapons/_all.qh>
-#include "../lib/warpzone/common.qh"
-#include "../lib/warpzone/server.qh"
-
-/*============================================
-
- Wazat's Xonotic Grappling Hook
-
- Contact: Wazat1@gmail.com
-
-
-Installation instructions:
---------------------------
-
-1. Place hook.c in your gamec source directory with the other source files.
-
-2. Add this line to the bottom of progs.src:
-
-gamec/hook.c
-
-3. Open defs.h and add these lines to the very bottom:
-
-// Wazat's grappling hook
-.entity hook;
-void GrapplingHookFrame();
-void RemoveGrapplingHook(entity pl);
-void SetGrappleHookBindings();
-// hook impulses
-const float GRAPHOOK_FIRE = 20;
-const float GRAPHOOK_RELEASE = 21;
-// (note: you can change the hook impulse #'s to whatever you please)
-
-4. Open client.c and add this to the top of PutClientInServer():
-
- RemoveGrapplingHook(this); // Wazat's Grappling Hook
-
-5. Find ClientConnect() (in client.c) and add these lines to the bottom:
-
- // Wazat's grappling hook
- SetGrappleHookBindings();
-
-6. Still in client.c, find PlayerPreThink and add this line just above the call to W_WeaponFrame:
-
- GrapplingHookFrame();
-
-7. Build and test the mod. You'll want to bind a key to "+hook" like this:
-bind ctrl "+hook"
-
-And you should be done!
-
-
-============================================*/
-
-void RemoveGrapplingHooks(entity pl)
-{
- if(pl.move_movetype == MOVETYPE_FLY)
- set_movetype(pl, MOVETYPE_WALK);
-
- for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
- {
- .entity weaponentity = weaponentities[slot];
- if(!pl.(weaponentity))
- continue; // continue incase other slots exist?
- if(pl.(weaponentity).hook)
- delete(pl.(weaponentity).hook);
- pl.(weaponentity).hook = NULL;
- }
-
- //pl.disableclientprediction = false;
-}
-
-void RemoveHook(entity this)
-{
- entity player = this.realowner;
- .entity weaponentity = this.weaponentity_fld;
-
- if(player.(weaponentity).hook == this)
- player.(weaponentity).hook = NULL;
-
- if(player.move_movetype == MOVETYPE_FLY)
- set_movetype(player, MOVETYPE_WALK);
- delete(this);
-}
-
-void GrapplingHookReset(entity this)
-{
- RemoveHook(this);
-}
-
-void GrapplingHook_Stop(entity this)
-{
- Send_Effect(EFFECT_HOOK_IMPACT, this.origin, '0 0 0', 1);
- sound (this, CH_SHOTS, SND_HOOK_IMPACT, VOL_BASE, ATTEN_NORM);
-
- this.state = 1;
- setthink(this, GrapplingHookThink);
- this.nextthink = time;
- settouch(this, func_null);
- this.velocity = '0 0 0';
- set_movetype(this, MOVETYPE_NONE);
- this.hook_length = -1;
-}
-
-.vector hook_start, hook_end;
-bool GrapplingHookSend(entity this, entity to, int sf)
-{
- WriteHeader(MSG_ENTITY, ENT_CLIENT_HOOK);
- sf = sf & 0x7F;
- if(sound_allowed(MSG_BROADCAST, this.realowner))
- sf |= 0x80;
- WriteByte(MSG_ENTITY, sf);
- if(sf & 1)
- {
- WriteByte(MSG_ENTITY, etof(this.realowner));
- WriteByte(MSG_ENTITY, weaponslot(this.weaponentity_fld));
- }
- if(sf & 2)
- {
- WriteVector(MSG_ENTITY, this.hook_start);
- }
- if(sf & 4)
- {
- WriteVector(MSG_ENTITY, this.hook_end);
- }
- return true;
-}
-
-int autocvar_g_grappling_hook_tarzan;
-
-void GrapplingHookThink(entity this)
-{
- float spd, dist, minlength, pullspeed, ropestretch, ropeairfriction, rubberforce, newlength, rubberforce_overstretch;
- vector dir, org, end, v0, dv, v, myorg, vs;
- .entity weaponentity = this.weaponentity_fld;
- if(this.realowner.(weaponentity).hook != this) // how did that happen?
- {
- error("Owner lost the hook!\n");
- return;
- }
- if(LostMovetypeFollow(this) || game_stopped || (round_handler_IsActive() && !round_handler_IsRoundStarted()) || ((this.aiment.flags & FL_PROJECTILE) && this.aiment.classname != "nade"))
- {
- RemoveHook(this);
- return;
- }
- if(this.aiment)
- WarpZone_RefSys_AddIncrementally(this, this.aiment);
-
- this.nextthink = time;
-
- int s = W_GunAlign(this.realowner.(weaponentity), STAT(GUNALIGN, this.realowner)) - 1;
- vs = hook_shotorigin[s];
-
- makevectors(this.realowner.v_angle);
- org = this.realowner.origin + this.realowner.view_ofs + v_forward * vs.x + v_right * -vs.y + v_up * vs.z;
- myorg = WarpZone_RefSys_TransformOrigin(this.realowner, this, org);
-
- if(this.hook_length < 0)
- this.hook_length = vlen(myorg - this.origin);
-
- int tarzan = autocvar_g_grappling_hook_tarzan;
- entity pull_entity = this.realowner;
- float velocity_multiplier = 1;
- MUTATOR_CALLHOOK(GrappleHookThink, this, tarzan, pull_entity, velocity_multiplier);
- tarzan = M_ARGV(1, int);
- pull_entity = M_ARGV(2, entity);
- velocity_multiplier = M_ARGV(3, float);
-
- if(this.state == 1)
- {
- pullspeed = autocvar_g_balance_grapplehook_speed_pull;//2000;
- // speed the rope is pulled with
-
- rubberforce = autocvar_g_balance_grapplehook_force_rubber;//2000;
- // force the rope will use if it is stretched
-
- rubberforce_overstretch = autocvar_g_balance_grapplehook_force_rubber_overstretch;//1000;
- // force the rope will use if it is stretched
-
- minlength = autocvar_g_balance_grapplehook_length_min;//100;
- // minimal rope length
- // if the rope goes below this length, it isn't pulled any more
-
- ropestretch = autocvar_g_balance_grapplehook_stretch;//400;
- // if the rope is stretched by more than this amount, more rope is
- // given to you again
-
- ropeairfriction = autocvar_g_balance_grapplehook_airfriction;//0.2
- // while hanging on the rope, this friction component will help you a
- // bit to control the rope
-
- bool frozen_pulling = (autocvar_g_grappling_hook_tarzan >= 2 && autocvar_g_balance_grapplehook_pull_frozen);
-
- dir = this.origin - myorg;
- dist = vlen(dir);
- dir = normalize(dir);
-
- if(tarzan)
- {
- v = v0 = WarpZone_RefSys_TransformVelocity(pull_entity, this, pull_entity.velocity);
-
- // first pull the rope...
- if(this.realowner.(weaponentity).hook_state & HOOK_PULLING)
- {
- newlength = this.hook_length;
- newlength = max(newlength - pullspeed * frametime, minlength);
-
- if(newlength < dist - ropestretch) // overstretched?
- {
- newlength = dist - ropestretch;
- if(v * dir < 0) // only if not already moving in hook direction
- v = v + frametime * dir * rubberforce_overstretch;
- }
-
- this.hook_length = newlength;
- }
-
- if(pull_entity.move_movetype == MOVETYPE_FLY)
- set_movetype(pull_entity, MOVETYPE_WALK);
-
- if(this.realowner.(weaponentity).hook_state & HOOK_RELEASING)
- {
- newlength = dist;
- this.hook_length = newlength;
- }
- else
- {
- // then pull the player
- spd = bound(0, (dist - this.hook_length) / ropestretch, 1);
- v = v * (1 - frametime * ropeairfriction);
- v = v + frametime * dir * spd * rubberforce;
-
- dv = ((v - v0) * dir) * dir;
- if(tarzan >= 2)
- {
- if(this.aiment.move_movetype == MOVETYPE_WALK || this.aiment.classname == "nade")
- {
- entity aim_ent = ((IS_VEHICLE(this.aiment) && this.aiment.owner) ? this.aiment.owner : this.aiment);
- v = v - dv * 0.5;
- if((frozen_pulling && STAT(FROZEN, this.aiment)) || !frozen_pulling)
- {
- this.aiment.velocity = this.aiment.velocity - dv * 0.5;
- UNSET_ONGROUND(this.aiment);
- if(this.aiment.flags & FL_PROJECTILE)
- UpdateCSQCProjectile(this.aiment);
- }
- if(this.aiment.classname == "nade")
- this.aiment.nextthink = time + autocvar_g_balance_grapplehook_nade_time; // set time after letting go?
- aim_ent.pusher = this.realowner;
- aim_ent.pushltime = time + autocvar_g_maxpushtime;
- aim_ent.istypefrag = PHYS_INPUT_BUTTON_CHAT(aim_ent);
- }
- }
-
- UNSET_ONGROUND(pull_entity);
- }
-
- if(!frozen_pulling && !(this.aiment.flags & FL_PROJECTILE))
- pull_entity.velocity = WarpZone_RefSys_TransformVelocity(this, pull_entity, v * velocity_multiplier);
-
- if(frozen_pulling && autocvar_g_balance_grapplehook_pull_frozen == 2 && !STAT(FROZEN, this.aiment))
- {
- RemoveHook(this);
- return;
- }
- }
- else
- {
- end = this.origin - dir*50;
- dist = vlen(end - myorg);
- if(dist < 200)
- spd = dist * (pullspeed / 200);
- else
- spd = pullspeed;
- if(spd < 50)
- spd = 0;
- this.realowner.velocity = dir*spd;
- set_movetype(this.realowner, MOVETYPE_FLY);
-
- UNSET_ONGROUND(this.realowner);
- }
- }
-
- makevectors(this.angles.x * '-1 0 0' + this.angles.y * '0 1 0');
- myorg = WarpZone_RefSys_TransformOrigin(this, this.realowner, this.origin); // + v_forward * (-9);
-
- if(myorg != this.hook_start)
- {
- this.SendFlags |= 2;
- this.hook_start = myorg;
- }
- if(org != this.hook_end)
- {
- this.SendFlags |= 4;
- this.hook_end = org;
- }
-}
-
-void GrapplingHookTouch(entity this, entity toucher)
-{
- if(toucher.move_movetype == MOVETYPE_FOLLOW)
- return;
- PROJECTILE_TOUCH(this, toucher);
-
- GrapplingHook_Stop(this);
-
- if(toucher)
- //if(toucher.move_movetype != MOVETYPE_NONE)
- {
- SetMovetypeFollow(this, toucher);
- WarpZone_RefSys_BeginAddingIncrementally(this, this.aiment);
- }
-
- //this.realowner.disableclientprediction = true;
-}
-
-void GrapplingHook_Damage(entity this, entity inflictor, entity attacker, float damage, int deathtype, .entity weaponentity, vector hitloc, vector force)
-{
- if(GetResource(this, RES_HEALTH) <= 0)
- return;
-
- if (!W_CheckProjectileDamage(inflictor.realowner, this.realowner, deathtype, -1)) // no exceptions
- return; // g_balance_projectiledamage says to halt
-
- TakeResource(this, RES_HEALTH, damage);
-
- if (GetResource(this, RES_HEALTH) <= 0)
- {
- if(attacker != this.realowner)
- {
- this.realowner.pusher = attacker;
- this.realowner.pushltime = time + autocvar_g_maxpushtime;
- this.realowner.istypefrag = PHYS_INPUT_BUTTON_CHAT(this.realowner);
- }
- RemoveHook(this);
- }
-}
-
-void FireGrapplingHook(entity actor, .entity weaponentity)
-{
- if(weaponLocked(actor)) return;
- if(actor.vehicle) return;
-
- int s = W_GunAlign(actor.(weaponentity), STAT(GUNALIGN, actor)) - 1;
- vector vs = hook_shotorigin[s];
- 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);
- actor.(weaponentity).movedir = oldmovedir;
-
- entity missile = WarpZone_RefSys_SpawnSameRefSys(actor);
- missile.owner = missile.realowner = actor;
- actor.(weaponentity).hook = missile;
- missile.weaponentity_fld = weaponentity;
- missile.reset = GrapplingHookReset;
- missile.classname = "grapplinghook";
- missile.flags = FL_PROJECTILE;
- IL_PUSH(g_projectiles, missile);
- IL_PUSH(g_bot_dodge, missile);
-
- set_movetype(missile, ((autocvar_g_balance_grapplehook_gravity) ? MOVETYPE_TOSS : MOVETYPE_FLY));
- PROJECTILE_MAKETRIGGER(missile);
-
- //setmodel (missile, MDL_HOOK); // precision set below
- setsize (missile, '-3 -3 -3', '3 3 3');
- setorigin(missile, w_shotorg);
-
- missile.state = 0; // not latched onto anything
-
- W_SetupProjVelocity_Explicit(missile, w_shotdir, v_up, autocvar_g_balance_grapplehook_speed_fly, 0, 0, 0, false);
-
- missile.angles = vectoangles (missile.velocity);
- //missile.glow_color = 250; // 244, 250
- //missile.glow_size = 120;
- settouch(missile, GrapplingHookTouch);
- setthink(missile, GrapplingHookThink);
- missile.nextthink = time;
-
- missile.effects = /*EF_FULLBRIGHT | EF_ADDITIVE |*/ EF_LOWPRECISION;
-
- SetResourceExplicit(missile, RES_HEALTH, autocvar_g_balance_grapplehook_health);
- missile.event_damage = GrapplingHook_Damage;
- missile.takedamage = DAMAGE_AIM;
- missile.damageforcescale = 0;
- missile.damagedbycontents = (autocvar_g_balance_grapplehook_damagedbycontents);
- if(missile.damagedbycontents)
- IL_PUSH(g_damagedbycontents, missile);
-
- missile.hook_start = missile.hook_end = missile.origin;
-
- Net_LinkEntity(missile, false, 0, GrapplingHookSend);
-}
-
-void GrappleHookInit()
-{
- if(g_grappling_hook)
- {
- hook_shotorigin[0] = '8 8 -12';
- hook_shotorigin[1] = '8 8 -12';
- hook_shotorigin[2] = '8 8 -12';
- hook_shotorigin[3] = '8 8 -12';
- }
- else
- {
- Weapon w = WEP_HOOK;
- w.wr_init(w);
- hook_shotorigin[0] = shotorg_adjust_values(CL_Weapon_GetShotOrg(WEP_HOOK.m_id), false, false, 1);
- hook_shotorigin[1] = shotorg_adjust_values(CL_Weapon_GetShotOrg(WEP_HOOK.m_id), false, false, 2);
- hook_shotorigin[2] = shotorg_adjust_values(CL_Weapon_GetShotOrg(WEP_HOOK.m_id), false, false, 3);
- hook_shotorigin[3] = shotorg_adjust_values(CL_Weapon_GetShotOrg(WEP_HOOK.m_id), false, false, 4);
- }
-}
+++ /dev/null
-#pragma once
-
-// Wazat's grappling hook
-.entity hook;
-void GrapplingHookThink(entity this);
-void RemoveGrapplingHooks(entity pl);
-void RemoveHook(entity this);
-// (note: you can change the hook impulse #'s to whatever you please)
-.float hook_time;
-
-.float hook_length;
-
-const float HOOK_FIRING = BIT(0);
-const float HOOK_REMOVING = BIT(1);
-const float HOOK_PULLING = BIT(2);
-const float HOOK_RELEASING = BIT(3);
-const float HOOK_WAITING_FOR_RELEASE = BIT(4);
-.float hook_state;
-.int state;
-
-void GrappleHookInit();
-vector hook_shotorigin[4];
-
+++ /dev/null
-#include "g_world.qh"
-
-#include "anticheat.qh"
-#include "antilag.qh"
-#include "bot/api.qh"
-#include "campaign.qh"
-#include "cheats.qh"
-#include "client.qh"
-#include "command/common.qh"
-#include "command/getreplies.qh"
-#include "command/sv_cmd.qh"
-#include "command/vote.qh"
-#include "g_hook.qh"
-#include "ipban.qh"
-#include "mapvoting.qh"
-#include <server/mutators/_mod.qh>
-#include "race.qh"
-#include "scores.qh"
-#include "scores_rules.qh"
-#include "teamplay.qh"
-#include "weapons/weaponstats.qh"
-#include "../common/constants.qh"
-#include <common/net_linked.qh>
-#include "../common/deathtypes/all.qh"
-#include "../common/gamemodes/sv_rules.qh"
-#include "../common/mapinfo.qh"
-#include "../common/monsters/_mod.qh"
-#include "../common/monsters/sv_monsters.qh"
-#include "../common/vehicles/all.qh"
-#include "../common/notifications/all.qh"
-#include "../common/physics/player.qh"
-#include "../common/playerstats.qh"
-#include "../common/stats.qh"
-#include "../common/teams.qh"
-#include "../common/mapobjects/trigger/secret.qh"
-#include "../common/mapobjects/target/music.qh"
-#include "../common/util.qh"
-#include "../common/items/_mod.qh"
-#include <common/weapons/_all.qh>
-#include "../common/state.qh"
-
-const float LATENCY_THINKRATE = 10;
-.float latency_sum;
-.float latency_cnt;
-.float latency_time;
-entity pingplreport;
-void PingPLReport_Think(entity this)
-{
- float delta;
- entity e;
-
- delta = 3 / maxclients;
- if(delta < sys_frametime)
- delta = 0;
- this.nextthink = time + delta;
-
- e = edict_num(this.cnt + 1);
- if(IS_CLIENT(e) && IS_REAL_CLIENT(e))
- {
- WriteHeader(MSG_BROADCAST, TE_CSQC_PINGPLREPORT);
- WriteByte(MSG_BROADCAST, this.cnt);
- WriteShort(MSG_BROADCAST, bound(1, CS(e).ping, 65535));
- WriteByte(MSG_BROADCAST, min(ceil(CS(e).ping_packetloss * 255), 255));
- WriteByte(MSG_BROADCAST, min(ceil(CS(e).ping_movementloss * 255), 255));
-
- // record latency times for clients throughout the match so we can report it to playerstats
- if(time > (CS(e).latency_time + LATENCY_THINKRATE))
- {
- CS(e).latency_sum += CS(e).ping;
- CS(e).latency_cnt += 1;
- CS(e).latency_time = time;
- //print("sum: ", ftos(CS(e).latency_sum), ", cnt: ", ftos(CS(e).latency_cnt), ", avg: ", ftos(CS(e).latency_sum / CS(e).latency_cnt), ".\n");
- }
- }
- else
- {
- WriteHeader(MSG_BROADCAST, TE_CSQC_PINGPLREPORT);
- WriteByte(MSG_BROADCAST, this.cnt);
- WriteShort(MSG_BROADCAST, 0);
- WriteByte(MSG_BROADCAST, 0);
- WriteByte(MSG_BROADCAST, 0);
- }
- this.cnt = (this.cnt + 1) % maxclients;
-}
-void PingPLReport_Spawn()
-{
- pingplreport = new_pure(pingplreport);
- setthink(pingplreport, PingPLReport_Think);
- pingplreport.nextthink = time;
-}
-
-const float SPAWNFLAG_NO_WAYPOINTS_FOR_ITEMS = 1;
-string redirection_target;
-float world_initialized;
-
-void SetDefaultAlpha()
-{
- if (!MUTATOR_CALLHOOK(SetDefaultAlpha))
- {
- default_player_alpha = autocvar_g_player_alpha;
- if(default_player_alpha == 0)
- default_player_alpha = 1;
- default_weapon_alpha = default_player_alpha;
- }
-}
-
-void GotoFirstMap(entity this)
-{
- float n;
- if(autocvar__sv_init)
- {
- // cvar_set("_sv_init", "0");
- // we do NOT set this to 0 any more, so someone "accidentally" changing
- // to this "init" map on a dedicated server will cause no permanent
- // harm
- if(autocvar_g_maplist_shuffle)
- ShuffleMaplist();
- n = tokenizebyseparator(autocvar_g_maplist, " ");
- cvar_set("g_maplist_index", ftos(n - 1)); // jump to map 0 in GotoNextMap
-
- MapInfo_Enumerate();
- MapInfo_FilterGametype(MapInfo_CurrentGametype(), MapInfo_CurrentFeatures(), MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags(), 0);
-
- if(!DoNextMapOverride(1))
- GotoNextMap(1);
-
- return;
- }
-
- if(time < 5)
- {
- this.nextthink = time;
- }
- else
- {
- this.nextthink = time + 1;
- LOG_INFO("Waiting for _sv_init being set to 1 by initialization scripts...");
- }
-}
-
-void cvar_changes_init()
-{
- float h;
- string k, v, d;
- float n, i, adding, pureadding;
-
- strfree(cvar_changes);
- strfree(cvar_purechanges);
- cvar_purechanges_count = 0;
-
- h = buf_create();
- buf_cvarlist(h, "", "_"); // exclude all _ cvars as they are temporary
- n = buf_getsize(h);
-
- adding = true;
- pureadding = true;
-
- for(i = 0; i < n; ++i)
- {
- k = bufstr_get(h, i);
-
-#define BADPREFIX(p) if(substring(k, 0, strlen(p)) == p) continue
-#define BADPRESUFFIX(p,s) if(substring(k, 0, strlen(p)) == p && substring(k, -strlen(s), -1) == s) continue
-#define BADCVAR(p) if(k == p) continue
-
- // general excludes and namespaces for server admin used cvars
- BADPREFIX("help_"); // PN's server has this listed as changed, let's not rat him out for THAT
-
- // internal
- BADPREFIX("csqc_");
- BADPREFIX("cvar_check_");
- BADCVAR("gamecfg");
- BADCVAR("g_configversion");
- BADCVAR("halflifebsp");
- BADCVAR("sv_mapformat_is_quake2");
- BADCVAR("sv_mapformat_is_quake3");
- BADPREFIX("sv_world");
-
- // client
- BADPREFIX("chase_");
- BADPREFIX("cl_");
- BADPREFIX("con_");
- BADPREFIX("scoreboard_");
- BADPREFIX("g_campaign");
- BADPREFIX("g_waypointsprite_");
- BADPREFIX("gl_");
- BADPREFIX("joy");
- BADPREFIX("hud_");
- BADPREFIX("m_");
- BADPREFIX("menu_");
- BADPREFIX("net_slist_");
- BADPREFIX("r_");
- BADPREFIX("sbar_");
- BADPREFIX("scr_");
- BADPREFIX("snd_");
- BADPREFIX("show");
- BADPREFIX("sensitivity");
- BADPREFIX("userbind");
- BADPREFIX("v_");
- BADPREFIX("vid_");
- BADPREFIX("crosshair");
- BADCVAR("mod_q3bsp_lightmapmergepower");
- BADCVAR("mod_q3bsp_nolightmaps");
- BADCVAR("fov");
- BADCVAR("mastervolume");
- BADCVAR("volume");
- BADCVAR("bgmvolume");
- BADCVAR("in_pitch_min");
- BADCVAR("in_pitch_max");
-
- // private
- BADCVAR("developer");
- BADCVAR("log_dest_udp");
- BADCVAR("net_address");
- BADCVAR("net_address_ipv6");
- BADCVAR("port");
- BADCVAR("savedgamecfg");
- BADCVAR("serverconfig");
- BADCVAR("sv_autoscreenshot");
- BADCVAR("sv_heartbeatperiod");
- BADCVAR("sv_vote_master_password");
- BADCVAR("sys_colortranslation");
- BADCVAR("sys_specialcharactertranslation");
- BADCVAR("timeformat");
- BADCVAR("timestamps");
- BADCVAR("g_require_stats");
- BADPREFIX("developer_");
- BADPREFIX("g_ban_");
- BADPREFIX("g_banned_list");
- BADPREFIX("g_require_stats_");
- BADPREFIX("g_chat_flood_");
- BADPREFIX("g_ghost_items");
- BADPREFIX("g_playerstats_");
- BADPREFIX("g_voice_flood_");
- BADPREFIX("log_file");
- BADPREFIX("quit_");
- BADPREFIX("rcon_");
- BADPREFIX("sv_allowdownloads");
- BADPREFIX("sv_autodemo");
- BADPREFIX("sv_curl_");
- BADPREFIX("sv_eventlog");
- BADPREFIX("sv_logscores_");
- BADPREFIX("sv_master");
- BADPREFIX("sv_weaponstats_");
- BADPREFIX("sv_waypointsprite_");
- BADCVAR("rescan_pending");
-
- // these can contain player IDs, so better hide
- BADPREFIX("g_forced_team_");
- BADCVAR("sv_muteban_list");
- BADCVAR("sv_voteban_list");
- BADCVAR("sv_allow_customplayermodels_idlist");
- BADCVAR("sv_allow_customplayermodels_speciallist");
-
- // mapinfo
- BADCVAR("fraglimit");
- BADCVAR("g_arena");
- BADCVAR("g_assault");
- BADCVAR("g_ca");
- BADCVAR("g_ca_teams");
- BADCVAR("g_conquest");
- BADCVAR("g_ctf");
- BADCVAR("g_cts");
- BADCVAR("g_dotc");
- BADCVAR("g_dm");
- BADCVAR("g_domination");
- BADCVAR("g_domination_default_teams");
- BADCVAR("g_duel");
- BADCVAR("g_duel_not_dm_maps");
- BADCVAR("g_freezetag");
- BADCVAR("g_freezetag_teams");
- BADCVAR("g_invasion_teams");
- BADCVAR("g_invasion_type");
- BADCVAR("g_jailbreak");
- BADCVAR("g_jailbreak_teams");
- BADCVAR("g_keepaway");
- BADCVAR("g_keyhunt");
- BADCVAR("g_keyhunt_teams");
- BADCVAR("g_lms");
- BADCVAR("g_nexball");
- BADCVAR("g_onslaught");
- BADCVAR("g_race");
- BADCVAR("g_race_laps_limit");
- BADCVAR("g_race_qualifying_timelimit");
- BADCVAR("g_race_qualifying_timelimit_override");
- BADCVAR("g_runematch");
- BADCVAR("g_shootfromeye");
- BADCVAR("g_snafu");
- BADCVAR("g_tdm");
- BADCVAR("g_tdm_on_dm_maps");
- BADCVAR("g_tdm_teams");
- BADCVAR("g_vip");
- BADCVAR("leadlimit");
- BADCVAR("nextmap");
- BADCVAR("teamplay");
- BADCVAR("timelimit");
- BADCVAR("g_mapinfo_ignore_warnings");
- BADCVAR("g_maplist_ignore_sizes");
- BADCVAR("g_maplist_sizes_count_bots");
-
- // long
- BADCVAR("hostname");
- BADCVAR("g_maplist");
- BADCVAR("g_maplist_mostrecent");
- BADCVAR("sv_motd");
-
- v = cvar_string(k);
- d = cvar_defstring(k);
- if(v == d)
- continue;
-
- if(adding)
- {
- cvar_changes = strcat(cvar_changes, k, " \"", v, "\" // \"", d, "\"\n");
- if(strlen(cvar_changes) > 16384)
- {
- cvar_changes = "// too many settings have been changed to show them here\n";
- adding = 0;
- }
- }
-
- // now check if the changes are actually gameplay relevant
-
- // does nothing gameplay relevant
- BADCVAR("captureleadlimit_override");
- BADCVAR("condump_stripcolors");
- BADCVAR("gameversion");
- BADCVAR("fs_gamedir");
- BADCVAR("g_allow_oldvortexbeam");
- BADCVAR("g_balance_kill_delay");
- BADCVAR("g_buffs_pickup_anyway");
- BADCVAR("g_buffs_randomize");
- BADCVAR("g_buffs_randomize_teamplay");
- BADCVAR("g_campcheck_distance");
- BADCVAR("g_chatsounds");
- BADCVAR("g_ca_point_leadlimit");
- BADCVAR("g_ca_point_limit");
- BADCVAR("g_ctf_captimerecord_always");
- BADCVAR("g_ctf_flag_glowtrails");
- BADCVAR("g_ctf_dynamiclights");
- BADCVAR("g_ctf_flag_pickup_verbosename");
- BADPRESUFFIX("g_ctf_flag_", "_model");
- BADPRESUFFIX("g_ctf_flag_", "_skin");
- BADCVAR("g_domination_point_leadlimit");
- BADCVAR("g_forced_respawn");
- BADCVAR("g_freezetag_point_leadlimit");
- BADCVAR("g_freezetag_point_limit");
- BADCVAR("g_glowtrails");
- BADCVAR("g_hats");
- BADCVAR("g_casings");
- BADCVAR("g_invasion_point_limit");
- BADCVAR("g_jump_grunt");
- BADCVAR("g_keepaway_ballcarrier_effects");
- BADCVAR("g_keepawayball_effects");
- BADCVAR("g_keyhunt_point_leadlimit");
- BADCVAR("g_nexball_goalleadlimit");
- BADCVAR("g_new_toys_autoreplace");
- BADCVAR("g_new_toys_use_pickupsound");
- BADCVAR("g_physics_predictall");
- BADCVAR("g_piggyback");
- BADCVAR("g_playerclip_collisions");
- BADCVAR("g_spawn_alloweffects");
- BADCVAR("g_tdm_point_leadlimit");
- BADCVAR("g_tdm_point_limit");
- BADCVAR("leadlimit_and_fraglimit");
- BADCVAR("leadlimit_override");
- BADCVAR("pausable");
- BADCVAR("sv_announcer");
- BADCVAR("sv_checkforpacketsduringsleep");
- BADCVAR("sv_damagetext");
- BADCVAR("sv_db_saveasdump");
- BADCVAR("sv_intermission_cdtrack");
- BADCVAR("sv_mapchange_delay");
- BADCVAR("sv_minigames");
- BADCVAR("sv_namechangetimer");
- BADCVAR("sv_precacheplayermodels");
- BADCVAR("sv_radio");
- BADCVAR("sv_stepheight");
- BADCVAR("sv_timeout");
- BADCVAR("sv_weapons_modeloverride");
- BADCVAR("w_prop_interval");
- BADPREFIX("chat_");
- BADPREFIX("crypto_");
- BADPREFIX("gameversion_");
- BADPREFIX("g_chat_");
- BADPREFIX("g_ctf_captimerecord_");
- BADPREFIX("g_hats_");
- BADPREFIX("g_maplist_");
- BADPREFIX("g_mod_");
- BADPREFIX("g_respawn_");
- BADPREFIX("net_");
- BADPREFIX("notification_");
- BADPREFIX("prvm_");
- BADPREFIX("skill_");
- BADPREFIX("sv_allow_");
- BADPREFIX("sv_cullentities_");
- BADPREFIX("sv_maxidle_");
- BADPREFIX("sv_minigames_");
- BADPREFIX("sv_radio_");
- BADPREFIX("sv_timeout_");
- BADPREFIX("sv_vote_");
- BADPREFIX("timelimit_");
-
- // allowed changes to server admins (please sync this to server.cfg)
- // vi commands:
- // :/"impure"/,$d
- // :g!,^\/\/[^ /],d
- // :%s,//\([^ ]*\).*,BADCVAR("\1");,
- // :%!sort
- // yes, this does contain some redundant stuff, don't really care
- BADPREFIX("bot_ai_");
- BADCVAR("bot_config_file");
- BADCVAR("bot_number");
- BADCVAR("bot_prefix");
- BADCVAR("bot_suffix");
- BADCVAR("capturelimit_override");
- BADCVAR("fraglimit_override");
- BADCVAR("gametype");
- BADCVAR("g_antilag");
- BADCVAR("g_balance_teams");
- BADCVAR("g_balance_teams_prevent_imbalance");
- BADCVAR("g_balance_teams_scorefactor");
- BADCVAR("g_ban_sync_trusted_servers");
- BADCVAR("g_ban_sync_uri");
- BADCVAR("g_buffs");
- BADCVAR("g_ca_teams_override");
- BADCVAR("g_ctf_fullbrightflags");
- BADCVAR("g_ctf_ignore_frags");
- BADCVAR("g_ctf_leaderboard");
- BADCVAR("g_domination_point_limit");
- BADCVAR("g_domination_teams_override");
- BADCVAR("g_freezetag_teams_override");
- BADCVAR("g_friendlyfire");
- BADCVAR("g_fullbrightitems");
- BADCVAR("g_fullbrightplayers");
- BADCVAR("g_keyhunt_point_limit");
- BADCVAR("g_keyhunt_teams_override");
- BADCVAR("g_lms_lives_override");
- BADCVAR("g_maplist");
- BADCVAR("g_maxplayers");
- BADCVAR("g_mirrordamage");
- BADCVAR("g_nexball_goallimit");
- BADCVAR("g_norecoil");
- BADCVAR("g_physics_clientselect");
- BADCVAR("g_pinata");
- BADCVAR("g_powerups");
- BADCVAR("g_player_brightness");
- BADCVAR("g_rocket_flying");
- BADCVAR("g_rocket_flying_disabledelays");
- BADCVAR("g_spawnshieldtime");
- BADCVAR("g_start_delay");
- BADCVAR("g_superspectate");
- BADCVAR("g_tdm_teams_override");
- BADCVAR("g_warmup");
- BADCVAR("g_weapon_stay"); BADPRESUFFIX("g_", "_weapon_stay");
- BADCVAR("hostname");
- BADCVAR("log_file");
- BADCVAR("maxplayers");
- BADCVAR("minplayers");
- BADCVAR("minplayers_per_team");
- BADCVAR("net_address");
- BADCVAR("port");
- BADCVAR("rcon_password");
- BADCVAR("rcon_restricted_commands");
- BADCVAR("rcon_restricted_password");
- BADCVAR("skill");
- BADCVAR("sv_adminnick");
- BADCVAR("sv_autoscreenshot");
- BADCVAR("sv_autotaunt");
- BADCVAR("sv_curl_defaulturl");
- BADCVAR("sv_defaultcharacter");
- BADCVAR("sv_defaultcharacterskin");
- BADCVAR("sv_defaultplayercolors");
- BADCVAR("sv_defaultplayermodel");
- BADCVAR("sv_defaultplayerskin");
- BADCVAR("sv_maxidle");
- BADCVAR("sv_maxrate");
- BADCVAR("sv_motd");
- BADCVAR("sv_public");
- BADCVAR("sv_ready_restart");
- BADCVAR("sv_status_privacy");
- BADCVAR("sv_taunt");
- BADCVAR("sv_vote_call");
- BADCVAR("sv_vote_commands");
- BADCVAR("sv_vote_majority_factor");
- BADCVAR("sv_vote_master");
- BADCVAR("sv_vote_master_commands");
- BADCVAR("sv_vote_master_password");
- BADCVAR("sv_vote_simple_majority_factor");
- BADCVAR("teamplay_mode");
- BADCVAR("timelimit_override");
- BADPREFIX("g_warmup_");
- BADPREFIX("sv_info_");
- BADPREFIX("sv_ready_restart_");
-
- // mutators that announce themselves properly to the server browser
- BADCVAR("g_instagib");
- BADCVAR("g_new_toys");
- BADCVAR("g_nix");
- BADCVAR("g_grappling_hook");
- BADCVAR("g_jetpack");
-
- // temporary for testing
- // TODO remove before 0.8.3 release
- BADCVAR("g_ca_weaponarena");
- BADCVAR("g_freezetag_weaponarena");
- BADCVAR("g_lms_weaponarena");
- BADCVAR("g_ctf_stalemate_time");
-
- if(cvar_string("g_mod_balance") == "Testing")
- {
- // (temporary) while using the Testing balance, any weapon balance cvars are allowed to be changed
- BADPREFIX("g_balance_");
- }
-
-#undef BADPRESUFFIX
-#undef BADPREFIX
-#undef BADCVAR
-
- if(pureadding)
- {
- cvar_purechanges = strcat(cvar_purechanges, k, " \"", v, "\" // \"", d, "\"\n");
- if(strlen(cvar_purechanges) > 16384)
- {
- cvar_purechanges = "// too many settings have been changed to show them here\n";
- pureadding = 0;
- }
- }
- ++cvar_purechanges_count;
- // WARNING: this variable is used for the server list
- // NEVER dare to skip this code!
- // Hacks to intentionally appearing as "pure server" even though you DO have
- // modified settings may be punished by removal from the server list.
- // You can do to the variables cvar_changes and cvar_purechanges all you want,
- // though.
- }
- buf_del(h);
- if(cvar_changes == "")
- cvar_changes = "// this server runs at default server settings\n";
- else
- cvar_changes = strcat("// this server runs at modified server settings:\n", cvar_changes);
- cvar_changes = strzone(cvar_changes);
- if(cvar_purechanges == "")
- cvar_purechanges = "// this server runs at default gameplay settings\n";
- else
- cvar_purechanges = strcat("// this server runs at modified gameplay settings:\n", cvar_purechanges);
- cvar_purechanges = strzone(cvar_purechanges);
-}
-
-entity randomseed;
-bool RandomSeed_Send(entity this, entity to, int sf)
-{
- WriteHeader(MSG_ENTITY, ENT_CLIENT_RANDOMSEED);
- WriteShort(MSG_ENTITY, this.cnt);
- return true;
-}
-void RandomSeed_Think(entity this)
-{
- this.cnt = bound(0, floor(random() * 65536), 65535);
- this.nextthink = time + 5;
-
- this.SendFlags |= 1;
-}
-void RandomSeed_Spawn()
-{
- randomseed = new_pure(randomseed);
- setthink(randomseed, RandomSeed_Think);
- Net_LinkEntity(randomseed, false, 0, RandomSeed_Send);
-
- getthink(randomseed)(randomseed); // sets random seed and nextthink
-}
-
-spawnfunc(__init_dedicated_server)
-{
- // handler for _init/_init map (only for dedicated server initialization)
-
- world_initialized = -1; // don't complain
-
- delete_fn = remove_unsafely;
-
- entity e = spawn();
- setthink(e, GotoFirstMap);
- e.nextthink = time; // this is usually 1 at this point
-
- e = new(info_player_deathmatch); // safeguard against player joining
-
- // assign reflectively to avoid "assignment to world" warning
- for (int i = 0, n = numentityfields(); i < n; ++i) {
- string k = entityfieldname(i);
- if (k == "classname") {
- // safeguard against various stuff ;)
- putentityfieldstring(i, this, "worldspawn");
- break;
- }
- }
-
- // needs to be done so early because of the constants they create
- static_init();
- static_init_late();
- static_init_precache();
-
- IL_PUSH(g_spawnpoints, e); // just incase
-
- MapInfo_Enumerate();
- MapInfo_FilterGametype(MapInfo_CurrentGametype(), MapInfo_CurrentFeatures(), MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags(), 0);
-}
-
-void __init_dedicated_server_shutdown() {
- MapInfo_Shutdown();
-}
-
-STATIC_INIT_EARLY(maxclients)
-{
- maxclients = 0;
- for (entity head = nextent(NULL); head; head = nextent(head)) {
- ++maxclients;
- }
-}
-
-void default_delayedinit(entity this)
-{
- if(!scores_initialized)
- ScoreRules_generic();
-}
-
-void InitGameplayMode()
-{
- VoteReset();
-
- // find out good world mins/maxs bounds, either the static bounds found by looking for solid, or the mapinfo specified bounds
- get_mi_min_max(1);
- // assign reflectively to avoid "assignment to world" warning
- int done = 0; for (int i = 0, n = numentityfields(); i < n; ++i) {
- string k = entityfieldname(i); vector v = (k == "mins") ? mi_min : (k == "maxs") ? mi_max : '0 0 0';
- if (v) {
- putentityfieldstring(i, world, sprintf("%v", v));
- if (++done == 2) break;
- }
- }
- // currently, NetRadiant's limit is 131072 qu for each side
- // distance from one corner of a 131072qu cube to the opposite corner is approx. 227023 qu
- // set the distance according to map size but don't go over the limit to avoid issues with float precision
- // in case somebody makes extremely large maps
- max_shot_distance = min(230000, vlen(world.maxs - world.mins));
-
- MapInfo_LoadMapSettings(mapname);
- GameRules_teams(false);
-
- if (!cvar_value_issafe(world.fog))
- {
- LOG_INFO("The current map contains a potentially harmful fog setting, ignored");
- world.fog = string_null;
- }
- if(MapInfo_Map_fog != "")
- {
- if(MapInfo_Map_fog == "none")
- world.fog = string_null;
- else
- world.fog = strzone(MapInfo_Map_fog);
- }
- clientstuff = strzone(MapInfo_Map_clientstuff);
-
- MapInfo_ClearTemps();
-
- gamemode_name = MapInfo_Type_ToText(MapInfo_LoadedGametype);
-
- cache_mutatormsg = strzone("");
- cache_lastmutatormsg = strzone("");
-
- InitializeEntity(NULL, default_delayedinit, INITPRIO_GAMETYPE_FALLBACK);
-}
-
-void Map_MarkAsRecent(string m);
-float world_already_spawned;
-spawnfunc(worldspawn)
-{
- server_is_dedicated = boolean(stof(cvar_defstring("is_dedicated")));
-
- bool wantrestart = false;
- {
- if (!server_is_dedicated)
- {
- // force unloading of server pk3 files when starting a listen server
- // localcmd("\nfs_rescan\n"); // FIXME: does more harm than good, has unintended side effects. What we really want is to unload temporary pk3s only
- // restore csqc_progname too
- string expect = "csprogs.dat";
- wantrestart = cvar_string("csqc_progname") != expect;
- cvar_set("csqc_progname", expect);
- }
- else
- {
- // Try to use versioned csprogs from pk3
- // Only ever use versioned csprogs.dat files on dedicated servers;
- // we need to reset csqc_progname on clients ourselves, and it's easier if the client's release name is constant
- string pk3csprogs = "csprogs-" WATERMARK ".dat";
- // This always works; fall back to it if a versioned csprogs.dat is suddenly missing
- string select = "csprogs.dat";
- if (fexists(pk3csprogs)) select = pk3csprogs;
- if (cvar_string("csqc_progname") != select)
- {
- cvar_set("csqc_progname", select);
- wantrestart = true;
- }
- // Check for updates on startup
- // We do it this way for atomicity so that connecting clients still match the server progs and don't disconnect
- int sentinel = fopen("progs.txt", FILE_READ);
- if (sentinel >= 0)
- {
- string switchversion = fgets(sentinel);
- fclose(sentinel);
- if (switchversion != "" && switchversion != WATERMARK)
- {
- LOG_INFOF("Switching progs: " WATERMARK " -> %s", switchversion);
- // if it doesn't exist, assume either:
- // a) the current program was overwritten
- // b) this is a client only update
- string newprogs = sprintf("progs-%s.dat", switchversion);
- if (fexists(newprogs))
- {
- cvar_set("sv_progs", newprogs);
- wantrestart = true;
- }
- string newcsprogs = sprintf("csprogs-%s.dat", switchversion);
- if (fexists(newcsprogs))
- {
- cvar_set("csqc_progname", newcsprogs);
- wantrestart = true;
- }
- }
- }
- }
- if (wantrestart)
- {
- LOG_INFO("Restart requested");
- changelevel(mapname);
- // let initialization continue, shutdown depends on it
- }
- }
-
- if(world_already_spawned)
- error("world already spawned - you may have EXACTLY ONE worldspawn!");
- world_already_spawned = true;
-
- delete_fn = remove_safely; // during spawning, watch what you remove!
-
- cvar_changes_init(); // do this very early now so it REALLY matches the server config
-
- // needs to be done so early because of the constants they create
- static_init();
-
- ServerProgsDB = db_load(strcat("server.db", autocvar_sessionid));
-
- TemporaryDB = db_create();
-
- // 0 normal
- lightstyle(0, "m");
-
- // 1 FLICKER (first variety)
- lightstyle(1, "mmnmmommommnonmmonqnmmo");
-
- // 2 SLOW STRONG PULSE
- lightstyle(2, "abcdefghijklmnopqrstuvwxyzyxwvutsrqponmlkjihgfedcba");
-
- // 3 CANDLE (first variety)
- lightstyle(3, "mmmmmaaaaammmmmaaaaaabcdefgabcdefg");
-
- // 4 FAST STROBE
- lightstyle(4, "mamamamamama");
-
- // 5 GENTLE PULSE 1
- lightstyle(5,"jklmnopqrstuvwxyzyxwvutsrqponmlkj");
-
- // 6 FLICKER (second variety)
- lightstyle(6, "nmonqnmomnmomomno");
-
- // 7 CANDLE (second variety)
- lightstyle(7, "mmmaaaabcdefgmmmmaaaammmaamm");
-
- // 8 CANDLE (third variety)
- lightstyle(8, "mmmaaammmaaammmabcdefaaaammmmabcdefmmmaaaa");
-
- // 9 SLOW STROBE (fourth variety)
- lightstyle(9, "aaaaaaaazzzzzzzz");
-
- // 10 FLUORESCENT FLICKER
- lightstyle(10, "mmamammmmammamamaaamammma");
-
- // 11 SLOW PULSE NOT FADE TO BLACK
- lightstyle(11, "abcdefghijklmnopqrrqponmlkjihgfedcba");
-
- // styles 32-62 are assigned by the spawnfunc_light program for switchable lights
-
- // 63 testing
- lightstyle(63, "a");
-
- if(autocvar_g_campaign)
- CampaignPreInit();
-
- Map_MarkAsRecent(mapname);
-
- PlayerStats_GameReport_Init(); // we need this to be initiated before InitGameplayMode
-
- InitGameplayMode();
- static_init_late();
- static_init_precache();
- readlevelcvars();
- GrappleHookInit();
-
- GameRules_limit_fallbacks();
-
- if(warmup_limit == 0)
- warmup_limit = (autocvar_timelimit > 0) ? autocvar_timelimit * 60 : autocvar_timelimit;
-
- player_count = 0;
- bot_waypoints_for_items = autocvar_g_waypoints_for_items;
- if(bot_waypoints_for_items == 1)
- if(this.spawnflags & SPAWNFLAG_NO_WAYPOINTS_FOR_ITEMS)
- bot_waypoints_for_items = 0;
-
- WaypointSprite_Init();
-
- GameLogInit(); // prepare everything
- // NOTE for matchid:
- // changing the logic generating it is okay. But:
- // it HAS to stay <= 64 chars
- // character set: ASCII 33-126 without the following characters: : ; ' " \ $
- if(autocvar_sv_eventlog)
- {
- string s = sprintf("%s.%s.%06d", itos(autocvar_sv_eventlog_files_counter), strftime(false, "%s"), floor(random() * 1000000));
- matchid = strzone(s);
-
- GameLogEcho(strcat(":gamestart:", GetGametype(), "_", GetMapname(), ":", s));
- s = ":gameinfo:mutators:LIST";
-
- MUTATOR_CALLHOOK(BuildMutatorsString, s);
- s = M_ARGV(0, string);
-
- // initialiation stuff, not good in the mutator system
- if(!autocvar_g_use_ammunition)
- s = strcat(s, ":no_use_ammunition");
-
- // initialiation stuff, not good in the mutator system
- if(autocvar_g_pickup_items == 0)
- s = strcat(s, ":no_pickup_items");
- if(autocvar_g_pickup_items > 0)
- s = strcat(s, ":pickup_items");
-
- // initialiation stuff, not good in the mutator system
- if(autocvar_g_weaponarena != "0")
- s = strcat(s, ":", autocvar_g_weaponarena, " arena");
-
- // TODO to mutator system
- if(autocvar_g_norecoil)
- s = strcat(s, ":norecoil");
-
- // TODO to mutator system
- if(autocvar_g_powerups == 0)
- s = strcat(s, ":no_powerups");
- if(autocvar_g_powerups > 0)
- s = strcat(s, ":powerups");
-
- GameLogEcho(s);
- GameLogEcho(":gameinfo:end");
- }
- else
- matchid = strzone(ftos(random()));
-
- cvar_set("nextmap", "");
-
- SetDefaultAlpha();
-
- if(autocvar_g_campaign)
- CampaignPostInit();
-
- Ban_LoadBans();
-
- MapInfo_Enumerate();
- MapInfo_FilterGametype(MapInfo_CurrentGametype(), MapInfo_CurrentFeatures(), MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags(), 1);
-
- if(fexists(strcat("scripts/", mapname, ".arena")))
- cvar_settemp("sv_q3acompat_machineshotgunswap", "1");
-
- if(fexists(strcat("scripts/", mapname, ".defi")))
- cvar_settemp("sv_q3defragcompat", "1");
-
- if(whichpack(strcat("maps/", mapname, ".cfg")) != "")
- {
- int fd = fopen(strcat("maps/", mapname, ".cfg"), FILE_READ);
- if(fd != -1)
- {
- string s;
- while((s = fgets(fd)))
- {
- int l = tokenize_console(s);
- if(l < 2)
- continue;
- if(argv(0) == "cd")
- {
- string trackname = argv(2);
- LOG_INFO("Found ^1UNSUPPORTED^7 cd loop command in .cfg file; put this line in mapinfo instead:");
- LOG_INFO(" cdtrack ", trackname);
- if (cvar_value_issafe(trackname))
- {
- string newstuff = strcat(clientstuff, "cd loop \"", trackname, "\"\n");
- strcpy(clientstuff, newstuff);
- }
- }
- else if(argv(0) == "fog")
- {
- LOG_INFO("Found ^1UNSUPPORTED^7 fog command in .cfg file; put this line in worldspawn in the .map/.bsp/.ent file instead:");
- LOG_INFO(" \"fog\" \"", s, "\"");
- }
- else if(argv(0) == "set")
- {
- LOG_INFO("Found ^1UNSUPPORTED^7 set command in .cfg file; put this line in mapinfo instead:");
- LOG_INFO(" clientsettemp_for_type all ", argv(1), " ", argv(2));
- }
- else if(argv(0) != "//")
- {
- LOG_INFO("Found ^1UNSUPPORTED^7 set command in .cfg file; put this line in mapinfo instead:");
- LOG_INFO(" clientsettemp_for_type all ", argv(0), " ", argv(1));
- }
- }
- fclose(fd);
- }
- }
-
- WeaponStats_Init();
-
- Nagger_Init();
-
- next_pingtime = time + 5;
-
- // set up information replies for clients and server to use
- maplist_reply = strzone(getmaplist());
- lsmaps_reply = strzone(getlsmaps());
- monsterlist_reply = strzone(getmonsterlist());
- for(int i = 0; i < 10; ++i)
- {
- string s = getrecords(i);
- if (s)
- records_reply[i] = strzone(s);
- }
- ladder_reply = strzone(getladder());
- rankings_reply = strzone(getrankings());
-
- // begin other init
- ClientInit_Spawn();
- RandomSeed_Spawn();
- PingPLReport_Spawn();
-
- CheatInit();
-
- if (!wantrestart) localcmd("\n_sv_hook_gamestart ", GetGametype(), "\n");
-
- // fill sv_curl_serverpackages from .serverpackage files
- if (autocvar_sv_curl_serverpackages_auto)
- {
- string s = "csprogs-" WATERMARK ".txt";
- // remove automatically managed files from the list to prevent duplicates
- for (int i = 0, n = tokenize_console(cvar_string("sv_curl_serverpackages")); i < n; ++i)
- {
- string pkg = argv(i);
- if (startsWith(pkg, "csprogs-")) continue;
- if (endsWith(pkg, "-serverpackage.txt")) continue;
- if (endsWith(pkg, ".serverpackage")) continue; // OLD legacy
- s = cons(s, pkg);
- }
- // add automatically managed files to the list
- #define X(match) MACRO_BEGIN \
- int fd = search_begin(match, true, false); \
- if (fd >= 0) \
- { \
- for (int i = 0, j = search_getsize(fd); i < j; ++i) \
- { \
- s = cons(s, search_getfilename(fd, i)); \
- } \
- search_end(fd); \
- } \
- MACRO_END
- X("*-serverpackage.txt");
- X("*.serverpackage");
- #undef X
- cvar_set("sv_curl_serverpackages", s);
- }
-
- // MOD AUTHORS: change this, and possibly remove a few of the blocks below to ignore certain changes
- modname = "Xonotic";
- // physics/balance/config changes that count as mod
- if(cvar_string("g_mod_physics") != cvar_defstring("g_mod_physics"))
- modname = cvar_string("g_mod_physics");
- if(cvar_string("g_mod_balance") != cvar_defstring("g_mod_balance") && cvar_string("g_mod_balance") != "Testing")
- modname = cvar_string("g_mod_balance");
- if(cvar_string("g_mod_config") != cvar_defstring("g_mod_config"))
- modname = cvar_string("g_mod_config");
- // extra mutators that deserve to count as mod
- MUTATOR_CALLHOOK(SetModname, modname);
- modname = M_ARGV(0, string);
-
- // save it for later
- modname = strzone(modname);
-
- WinningConditionHelper(this); // set worldstatus
-
- world_initialized = 1;
- __spawnfunc_spawn_all();
-}
-
-spawnfunc(light)
-{
- //makestatic (this); // Who the f___ did that?
- delete(this);
-}
-
-string GetGametype()
-{
- return MapInfo_Type_ToString(MapInfo_LoadedGametype);
-}
-
-string GetMapname()
-{
- return mapname;
-}
-
-float Map_Count, Map_Current;
-string Map_Current_Name;
-
-// NOTE: this now expects the map list to be already tokenized and the count in Map_Count
-int GetMaplistPosition()
-{
- string map = GetMapname();
- int idx = autocvar_g_maplist_index;
-
- if(idx >= 0)
- {
- if(idx < Map_Count)
- {
- if(map == argv(idx))
- {
- return idx;
- }
- }
- }
-
- for(int pos = 0; pos < Map_Count; ++pos)
- {
- if(map == argv(pos))
- return pos;
- }
-
- // resume normal maplist rotation if current map is not in g_maplist
- return idx;
-}
-
-bool MapHasRightSize(string map)
-{
- int minplayers = max(0, floor(autocvar_minplayers));
- if (teamplay)
- minplayers = max(0, floor(autocvar_minplayers_per_team) * AvailableTeams());
- if (autocvar_g_maplist_check_waypoints
- && (currentbots || autocvar_bot_number || player_count < minplayers))
- {
- string checkwp_msg = strcat("checkwp ", map);
- if(!fexists(strcat("maps/", map, ".waypoints")))
- {
- LOG_TRACE(checkwp_msg, ": no waypoints");
- return false;
- }
- LOG_TRACE(checkwp_msg, ": has waypoints");
- }
-
- if(autocvar_g_maplist_ignore_sizes)
- return true;
-
- // open map size restriction file
- string opensize_msg = strcat("opensize ", map);
- float fh = fopen(strcat("maps/", map, ".sizes"), FILE_READ);
- int player_limit = ((autocvar_g_maplist_sizes_count_maxplayers) ? GetPlayerLimit() : 0);
- int pcount = ((player_limit > 0) ? min(player_count, player_limit) : player_count); // bind it to the player limit so that forced spectators don't influence the limits
- if(!autocvar_g_maplist_sizes_count_bots)
- pcount -= currentbots;
- if(fh >= 0)
- {
- opensize_msg = strcat(opensize_msg, ": ok, ");
- int mapmin = stoi(fgets(fh));
- int mapmax = stoi(fgets(fh));
- fclose(fh);
- if(pcount < mapmin)
- {
- LOG_TRACE(opensize_msg, "not enough");
- return false;
- }
- if(mapmax && pcount > mapmax)
- {
- LOG_TRACE(opensize_msg, "too many");
- return false;
- }
- LOG_TRACE(opensize_msg, "right size");
- return true;
- }
- LOG_TRACE(opensize_msg, ": not found");
- return true;
-}
-
-string Map_Filename(float position)
-{
- return strcat("maps/", argv(position), ".bsp");
-}
-
-void Map_MarkAsRecent(string m)
-{
- cvar_set("g_maplist_mostrecent", strwords(cons(m, autocvar_g_maplist_mostrecent), max(0, autocvar_g_maplist_mostrecent_count)));
-}
-
-float Map_IsRecent(string m)
-{
- return strhasword(autocvar_g_maplist_mostrecent, m);
-}
-
-float Map_Check(float position, float pass)
-{
- string filename;
- string map_next;
- map_next = argv(position);
- if(pass <= 1)
- {
- if(Map_IsRecent(map_next))
- return 0;
- }
- filename = Map_Filename(position);
- if(MapInfo_CheckMap(map_next))
- {
- if(pass == 2)
- return 1;
- if(MapHasRightSize(map_next))
- return 1;
- return 0;
- }
- else
- LOG_DEBUG( "Couldn't select '", filename, "'..." );
-
- return 0;
-}
-
-void Map_Goto_SetStr(string nextmapname)
-{
- if(getmapname_stored != "")
- strunzone(getmapname_stored);
- if(nextmapname == "")
- getmapname_stored = "";
- else
- getmapname_stored = strzone(nextmapname);
-}
-
-void Map_Goto_SetFloat(float position)
-{
- cvar_set("g_maplist_index", ftos(position));
- Map_Goto_SetStr(argv(position));
-}
-
-void Map_Goto(float reinit)
-{
- MapInfo_LoadMap(getmapname_stored, reinit);
-}
-
-// return codes of map selectors:
-// -1 = temporary failure (that is, try some method that is guaranteed to succeed)
-// -2 = permanent failure
-float MaplistMethod_Iterate() // usual method
-{
- float pass, i;
-
- LOG_TRACE("Trying MaplistMethod_Iterate");
-
- for(pass = 1; pass <= 2; ++pass)
- {
- for(i = 1; i < Map_Count; ++i)
- {
- float mapindex;
- mapindex = (i + Map_Current) % Map_Count;
- if(Map_Check(mapindex, pass))
- return mapindex;
- }
- }
- return -1;
-}
-
-float MaplistMethod_Repeat() // fallback method
-{
- LOG_TRACE("Trying MaplistMethod_Repeat");
-
- if(Map_Check(Map_Current, 2))
- return Map_Current;
- return -2;
-}
-
-float MaplistMethod_Random() // random map selection
-{
- float i, imax;
-
- LOG_TRACE("Trying MaplistMethod_Random");
-
- imax = 42;
-
- for(i = 0; i <= imax; ++i)
- {
- float mapindex;
- mapindex = (Map_Current + floor(random() * (Map_Count - 1) + 1)) % Map_Count; // any OTHER map
- if(Map_Check(mapindex, 1))
- return mapindex;
- }
- return -1;
-}
-
-float MaplistMethod_Shuffle(float exponent) // more clever shuffling
-// the exponent sets a bias on the map selection:
-// the higher the exponent, the less likely "shortly repeated" same maps are
-{
- float i, j, imax, insertpos;
-
- LOG_TRACE("Trying MaplistMethod_Shuffle");
-
- imax = 42;
-
- for(i = 0; i <= imax; ++i)
- {
- string newlist;
-
- // now reinsert this at another position
- insertpos = (random() ** (1 / exponent)); // ]0, 1]
- insertpos = insertpos * (Map_Count - 1); // ]0, Map_Count - 1]
- insertpos = ceil(insertpos) + 1; // {2, 3, 4, ..., Map_Count}
- LOG_TRACE("SHUFFLE: insert pos = ", ftos(insertpos));
-
- // insert the current map there
- newlist = "";
- for(j = 1; j < insertpos; ++j) // i == 1: no loop, will be inserted as first; however, i == 1 has been excluded above
- newlist = strcat(newlist, " ", argv(j));
- newlist = strcat(newlist, " ", argv(0)); // now insert the just selected map
- for(j = insertpos; j < Map_Count; ++j) // i == Map_Count: no loop, has just been inserted as last
- newlist = strcat(newlist, " ", argv(j));
- newlist = substring(newlist, 1, strlen(newlist) - 1);
- cvar_set("g_maplist", newlist);
- Map_Count = tokenizebyseparator(autocvar_g_maplist, " ");
-
- // NOTE: the selected map has just been inserted at (insertpos-1)th position
- Map_Current = insertpos - 1; // this is not really valid, but this way the fallback has a chance of working
- if(Map_Check(Map_Current, 1))
- return Map_Current;
- }
- return -1;
-}
-
-void Maplist_Init()
-{
- float i = Map_Count = 0;
- if(autocvar_g_maplist != "")
- {
- Map_Count = tokenizebyseparator(autocvar_g_maplist, " ");
- for (i = 0; i < Map_Count; ++i)
- {
- if (Map_Check(i, 2))
- break;
- }
- }
-
- if (i == Map_Count)
- {
- bprint( "Maplist contains no usable maps! Resetting it to default map list.\n" );
- cvar_set("g_maplist", MapInfo_ListAllAllowedMaps(MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags() | MAPINFO_FLAG_NOAUTOMAPLIST));
- if(autocvar_g_maplist_shuffle)
- ShuffleMaplist();
- if(!server_is_dedicated)
- localcmd("\nmenu_cmd sync\n");
- Map_Count = tokenizebyseparator(autocvar_g_maplist, " ");
- }
- if(Map_Count == 0)
- error("empty maplist, cannot select a new map");
- Map_Current = bound(0, GetMaplistPosition(), Map_Count - 1);
-
- strcpy(Map_Current_Name, argv(Map_Current)); // will be automatically freed on exit thanks to DP
- // this may or may not be correct, but who cares, in the worst case a map
- // isn't chosen in the first pass that should have been
-}
-
-string GetNextMap()
-{
- Maplist_Init();
- float nextMap = -1;
-
- if(nextMap == -1)
- if(autocvar_g_maplist_shuffle > 0)
- nextMap = MaplistMethod_Shuffle(autocvar_g_maplist_shuffle + 1);
-
- if(nextMap == -1)
- if(autocvar_g_maplist_selectrandom)
- nextMap = MaplistMethod_Random();
-
- if(nextMap == -1)
- nextMap = MaplistMethod_Iterate();
-
- if(nextMap == -1)
- nextMap = MaplistMethod_Repeat();
-
- if(nextMap >= 0)
- {
- Map_Goto_SetFloat(nextMap);
- return getmapname_stored;
- }
-
- return "";
-}
-
-float DoNextMapOverride(float reinit)
-{
- if(autocvar_g_campaign)
- {
- CampaignPostIntermission();
- alreadychangedlevel = true;
- return true;
- }
- if(autocvar_quit_when_empty)
- {
- if(player_count <= currentbots)
- {
- localcmd("quit\n");
- alreadychangedlevel = true;
- return true;
- }
- }
- if(autocvar_quit_and_redirect != "")
- {
- redirection_target = strzone(autocvar_quit_and_redirect);
- alreadychangedlevel = true;
- return true;
- }
- if (!reinit && autocvar_samelevel) // if samelevel is set, stay on same level
- {
- localcmd("restart\n");
- alreadychangedlevel = true;
- return true;
- }
- if(autocvar_nextmap != "")
- {
- string m;
- m = GameTypeVote_MapInfo_FixName(autocvar_nextmap);
- cvar_set("nextmap",m);
-
- if(!m || gametypevote)
- return false;
- if(autocvar_sv_vote_gametype)
- {
- Map_Goto_SetStr(m);
- return false;
- }
-
- if(MapInfo_CheckMap(m))
- {
- Map_Goto_SetStr(m);
- Map_Goto(reinit);
- alreadychangedlevel = true;
- return true;
- }
- }
- if(!reinit && autocvar_lastlevel)
- {
- cvar_settemp_restore();
- localcmd("set lastlevel 0\ntogglemenu 1\n");
- alreadychangedlevel = true;
- return true;
- }
- return false;
-}
-
-void GotoNextMap(float reinit)
-{
- //string nextmap;
- //float n, nummaps;
- //string s;
- if (alreadychangedlevel)
- return;
- alreadychangedlevel = true;
-
- string nextMap = GetNextMap();
- if(nextMap == "")
- error("Everything is broken - cannot find a next map. Please report this to the developers.");
- Map_Goto(reinit);
-}
-
-
-/*
-============
-IntermissionThink
-
-When the player presses attack or jump, change to the next level
-============
-*/
-.float autoscreenshot;
-void IntermissionThink(entity this)
-{
- FixIntermissionClient(this);
-
- float server_screenshot = (autocvar_sv_autoscreenshot && CS(this).cvar_cl_autoscreenshot);
- float client_screenshot = (CS(this).cvar_cl_autoscreenshot == 2);
-
- if( (server_screenshot || client_screenshot)
- && ((this.autoscreenshot > 0) && (time > this.autoscreenshot)) )
- {
- this.autoscreenshot = -1;
- if(IS_REAL_CLIENT(this)) { stuffcmd(this, sprintf("\nscreenshot screenshots/autoscreenshot/%s-%s.jpg; echo \"^5A screenshot has been taken at request of the server.\"\n", GetMapname(), strftime(false, "%s"))); }
- return;
- }
-
- if (time < intermission_exittime)
- return;
-
- if(!mapvote_initialized)
- if (time < intermission_exittime + 10 && !(PHYS_INPUT_BUTTON_ATCK(this) || PHYS_INPUT_BUTTON_JUMP(this) || PHYS_INPUT_BUTTON_ATCK2(this) || PHYS_INPUT_BUTTON_HOOK(this) || PHYS_INPUT_BUTTON_USE(this)))
- return;
-
- MapVote_Start();
-}
-
-/*
-===============================================================================
-
-RULES
-
-===============================================================================
-*/
-
-void DumpStats(float final)
-{
- float file;
- string s;
- float to_console;
- float to_eventlog;
- float to_file;
- float i;
-
- to_console = autocvar_sv_logscores_console;
- to_eventlog = autocvar_sv_eventlog;
- to_file = autocvar_sv_logscores_file;
-
- if(!final)
- {
- to_console = true; // always print printstats replies
- to_eventlog = false; // but never print them to the event log
- }
-
- if(to_eventlog)
- if(autocvar_sv_eventlog_console)
- to_console = false; // otherwise we get the output twice
-
- if(final)
- s = ":scores:";
- else
- s = ":status:";
- s = strcat(s, GetGametype(), "_", GetMapname(), ":", ftos(rint(time)));
-
- if(to_console)
- LOG_INFO(s);
- if(to_eventlog)
- GameLogEcho(s);
-
- file = -1;
- if(to_file)
- {
- file = fopen(autocvar_sv_logscores_filename, FILE_APPEND);
- if(file == -1)
- to_file = false;
- else
- fputs(file, strcat(s, "\n"));
- }
-
- s = strcat(":labels:player:", GetPlayerScoreString(NULL, 0));
- if(to_console)
- LOG_INFO(s);
- if(to_eventlog)
- GameLogEcho(s);
- if(to_file)
- fputs(file, strcat(s, "\n"));
-
- FOREACH_CLIENT(IS_REAL_CLIENT(it) || (IS_BOT_CLIENT(it) && autocvar_sv_logscores_bots), {
- s = strcat(":player:see-labels:", GetPlayerScoreString(it, 0), ":");
- s = strcat(s, ftos(rint(time - CS(it).jointime)), ":");
- if(IS_PLAYER(it) || MUTATOR_CALLHOOK(GetPlayerStatus, it))
- s = strcat(s, ftos(it.team), ":");
- else
- s = strcat(s, "spectator:");
-
- if(to_console)
- LOG_INFO(s, playername(it, false));
- if(to_eventlog)
- GameLogEcho(strcat(s, ftos(it.playerid), ":", playername(it, false)));
- if(to_file)
- fputs(file, strcat(s, playername(it, false), "\n"));
- });
-
- if(teamplay)
- {
- s = strcat(":labels:teamscores:", GetTeamScoreString(0, 0));
- if(to_console)
- LOG_INFO(s);
- if(to_eventlog)
- GameLogEcho(s);
- if(to_file)
- fputs(file, strcat(s, "\n"));
-
- for(i = 1; i < 16; ++i)
- {
- s = strcat(":teamscores:see-labels:", GetTeamScoreString(i, 0));
- s = strcat(s, ":", ftos(i));
- if(to_console)
- LOG_INFO(s);
- if(to_eventlog)
- GameLogEcho(s);
- if(to_file)
- fputs(file, strcat(s, "\n"));
- }
- }
-
- if(to_console)
- LOG_INFO(":end");
- if(to_eventlog)
- GameLogEcho(":end");
- if(to_file)
- {
- fputs(file, ":end\n");
- fclose(file);
- }
-}
-
-void FixIntermissionClient(entity e)
-{
- if(!e.autoscreenshot) // initial call
- {
- e.autoscreenshot = time + 0.8; // used for autoscreenshot
- SetResourceExplicit(e, RES_HEALTH, -2342);
- // first intermission phase; voting phase has positive health (used to decide whether to send SVC_FINALE or not)
- for (int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
- {
- .entity weaponentity = weaponentities[slot];
- if(e.(weaponentity))
- {
- e.(weaponentity).effects = EF_NODRAW;
- if (e.(weaponentity).weaponchild)
- e.(weaponentity).weaponchild.effects = EF_NODRAW;
- }
- }
- if(IS_REAL_CLIENT(e))
- {
- stuffcmd(e, "\nscr_printspeed 1000000\n");
- RandomSelection_Init();
- FOREACH_WORD(autocvar_sv_intermission_cdtrack, true, {
- RandomSelection_AddString(it, 1, 1);
- });
- if (RandomSelection_chosen_string != "")
- {
- stuffcmd(e, sprintf("\ncd loop %s\n", RandomSelection_chosen_string));
- }
- msg_entity = e;
- WriteByte(MSG_ONE, SVC_INTERMISSION);
- }
- }
-}
-
-/*
-go to the next level for deathmatch
-only called if a time or frag limit has expired
-*/
-void NextLevel()
-{
- game_stopped = true;
- intermission_running = 1; // game over
-
- // enforce a wait time before allowing changelevel
- if(player_count > 0)
- intermission_exittime = time + autocvar_sv_mapchange_delay;
- else
- intermission_exittime = -1;
-
- /*
- WriteByte (MSG_ALL, SVC_CDTRACK);
- WriteByte (MSG_ALL, 3);
- WriteByte (MSG_ALL, 3);
- // done in FixIntermission
- */
-
- //pos = FindIntermission ();
-
- VoteReset();
-
- DumpStats(true);
-
- // send statistics
- PlayerStats_GameReport(true);
- WeaponStats_Shutdown();
-
- Kill_Notification(NOTIF_ALL, NULL, MSG_CENTER, CPID_Null); // kill all centerprints now
-
- if(autocvar_sv_eventlog)
- GameLogEcho(":gameover");
-
- GameLogClose();
-
- FOREACH_CLIENT(IS_PLAYER(it), {
- FixIntermissionClient(it);
- if(it.winning)
- bprint(playername(it, false), " ^7wins.\n");
- });
-
- target_music_kill();
-
- if(autocvar_g_campaign)
- CampaignPreIntermission();
-
- MUTATOR_CALLHOOK(MatchEnd);
-
- localcmd("\nsv_hook_gameend\n");
-}
-
-
-float InitiateSuddenDeath()
-{
- // Check first whether normal overtimes could be added before initiating suddendeath mode
- // - for this timelimit_overtime needs to be >0 of course
- // - also check the winning condition calculated in the previous frame and only add normal overtime
- // again, if at the point at which timelimit would be extended again, still no winner was found
- if (!autocvar_g_campaign && checkrules_overtimesadded >= 0
- && (checkrules_overtimesadded < autocvar_timelimit_overtimes || autocvar_timelimit_overtimes < 0)
- && autocvar_timelimit_overtime && !(g_race && !g_race_qualifying))
- {
- return 1; // need to call InitiateOvertime later
- }
- else
- {
- if(!checkrules_suddendeathend)
- {
- if(autocvar_g_campaign)
- checkrules_suddendeathend = time; // no suddendeath in campaign
- else
- checkrules_suddendeathend = time + 60 * autocvar_timelimit_suddendeath;
- if(g_race && !g_race_qualifying)
- race_StartCompleting();
- }
- return 0;
- }
-}
-
-void InitiateOvertime() // ONLY call this if InitiateSuddenDeath returned true
-{
- ++checkrules_overtimesadded;
- //add one more overtime by simply extending the timelimit
- cvar_set("timelimit", ftos(autocvar_timelimit + autocvar_timelimit_overtime));
- Send_Notification(NOTIF_ALL, NULL, MSG_CENTER, CENTER_OVERTIME_TIME, autocvar_timelimit_overtime * 60);
-}
-
-float GetWinningCode(float fraglimitreached, float equality)
-{
- if(autocvar_g_campaign == 1)
- {
- if(fraglimitreached)
- return WINNING_YES;
- else
- return WINNING_NO;
- }
- else
- {
- if(equality)
- {
- if(fraglimitreached)
- return WINNING_STARTSUDDENDEATHOVERTIME;
- else
- return WINNING_NEVER;
- }
- else
- {
- if(fraglimitreached)
- return WINNING_YES;
- else
- return WINNING_NO;
- }
- }
-}
-
-// set the .winning flag for exactly those players with a given field value
-void SetWinners(.float field, float value)
-{
- FOREACH_CLIENT(IS_PLAYER(it), { it.winning = (it.(field) == value); });
-}
-
-// set the .winning flag for those players with a given field value
-void AddWinners(.float field, float value)
-{
- FOREACH_CLIENT(IS_PLAYER(it), {
- if(it.(field) == value)
- it.winning = 1;
- });
-}
-
-// clear the .winning flags
-void ClearWinners()
-{
- FOREACH_CLIENT(IS_PLAYER(it), { it.winning = 0; });
-}
-
-void ShuffleMaplist()
-{
- cvar_set("g_maplist", shufflewords(autocvar_g_maplist));
-}
-
-int fragsleft_last;
-float WinningCondition_Scores(float limit, float leadlimit)
-{
- // TODO make everything use THIS winning condition (except LMS)
- WinningConditionHelper(NULL);
-
- if(teamplay)
- {
- for (int i = 1; i < 5; ++i)
- {
- Team_SetTeamScore(Team_GetTeamFromIndex(i),
- TeamScore_GetCompareValue(Team_IndexToTeam(i)));
- }
- }
-
- ClearWinners();
- if(WinningConditionHelper_winner)
- WinningConditionHelper_winner.winning = 1;
- if(WinningConditionHelper_winnerteam >= 0)
- SetWinners(team, WinningConditionHelper_winnerteam);
-
- if(WinningConditionHelper_lowerisbetter)
- {
- WinningConditionHelper_topscore = -WinningConditionHelper_topscore;
- WinningConditionHelper_secondscore = -WinningConditionHelper_secondscore;
- limit = -limit;
- }
-
- if(WinningConditionHelper_zeroisworst)
- leadlimit = 0; // not supported in this mode
-
- if(MUTATOR_CALLHOOK(Scores_CountFragsRemaining))
- {
- float fragsleft;
- if (checkrules_suddendeathend && time >= checkrules_suddendeathend)
- {
- fragsleft = 1;
- }
- else
- {
- fragsleft = FLOAT_MAX;
- float leadingfragsleft = FLOAT_MAX;
- if (limit)
- fragsleft = limit - WinningConditionHelper_topscore;
- if (leadlimit)
- leadingfragsleft = WinningConditionHelper_secondscore + leadlimit - WinningConditionHelper_topscore;
-
- if (limit && leadlimit && autocvar_leadlimit_and_fraglimit)
- fragsleft = max(fragsleft, leadingfragsleft);
- else
- fragsleft = min(fragsleft, leadingfragsleft);
- }
-
- if (fragsleft_last != fragsleft) // do not announce same remaining frags multiple times
- {
- if (fragsleft == 1)
- Send_Notification(NOTIF_ALL, NULL, MSG_ANNCE, ANNCE_REMAINING_FRAG_1);
- else if (fragsleft == 2)
- Send_Notification(NOTIF_ALL, NULL, MSG_ANNCE, ANNCE_REMAINING_FRAG_2);
- else if (fragsleft == 3)
- Send_Notification(NOTIF_ALL, NULL, MSG_ANNCE, ANNCE_REMAINING_FRAG_3);
-
- fragsleft_last = fragsleft;
- }
- }
-
- bool fraglimit_reached = (limit && WinningConditionHelper_topscore >= limit);
- bool leadlimit_reached = (leadlimit && WinningConditionHelper_topscore - WinningConditionHelper_secondscore >= leadlimit);
-
- bool limit_reached;
- // only respect leadlimit_and_fraglimit when both limits are set or the game will never end
- if (limit && leadlimit && autocvar_leadlimit_and_fraglimit)
- limit_reached = (fraglimit_reached && leadlimit_reached);
- else
- limit_reached = (fraglimit_reached || leadlimit_reached);
-
- return GetWinningCode(
- WinningConditionHelper_topscore && limit_reached,
- WinningConditionHelper_equality
- );
-}
-
-float WinningCondition_RanOutOfSpawns()
-{
- if(have_team_spawns <= 0)
- return WINNING_NO;
-
- if(!autocvar_g_spawn_useallspawns)
- return WINNING_NO;
-
- if(!some_spawn_has_been_used)
- return WINNING_NO;
-
- for (int i = 1; i < 5; ++i)
- {
- Team_SetTeamScore(Team_GetTeamFromIndex(i), 0);
- }
-
- FOREACH_CLIENT(IS_PLAYER(it) && !IS_DEAD(it),
- {
- if (Team_IsValidTeam(it.team))
- {
- Team_SetTeamScore(Team_GetTeam(it.team), 1);
- }
- });
-
- IL_EACH(g_spawnpoints, true,
- {
- if (Team_IsValidTeam(it.team))
- {
- Team_SetTeamScore(Team_GetTeam(it.team), 1);
- }
- });
-
- ClearWinners();
- float team1_score = Team_GetTeamScore(Team_GetTeamFromIndex(1));
- float team2_score = Team_GetTeamScore(Team_GetTeamFromIndex(2));
- float team3_score = Team_GetTeamScore(Team_GetTeamFromIndex(3));
- float team4_score = Team_GetTeamScore(Team_GetTeamFromIndex(4));
- if(team1_score + team2_score + team3_score + team4_score == 0)
- {
- checkrules_equality = true;
- return WINNING_YES;
- }
- else if(team1_score + team2_score + team3_score + team4_score == 1)
- {
- float t, i;
- if(team1_score)
- t = 1;
- else if(team2_score)
- t = 2;
- else if(team3_score)
- t = 3;
- else // if(team4_score)
- t = 4;
- entity balance = TeamBalance_CheckAllowedTeams(NULL);
- for(i = 0; i < MAX_TEAMSCORE; ++i)
- {
- for (int j = 1; j <= NUM_TEAMS; ++j)
- {
- if (t == j)
- {
- continue;
- }
- if (!TeamBalance_IsTeamAllowed(balance, j))
- {
- continue;
- }
- TeamScore_AddToTeam(Team_IndexToTeam(j), i, -1000);
- }
- }
-
- AddWinners(team, t);
- return WINNING_YES;
- }
- else
- return WINNING_NO;
-}
-
-/*
-============
-CheckRules_World
-
-Exit deathmatch games upon conditions
-============
-*/
-void CheckRules_World()
-{
- VoteThink();
- MapVote_Think();
-
- SetDefaultAlpha();
-
- if (intermission_running) // someone else quit the game already
- {
- if(player_count == 0) // Nobody there? Then let's go to the next map
- MapVote_Start();
- // this will actually check the player count in the next frame
- // again, but this shouldn't hurt
- return;
- }
-
- float timelimit = autocvar_timelimit * 60;
- float fraglimit = autocvar_fraglimit;
- float leadlimit = autocvar_leadlimit;
- if (leadlimit < 0) leadlimit = 0;
-
- if(warmup_stage || time <= game_starttime) // NOTE: this is <= to prevent problems in the very tic where the game starts
- {
- if(timelimit > 0)
- timelimit = 0; // timelimit is not made for warmup
- if(fraglimit > 0)
- fraglimit = 0; // no fraglimit for now
- leadlimit = 0; // no leadlimit for now
- }
-
- if(timelimit > 0)
- {
- timelimit += game_starttime;
- }
- else if (timelimit < 0)
- {
- // endmatch
- NextLevel();
- return;
- }
-
- float wantovertime;
- wantovertime = 0;
-
- if(checkrules_suddendeathend)
- {
- if(!checkrules_suddendeathwarning)
- {
- checkrules_suddendeathwarning = true;
- if(g_race && !g_race_qualifying)
- Send_Notification(NOTIF_ALL, NULL, MSG_CENTER, CENTER_RACE_FINISHLAP);
- else
- Send_Notification(NOTIF_ALL, NULL, MSG_CENTER, CENTER_OVERTIME_FRAG);
- }
- }
- else
- {
- if (timelimit && time >= timelimit)
- {
- if(g_race && (g_race_qualifying == 2) && timelimit > 0)
- {
- float totalplayers;
- float playerswithlaps;
- float readyplayers;
- totalplayers = playerswithlaps = readyplayers = 0;
- FOREACH_CLIENT(IS_PLAYER(it), {
- ++totalplayers;
- if(GameRules_scoring_add(it, RACE_FASTEST, 0))
- ++playerswithlaps;
- if(it.ready)
- ++readyplayers;
- });
-
- // at least 2 of the players have completed a lap: start the RACE
- // otherwise, the players should end the qualifying on their own
- if(readyplayers || playerswithlaps >= 2)
- {
- checkrules_suddendeathend = 0;
- ReadyRestart(); // go to race
- return;
- }
- else
- wantovertime |= InitiateSuddenDeath();
- }
- else
- wantovertime |= InitiateSuddenDeath();
- }
- }
-
- if (checkrules_suddendeathend && time >= checkrules_suddendeathend)
- {
- NextLevel();
- return;
- }
-
- int checkrules_status = WinningCondition_RanOutOfSpawns();
- if(checkrules_status == WINNING_YES)
- bprint("Hey! Someone ran out of spawns!\n");
- else if(MUTATOR_CALLHOOK(CheckRules_World, checkrules_status, timelimit, fraglimit))
- checkrules_status = M_ARGV(0, float);
- else
- checkrules_status = WinningCondition_Scores(fraglimit, leadlimit);
-
- if(checkrules_status == WINNING_STARTSUDDENDEATHOVERTIME)
- {
- checkrules_status = WINNING_NEVER;
- checkrules_overtimesadded = -1;
- wantovertime |= InitiateSuddenDeath();
- }
-
- if(checkrules_status == WINNING_NEVER)
- // equality cases! Nobody wins if the overtime ends in a draw.
- ClearWinners();
-
- if(wantovertime)
- {
- if(checkrules_status == WINNING_NEVER)
- InitiateOvertime();
- else
- checkrules_status = WINNING_YES;
- }
-
- if(checkrules_suddendeathend)
- if(checkrules_status != WINNING_NEVER || time >= checkrules_suddendeathend)
- checkrules_status = WINNING_YES;
-
- if(checkrules_status == WINNING_YES)
- {
- //print("WINNING\n");
- NextLevel();
- }
-}
-
-string GotoMap(string m)
-{
- m = GameTypeVote_MapInfo_FixName(m);
- if (!m)
- return "The map you suggested is not available on this server.";
- if (!autocvar_sv_vote_gametype)
- if(!MapInfo_CheckMap(m))
- return "The map you suggested does not support the current game mode.";
- cvar_set("nextmap", m);
- cvar_set("timelimit", "-1");
- if(mapvote_initialized || alreadychangedlevel)
- {
- if(DoNextMapOverride(0))
- return "Map switch initiated.";
- else
- return "Hm... no. For some reason I like THIS map more.";
- }
- else
- return "Map switch will happen after scoreboard.";
-}
-
-bool autocvar_sv_gameplayfix_multiplethinksperframe = true;
-void RunThink(entity this)
-{
- // don't let things stay in the past.
- // it is possible to start that way by a trigger with a local time.
- if(this.nextthink <= 0 || this.nextthink > time + frametime)
- return;
-
- float oldtime = time; // do we need to save this?
-
- for (int iterations = 0; iterations < 128 && !wasfreed(this); iterations++)
- {
- time = max(oldtime, this.nextthink);
- this.nextthink = 0;
-
- if(getthink(this))
- getthink(this)(this);
- // mods often set nextthink to time to cause a think every frame,
- // we don't want to loop in that case, so exit if the new nextthink is
- // <= the time the qc was told, also exit if it is past the end of the
- // frame
- if(this.nextthink <= time || this.nextthink > oldtime + frametime || !autocvar_sv_gameplayfix_multiplethinksperframe)
- break;
- }
-
- time = oldtime;
-}
-
-bool autocvar_sv_freezenonclients;
-bool autocvar_sv_gameplayfix_delayprojectiles = false;
-void Physics_Frame()
-{
- if(autocvar_sv_freezenonclients)
- return;
-
- IL_EACH(g_moveables, true,
- {
- if(IS_CLIENT(it) || it.classname == "" || it.move_movetype == MOVETYPE_PUSH || it.move_movetype == MOVETYPE_FAKEPUSH || it.move_movetype == MOVETYPE_PHYSICS)
- continue;
-
- //set_movetype(it, it.move_movetype);
- // inline the set_movetype function, since this is called a lot
- it.movetype = (it.move_qcphysics) ? MOVETYPE_NONE : it.move_movetype;
-
- if(it.move_movetype == MOVETYPE_NONE)
- continue;
-
- if(it.move_qcphysics)
- Movetype_Physics_NoMatchTicrate(it, PHYS_INPUT_TIMELENGTH, false);
-
- if(it.movetype >= MOVETYPE_USER_FIRST && it.movetype <= MOVETYPE_USER_LAST) // these cases have no think handling
- {
- // handle thinking here
- if (getthink(it) && it.nextthink > 0 && it.nextthink <= time + frametime)
- RunThink(it);
- }
- });
-
- if(autocvar_sv_gameplayfix_delayprojectiles >= 0)
- return;
-
- IL_EACH(g_moveables, it.move_qcphysics,
- {
- if(IS_CLIENT(it) || is_pure(it) || it.classname == "" || it.move_movetype == MOVETYPE_NONE)
- continue;
- Movetype_Physics_NoMatchTicrate(it, PHYS_INPUT_TIMELENGTH, false);
- });
-}
-
-void systems_update();
-void EndFrame()
-{
- anticheat_endframe();
-
- Physics_Frame();
-
- FOREACH_CLIENT(IS_REAL_CLIENT(it), {
- entity e = IS_SPEC(it) ? it.enemy : it;
- if (e.typehitsound) {
- STAT(TYPEHIT_TIME, it) = time;
- } else if (e.killsound) {
- STAT(KILL_TIME, it) = time;
- } else if (e.damage_dealt) {
- STAT(HIT_TIME, it) = time;
- STAT(DAMAGE_DEALT_TOTAL, it) += ceil(e.damage_dealt);
- }
- });
- // add 1 frametime because after this, engine SV_Physics
- // increases time by a frametime and then networks the frame
- // add another frametime because client shows everything with
- // 1 frame of lag (cl_nolerp 0). The last +1 however should not be
- // needed!
- float altime = time + frametime * (1 + autocvar_g_antilag_nudge);
- FOREACH_CLIENT(true, {
- it.typehitsound = false;
- it.damage_dealt = 0;
- it.killsound = false;
- antilag_record(it, CS(it), altime);
- });
- IL_EACH(g_monsters, true,
- {
- antilag_record(it, it, altime);
- });
- IL_EACH(g_projectiles, it.classname == "nade",
- {
- antilag_record(it, it, altime);
- });
- systems_update();
- IL_ENDFRAME();
-}
-
-
-/*
- * RedirectionThink:
- * returns true if redirecting
- */
-float redirection_timeout;
-float redirection_nextthink;
-float RedirectionThink()
-{
- float clients_found;
-
- if(redirection_target == "")
- return false;
-
- if(!redirection_timeout)
- {
- cvar_set("sv_public", "-2");
- redirection_timeout = time + 0.6; // this will only try twice... should be able to keep more clients
- if(redirection_target == "self")
- bprint("^3SERVER NOTICE:^7 restarting the server\n");
- else
- bprint("^3SERVER NOTICE:^7 redirecting everyone to ", redirection_target, "\n");
- }
-
- if(time < redirection_nextthink)
- return true;
-
- redirection_nextthink = time + 1;
-
- clients_found = 0;
- FOREACH_CLIENT(IS_REAL_CLIENT(it), {
- // TODO add timer
- LOG_INFO("Redirecting: sending connect command to ", it.netname);
- if(redirection_target == "self")
- stuffcmd(it, "\ndisconnect; defer ", ftos(autocvar_quit_and_redirect_timer), " reconnect\n");
- else
- stuffcmd(it, strcat("\ndisconnect; defer ", ftos(autocvar_quit_and_redirect_timer), " \"connect ", redirection_target, "\"\n"));
- ++clients_found;
- });
-
- LOG_INFO("Redirecting: ", ftos(clients_found), " clients left.");
-
- if(time > redirection_timeout || clients_found == 0)
- localcmd("\nwait; wait; wait; quit\n");
-
- return true;
-}
-
-void RestoreGame()
-{
- // Loaded from a save game
- // some things then break, so let's work around them...
-
- // Progs DB (capture records)
- ServerProgsDB = db_load(strcat("server.db", autocvar_sessionid));
-
- // Mapinfo
- MapInfo_Shutdown();
- MapInfo_Enumerate();
- MapInfo_FilterGametype(MapInfo_CurrentGametype(), MapInfo_CurrentFeatures(), MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags(), 1);
- WeaponStats_Init();
-
- TargetMusic_RestoreGame();
-}
-
-void Shutdown()
-{
- game_stopped = 2;
-
- if(world_initialized > 0)
- {
- world_initialized = 0;
- LOG_TRACE("Saving persistent data...");
- Ban_SaveBans();
-
- // playerstats with unfinished match
- PlayerStats_GameReport(false);
-
- if(!cheatcount_total)
- {
- if(autocvar_sv_db_saveasdump)
- db_dump(ServerProgsDB, strcat("server.db", autocvar_sessionid));
- else
- db_save(ServerProgsDB, strcat("server.db", autocvar_sessionid));
- }
- if(autocvar_developer > 0)
- {
- if(autocvar_sv_db_saveasdump)
- db_dump(TemporaryDB, "server-temp.db");
- else
- db_save(TemporaryDB, "server-temp.db");
- }
- CheatShutdown(); // must be after cheatcount check
- db_close(ServerProgsDB);
- db_close(TemporaryDB);
- LOG_TRACE("Saving persistent data... done!");
- // tell the bot system the game is ending now
- bot_endgame();
-
- WeaponStats_Shutdown();
- MapInfo_Shutdown();
- }
- else if(world_initialized == 0)
- {
- LOG_INFO("NOTE: crashed before even initializing the world, not saving persistent data");
- }
- else
- {
- __init_dedicated_server_shutdown();
- }
-}
+++ /dev/null
-#pragma once
-
-float checkrules_equality;
-float checkrules_suddendeathwarning;
-float checkrules_suddendeathend;
-float checkrules_overtimesadded; //how many overtimes have been already added
-
-string cache_mutatormsg;
-string cache_lastmutatormsg;
-
-const int WINNING_NO = 0; // no winner, but time limits may terminate the game
-const int WINNING_YES = 1; // winner found
-const int WINNING_NEVER = 2; // no winner, enter overtime if time limit is reached
-const int WINNING_STARTSUDDENDEATHOVERTIME = 3; // no winner, enter suddendeath overtime NOW
-
-float WinningCondition_Scores(float limit, float leadlimit);
-void SetWinners(.float field, float value);
-void IntermissionThink(entity this);
-void GotoNextMap(float reinit);
-void ReadyRestart();
-
-string GetGametype();
-
-void DumpStats(float final);
-float Map_IsRecent(string m);
-string GetNextMap();
-void ShuffleMaplist();
-void Map_Goto_SetStr(string nextmapname);
-void Map_Goto(float reinit);
-void Map_MarkAsRecent(string m);
-float DoNextMapOverride(float reinit);
-void CheckRules_World();
-float RedirectionThink();
--- /dev/null
+#include "gamelog.qh"
+
+#include <server/autocvars.qh>
+#include <server/miscfunctions.qh>
+
+string GameLog_ProcessIP(string s)
+{
+ if(!autocvar_sv_eventlog_ipv6_delimiter)
+ return s;
+ return strreplace(":", "_", s);
+}
+
+void GameLogEcho(string s)
+{
+ if (autocvar_sv_eventlog_files)
+ {
+ if (!logfile_open)
+ {
+ logfile_open = true;
+ int matches = autocvar_sv_eventlog_files_counter + 1;
+ cvar_set("sv_eventlog_files_counter", itos(matches));
+ string fn = ftos(matches);
+ if (strlen(fn) < 8)
+ fn = strcat(substring("00000000", 0, 8 - strlen(fn)), fn);
+ fn = strcat(autocvar_sv_eventlog_files_nameprefix, fn, autocvar_sv_eventlog_files_namesuffix);
+ logfile = fopen(fn, FILE_APPEND);
+ fputs(logfile, ":logversion:3\n");
+ }
+ if (logfile >= 0)
+ {
+ if (autocvar_sv_eventlog_files_timestamps)
+ fputs(logfile, strcat(":time:", strftime(true, "%Y-%m-%d %H:%M:%S", "\n", s, "\n")));
+ else
+ fputs(logfile, strcat(s, "\n"));
+ }
+ }
+ if (autocvar_sv_eventlog_console)
+ {
+ dedicated_print(strcat(s, "\n"));
+ }
+}
+
+void GameLogInit()
+{
+ logfile_open = false;
+ // will be opened later
+}
+
+void GameLogClose()
+{
+ if (logfile_open && logfile >= 0)
+ {
+ fclose(logfile);
+ logfile = -1;
+ }
+}
--- /dev/null
+#pragma once
+
+bool logfile_open;
+float logfile;
+
+string GameLog_ProcessIP(string s);
+
+void GameLogEcho(string s);
+
+void GameLogInit();
+
+void GameLogClose();
--- /dev/null
+#include "hook.qh"
+
+#include <server/bot/api.qh>
+#include <common/weapons/_all.qh>
+#include <common/stats.qh>
+#include <server/damage.qh>
+#include <server/miscfunctions.qh>
+#include <common/effects/all.qh>
+#include "weapons/common.qh"
+#include "weapons/csqcprojectile.qh"
+#include "weapons/weaponsystem.qh"
+#include "weapons/selection.qh"
+#include "weapons/tracing.qh"
+#include "player.qh"
+#include "command/common.qh"
+#include "command/vote.qh"
+#include "round_handler.qh"
+#include "../common/state.qh"
+#include "../common/physics/player.qh"
+#include "../common/vehicles/all.qh"
+#include "../common/constants.qh"
+#include "../common/util.qh"
+#include <common/net_linked.qh>
+#include <common/weapons/_all.qh>
+#include "../lib/warpzone/common.qh"
+#include "../lib/warpzone/server.qh"
+
+/*============================================
+
+ Wazat's Xonotic Grappling Hook
+
+ Contact: Wazat1@gmail.com
+
+
+Installation instructions:
+--------------------------
+
+1. Place hook.c in your gamec source directory with the other source files.
+
+2. Add this line to the bottom of progs.src:
+
+gamec/hook.c
+
+3. Open defs.h and add these lines to the very bottom:
+
+// Wazat's grappling hook
+.entity hook;
+void GrapplingHookFrame();
+void RemoveGrapplingHook(entity pl);
+void SetGrappleHookBindings();
+// hook impulses
+const float GRAPHOOK_FIRE = 20;
+const float GRAPHOOK_RELEASE = 21;
+// (note: you can change the hook impulse #'s to whatever you please)
+
+4. Open client.c and add this to the top of PutClientInServer():
+
+ RemoveGrapplingHook(this); // Wazat's Grappling Hook
+
+5. Find ClientConnect() (in client.c) and add these lines to the bottom:
+
+ // Wazat's grappling hook
+ SetGrappleHookBindings();
+
+6. Still in client.c, find PlayerPreThink and add this line just above the call to W_WeaponFrame:
+
+ GrapplingHookFrame();
+
+7. Build and test the mod. You'll want to bind a key to "+hook" like this:
+bind ctrl "+hook"
+
+And you should be done!
+
+
+============================================*/
+
+void RemoveGrapplingHooks(entity pl)
+{
+ if(pl.move_movetype == MOVETYPE_FLY)
+ set_movetype(pl, MOVETYPE_WALK);
+
+ for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
+ {
+ .entity weaponentity = weaponentities[slot];
+ if(!pl.(weaponentity))
+ continue; // continue incase other slots exist?
+ if(pl.(weaponentity).hook)
+ delete(pl.(weaponentity).hook);
+ pl.(weaponentity).hook = NULL;
+ }
+
+ //pl.disableclientprediction = false;
+}
+
+void RemoveHook(entity this)
+{
+ entity player = this.realowner;
+ .entity weaponentity = this.weaponentity_fld;
+
+ if(player.(weaponentity).hook == this)
+ player.(weaponentity).hook = NULL;
+
+ if(player.move_movetype == MOVETYPE_FLY)
+ set_movetype(player, MOVETYPE_WALK);
+ delete(this);
+}
+
+void GrapplingHookReset(entity this)
+{
+ RemoveHook(this);
+}
+
+void GrapplingHook_Stop(entity this)
+{
+ Send_Effect(EFFECT_HOOK_IMPACT, this.origin, '0 0 0', 1);
+ sound (this, CH_SHOTS, SND_HOOK_IMPACT, VOL_BASE, ATTEN_NORM);
+
+ this.state = 1;
+ setthink(this, GrapplingHookThink);
+ this.nextthink = time;
+ settouch(this, func_null);
+ this.velocity = '0 0 0';
+ set_movetype(this, MOVETYPE_NONE);
+ this.hook_length = -1;
+}
+
+.vector hook_start, hook_end;
+bool GrapplingHookSend(entity this, entity to, int sf)
+{
+ WriteHeader(MSG_ENTITY, ENT_CLIENT_HOOK);
+ sf = sf & 0x7F;
+ if(sound_allowed(MSG_BROADCAST, this.realowner))
+ sf |= 0x80;
+ WriteByte(MSG_ENTITY, sf);
+ if(sf & 1)
+ {
+ WriteByte(MSG_ENTITY, etof(this.realowner));
+ WriteByte(MSG_ENTITY, weaponslot(this.weaponentity_fld));
+ }
+ if(sf & 2)
+ {
+ WriteVector(MSG_ENTITY, this.hook_start);
+ }
+ if(sf & 4)
+ {
+ WriteVector(MSG_ENTITY, this.hook_end);
+ }
+ return true;
+}
+
+int autocvar_g_grappling_hook_tarzan;
+
+void GrapplingHookThink(entity this)
+{
+ float spd, dist, minlength, pullspeed, ropestretch, ropeairfriction, rubberforce, newlength, rubberforce_overstretch;
+ vector dir, org, end, v0, dv, v, myorg, vs;
+ .entity weaponentity = this.weaponentity_fld;
+ if(this.realowner.(weaponentity).hook != this) // how did that happen?
+ {
+ error("Owner lost the hook!\n");
+ return;
+ }
+ if(LostMovetypeFollow(this) || game_stopped || (round_handler_IsActive() && !round_handler_IsRoundStarted()) || ((this.aiment.flags & FL_PROJECTILE) && this.aiment.classname != "nade"))
+ {
+ RemoveHook(this);
+ return;
+ }
+ if(this.aiment)
+ WarpZone_RefSys_AddIncrementally(this, this.aiment);
+
+ this.nextthink = time;
+
+ int s = W_GunAlign(this.realowner.(weaponentity), STAT(GUNALIGN, this.realowner)) - 1;
+ vs = hook_shotorigin[s];
+
+ makevectors(this.realowner.v_angle);
+ org = this.realowner.origin + this.realowner.view_ofs + v_forward * vs.x + v_right * -vs.y + v_up * vs.z;
+ myorg = WarpZone_RefSys_TransformOrigin(this.realowner, this, org);
+
+ if(this.hook_length < 0)
+ this.hook_length = vlen(myorg - this.origin);
+
+ int tarzan = autocvar_g_grappling_hook_tarzan;
+ entity pull_entity = this.realowner;
+ float velocity_multiplier = 1;
+ MUTATOR_CALLHOOK(GrappleHookThink, this, tarzan, pull_entity, velocity_multiplier);
+ tarzan = M_ARGV(1, int);
+ pull_entity = M_ARGV(2, entity);
+ velocity_multiplier = M_ARGV(3, float);
+
+ if(this.state == 1)
+ {
+ pullspeed = autocvar_g_balance_grapplehook_speed_pull;//2000;
+ // speed the rope is pulled with
+
+ rubberforce = autocvar_g_balance_grapplehook_force_rubber;//2000;
+ // force the rope will use if it is stretched
+
+ rubberforce_overstretch = autocvar_g_balance_grapplehook_force_rubber_overstretch;//1000;
+ // force the rope will use if it is stretched
+
+ minlength = autocvar_g_balance_grapplehook_length_min;//100;
+ // minimal rope length
+ // if the rope goes below this length, it isn't pulled any more
+
+ ropestretch = autocvar_g_balance_grapplehook_stretch;//400;
+ // if the rope is stretched by more than this amount, more rope is
+ // given to you again
+
+ ropeairfriction = autocvar_g_balance_grapplehook_airfriction;//0.2
+ // while hanging on the rope, this friction component will help you a
+ // bit to control the rope
+
+ bool frozen_pulling = (autocvar_g_grappling_hook_tarzan >= 2 && autocvar_g_balance_grapplehook_pull_frozen);
+
+ dir = this.origin - myorg;
+ dist = vlen(dir);
+ dir = normalize(dir);
+
+ if(tarzan)
+ {
+ v = v0 = WarpZone_RefSys_TransformVelocity(pull_entity, this, pull_entity.velocity);
+
+ // first pull the rope...
+ if(this.realowner.(weaponentity).hook_state & HOOK_PULLING)
+ {
+ newlength = this.hook_length;
+ newlength = max(newlength - pullspeed * frametime, minlength);
+
+ if(newlength < dist - ropestretch) // overstretched?
+ {
+ newlength = dist - ropestretch;
+ if(v * dir < 0) // only if not already moving in hook direction
+ v = v + frametime * dir * rubberforce_overstretch;
+ }
+
+ this.hook_length = newlength;
+ }
+
+ if(pull_entity.move_movetype == MOVETYPE_FLY)
+ set_movetype(pull_entity, MOVETYPE_WALK);
+
+ if(this.realowner.(weaponentity).hook_state & HOOK_RELEASING)
+ {
+ newlength = dist;
+ this.hook_length = newlength;
+ }
+ else
+ {
+ // then pull the player
+ spd = bound(0, (dist - this.hook_length) / ropestretch, 1);
+ v = v * (1 - frametime * ropeairfriction);
+ v = v + frametime * dir * spd * rubberforce;
+
+ dv = ((v - v0) * dir) * dir;
+ if(tarzan >= 2)
+ {
+ if(this.aiment.move_movetype == MOVETYPE_WALK || this.aiment.classname == "nade")
+ {
+ entity aim_ent = ((IS_VEHICLE(this.aiment) && this.aiment.owner) ? this.aiment.owner : this.aiment);
+ v = v - dv * 0.5;
+ if((frozen_pulling && STAT(FROZEN, this.aiment)) || !frozen_pulling)
+ {
+ this.aiment.velocity = this.aiment.velocity - dv * 0.5;
+ UNSET_ONGROUND(this.aiment);
+ if(this.aiment.flags & FL_PROJECTILE)
+ UpdateCSQCProjectile(this.aiment);
+ }
+ if(this.aiment.classname == "nade")
+ this.aiment.nextthink = time + autocvar_g_balance_grapplehook_nade_time; // set time after letting go?
+ aim_ent.pusher = this.realowner;
+ aim_ent.pushltime = time + autocvar_g_maxpushtime;
+ aim_ent.istypefrag = PHYS_INPUT_BUTTON_CHAT(aim_ent);
+ }
+ }
+
+ UNSET_ONGROUND(pull_entity);
+ }
+
+ if(!frozen_pulling && !(this.aiment.flags & FL_PROJECTILE))
+ pull_entity.velocity = WarpZone_RefSys_TransformVelocity(this, pull_entity, v * velocity_multiplier);
+
+ if(frozen_pulling && autocvar_g_balance_grapplehook_pull_frozen == 2 && !STAT(FROZEN, this.aiment))
+ {
+ RemoveHook(this);
+ return;
+ }
+ }
+ else
+ {
+ end = this.origin - dir*50;
+ dist = vlen(end - myorg);
+ if(dist < 200)
+ spd = dist * (pullspeed / 200);
+ else
+ spd = pullspeed;
+ if(spd < 50)
+ spd = 0;
+ this.realowner.velocity = dir*spd;
+ set_movetype(this.realowner, MOVETYPE_FLY);
+
+ UNSET_ONGROUND(this.realowner);
+ }
+ }
+
+ makevectors(this.angles.x * '-1 0 0' + this.angles.y * '0 1 0');
+ myorg = WarpZone_RefSys_TransformOrigin(this, this.realowner, this.origin); // + v_forward * (-9);
+
+ if(myorg != this.hook_start)
+ {
+ this.SendFlags |= 2;
+ this.hook_start = myorg;
+ }
+ if(org != this.hook_end)
+ {
+ this.SendFlags |= 4;
+ this.hook_end = org;
+ }
+}
+
+void GrapplingHookTouch(entity this, entity toucher)
+{
+ if(toucher.move_movetype == MOVETYPE_FOLLOW)
+ return;
+ PROJECTILE_TOUCH(this, toucher);
+
+ GrapplingHook_Stop(this);
+
+ if(toucher)
+ //if(toucher.move_movetype != MOVETYPE_NONE)
+ {
+ SetMovetypeFollow(this, toucher);
+ WarpZone_RefSys_BeginAddingIncrementally(this, this.aiment);
+ }
+
+ //this.realowner.disableclientprediction = true;
+}
+
+void GrapplingHook_Damage(entity this, entity inflictor, entity attacker, float damage, int deathtype, .entity weaponentity, vector hitloc, vector force)
+{
+ if(GetResource(this, RES_HEALTH) <= 0)
+ return;
+
+ if (!W_CheckProjectileDamage(inflictor.realowner, this.realowner, deathtype, -1)) // no exceptions
+ return; // g_balance_projectiledamage says to halt
+
+ TakeResource(this, RES_HEALTH, damage);
+
+ if (GetResource(this, RES_HEALTH) <= 0)
+ {
+ if(attacker != this.realowner)
+ {
+ this.realowner.pusher = attacker;
+ this.realowner.pushltime = time + autocvar_g_maxpushtime;
+ this.realowner.istypefrag = PHYS_INPUT_BUTTON_CHAT(this.realowner);
+ }
+ RemoveHook(this);
+ }
+}
+
+void FireGrapplingHook(entity actor, .entity weaponentity)
+{
+ if(weaponLocked(actor)) return;
+ if(actor.vehicle) return;
+
+ int s = W_GunAlign(actor.(weaponentity), STAT(GUNALIGN, actor)) - 1;
+ vector vs = hook_shotorigin[s];
+ 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);
+ W_MuzzleFlash(WEP_HOOK, actor, weaponentity, w_shotorg, '0 0 0');
+ actor.(weaponentity).movedir = oldmovedir;
+
+ entity missile = WarpZone_RefSys_SpawnSameRefSys(actor);
+ missile.owner = missile.realowner = actor;
+ actor.(weaponentity).hook = missile;
+ missile.weaponentity_fld = weaponentity;
+ missile.reset = GrapplingHookReset;
+ missile.classname = "grapplinghook";
+ missile.flags = FL_PROJECTILE;
+ IL_PUSH(g_projectiles, missile);
+ IL_PUSH(g_bot_dodge, missile);
+
+ set_movetype(missile, ((autocvar_g_balance_grapplehook_gravity) ? MOVETYPE_TOSS : MOVETYPE_FLY));
+ PROJECTILE_MAKETRIGGER(missile);
+
+ //setmodel (missile, MDL_HOOK); // precision set below
+ setsize (missile, '-3 -3 -3', '3 3 3');
+ setorigin(missile, w_shotorg);
+
+ missile.state = 0; // not latched onto anything
+
+ W_SetupProjVelocity_Explicit(missile, w_shotdir, v_up, autocvar_g_balance_grapplehook_speed_fly, 0, 0, 0, false);
+
+ missile.angles = vectoangles (missile.velocity);
+ //missile.glow_color = 250; // 244, 250
+ //missile.glow_size = 120;
+ settouch(missile, GrapplingHookTouch);
+ setthink(missile, GrapplingHookThink);
+ missile.nextthink = time;
+
+ missile.effects = /*EF_FULLBRIGHT | EF_ADDITIVE |*/ EF_LOWPRECISION;
+
+ SetResourceExplicit(missile, RES_HEALTH, autocvar_g_balance_grapplehook_health);
+ missile.event_damage = GrapplingHook_Damage;
+ missile.takedamage = DAMAGE_AIM;
+ missile.damageforcescale = 0;
+ missile.damagedbycontents = (autocvar_g_balance_grapplehook_damagedbycontents);
+ if(missile.damagedbycontents)
+ IL_PUSH(g_damagedbycontents, missile);
+
+ missile.hook_start = missile.hook_end = missile.origin;
+
+ Net_LinkEntity(missile, false, 0, GrapplingHookSend);
+}
+
+void GrappleHookInit()
+{
+ if(g_grappling_hook)
+ {
+ hook_shotorigin[0] = '8 8 -12';
+ hook_shotorigin[1] = '8 8 -12';
+ hook_shotorigin[2] = '8 8 -12';
+ hook_shotorigin[3] = '8 8 -12';
+ }
+ else
+ {
+ Weapon w = WEP_HOOK;
+ w.wr_init(w);
+ hook_shotorigin[0] = shotorg_adjust_values(CL_Weapon_GetShotOrg(WEP_HOOK.m_id), false, false, 1);
+ hook_shotorigin[1] = shotorg_adjust_values(CL_Weapon_GetShotOrg(WEP_HOOK.m_id), false, false, 2);
+ hook_shotorigin[2] = shotorg_adjust_values(CL_Weapon_GetShotOrg(WEP_HOOK.m_id), false, false, 3);
+ hook_shotorigin[3] = shotorg_adjust_values(CL_Weapon_GetShotOrg(WEP_HOOK.m_id), false, false, 4);
+ }
+}
--- /dev/null
+#pragma once
+
+// Wazat's grappling hook
+.entity hook;
+void GrapplingHookThink(entity this);
+void RemoveGrapplingHooks(entity pl);
+void RemoveHook(entity this);
+// (note: you can change the hook impulse #'s to whatever you please)
+.float hook_time;
+
+.float hook_length;
+
+const float HOOK_FIRING = BIT(0);
+const float HOOK_REMOVING = BIT(1);
+const float HOOK_PULLING = BIT(2);
+const float HOOK_RELEASING = BIT(3);
+const float HOOK_WAITING_FOR_RELEASE = BIT(4);
+.float hook_state;
+.int state;
+
+void GrappleHookInit();
+vector hook_shotorigin[4];
+
#include "weapons/throwing.qh"
#include "command/common.qh"
#include "cheats.qh"
+#include "client.qh"
#include "clientkill.qh"
+#include "damage.qh"
#include "weapons/selection.qh"
#include "weapons/tracing.qh"
#include "weapons/weaponsystem.qh"
+#include <common/gamemodes/_mod.qh>
+
#include <common/state.qh>
#include "../common/minigames/sv_minigames.qh"
{
if (this.vehicle) return;
if (IS_DEAD(this)) return;
+ bool is_dualwielding = W_DualWielding(this);
for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
{
.entity weaponentity = weaponentities[slot];
- W_ThrowWeapon(this, weaponentity, W_CalculateProjectileVelocity(this, this.velocity, v_forward * 750, false), '0 0 0', true);
-
- if(autocvar_g_weaponswitch_debug != 1)
- break;
+ vector md = this.(weaponentity).movedir;
+ vector vecs = ((md.x > 0) ? md : '0 0 0');
+ vector dv = v_right * -vecs.y;
+ if(!is_dualwielding)
+ dv = '0 0 0'; // don't override!
+ W_ThrowWeapon(this, weaponentity, W_CalculateProjectileVelocity(this, this.velocity, v_forward * 750, false), dv, true);
+
+ if(autocvar_g_weaponswitch_debug == 2)
+ break; // in this mode, the off-hand weapon is selected based on the primary weapon, don't drop it twice!
}
}
#include "ipban.qh"
-#include <server/defs.qh>
+#include <common/weapons/_all.qh>
+#include <common/stats.qh>
#include <server/miscfunctions.qh>
#include "autocvars.qh"
#include "command/banning.qh"
-#include "defs.qh"
#include "../common/constants.qh"
#include "../common/util.qh"
+++ /dev/null
-#include "items.qh"
-
-/// \file
-/// \brief Source file that contains implementation of the functions related to
-/// game items.
-/// \copyright GNU GPLv2 or any later version.
-
-#include <server/mutators/_mod.qh>
-#include <common/weapons/all.qh>
-#include <common/mapobjects/subs.qh>
-
-.bool m_isloot; ///< Holds whether item is loot.
-/// \brief Holds whether strength, shield or superweapon timers expire while
-/// this item is on the ground.
-.bool m_isexpiring;
-
-entity Item_FindDefinition(string class_name)
-{
- FOREACH(Items, it.m_canonical_spawnfunc == class_name,
- {
- return it;
- });
- FOREACH(Weapons, it.m_canonical_spawnfunc == class_name,
- {
- return it.m_pickup;
- });
- return NULL;
-}
-
-bool Item_IsAllowed(string class_name)
-{
- entity definition = Item_FindDefinition(class_name);
- if (definition == NULL)
- {
- return false;
- }
- return Item_IsDefinitionAllowed(definition);
-}
-
-bool Item_IsDefinitionAllowed(entity definition)
-{
- return !MUTATOR_CALLHOOK(FilterItemDefinition, definition);
-}
-
-entity Item_Create(string class_name, vector position, bool no_align)
-{
- entity item = spawn();
- item.classname = class_name;
- item.spawnfunc_checked = true;
- setorigin(item, position);
- item.noalign = no_align;
- Item_Initialize(item, class_name);
- if (wasfreed(item))
- {
- return NULL;
- }
- return item;
-}
-
-void Item_Initialize(entity item, string class_name)
-{
- FOREACH(Weapons, it.m_canonical_spawnfunc == class_name,
- {
- weapon_defaultspawnfunc(item, it);
- return;
- });
- FOREACH(Items, it.m_canonical_spawnfunc == class_name,
- {
- StartItem(item, it);
- return;
- });
- LOG_FATALF("Item_Initialize: Invalid classname: %s", class_name);
-}
-
-entity Item_CreateLoot(string class_name, vector position, vector vel,
- float time_to_live)
-{
- entity item = spawn();
- if (!Item_InitializeLoot(item, class_name, position, vel, time_to_live))
- {
- return NULL;
- }
- return item;
-}
-
-bool Item_InitializeLoot(entity item, string class_name, vector position,
- vector vel, float time_to_live)
-{
- item.classname = class_name;
- Item_SetLoot(item, true);
- item.noalign = true;
- setorigin(item, position);
- item.pickup_anyway = true;
- item.spawnfunc_checked = true;
- Item_Initialize(item, class_name);
- if (wasfreed(item))
- {
- return false;
- }
- item.gravity = 1;
- item.velocity = vel;
- SUB_SetFade(item, time + time_to_live, 1);
- return true;
-}
-
-bool Item_IsLoot(entity item)
-{
- return item.m_isloot;
-}
-
-void Item_SetLoot(entity item, bool loot)
-{
- item.m_isloot = loot;
-}
-
-bool Item_ShouldKeepPosition(entity item)
-{
- return item.noalign || (item.spawnflags & 1);
-}
-
-bool Item_IsExpiring(entity item)
-{
- return item.m_isexpiring;
-}
-
-void Item_SetExpiring(entity item, bool expiring)
-{
- item.m_isexpiring = expiring;
-}
-
-// Compatibility spawn functions
-
-// FIXME: in Quake this is green armor, in Xonotic maps it is an armor shard
-SPAWNFUNC_ITEM(item_armor1, ITEM_ArmorSmall)
-
-SPAWNFUNC_ITEM(item_armor25, ITEM_ArmorMega)
-
-SPAWNFUNC_ITEM(item_armor_large, ITEM_ArmorMega)
-
-SPAWNFUNC_ITEM(item_health1, ITEM_HealthSmall)
-
-SPAWNFUNC_ITEM(item_health25, ITEM_HealthMedium)
-
-SPAWNFUNC_ITEM(item_health_large, ITEM_HealthBig)
-
-SPAWNFUNC_ITEM(item_health100, ITEM_HealthMega)
-
-SPAWNFUNC_ITEM(item_quad, ITEM_Strength)
+++ /dev/null
-#pragma once
-
-/// \file
-/// \brief Header file that describes the functions related to game items.
-/// \copyright GNU GPLv2 or any later version.
-
-bool startitem_failed;
-
-/// \brief Returns the item definition corresponding to the given class name.
-/// \param[in] class_name Class name to search for.
-/// \return Item definition corresponding to the given class name or NULL is not
-/// found.
-entity Item_FindDefinition(string class_name);
-
-/// \brief Checks whether the items with the specified class name are allowed to
-/// spawn.
-/// \param[in] class_name Item class name to check.
-/// \return True items with the specified class name are allowed to spawn, false
-/// otherwise.
-bool Item_IsAllowed(string class_name);
-
-/// \brief Checks whether the items with the specified definition are allowed to
-/// spawn.
-/// \param[in] definition Item definition to check.
-/// \return True items with the specified definition are allowed to spawn, false
-/// otherwise.
-bool Item_IsDefinitionAllowed(entity definition);
-
-/// \brief Creates a new item.
-/// \param[in] class_name Class name of the item.
-/// \param[in] position Position of the item.
-/// \param[in] no_align True if item should be placed directly at specified
-/// position, false to let it drop to the ground.
-/// \return Item on success, NULL otherwise.
-entity Item_Create(string class_name, vector position, bool no_align);
-
-/// \brief Initializes the item according to class name.
-/// \param[in,out] item Item to initialize.
-/// \param[in] class_name Class name to use.
-/// \return No return.
-/// \nore This function is useful if you want to set some item properties before
-/// initialization.
-void Item_Initialize(entity item, string class_name);
-
-/// \brief Creates a loot item.
-/// \param[in] class_name Class name of the item.
-/// \param[in] position Position of the item.
-/// \param[in] velocity of the item.
-/// \param[in] time_to_live Amount of time after which the item will disappear.
-/// \return Item on success, NULL otherwise.
-entity Item_CreateLoot(string class_name, vector position, vector vel,
- float time_to_live);
-
-/// \brief Initializes the loot item.
-/// \param[in] class_name Class name of the item.
-/// \param[in] position Position of the item.
-/// \param[in] velocity of the item.
-/// \param[in] time_to_live Amount of time after which the item will disappear.
-/// \return True on success, false otherwise.
-/// \nore This function is useful if you want to set some item properties before
-/// initialization.
-bool Item_InitializeLoot(entity item, string class_name, vector position,
- vector vel, float time_to_live);
-
-/// \brief Returns whether the item is loot.
-/// \param[in] item Item to check.
-/// \return True if the item is loot, false otherwise.
-bool Item_IsLoot(entity item);
-
-/// \brief Sets the item loot status.
-/// \param[in,out] item Item to adjust.
-/// \param[in] loot Whether item is loot.
-/// \return No return.
-void Item_SetLoot(entity item, bool loot);
-
-/// \brief Returns whether item should keep its position or be dropped to the
-/// ground.
-/// \param[in] item Item to check.
-/// \return True if item should keep its position or false if it should be
-/// dropped to the ground.
-bool Item_ShouldKeepPosition(entity item);
-
-/// \brief Returns whether the item is expiring (i.e. its strength, shield and
-/// superweapon timers expire while it is on the ground).
-/// \param[in] item Item to check.
-/// \return True if the item is expiring, false otherwise.
-bool Item_IsExpiring(entity item);
-
-/// \brief Sets the item expiring status (i.e. whether its strength, shield
-/// and superweapon timers expire while it is on the ground).
-/// \param[in,out] item Item to adjust.
-/// \param[in] expiring Whether item is expiring.
-/// \return No return.
-void Item_SetExpiring(entity item, bool expiring);
--- /dev/null
+// generated file; do not modify
+#include <server/items/items.qc>
+#include <server/items/spawning.qc>
--- /dev/null
+// generated file; do not modify
+#include <server/items/items.qh>
+#include <server/items/spawning.qh>
--- /dev/null
+#include "items.qh"
+
+#include <common/items/_mod.qh>
+
+#include <server/bot/api.qh>
+
+#include <server/command/vote.qh>
+
+#include <server/damage.qh>
+
+#include <server/mutators/_mod.qh>
+
+#include <server/teamplay.qh>
+
+#include <server/weapons/common.qh>
+#include <server/weapons/selection.qh>
+#include <server/weapons/weaponsystem.qh>
+
+#include <common/constants.qh>
+#include <common/deathtypes/all.qh>
+#include <common/notifications/all.qh>
+#include <common/mapobjects/subs.qh>
+#include <common/mapobjects/triggers.qh>
+#include <common/util.qh>
+
+#include <common/monsters/_mod.qh>
+
+#include <common/wepent.qh>
+#include <common/weapons/_all.qh>
+
+#include <common/mutators/mutator/buffs/buffs.qh>
+#include <common/mutators/mutator/buffs/sv_buffs.qh>
+
+#include <lib/warpzone/util_server.qh>
+
+bool ItemSend(entity this, entity to, int sf)
+{
+ if(this.gravity)
+ sf |= ISF_DROP;
+ else
+ sf &= ~ISF_DROP;
+
+ WriteHeader(MSG_ENTITY, ENT_CLIENT_ITEM);
+ WriteByte(MSG_ENTITY, sf);
+
+ //WriteByte(MSG_ENTITY, this.cnt);
+ if(sf & ISF_LOCATION)
+ {
+ WriteVector(MSG_ENTITY, this.origin);
+ }
+
+ if(sf & ISF_ANGLES)
+ {
+ WriteAngleVector(MSG_ENTITY, this.angles);
+ }
+
+ // sets size on the client, unused on server
+ //if(sf & ISF_SIZE)
+
+ if(sf & ISF_STATUS)
+ WriteByte(MSG_ENTITY, this.ItemStatus);
+
+ if(sf & ISF_MODEL)
+ {
+ WriteShort(MSG_ENTITY, this.fade_end);
+ WriteShort(MSG_ENTITY, this.fade_start);
+
+ if(this.mdl == "")
+ LOG_TRACE("^1WARNING!^7 this.mdl is unset for item ", this.classname, "expect a crash just about now");
+
+ WriteString(MSG_ENTITY, this.mdl);
+ }
+
+
+ if(sf & ISF_COLORMAP)
+ {
+ WriteShort(MSG_ENTITY, this.colormap);
+ WriteByte(MSG_ENTITY, this.glowmod.x * 255.0);
+ WriteByte(MSG_ENTITY, this.glowmod.y * 255.0);
+ WriteByte(MSG_ENTITY, this.glowmod.z * 255.0);
+ }
+
+ if(sf & ISF_DROP)
+ {
+ WriteVector(MSG_ENTITY, this.velocity);
+ }
+
+ return true;
+}
+
+void ItemUpdate(entity this)
+{
+ this.oldorigin = this.origin;
+ this.SendFlags |= ISF_LOCATION;
+}
+
+void UpdateItemAfterTeleport(entity this)
+{
+ if(getSendEntity(this) == ItemSend)
+ ItemUpdate(this);
+}
+
+bool have_pickup_item(entity this)
+{
+ if(this.itemdef.instanceOfPowerup)
+ {
+ if(autocvar_g_powerups > 0)
+ return true;
+ if(autocvar_g_powerups == 0)
+ return false;
+ }
+ else
+ {
+ if(autocvar_g_pickup_items > 0)
+ return true;
+ if(autocvar_g_pickup_items == 0)
+ return false;
+ if(g_weaponarena)
+ if(STAT(WEAPONS, this) || this.itemdef.instanceOfAmmo) // no item or ammo pickups in weaponarena
+ return false;
+ }
+ return true;
+}
+
+void Item_Show(entity e, int mode)
+{
+ e.effects &= ~(EF_ADDITIVE | EF_STARDUST | EF_FULLBRIGHT | EF_NODEPTHTEST);
+ e.ItemStatus &= ~ITS_STAYWEP;
+ entity def = e.itemdef;
+ if (mode > 0)
+ {
+ // make the item look normal, and be touchable
+ e.model = e.mdl;
+ e.solid = SOLID_TRIGGER;
+ e.spawnshieldtime = 1;
+ e.ItemStatus |= ITS_AVAILABLE;
+ }
+ else if (mode < 0)
+ {
+ // hide the item completely
+ e.model = string_null;
+ e.solid = SOLID_NOT;
+ e.spawnshieldtime = 1;
+ e.ItemStatus &= ~ITS_AVAILABLE;
+ }
+ else
+ {
+ bool nostay = def.instanceOfWeaponPickup ? !!(def.m_weapon.m_wepset & WEPSET_SUPERWEAPONS) : false // no weapon-stay on superweapons
+ || e.team // weapon stay isn't supported for teamed weapons
+ ;
+ if(def.instanceOfWeaponPickup && !nostay && g_weapon_stay)
+ {
+ // make the item translucent and not touchable
+ e.model = e.mdl;
+ e.solid = SOLID_TRIGGER; // can STILL be picked up!
+ e.effects |= EF_STARDUST;
+ e.spawnshieldtime = 0; // field indicates whether picking it up may give you anything other than the weapon
+ e.ItemStatus |= (ITS_AVAILABLE | ITS_STAYWEP);
+ }
+ else
+ {
+ //setmodel(e, "null");
+ e.solid = SOLID_NOT;
+ e.colormod = '0 0 0';
+ //e.glowmod = e.colormod;
+ e.spawnshieldtime = 1;
+ e.ItemStatus &= ~ITS_AVAILABLE;
+ }
+ }
+
+ if (def.m_glow)
+ e.ItemStatus |= ITS_GLOW;
+
+ if (autocvar_g_nodepthtestitems)
+ e.effects |= EF_NODEPTHTEST;
+
+ if (autocvar_g_fullbrightitems)
+ e.ItemStatus |= ITS_ALLOWFB;
+ else
+ e.ItemStatus &= ~ITS_ALLOWFB;
+
+ if (autocvar_sv_simple_items)
+ e.ItemStatus |= ITS_ALLOWSI;
+
+ // relink entity (because solid may have changed)
+ setorigin(e, e.origin);
+ e.SendFlags |= ISF_STATUS;
+}
+
+void Item_Think(entity this)
+{
+ this.nextthink = time;
+ if(this.origin != this.oldorigin)
+ ItemUpdate(this);
+}
+
+bool Item_ItemsTime_SpectatorOnly(GameItem it);
+bool Item_ItemsTime_Allow(GameItem it);
+float Item_ItemsTime_UpdateTime(entity e, float t);
+void Item_ItemsTime_SetTime(entity e, float t);
+void Item_ItemsTime_SetTimesForAllPlayers();
+
+void Item_Respawn(entity this)
+{
+ Item_Show(this, 1);
+ sound(this, CH_TRIGGER, this.itemdef.m_respawnsound, VOL_BASE, ATTEN_NORM); // play respawn sound
+ setorigin(this, this.origin);
+
+ if (Item_ItemsTime_Allow(this.itemdef) || (STAT(WEAPONS, this) & WEPSET_SUPERWEAPONS))
+ {
+ float t = Item_ItemsTime_UpdateTime(this, 0);
+ Item_ItemsTime_SetTime(this, t);
+ Item_ItemsTime_SetTimesForAllPlayers();
+ }
+
+ setthink(this, Item_Think);
+ this.nextthink = time;
+
+ //Send_Effect(EFFECT_ITEM_RESPAWN, this.origin + this.mins_z * '0 0 1' + '0 0 48', '0 0 0', 1);
+ Send_Effect(EFFECT_ITEM_RESPAWN, CENTER_OR_VIEWOFS(this), '0 0 0', 1);
+}
+
+void Item_RespawnCountdown(entity this)
+{
+ if(this.item_respawncounter >= ITEM_RESPAWN_TICKS)
+ {
+ if(this.waypointsprite_attached)
+ WaypointSprite_Kill(this.waypointsprite_attached);
+ Item_Respawn(this);
+ }
+ else
+ {
+ this.nextthink = time + 1;
+ this.item_respawncounter += 1;
+ if(this.item_respawncounter == 1)
+ {
+ do {
+ {
+ entity wi = REGISTRY_GET(Weapons, this.weapon);
+ if (wi != WEP_Null) {
+ entity wp = WaypointSprite_Spawn(WP_Weapon, 0, 0, this, '0 0 64', NULL, 0, this, waypointsprite_attached, true, RADARICON_Weapon);
+ wp.wp_extra = wi.m_id;
+ break;
+ }
+ }
+ {
+ entity ii = this.itemdef;
+ if (ii != NULL) {
+ entity wp = WaypointSprite_Spawn(WP_Item, 0, 0, this, '0 0 64', NULL, 0, this, waypointsprite_attached, true, RADARICON_Item);
+ wp.wp_extra = ii.m_id;
+ break;
+ }
+ }
+ } while (0);
+ bool mutator_returnvalue = MUTATOR_CALLHOOK(Item_RespawnCountdown, this);
+ if(this.waypointsprite_attached)
+ {
+ GameItem def = this.itemdef;
+ if (Item_ItemsTime_SpectatorOnly(def) && !mutator_returnvalue)
+ WaypointSprite_UpdateRule(this.waypointsprite_attached, 0, SPRITERULE_SPECTATOR);
+ WaypointSprite_UpdateBuildFinished(this.waypointsprite_attached, time + ITEM_RESPAWN_TICKS);
+ }
+ }
+
+ if(this.waypointsprite_attached)
+ {
+ FOREACH_CLIENT(IS_REAL_CLIENT(it), {
+ 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, 0); // play respawn sound
+ }
+ });
+
+ WaypointSprite_Ping(this.waypointsprite_attached);
+ //WaypointSprite_UpdateHealth(this.waypointsprite_attached, this.item_respawncounter);
+ }
+ }
+}
+
+void Item_RespawnThink(entity this)
+{
+ this.nextthink = time;
+ if(this.origin != this.oldorigin)
+ ItemUpdate(this);
+
+ if(time >= this.wait)
+ Item_Respawn(this);
+}
+
+void Item_ScheduleRespawnIn(entity e, float t)
+{
+ // if the respawn time is longer than 10 seconds, show a waypoint, otherwise, just respawn normally
+ if ((Item_ItemsTime_Allow(e.itemdef) || (STAT(WEAPONS, e) & WEPSET_SUPERWEAPONS) || MUTATOR_CALLHOOK(Item_ScheduleRespawn, e, t)) && (t - ITEM_RESPAWN_TICKS) > 0)
+ {
+ setthink(e, Item_RespawnCountdown);
+ e.nextthink = time + max(0, t - ITEM_RESPAWN_TICKS);
+ e.scheduledrespawntime = e.nextthink + ITEM_RESPAWN_TICKS;
+ e.item_respawncounter = 0;
+ if(Item_ItemsTime_Allow(e.itemdef) || (STAT(WEAPONS, e) & WEPSET_SUPERWEAPONS))
+ {
+ t = Item_ItemsTime_UpdateTime(e, e.scheduledrespawntime);
+ Item_ItemsTime_SetTime(e, t);
+ Item_ItemsTime_SetTimesForAllPlayers();
+ }
+ }
+ else
+ {
+ setthink(e, Item_RespawnThink);
+ e.nextthink = time;
+ e.scheduledrespawntime = time + t;
+ e.wait = time + t;
+
+ if(Item_ItemsTime_Allow(e.itemdef) || (STAT(WEAPONS, e) & WEPSET_SUPERWEAPONS))
+ {
+ t = Item_ItemsTime_UpdateTime(e, e.scheduledrespawntime);
+ Item_ItemsTime_SetTime(e, t);
+ Item_ItemsTime_SetTimesForAllPlayers();
+ }
+ }
+}
+
+AUTOCVAR(g_pickup_respawntime_scaling_reciprocal, float, 0.0, "Multiply respawn time by `reciprocal / (p + offset) + linear` where `p` is the current number of players, takes effect with 2 or more players present, `reciprocal` (with `offset` and `linear` set to 0) can be used to achieve a constant number of items spawned *per player*");
+AUTOCVAR(g_pickup_respawntime_scaling_offset, float, 0.0, "Multiply respawn time by `reciprocal / (p + offset) + linear` where `p` is the current number of players, takes effect with 2 or more players present, `offset` offsets the curve left or right - the results are not intuitive and I recommend plotting the respawn time and the number of items per player to see what's happening");
+AUTOCVAR(g_pickup_respawntime_scaling_linear, float, 1.0, "Multiply respawn time by `reciprocal / (p + offset) + linear` where `p` is the current number of players, takes effect with 2 or more players present, `linear` can be used to simply scale the respawn time linearly");
+
+/// Adjust respawn time according to the number of players.
+float adjust_respawntime(float normal_respawntime) {
+ float r = autocvar_g_pickup_respawntime_scaling_reciprocal;
+ float o = autocvar_g_pickup_respawntime_scaling_offset;
+ float l = autocvar_g_pickup_respawntime_scaling_linear;
+
+ if (r == 0 && l == 1) {
+ return normal_respawntime;
+ }
+
+ entity balance = TeamBalance_CheckAllowedTeams(NULL);
+ TeamBalance_GetTeamCounts(balance, NULL);
+ int players = 0;
+ for (int i = 1; i <= NUM_TEAMS; ++i)
+ {
+ if (TeamBalance_IsTeamAllowed(balance, i))
+ {
+ players += TeamBalance_GetNumberOfPlayers(balance, i);
+ }
+ }
+ TeamBalance_Destroy(balance);
+
+ if (players >= 2) {
+ return normal_respawntime * (r / (players + o) + l);
+ } else {
+ return normal_respawntime;
+ }
+}
+
+void Item_ScheduleRespawn(entity e)
+{
+ if(e.respawntime > 0)
+ {
+ Item_Show(e, 0);
+
+ float adjusted_respawntime = adjust_respawntime(e.respawntime);
+ //LOG_INFOF("item %s will respawn in %f", e.classname, adjusted_respawntime);
+
+ // range: adjusted_respawntime - respawntimejitter .. adjusted_respawntime + respawntimejitter
+ float respawn_in = adjusted_respawntime + crandom() * e.respawntimejitter;
+ Item_ScheduleRespawnIn(e, respawn_in);
+ }
+ else // if respawntime is -1, this item does not respawn
+ Item_Show(e, -1);
+}
+
+AUTOCVAR(g_pickup_respawntime_initial_random, int, 1,
+ "For items that don't start spawned: 0: spawn after their normal respawntime; 1: spawn after `random * respawntime` with the *same* random; 2: same as 1 but each item has separate random");
+
+void Item_ScheduleInitialRespawn(entity e)
+{
+ Item_Show(e, 0);
+
+ float spawn_in;
+ if (autocvar_g_pickup_respawntime_initial_random == 0)
+ {
+ // range: respawntime .. respawntime + respawntimejitter
+ spawn_in = e.respawntime + random() * e.respawntimejitter;
+ }
+ else
+ {
+ float rnd;
+ if (autocvar_g_pickup_respawntime_initial_random == 1)
+ {
+ static float shared_random = 0;
+ // NOTE this code works only if items are scheduled at the same time (normal case)
+ // NOTE2 random() can't return exactly 1 so this check always work as intended
+ if (!shared_random || floor(time) > shared_random)
+ shared_random = floor(time) + random();
+ rnd = shared_random - floor(time);
+ }
+ else
+ rnd = random();
+
+ // range:
+ // if respawntime >= ITEM_RESPAWN_TICKS: ITEM_RESPAWN_TICKS .. respawntime + respawntimejitter
+ // else: 0 .. ITEM_RESPAWN_TICKS
+ // this is to prevent powerups spawning unexpectedly without waypoints
+ spawn_in = ITEM_RESPAWN_TICKS + rnd * (e.respawntime + e.respawntimejitter - ITEM_RESPAWN_TICKS);
+ }
+
+ Item_ScheduleRespawnIn(e, max(0, game_starttime - time) + ((e.respawntimestart) ? e.respawntimestart : spawn_in));
+}
+
+void GiveRandomWeapons(entity receiver, int num_weapons, string weapon_names,
+ entity ammo_entity)
+{
+ if (num_weapons == 0)
+ {
+ return;
+ }
+ int num_potential_weapons = tokenize_console(weapon_names);
+ for (int give_attempt = 0; give_attempt < num_weapons; ++give_attempt)
+ {
+ RandomSelection_Init();
+ for (int weapon_index = 0; weapon_index < num_potential_weapons;
+ ++weapon_index)
+ {
+ string weapon = argv(weapon_index);
+ FOREACH(Weapons, it != WEP_Null,
+ {
+ // Finding a weapon which player doesn't have.
+ if (!(STAT(WEAPONS, receiver) & it.m_wepset) && (it.netname == weapon))
+ {
+ RandomSelection_AddEnt(it, 1, 1);
+ break;
+ }
+ });
+ }
+ if (RandomSelection_chosen_ent == NULL)
+ {
+ return;
+ }
+ STAT(WEAPONS, receiver) |= RandomSelection_chosen_ent.m_wepset;
+ if (RandomSelection_chosen_ent.ammo_type == RES_NONE)
+ {
+ continue;
+ }
+ if (GetResource(receiver,
+ RandomSelection_chosen_ent.ammo_type) != 0)
+ {
+ continue;
+ }
+ GiveResource(receiver, RandomSelection_chosen_ent.ammo_type,
+ GetResource(ammo_entity,
+ RandomSelection_chosen_ent.ammo_type));
+ }
+}
+
+bool Item_GiveAmmoTo(entity item, entity player, int res_type, float ammomax)
+{
+ float amount = GetResource(item, res_type);
+ if (amount == 0)
+ {
+ return false;
+ }
+ float player_amount = GetResource(player, res_type);
+ if (item.spawnshieldtime)
+ {
+ if ((player_amount >= ammomax) && (item.pickup_anyway <= 0))
+ return false;
+ }
+ else if (g_weapon_stay == 2)
+ {
+ ammomax = min(amount, ammomax);
+ if(player_amount >= ammomax)
+ return false;
+ }
+ else
+ return false;
+ if (amount < 0)
+ TakeResourceWithLimit(player, res_type, -amount, ammomax);
+ else
+ GiveResourceWithLimit(player, res_type, amount, ammomax);
+ return true;
+}
+
+bool Item_GiveTo(entity item, entity player)
+{
+ // if nothing happens to player, just return without taking the item
+ int _switchweapon = 0;
+ // in case the player has autoswitch enabled do the following:
+ // if the player is using their best weapon before items are given, they
+ // probably want to switch to an even better weapon after items are given
+
+ if(CS(player).autoswitch)
+ {
+ for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
+ {
+ .entity weaponentity = weaponentities[slot];
+ if(player.(weaponentity).m_weapon != WEP_Null || slot == 0)
+ {
+ if(player.(weaponentity).m_switchweapon == w_getbestweapon(player, weaponentity))
+ _switchweapon |= BIT(slot);
+
+ if(!(STAT(WEAPONS, player) & WepSet_FromWeapon(player.(weaponentity).m_switchweapon)))
+ _switchweapon |= BIT(slot);
+ }
+ }
+ }
+ bool pickedup = false;
+ pickedup |= Item_GiveAmmoTo(item, player, RES_HEALTH, item.max_health);
+ pickedup |= Item_GiveAmmoTo(item, player, RES_ARMOR, item.max_armorvalue);
+ pickedup |= Item_GiveAmmoTo(item, player, RES_SHELLS, g_pickup_shells_max);
+ pickedup |= Item_GiveAmmoTo(item, player, RES_BULLETS, g_pickup_nails_max);
+ pickedup |= Item_GiveAmmoTo(item, player, RES_ROCKETS, g_pickup_rockets_max);
+ pickedup |= Item_GiveAmmoTo(item, player, RES_CELLS, g_pickup_cells_max);
+ pickedup |= Item_GiveAmmoTo(item, player, RES_PLASMA, g_pickup_plasma_max);
+ pickedup |= Item_GiveAmmoTo(item, player, RES_FUEL, g_pickup_fuel_max);
+ if (item.itemdef.instanceOfWeaponPickup)
+ {
+ WepSet w;
+ w = STAT(WEAPONS, item);
+ w &= ~STAT(WEAPONS, player);
+
+ if (w || (item.spawnshieldtime && item.pickup_anyway > 0))
+ {
+ pickedup = true;
+ FOREACH(Weapons, it != WEP_Null, {
+ if(w & (it.m_wepset))
+ {
+ for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
+ {
+ .entity weaponentity = weaponentities[slot];
+ if(player.(weaponentity).m_weapon != WEP_Null || slot == 0)
+ W_DropEvent(wr_pickup, player, it.m_id, item, weaponentity);
+ }
+ W_GiveWeapon(player, it.m_id);
+ }
+ });
+ }
+ }
+
+ if (item.itemdef.instanceOfPowerup)
+ {
+ if ((item.itemdef == ITEM_JetpackRegen) && !(player.items & IT_FUEL_REGEN))
+ Send_Notification(NOTIF_ONE, player, MSG_CENTER, CENTER_ITEM_FUELREGEN_GOT);
+ else if ((item.itemdef == ITEM_Jetpack) && !(player.items & IT_JETPACK))
+ Send_Notification(NOTIF_ONE, player, MSG_CENTER, CENTER_ITEM_JETPACK_GOT);
+ }
+
+ int its;
+ if((its = (item.items - (item.items & player.items)) & IT_PICKUPMASK))
+ {
+ pickedup = true;
+ player.items |= its;
+ // TODO: we probably want to show a message in the console, but not this one!
+ //Send_Notification(NOTIF_ONE, player, MSG_INFO, INFO_ITEM_WEAPON_GOT, item.netname);
+ }
+
+ if (item.strength_finished)
+ {
+ pickedup = true;
+ STAT(STRENGTH_FINISHED, player) = max(STAT(STRENGTH_FINISHED, player), time) + item.strength_finished;
+ }
+ if (item.invincible_finished)
+ {
+ pickedup = true;
+ STAT(INVINCIBLE_FINISHED, player) = max(STAT(INVINCIBLE_FINISHED, player), time) + item.invincible_finished;
+ }
+ if (item.superweapons_finished)
+ {
+ pickedup = true;
+ STAT(SUPERWEAPONS_FINISHED, player) = max(STAT(SUPERWEAPONS_FINISHED, player), time) + item.superweapons_finished;
+ }
+
+ // always eat teamed entities
+ if(item.team)
+ pickedup = true;
+
+ if (!pickedup)
+ return false;
+
+ // crude hack to enforce switching weapons
+ if(g_cts && item.itemdef.instanceOfWeaponPickup && !CS(player).cvar_cl_cts_noautoswitch)
+ {
+ for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
+ {
+ .entity weaponentity = weaponentities[slot];
+ if(player.(weaponentity).m_weapon != WEP_Null || slot == 0)
+ W_SwitchWeapon_Force(player, REGISTRY_GET(Weapons, item.weapon), weaponentity);
+ }
+ return true;
+ }
+
+ if(_switchweapon)
+ {
+ for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
+ {
+ .entity weaponentity = weaponentities[slot];
+ if(_switchweapon & BIT(slot))
+ if(player.(weaponentity).m_switchweapon != w_getbestweapon(player, weaponentity))
+ W_SwitchWeapon_Force(player, w_getbestweapon(player, weaponentity), weaponentity);
+ }
+ }
+
+ return true;
+}
+
+void Item_Touch(entity this, entity toucher)
+{
+ // remove the item if it's currnetly in a NODROP brush or hits a NOIMPACT surface (such as sky)
+ if (Item_IsLoot(this))
+ {
+ if (ITEM_TOUCH_NEEDKILL())
+ {
+ delete(this);
+ return;
+ }
+ }
+
+ if(!(toucher.flags & FL_PICKUPITEMS)
+ || STAT(FROZEN, toucher)
+ || IS_DEAD(toucher)
+ || (this.solid != SOLID_TRIGGER)
+ || (this.owner == toucher)
+ || (time < this.item_spawnshieldtime)
+ ) { return; }
+
+ switch (MUTATOR_CALLHOOK(ItemTouch, this, toucher))
+ {
+ case MUT_ITEMTOUCH_RETURN: { return; }
+ case MUT_ITEMTOUCH_PICKUP: { toucher = M_ARGV(1, entity); goto pickup; }
+ }
+
+ toucher = M_ARGV(1, entity);
+
+ if (Item_IsExpiring(this))
+ {
+ this.strength_finished = max(0, this.strength_finished - time);
+ this.invincible_finished = max(0, this.invincible_finished - time);
+ this.superweapons_finished = max(0, this.superweapons_finished - time);
+ }
+ bool gave = ITEM_HANDLE(Pickup, this.itemdef, this, toucher);
+ if (!gave)
+ {
+ if (Item_IsExpiring(this))
+ {
+ // undo what we did above
+ this.strength_finished += time;
+ this.invincible_finished += time;
+ this.superweapons_finished += time;
+ }
+ return;
+ }
+
+LABEL(pickup)
+
+ if(this.target && this.target != "" && this.target != "###item###") // defrag support
+ SUB_UseTargets(this, toucher, NULL);
+
+ STAT(LAST_PICKUP, toucher) = time;
+
+ Send_Effect(EFFECT_ITEM_PICKUP, CENTER_OR_VIEWOFS(this), '0 0 0', 1);
+ _sound (toucher, (this.itemdef.instanceOfPowerup ? CH_TRIGGER_SINGLE : CH_TRIGGER), (this.item_pickupsound ? this.item_pickupsound : Sound_fixpath(this.item_pickupsound_ent)), VOL_BASE, ATTEN_NORM);
+
+ MUTATOR_CALLHOOK(ItemTouched, this, toucher);
+ if (wasfreed(this))
+ {
+ return;
+ }
+
+ if (Item_IsLoot(this))
+ {
+ delete(this);
+ return;
+ }
+ if (!this.spawnshieldtime)
+ {
+ return;
+ }
+ entity e;
+ if (this.team)
+ {
+ RandomSelection_Init();
+ IL_EACH(g_items, it.team == this.team,
+ {
+ if (it.itemdef) // is a registered item
+ {
+ Item_Show(it, -1);
+ it.scheduledrespawntime = 0;
+ RandomSelection_AddEnt(it, it.cnt, 0);
+ }
+ });
+ e = RandomSelection_chosen_ent;
+ Item_Show(e, 1); // reset its state so it is visible (extra sendflags doesn't matter, this happens anyway)
+ }
+ else
+ e = this;
+ Item_ScheduleRespawn(e);
+}
+
+void Item_Reset(entity this)
+{
+ Item_Show(this, !this.state);
+ setorigin(this, this.origin);
+
+ if (Item_IsLoot(this))
+ {
+ return;
+ }
+ setthink(this, Item_Think);
+ this.nextthink = time;
+ if (this.waypointsprite_attached)
+ {
+ WaypointSprite_Kill(this.waypointsprite_attached);
+ }
+ if (this.itemdef.instanceOfPowerup || (STAT(WEAPONS, this) & WEPSET_SUPERWEAPONS)) // do not spawn powerups initially!
+ {
+ Item_ScheduleInitialRespawn(this);
+ }
+}
+
+void Item_FindTeam(entity this)
+{
+ entity e;
+
+ if(this.effects & EF_NODRAW)
+ {
+ // marker for item team search
+ LOG_TRACE("Initializing item team ", ftos(this.team));
+ RandomSelection_Init();
+ IL_EACH(g_items, it.team == this.team,
+ {
+ if(it.itemdef) // is a registered item
+ RandomSelection_AddEnt(it, it.cnt, 0);
+ });
+
+ e = RandomSelection_chosen_ent;
+ if (!e)
+ return;
+
+ IL_EACH(g_items, it.team == this.team,
+ {
+ if(it.itemdef) // is a registered item
+ {
+ if(it != e)
+ {
+ // make it non-spawned
+ Item_Show(it, -1);
+ it.state = 1; // state 1 = initially hidden item, apparently
+ }
+ else
+ Item_Reset(it);
+ it.effects &= ~EF_NODRAW;
+ }
+ });
+ }
+}
+
+// Savage: used for item garbage-collection
+void RemoveItem(entity this)
+{
+ if(wasfreed(this) || !this) { return; }
+ Send_Effect(EFFECT_ITEM_PICKUP, CENTER_OR_VIEWOFS(this), '0 0 0', 1);
+ delete(this);
+}
+
+// pickup evaluation functions
+// these functions decide how desirable an item is to the bots
+
+float generic_pickupevalfunc(entity player, entity item) {return item.bot_pickupbasevalue;}
+
+float weapon_pickupevalfunc(entity player, entity item)
+{
+ // See if I have it already
+ if(STAT(WEAPONS, player) & STAT(WEAPONS, item))
+ {
+ // If I can pick it up
+ if(!item.spawnshieldtime)
+ return 0;
+ return ammo_pickupevalfunc(player, item);
+ }
+
+ // reduce weapon value if bot already got a good arsenal
+ float c = 1;
+ int weapons_value = 0;
+ FOREACH(Weapons, it != WEP_Null && (STAT(WEAPONS, player) & it.m_wepset), {
+ weapons_value += it.bot_pickupbasevalue;
+ });
+ c -= bound(0, weapons_value / 20000, 1) * 0.5;
+
+ return item.bot_pickupbasevalue * c;
+}
+
+float ammo_pickupevalfunc(entity player, entity item)
+{
+ bool need_shells = false, need_nails = false, need_rockets = false, need_cells = false, need_plasma = false, need_fuel = false;
+ entity wpn = NULL;
+ float c = 0;
+ float rating = 0;
+
+ // Detect needed ammo
+ if(item.itemdef.instanceOfWeaponPickup)
+ {
+ entity ammo = NULL;
+ if(GetResource(item, RES_SHELLS)) { need_shells = true; ammo = ITEM_Shells; }
+ else if(GetResource(item, RES_BULLETS)) { need_nails = true; ammo = ITEM_Bullets; }
+ else if(GetResource(item, RES_ROCKETS)) { need_rockets = true; ammo = ITEM_Rockets; }
+ else if(GetResource(item, RES_CELLS)) { need_cells = true; ammo = ITEM_Cells; }
+ else if(GetResource(item, RES_PLASMA)) { need_plasma = true; ammo = ITEM_Plasma; }
+ else if(GetResource(item, RES_FUEL)) { need_fuel = true; ammo = ITEM_JetpackFuel; }
+
+ if(!ammo)
+ return 0;
+ wpn = item;
+ rating = ammo.m_botvalue;
+ }
+ else
+ {
+ FOREACH(Weapons, it != WEP_Null, {
+ if(!(STAT(WEAPONS, player) & (it.m_wepset)))
+ continue;
+
+ switch(it.ammo_type)
+ {
+ case RES_SHELLS: need_shells = true; break;
+ case RES_BULLETS: need_nails = true; break;
+ case RES_ROCKETS: need_rockets = true; break;
+ case RES_CELLS: need_cells = true; break;
+ case RES_PLASMA: need_plasma = true; break;
+ case RES_FUEL: need_fuel = true; break;
+ }
+ });
+ rating = item.bot_pickupbasevalue;
+ }
+
+ float noammorating = 0.5;
+
+ if ((need_shells) && GetResource(item, RES_SHELLS) && (GetResource(player, RES_SHELLS) < g_pickup_shells_max))
+ c = GetResource(item, RES_SHELLS) / max(noammorating, GetResource(player, RES_SHELLS));
+
+ if ((need_nails) && GetResource(item, RES_BULLETS) && (GetResource(player, RES_BULLETS) < g_pickup_nails_max))
+ c = GetResource(item, RES_BULLETS) / max(noammorating, GetResource(player, RES_BULLETS));
+
+ if ((need_rockets) && GetResource(item, RES_ROCKETS) && (GetResource(player, RES_ROCKETS) < g_pickup_rockets_max))
+ c = GetResource(item, RES_ROCKETS) / max(noammorating, GetResource(player, RES_ROCKETS));
+
+ if ((need_cells) && GetResource(item, RES_CELLS) && (GetResource(player, RES_CELLS) < g_pickup_cells_max))
+ c = GetResource(item, RES_CELLS) / max(noammorating, GetResource(player, RES_CELLS));
+
+ if ((need_plasma) && GetResource(item, RES_PLASMA) && (GetResource(player, RES_PLASMA) < g_pickup_plasma_max))
+ c = GetResource(item, RES_PLASMA) / max(noammorating, GetResource(player, RES_PLASMA));
+
+ if ((need_fuel) && GetResource(item, RES_FUEL) && (GetResource(player, RES_FUEL) < g_pickup_fuel_max))
+ c = GetResource(item, RES_FUEL) / max(noammorating, GetResource(player, RES_FUEL));
+
+ rating *= min(c, 2);
+ if(wpn)
+ rating += wpn.bot_pickupbasevalue * 0.1;
+ return rating;
+}
+
+float healtharmor_pickupevalfunc(entity player, entity item)
+{
+ float c = 0;
+ float rating = item.bot_pickupbasevalue;
+
+ float itemarmor = GetResource(item, RES_ARMOR);
+ float itemhealth = GetResource(item, RES_HEALTH);
+
+ if(item.item_group)
+ {
+ itemarmor *= min(4, item.item_group_count);
+ itemhealth *= min(4, item.item_group_count);
+ }
+
+ if (itemarmor && (GetResource(player, RES_ARMOR) < item.max_armorvalue))
+ c = itemarmor / max(1, GetResource(player, RES_ARMOR) * 2/3 + GetResource(player, RES_HEALTH) * 1/3);
+
+ if (itemhealth && (GetResource(player, RES_HEALTH) < item.max_health))
+ c = itemhealth / max(1, GetResource(player, RES_HEALTH));
+
+ rating *= min(2, c);
+ return rating;
+}
+
+void Item_Damage(entity this, entity inflictor, entity attacker, float damage, int deathtype, .entity weaponentity, vector hitloc, vector force)
+{
+ if(ITEM_DAMAGE_NEEDKILL(deathtype))
+ RemoveItem(this);
+}
+
+void item_use(entity this, entity actor, entity trigger)
+{
+ // use the touch function to handle collection
+ gettouch(this)(this, actor);
+}
+
+void _StartItem(entity this, entity def, float defaultrespawntime, float defaultrespawntimejitter)
+{
+ string itemname = def.m_name;
+ Model itemmodel = def.m_model;
+ Sound pickupsound = def.m_sound;
+ float(entity player, entity item) pickupevalfunc = def.m_pickupevalfunc;
+ float pickupbasevalue = def.m_botvalue;
+ int itemflags = def.m_itemflags;
+
+ startitem_failed = false;
+
+ this.item_model_ent = itemmodel;
+ this.item_pickupsound_ent = pickupsound;
+
+ if(def.m_iteminit)
+ def.m_iteminit(def, this);
+
+ if(!this.respawntime) // both need to be set
+ {
+ this.respawntime = defaultrespawntime;
+ this.respawntimejitter = defaultrespawntimejitter;
+ }
+
+ if(!this.pickup_anyway && def.m_pickupanyway)
+ this.pickup_anyway = def.m_pickupanyway();
+
+ int itemid = def.m_itemid;
+ this.items = itemid;
+ int weaponid = def.instanceOfWeaponPickup ? def.m_weapon.m_id : 0;
+ this.weapon = weaponid;
+
+ if(!this.fade_end)
+ {
+ this.fade_start = autocvar_g_items_mindist;
+ this.fade_end = autocvar_g_items_maxdist;
+ }
+
+ if(weaponid)
+ STAT(WEAPONS, this) = WepSet_FromWeapon(REGISTRY_GET(Weapons, weaponid));
+
+ this.flags = FL_ITEM | itemflags;
+ IL_PUSH(g_items, this);
+
+ if(MUTATOR_CALLHOOK(FilterItem, this)) // error means we do not want the item
+ {
+ startitem_failed = true;
+ delete(this);
+ return;
+ }
+
+ precache_model(this.model);
+ precache_sound(this.item_pickupsound);
+
+ if (Item_IsLoot(this))
+ {
+ this.reset = SUB_Remove;
+ set_movetype(this, MOVETYPE_TOSS);
+
+ // Savage: remove thrown items after a certain period of time ("garbage collection")
+ setthink(this, RemoveItem);
+ this.nextthink = time + 20;
+
+ this.takedamage = DAMAGE_YES;
+ this.event_damage = Item_Damage;
+
+ if (Item_IsExpiring(this))
+ {
+ // if item is worthless after a timer, have it expire then
+ this.nextthink = max(this.strength_finished, this.invincible_finished, this.superweapons_finished);
+ }
+
+ // don't drop if in a NODROP zone (such as lava)
+ traceline(this.origin, this.origin, MOVE_NORMAL, this);
+ if (trace_dpstartcontents & DPCONTENTS_NODROP)
+ {
+ startitem_failed = true;
+ delete(this);
+ return;
+ }
+ }
+ else
+ {
+ if(!have_pickup_item(this))
+ {
+ startitem_failed = true;
+ delete(this);
+ return;
+ }
+
+ if(this.angles != '0 0 0')
+ this.SendFlags |= ISF_ANGLES;
+
+ this.reset = Item_Reset;
+ // it's a level item
+ if(this.spawnflags & 1)
+ this.noalign = 1;
+ if (this.noalign > 0)
+ set_movetype(this, MOVETYPE_NONE);
+ else
+ set_movetype(this, MOVETYPE_TOSS);
+ // do item filtering according to game mode and other things
+ if (this.noalign <= 0)
+ {
+ // first nudge it off the floor a little bit to avoid math errors
+ setorigin(this, this.origin + '0 0 1');
+ // set item size before we spawn a spawnfunc_waypoint
+ setsize(this, def.m_mins, def.m_maxs);
+ this.SendFlags |= ISF_SIZE;
+ // note droptofloor returns false if stuck/or would fall too far
+ if (!this.noalign)
+ droptofloor(this);
+ waypoint_spawnforitem(this);
+ }
+
+ /*
+ * can't do it that way, as it would break maps
+ * TODO make a target_give like entity another way, that perhaps has
+ * the weapon name in a key
+ if(this.targetname)
+ {
+ // target_give not yet supported; maybe later
+ print("removed targeted ", this.classname, "\n");
+ startitem_failed = true;
+ delete(this);
+ return;
+ }
+ */
+
+ if(this.targetname != "" && (this.spawnflags & 16))
+ this.use = item_use;
+
+ if(autocvar_spawn_debug >= 2)
+ {
+ // why not flags & fl_item?
+ FOREACH_ENTITY_RADIUS(this.origin, 3, it.is_item, {
+ LOG_TRACE("XXX Found duplicated item: ", itemname, vtos(this.origin));
+ LOG_TRACE(" vs ", it.netname, vtos(it.origin));
+ error("Mapper sucks.");
+ });
+ this.is_item = true;
+ }
+
+ weaponsInMap |= WepSet_FromWeapon(REGISTRY_GET(Weapons, weaponid));
+
+ if ( def.instanceOfPowerup
+ || def.instanceOfWeaponPickup
+ || (def.instanceOfHealth && def != ITEM_HealthSmall)
+ || (def.instanceOfArmor && def != ITEM_ArmorSmall)
+ || (itemid & (IT_KEY1 | IT_KEY2))
+ )
+ {
+ if(!this.target || this.target == "")
+ this.target = "###item###"; // for finding the nearest item using findnearest
+ }
+
+ Item_ItemsTime_SetTime(this, 0);
+ }
+
+ this.bot_pickup = true;
+ this.bot_pickupevalfunc = pickupevalfunc;
+ this.bot_pickupbasevalue = pickupbasevalue;
+ this.mdl = this.model ? this.model : strzone(this.item_model_ent.model_str());
+ this.netname = itemname;
+ settouch(this, Item_Touch);
+ setmodel(this, MDL_Null); // precision set below
+ //this.effects |= EF_LOWPRECISION;
+
+ setsize (this, this.pos1 = def.m_mins, this.pos2 = def.m_maxs);
+
+ this.SendFlags |= ISF_SIZE;
+
+ if (!(this.spawnflags & 1024)) {
+ if(def.instanceOfPowerup)
+ this.ItemStatus |= ITS_ANIMATE1;
+
+ if(GetResource(this, RES_ARMOR) || GetResource(this, RES_HEALTH))
+ this.ItemStatus |= ITS_ANIMATE2;
+ }
+
+ if(Item_IsLoot(this))
+ this.gravity = 1;
+
+ if(def.instanceOfWeaponPickup)
+ {
+ if (!Item_IsLoot(this)) // if dropped, colormap is already set up nicely
+ this.colormap = 1024; // color shirt=0 pants=0 grey
+ if (!(this.spawnflags & 1024))
+ this.ItemStatus |= ITS_ANIMATE1;
+ this.SendFlags |= ISF_COLORMAP;
+ }
+
+ this.state = 0;
+ if(this.team)
+ {
+ if(!this.cnt)
+ this.cnt = 1; // item probability weight
+
+ this.effects |= EF_NODRAW; // marker for item team search
+ InitializeEntity(this, Item_FindTeam, INITPRIO_FINDTARGET);
+ }
+ else
+ Item_Reset(this);
+
+ Net_LinkEntity(this, !(def.instanceOfPowerup || def.instanceOfHealth || def.instanceOfArmor), 0, ItemSend);
+
+ // call this hook after everything else has been done
+ if (MUTATOR_CALLHOOK(Item_Spawn, this))
+ {
+ startitem_failed = true;
+ delete(this);
+ return;
+ }
+
+ setItemGroup(this);
+}
+
+void StartItem(entity this, GameItem def)
+{
+ def = def.m_spawnfunc_hookreplace(def, this);
+ if (def.spawnflags & ITEM_FLAG_MUTATORBLOCKED)
+ {
+ delete(this);
+ return;
+ }
+ this.classname = def.m_canonical_spawnfunc;
+ _StartItem(
+ this,
+ this.itemdef = def,
+ def.m_respawntime(), // defaultrespawntime
+ def.m_respawntimejitter() // defaultrespawntimejitter
+ );
+}
+
+#define IS_SMALL(def) ((def.instanceOfHealth && def == ITEM_HealthSmall) || (def.instanceOfArmor && def == ITEM_ArmorSmall))
+int group_count = 1;
+
+void setItemGroup(entity this)
+{
+ if(!IS_SMALL(this.itemdef) || Item_IsLoot(this))
+ return;
+
+ FOREACH_ENTITY_RADIUS(this.origin, 120, (it != this) && IS_SMALL(it.itemdef),
+ {
+ if(!this.item_group)
+ {
+ if(!it.item_group)
+ {
+ it.item_group = group_count;
+ group_count++;
+ }
+ this.item_group = it.item_group;
+ }
+ else // spawning item is already part of a item_group X
+ {
+ if(!it.item_group)
+ it.item_group = this.item_group;
+ else if(it.item_group != this.item_group) // found an item near the spawning item that is part of a different item_group Y
+ {
+ int grY = it.item_group;
+ // move all items of item_group Y to item_group X
+ IL_EACH(g_items, IS_SMALL(it.itemdef),
+ {
+ if(it.item_group == grY)
+ it.item_group = this.item_group;
+ });
+ }
+ }
+ });
+}
+
+void setItemGroupCount()
+{
+ for (int k = 1; k <= group_count; k++)
+ {
+ int count = 0;
+ IL_EACH(g_items, IS_SMALL(it.itemdef) && it.item_group == k, { count++; });
+ if (count)
+ IL_EACH(g_items, IS_SMALL(it.itemdef) && it.item_group == k, { it.item_group_count = count; });
+ }
+}
+
+void target_items_use(entity this, entity actor, entity trigger)
+{
+ if(Item_IsLoot(actor))
+ {
+ EXACTTRIGGER_TOUCH(this, trigger);
+ delete(actor);
+ return;
+ }
+
+ if (!IS_PLAYER(actor) || IS_DEAD(actor))
+ return;
+
+ if(trigger.solid == SOLID_TRIGGER)
+ {
+ EXACTTRIGGER_TOUCH(this, trigger);
+ }
+
+ IL_EACH(g_items, it.enemy == actor && Item_IsLoot(it),
+ {
+ delete(it);
+ });
+
+ if(GiveItems(actor, 0, tokenize_console(this.netname)))
+ centerprint(actor, this.message);
+}
+
+spawnfunc(target_items)
+{
+ this.use = target_items_use;
+ if(!this.strength_finished)
+ this.strength_finished = autocvar_g_balance_powerup_strength_time;
+ if(!this.invincible_finished)
+ this.invincible_finished = autocvar_g_balance_powerup_invincible_time;
+ if(!this.superweapons_finished)
+ this.superweapons_finished = autocvar_g_balance_superweapons_time;
+
+ string str;
+ int n = tokenize_console(this.netname);
+ if(argv(0) == "give")
+ {
+ str = substring(this.netname, argv_start_index(1), argv_end_index(-1) - argv_start_index(1));
+ }
+ else
+ {
+ for(int j = 0; j < n; ++j)
+ {
+ // this is from a time when unlimited superweapons were handled together with ammo in some parts of the code
+ if (argv(j) == "unlimited_ammo") this.items |= IT_UNLIMITED_AMMO | IT_UNLIMITED_SUPERWEAPONS;
+ else if(argv(j) == "unlimited_weapon_ammo") this.items |= IT_UNLIMITED_AMMO;
+ else if(argv(j) == "unlimited_superweapons") this.items |= IT_UNLIMITED_SUPERWEAPONS;
+ else if(argv(j) == "strength") this.items |= ITEM_Strength.m_itemid;
+ else if(argv(j) == "invincible") this.items |= ITEM_Shield.m_itemid;
+ else if(argv(j) == "superweapons") this.items |= IT_SUPERWEAPON;
+ else if(argv(j) == "jetpack") this.items |= ITEM_Jetpack.m_itemid;
+ else if(argv(j) == "fuel_regen") this.items |= ITEM_JetpackRegen.m_itemid;
+ else
+ {
+ FOREACH(Buffs, it != BUFF_Null,
+ {
+ string s = Buff_UndeprecateName(argv(j));
+ if(s == it.netname)
+ {
+ STAT(BUFFS, this) |= (it.m_itemid);
+ if(!STAT(BUFF_TIME, this))
+ STAT(BUFF_TIME, this) = it.m_time(it);
+ break;
+ }
+ });
+ FOREACH(Weapons, it != WEP_Null, {
+ string s = W_UndeprecateName(argv(j));
+ if(s == it.netname)
+ {
+ STAT(WEAPONS, this) |= (it.m_wepset);
+ if(this.spawnflags == 0 || this.spawnflags == 2)
+ it.wr_init(it);
+ break;
+ }
+ });
+ }
+ }
+
+ string itemprefix, valueprefix;
+ if(this.spawnflags == 0)
+ {
+ itemprefix = "";
+ valueprefix = "";
+ }
+ else if(this.spawnflags == 1)
+ {
+ itemprefix = "max ";
+ valueprefix = "max ";
+ }
+ else if(this.spawnflags == 2)
+ {
+ itemprefix = "min ";
+ valueprefix = "min ";
+ }
+ else if(this.spawnflags == 4)
+ {
+ itemprefix = "minus ";
+ valueprefix = "max ";
+ }
+ else
+ {
+ error("invalid spawnflags");
+ itemprefix = valueprefix = string_null;
+ }
+
+ str = "";
+ str = sprintf("%s %s%d %s", str, itemprefix, boolean(this.items & IT_UNLIMITED_AMMO), "unlimited_weapon_ammo");
+ str = sprintf("%s %s%d %s", str, itemprefix, boolean(this.items & IT_UNLIMITED_SUPERWEAPONS), "unlimited_superweapons");
+ str = sprintf("%s %s%d %s", str, valueprefix, this.strength_finished * boolean(this.items & ITEM_Strength.m_itemid), "strength");
+ str = sprintf("%s %s%d %s", str, valueprefix, this.invincible_finished * boolean(this.items & ITEM_Shield.m_itemid), "invincible");
+ str = sprintf("%s %s%d %s", str, valueprefix, this.superweapons_finished * boolean(this.items & IT_SUPERWEAPON), "superweapons");
+ str = sprintf("%s %s%d %s", str, itemprefix, boolean(this.items & ITEM_Jetpack.m_itemid), "jetpack");
+ str = sprintf("%s %s%d %s", str, itemprefix, boolean(this.items & ITEM_JetpackRegen.m_itemid), "fuel_regen");
+ float res;
+ res = GetResource(this, RES_SHELLS); if(res != 0) str = sprintf("%s %s%d %s", str, valueprefix, max(0, res), "shells");
+ res = GetResource(this, RES_BULLETS); if(res != 0) str = sprintf("%s %s%d %s", str, valueprefix, max(0, res), "nails");
+ res = GetResource(this, RES_ROCKETS); if(res != 0) str = sprintf("%s %s%d %s", str, valueprefix, max(0, res), "rockets");
+ res = GetResource(this, RES_CELLS); if(res != 0) str = sprintf("%s %s%d %s", str, valueprefix, max(0, res), "cells");
+ res = GetResource(this, RES_PLASMA); if(res != 0) str = sprintf("%s %s%d %s", str, valueprefix, max(0, res), "plasma");
+ res = GetResource(this, RES_FUEL); if(res != 0) str = sprintf("%s %s%d %s", str, valueprefix, max(0, res), "fuel");
+ res = GetResource(this, RES_HEALTH); if(res != 0) str = sprintf("%s %s%d %s", str, valueprefix, max(0, res), "health");
+ res = GetResource(this, RES_ARMOR); if(res != 0) str = sprintf("%s %s%d %s", str, valueprefix, max(0, res), "armor");
+ // HACK: buffs share a single timer, so we need to include enabled buffs AFTER disabled ones to avoid loss
+ FOREACH(Buffs, it != BUFF_Null && !(STAT(BUFFS, this) & it.m_itemid), str = sprintf("%s %s%d %s", str, valueprefix, max(0, STAT(BUFF_TIME, this)), it.netname));
+ FOREACH(Buffs, it != BUFF_Null && (STAT(BUFFS, this) & it.m_itemid), str = sprintf("%s %s%d %s", str, valueprefix, max(0, STAT(BUFF_TIME, this)), it.netname));
+ FOREACH(Weapons, it != WEP_Null, str = sprintf("%s %s%d %s", str, itemprefix, !!(STAT(WEAPONS, this) & (it.m_wepset)), it.netname));
+ }
+ this.netname = strzone(str);
+
+ n = tokenize_console(this.netname);
+ for(int j = 0; j < n; ++j)
+ {
+ FOREACH(Weapons, it != WEP_Null && W_UndeprecateName(argv(j)) == it.netname, {
+ it.wr_init(it);
+ break;
+ });
+ }
+}
+
+float GiveWeapon(entity e, float wpn, float op, float val)
+{
+ WepSet v0, v1;
+ WepSet s = WepSet_FromWeapon(REGISTRY_GET(Weapons, wpn));
+ v0 = (STAT(WEAPONS, e) & s);
+ switch(op)
+ {
+ case OP_SET:
+ if(val > 0)
+ STAT(WEAPONS, e) |= s;
+ else
+ STAT(WEAPONS, e) &= ~s;
+ break;
+ case OP_MIN:
+ case OP_PLUS:
+ if(val > 0)
+ STAT(WEAPONS, e) |= s;
+ break;
+ case OP_MAX:
+ if(val <= 0)
+ STAT(WEAPONS, e) &= ~s;
+ break;
+ case OP_MINUS:
+ if(val > 0)
+ STAT(WEAPONS, e) &= ~s;
+ break;
+ }
+ v1 = (STAT(WEAPONS, e) & s);
+ return (v0 != v1);
+}
+
+bool GiveBuff(entity e, Buff thebuff, int op, int val)
+{
+ bool had_buff = (STAT(BUFFS, e) & thebuff.m_itemid);
+ float new_buff_time = ((had_buff) ? STAT(BUFF_TIME, e) : 0);
+ switch (op)
+ {
+ case OP_SET:
+ new_buff_time = val;
+ break;
+ case OP_MIN:
+ new_buff_time = max(new_buff_time, val);
+ break;
+ case OP_MAX:
+ new_buff_time = min(new_buff_time, val);
+ break;
+ case OP_PLUS:
+ new_buff_time += val;
+ break;
+ case OP_MINUS:
+ new_buff_time -= val;
+ break;
+ }
+ if(new_buff_time <= 0)
+ {
+ if(had_buff)
+ STAT(BUFF_TIME, e) = new_buff_time;
+ STAT(BUFFS, e) &= ~thebuff.m_itemid;
+ }
+ else
+ {
+ STAT(BUFF_TIME, e) = new_buff_time;
+ STAT(BUFFS, e) = thebuff.m_itemid; // NOTE: replaces any existing buffs on the player!
+ }
+ bool have_buff = (STAT(BUFFS, e) & thebuff.m_itemid);
+ return (had_buff != have_buff);
+}
+
+void GiveSound(entity e, float v0, float v1, float t, Sound snd_incr, Sound snd_decr)
+{
+ if(v1 == v0)
+ return;
+ if(v1 <= v0 - t)
+ {
+ if(snd_decr != NULL)
+ sound (e, CH_TRIGGER, snd_decr, VOL_BASE, ATTEN_NORM);
+ }
+ else if(v0 >= v0 + t)
+ {
+ if(snd_incr != NULL)
+ sound (e, CH_TRIGGER, snd_incr, VOL_BASE, ATTEN_NORM);
+ }
+}
+
+void GiveRot(entity e, float v0, float v1, .float rotfield, float rottime, .float regenfield, float regentime)
+{
+ if(v0 < v1)
+ e.(rotfield) = max(e.(rotfield), time + rottime);
+ else if(v0 > v1)
+ e.(regenfield) = max(e.(regenfield), time + regentime);
+}
+bool GiveResourceValue(entity e, int res_type, int op, int val)
+{
+ int v0 = GetResource(e, res_type);
+ float new_val = 0;
+ switch (op)
+ {
+ // min 100 cells = at least 100 cells
+ case OP_SET: new_val = val; break;
+ case OP_MIN: new_val = max(v0, val); break;
+ case OP_MAX: new_val = min(v0, val); break;
+ case OP_PLUS: new_val = v0 + val; break;
+ case OP_MINUS: new_val = v0 - val; break;
+ default: return false;
+ }
+
+ return SetResourceExplicit(e, res_type, new_val);
+}
+
+float GiveItems(entity e, float beginarg, float endarg)
+{
+ float got, i, val, op;
+ string cmd;
+
+ val = 999;
+ op = OP_SET;
+
+ got = 0;
+
+ int _switchweapon = 0;
+
+ if(CS(e).autoswitch)
+ {
+ for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
+ {
+ .entity weaponentity = weaponentities[slot];
+ if(e.(weaponentity).m_weapon != WEP_Null || slot == 0)
+ if(e.(weaponentity).m_switchweapon == w_getbestweapon(e, weaponentity))
+ _switchweapon |= BIT(slot);
+ }
+ }
+
+ STAT(STRENGTH_FINISHED, e) = max(0, STAT(STRENGTH_FINISHED, e) - time);
+ STAT(INVINCIBLE_FINISHED, e) = max(0, STAT(INVINCIBLE_FINISHED, e) - time);
+ STAT(SUPERWEAPONS_FINISHED, e) = max(0, STAT(SUPERWEAPONS_FINISHED, e) - time);
+ STAT(BUFF_TIME, e) = max(0, STAT(BUFF_TIME, e) - time);
+
+ PREGIVE(e, items);
+ PREGIVE_WEAPONS(e);
+ PREGIVE(e, stat_STRENGTH_FINISHED);
+ PREGIVE(e, stat_INVINCIBLE_FINISHED);
+ PREGIVE(e, stat_SUPERWEAPONS_FINISHED);
+ PREGIVE_RESOURCE(e, RES_BULLETS);
+ PREGIVE_RESOURCE(e, RES_CELLS);
+ PREGIVE_RESOURCE(e, RES_PLASMA);
+ PREGIVE_RESOURCE(e, RES_SHELLS);
+ PREGIVE_RESOURCE(e, RES_ROCKETS);
+ PREGIVE_RESOURCE(e, RES_FUEL);
+ PREGIVE_RESOURCE(e, RES_ARMOR);
+ PREGIVE_RESOURCE(e, RES_HEALTH);
+
+ for(i = beginarg; i < endarg; ++i)
+ {
+ cmd = argv(i);
+
+ if(cmd == "0" || stof(cmd))
+ {
+ val = stof(cmd);
+ continue;
+ }
+ switch(cmd)
+ {
+ case "no":
+ op = OP_MAX;
+ val = 0;
+ continue;
+ case "max":
+ op = OP_MAX;
+ continue;
+ case "min":
+ op = OP_MIN;
+ continue;
+ case "plus":
+ op = OP_PLUS;
+ continue;
+ case "minus":
+ op = OP_MINUS;
+ continue;
+ case "ALL":
+ got += GiveBit(e, items, ITEM_JetpackRegen.m_itemid, op, val);
+ got += GiveValue(e, stat_STRENGTH_FINISHED, op, val);
+ got += GiveValue(e, stat_INVINCIBLE_FINISHED, op, val);
+ got += GiveValue(e, stat_SUPERWEAPONS_FINISHED, op, val);
+ got += GiveBit(e, items, IT_UNLIMITED_AMMO | IT_UNLIMITED_SUPERWEAPONS, op, val);
+ case "all":
+ got += GiveBit(e, items, ITEM_Jetpack.m_itemid, op, val);
+ got += GiveResourceValue(e, RES_HEALTH, op, val);
+ got += GiveResourceValue(e, RES_ARMOR, op, val);
+ case "allweapons":
+ FOREACH(Weapons, it != WEP_Null && !(it.spawnflags & (WEP_FLAG_MUTATORBLOCKED | WEP_FLAG_SPECIALATTACK)), got += GiveWeapon(e, it.m_id, op, val));
+ //case "allbuffs": // all buffs makes a player god, do not want!
+ //FOREACH(Buffs, it != BUFF_Null, got += GiveBuff(e, it.m_itemid, op, val));
+ case "allammo":
+ got += GiveResourceValue(e, RES_CELLS, op, val);
+ got += GiveResourceValue(e, RES_PLASMA, op, val);
+ got += GiveResourceValue(e, RES_SHELLS, op, val);
+ got += GiveResourceValue(e, RES_BULLETS, op, val);
+ got += GiveResourceValue(e, RES_ROCKETS, op, val);
+ got += GiveResourceValue(e, RES_FUEL, op, val);
+ break;
+ case "unlimited_ammo":
+ // this is from a time when unlimited superweapons were handled together with ammo in some parts of the code
+ got += GiveBit(e, items, IT_UNLIMITED_AMMO | IT_UNLIMITED_SUPERWEAPONS, op, val);
+ break;
+ case "unlimited_weapon_ammo":
+ got += GiveBit(e, items, IT_UNLIMITED_AMMO, op, val);
+ break;
+ case "unlimited_superweapons":
+ got += GiveBit(e, items, IT_UNLIMITED_SUPERWEAPONS, op, val);
+ break;
+ case "jetpack":
+ got += GiveBit(e, items, ITEM_Jetpack.m_itemid, op, val);
+ break;
+ case "fuel_regen":
+ got += GiveBit(e, items, ITEM_JetpackRegen.m_itemid, op, val);
+ break;
+ case "strength":
+ got += GiveValue(e, stat_STRENGTH_FINISHED, op, val);
+ break;
+ case "invincible":
+ got += GiveValue(e, stat_INVINCIBLE_FINISHED, op, val);
+ break;
+ case "superweapons":
+ got += GiveValue(e, stat_SUPERWEAPONS_FINISHED, op, val);
+ break;
+ case "cells":
+ got += GiveResourceValue(e, RES_CELLS, op, val);
+ break;
+ case "plasma":
+ got += GiveResourceValue(e, RES_PLASMA, op, val);
+ break;
+ case "shells":
+ got += GiveResourceValue(e, RES_SHELLS, op, val);
+ break;
+ case "nails":
+ case "bullets":
+ got += GiveResourceValue(e, RES_BULLETS, op, val);
+ break;
+ case "rockets":
+ got += GiveResourceValue(e, RES_ROCKETS, op, val);
+ break;
+ case "health":
+ got += GiveResourceValue(e, RES_HEALTH, op, val);
+ break;
+ case "armor":
+ got += GiveResourceValue(e, RES_ARMOR, op, val);
+ break;
+ case "fuel":
+ got += GiveResourceValue(e, RES_FUEL, op, val);
+ break;
+ default:
+ FOREACH(Buffs, it != BUFF_Null && buff_Available(it) && Buff_UndeprecateName(cmd) == it.netname,
+ {
+ got += GiveBuff(e, it, op, val);
+ break;
+ });
+ FOREACH(Weapons, it != WEP_Null && W_UndeprecateName(cmd) == it.netname, {
+ got += GiveWeapon(e, it.m_id, op, val);
+ break;
+ });
+ break;
+ }
+ val = 999;
+ op = OP_SET;
+ }
+
+ POSTGIVE_BIT(e, items, ITEM_JetpackRegen.m_itemid, SND_ITEMPICKUP, SND_Null);
+ POSTGIVE_BIT(e, items, IT_UNLIMITED_SUPERWEAPONS, SND_POWERUP, SND_POWEROFF);
+ POSTGIVE_BIT(e, items, IT_UNLIMITED_AMMO, SND_POWERUP, SND_POWEROFF);
+ POSTGIVE_BIT(e, items, ITEM_Jetpack.m_itemid, SND_ITEMPICKUP, SND_Null);
+ FOREACH(Weapons, it != WEP_Null, {
+ POSTGIVE_WEAPON(e, it, SND_WEAPONPICKUP, SND_Null);
+ if(!(save_weapons & (it.m_wepset)))
+ if(STAT(WEAPONS, e) & (it.m_wepset))
+ it.wr_init(it);
+ });
+ POSTGIVE_VALUE(e, stat_STRENGTH_FINISHED, 1, SND_POWERUP, SND_POWEROFF);
+ POSTGIVE_VALUE(e, stat_INVINCIBLE_FINISHED, 1, SND_Shield, SND_POWEROFF);
+ //POSTGIVE_VALUE(e, stat_SUPERWEAPONS_FINISHED, 1, SND_Null, SND_Null);
+ POSTGIVE_RESOURCE(e, RES_BULLETS, 0, SND_ITEMPICKUP, SND_Null);
+ POSTGIVE_RESOURCE(e, RES_CELLS, 0, SND_ITEMPICKUP, SND_Null);
+ POSTGIVE_RESOURCE(e, RES_PLASMA, 0, SND_ITEMPICKUP, SND_Null);
+ POSTGIVE_RESOURCE(e, RES_SHELLS, 0, SND_ITEMPICKUP, SND_Null);
+ POSTGIVE_RESOURCE(e, RES_ROCKETS, 0, SND_ITEMPICKUP, SND_Null);
+ POSTGIVE_RES_ROT(e, RES_FUEL, 1, pauserotfuel_finished, autocvar_g_balance_pause_fuel_rot, pauseregen_finished, autocvar_g_balance_pause_fuel_regen, SND_ITEMPICKUP, SND_Null);
+ POSTGIVE_RES_ROT(e, RES_ARMOR, 1, pauserotarmor_finished, autocvar_g_balance_pause_armor_rot, pauseregen_finished, autocvar_g_balance_pause_health_regen, SND_ARMOR25, SND_Null);
+ POSTGIVE_RES_ROT(e, RES_HEALTH, 1, pauserothealth_finished, autocvar_g_balance_pause_health_rot, pauseregen_finished, autocvar_g_balance_pause_health_regen, SND_MEGAHEALTH, SND_Null);
+
+ if(STAT(SUPERWEAPONS_FINISHED, e) <= 0)
+ if(!g_weaponarena && (STAT(WEAPONS, e) & WEPSET_SUPERWEAPONS))
+ STAT(SUPERWEAPONS_FINISHED, e) = autocvar_g_balance_superweapons_time;
+
+ if(STAT(STRENGTH_FINISHED, e) <= 0)
+ STAT(STRENGTH_FINISHED, e) = 0;
+ else
+ STAT(STRENGTH_FINISHED, e) += time;
+ if(STAT(INVINCIBLE_FINISHED, e) <= 0)
+ STAT(INVINCIBLE_FINISHED, e) = 0;
+ else
+ STAT(INVINCIBLE_FINISHED, e) += time;
+ if(STAT(SUPERWEAPONS_FINISHED, e) <= 0)
+ STAT(SUPERWEAPONS_FINISHED, e) = 0;
+ else
+ STAT(SUPERWEAPONS_FINISHED, e) += time;
+ if(STAT(BUFF_TIME, e) <= 0)
+ STAT(BUFF_TIME, e) = 0;
+ else
+ STAT(BUFF_TIME, e) += time;
+
+ for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
+ {
+ .entity weaponentity = weaponentities[slot];
+ if(e.(weaponentity).m_weapon != WEP_Null || slot == 0)
+ if(!(STAT(WEAPONS, e) & WepSet_FromWeapon(e.(weaponentity).m_switchweapon)))
+ _switchweapon |= BIT(slot);
+ }
+
+ if(_switchweapon)
+ {
+ for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
+ {
+ .entity weaponentity = weaponentities[slot];
+ if(_switchweapon & BIT(slot))
+ {
+ Weapon wep = w_getbestweapon(e, weaponentity);
+ if(wep != e.(weaponentity).m_switchweapon)
+ W_SwitchWeapon_Force(e, wep, weaponentity);
+ }
+ }
+ }
+
+ return got;
+}
--- /dev/null
+#pragma once
+
+#include <common/sounds/sound.qh>
+
+void StartItem(entity this, entity a);
+.int item_group;
+.int item_group_count;
+
+float autocvar_sv_simple_items;
+bool ItemSend(entity this, entity to, int sf);
+
+bool have_pickup_item(entity this);
+
+const float ITEM_RESPAWN_TICKS = 10;
+
+// string overrides entity
+.string item_pickupsound;
+.entity item_pickupsound_ent;
+.entity item_model_ent;
+
+.float max_armorvalue;
+.float pickup_anyway;
+
+.float scheduledrespawntime;
+.float respawntime;
+.float respawntimejitter;
+.float respawntimestart;
+
+.float item_respawncounter;
+
+.float noalign; // if set to 1, the item or spawnpoint won't be dropped to the floor
+
+.float superweapons_finished; // NOTE: this field is used only by map entities, it does not directly apply the superweapons stat
+
+// delay before this item can be picked up
+.float item_spawnshieldtime;
+
+void Item_Show (entity e, int mode);
+
+void Item_Respawn (entity this);
+
+void Item_RespawnCountdown(entity this);
+void Item_ScheduleRespawnIn(entity e, float t);
+
+void Item_ScheduleRespawn(entity e);
+
+void Item_ScheduleInitialRespawn(entity e);
+
+/// \brief Give several random weapons and ammo to the entity.
+/// \param[in,out] receiver Entity to give weapons to.
+/// \param[in] num_weapons Number of weapons to give.
+/// \param[in] weapon_names Names of weapons to give separated by spaces.
+/// \param[in] ammo Entity containing the ammo amount for each possible weapon.
+/// \return No return.
+void GiveRandomWeapons(entity receiver, int num_weapons, string weapon_names, entity ammo_entity);
+
+bool Item_GiveAmmoTo(entity item, entity player, int res_type, float ammomax);
+
+bool Item_GiveTo(entity item, entity player);
+
+void Item_Touch(entity this, entity toucher);
+
+void Item_Reset(entity this);
+
+void Item_FindTeam(entity this);
+// Savage: used for item garbage-collection
+
+bool ItemSend(entity this, entity to, int sf);
+void ItemUpdate(entity this);
+
+void UpdateItemAfterTeleport(entity this);
+
+// pickup evaluation functions
+// these functions decide how desirable an item is to the bots
+
+float generic_pickupevalfunc(entity player, entity item);// {return item.bot_pickupbasevalue;} // WEAPONTODO
+
+float weapon_pickupevalfunc(entity player, entity item);
+float ammo_pickupevalfunc(entity player, entity item);
+float healtharmor_pickupevalfunc(entity player, entity item);
+
+.bool is_item;
+.entity itemdef;
+void _StartItem(entity this, entity def, float defaultrespawntime, float defaultrespawntimejitter);
+
+void setItemGroup(entity this);
+void setItemGroupCount();
+
+float GiveWeapon(entity e, float wpn, float op, float val);
+
+float GiveBit(entity e, .float fld, float bit, float op, float val);
+
+float GiveValue(entity e, .float fld, float op, float val);
+
+void GiveSound(entity e, float v0, float v1, float t, Sound snd_incr, Sound snd_decr);
+
+void GiveRot(entity e, float v0, float v1, .float rotfield, float rottime, .float regenfield, float regentime);
+
+spawnfunc(target_items);
+
+#define PREGIVE_WEAPONS(e) WepSet save_weapons; save_weapons = STAT(WEAPONS, e)
+#define PREGIVE(e,f) float save_##f; save_##f = (e).f
+#define PREGIVE_RESOURCE(e,f) float save_##f = GetResource((e), (f))
+#define POSTGIVE_WEAPON(e,b,snd_incr,snd_decr) GiveSound((e), !!(save_weapons & WepSet_FromWeapon(b)), !!(STAT(WEAPONS, e) & WepSet_FromWeapon(b)), 0, snd_incr, snd_decr)
+#define POSTGIVE_BIT(e,f,b,snd_incr,snd_decr) GiveSound((e), save_##f & (b), (e).f & (b), 0, snd_incr, snd_decr)
+#define POSTGIVE_RESOURCE(e,f,t,snd_incr,snd_decr) GiveSound((e), save_##f, GetResource((e), (f)), t, snd_incr, snd_decr)
+#define POSTGIVE_RES_ROT(e,f,t,rotfield,rottime,regenfield,regentime,snd_incr,snd_decr) GiveRot((e),save_##f,GetResource((e),(f)),rotfield,rottime,regenfield,regentime);GiveSound((e),save_##f,GetResource((e),(f)),t,snd_incr,snd_decr)
+#define POSTGIVE_VALUE(e,f,t,snd_incr,snd_decr) GiveSound((e), save_##f, (e).f, t, snd_incr, snd_decr)
+#define POSTGIVE_VALUE_ROT(e,f,t,rotfield,rottime,regenfield,regentime,snd_incr,snd_decr) GiveRot((e), save_##f, (e).f, rotfield, rottime, regenfield, regentime); GiveSound((e), save_##f, (e).f, t, snd_incr, snd_decr)
+
+float GiveItems(entity e, float beginarg, float endarg);
+
+IntrusiveList g_items;
+STATIC_INIT(g_items) { g_items = IL_NEW(); }
--- /dev/null
+#include "spawning.qh"
+
+/// \file
+/// \brief Source file that contains implementation of the functions related to
+/// creation of game items.
+/// \copyright GNU GPLv2 or any later version.
+
+#include <server/items/items.qh>
+#include <server/mutators/_mod.qh>
+#include <server/weapons/spawning.qh>
+#include <common/weapons/all.qh>
+#include <common/mapobjects/subs.qh>
+
+.bool m_isloot; ///< Holds whether item is loot.
+/// \brief Holds whether strength, shield or superweapon timers expire while
+/// this item is on the ground.
+.bool m_isexpiring;
+
+entity Item_FindDefinition(string class_name)
+{
+ FOREACH(Items, it.m_canonical_spawnfunc == class_name,
+ {
+ return it;
+ });
+ FOREACH(Weapons, it.m_canonical_spawnfunc == class_name,
+ {
+ return it.m_pickup;
+ });
+ return NULL;
+}
+
+bool Item_IsAllowed(string class_name)
+{
+ entity definition = Item_FindDefinition(class_name);
+ if (definition == NULL)
+ {
+ return false;
+ }
+ return Item_IsDefinitionAllowed(definition);
+}
+
+bool Item_IsDefinitionAllowed(entity definition)
+{
+ return !MUTATOR_CALLHOOK(FilterItemDefinition, definition);
+}
+
+entity Item_Create(string class_name, vector position, bool no_align)
+{
+ entity item = spawn();
+ item.classname = class_name;
+ item.spawnfunc_checked = true;
+ setorigin(item, position);
+ item.noalign = no_align;
+ Item_Initialize(item, class_name);
+ if (wasfreed(item))
+ {
+ return NULL;
+ }
+ return item;
+}
+
+void Item_Initialize(entity item, string class_name)
+{
+ FOREACH(Weapons, it.m_canonical_spawnfunc == class_name,
+ {
+ weapon_defaultspawnfunc(item, it);
+ return;
+ });
+ FOREACH(Items, it.m_canonical_spawnfunc == class_name,
+ {
+ StartItem(item, it);
+ return;
+ });
+ LOG_FATALF("Item_Initialize: Invalid classname: %s", class_name);
+}
+
+entity Item_CreateLoot(string class_name, vector position, vector vel,
+ float time_to_live)
+{
+ entity item = spawn();
+ if (!Item_InitializeLoot(item, class_name, position, vel, time_to_live))
+ {
+ return NULL;
+ }
+ return item;
+}
+
+bool Item_InitializeLoot(entity item, string class_name, vector position,
+ vector vel, float time_to_live)
+{
+ item.classname = class_name;
+ Item_SetLoot(item, true);
+ item.noalign = true;
+ setorigin(item, position);
+ item.pickup_anyway = true;
+ item.spawnfunc_checked = true;
+ Item_Initialize(item, class_name);
+ if (wasfreed(item))
+ {
+ return false;
+ }
+ item.gravity = 1;
+ item.velocity = vel;
+ SUB_SetFade(item, time + time_to_live, 1);
+ return true;
+}
+
+bool Item_IsLoot(entity item)
+{
+ return item.m_isloot || item.classname == "droppedweapon";
+}
+
+void Item_SetLoot(entity item, bool loot)
+{
+ item.m_isloot = loot;
+}
+
+bool Item_ShouldKeepPosition(entity item)
+{
+ return item.noalign || (item.spawnflags & 1);
+}
+
+bool Item_IsExpiring(entity item)
+{
+ return item.m_isexpiring;
+}
+
+void Item_SetExpiring(entity item, bool expiring)
+{
+ item.m_isexpiring = expiring;
+}
+
+// Compatibility spawn functions
+
+// FIXME: in Quake this is green armor, in Xonotic maps it is an armor shard
+SPAWNFUNC_ITEM(item_armor1, ITEM_ArmorSmall)
+
+SPAWNFUNC_ITEM(item_armor25, ITEM_ArmorMega)
+
+SPAWNFUNC_ITEM(item_armor_large, ITEM_ArmorMega)
+
+SPAWNFUNC_ITEM(item_health1, ITEM_HealthSmall)
+
+SPAWNFUNC_ITEM(item_health25, ITEM_HealthMedium)
+
+SPAWNFUNC_ITEM(item_health_large, ITEM_HealthBig)
+
+SPAWNFUNC_ITEM(item_health100, ITEM_HealthMega)
+
+SPAWNFUNC_ITEM(item_quad, ITEM_Strength)
--- /dev/null
+#pragma once
+
+/// \file
+/// \brief Header file that describes the functions related to game items.
+/// \copyright GNU GPLv2 or any later version.
+
+bool startitem_failed;
+
+/// \brief Returns the item definition corresponding to the given class name.
+/// \param[in] class_name Class name to search for.
+/// \return Item definition corresponding to the given class name or NULL is not
+/// found.
+entity Item_FindDefinition(string class_name);
+
+/// \brief Checks whether the items with the specified class name are allowed to
+/// spawn.
+/// \param[in] class_name Item class name to check.
+/// \return True items with the specified class name are allowed to spawn, false
+/// otherwise.
+bool Item_IsAllowed(string class_name);
+
+/// \brief Checks whether the items with the specified definition are allowed to
+/// spawn.
+/// \param[in] definition Item definition to check.
+/// \return True items with the specified definition are allowed to spawn, false
+/// otherwise.
+bool Item_IsDefinitionAllowed(entity definition);
+
+/// \brief Creates a new item.
+/// \param[in] class_name Class name of the item.
+/// \param[in] position Position of the item.
+/// \param[in] no_align True if item should be placed directly at specified
+/// position, false to let it drop to the ground.
+/// \return Item on success, NULL otherwise.
+entity Item_Create(string class_name, vector position, bool no_align);
+
+/// \brief Initializes the item according to class name.
+/// \param[in,out] item Item to initialize.
+/// \param[in] class_name Class name to use.
+/// \return No return.
+/// \nore This function is useful if you want to set some item properties before
+/// initialization.
+void Item_Initialize(entity item, string class_name);
+
+/// \brief Creates a loot item.
+/// \param[in] class_name Class name of the item.
+/// \param[in] position Position of the item.
+/// \param[in] velocity of the item.
+/// \param[in] time_to_live Amount of time after which the item will disappear.
+/// \return Item on success, NULL otherwise.
+entity Item_CreateLoot(string class_name, vector position, vector vel,
+ float time_to_live);
+
+/// \brief Initializes the loot item.
+/// \param[in] class_name Class name of the item.
+/// \param[in] position Position of the item.
+/// \param[in] velocity of the item.
+/// \param[in] time_to_live Amount of time after which the item will disappear.
+/// \return True on success, false otherwise.
+/// \nore This function is useful if you want to set some item properties before
+/// initialization.
+bool Item_InitializeLoot(entity item, string class_name, vector position,
+ vector vel, float time_to_live);
+
+/// \brief Returns whether the item is loot.
+/// \param[in] item Item to check.
+/// \return True if the item is loot, false otherwise.
+bool Item_IsLoot(entity item);
+
+/// \brief Sets the item loot status.
+/// \param[in,out] item Item to adjust.
+/// \param[in] loot Whether item is loot.
+/// \return No return.
+void Item_SetLoot(entity item, bool loot);
+
+/// \brief Returns whether item should keep its position or be dropped to the
+/// ground.
+/// \param[in] item Item to check.
+/// \return True if item should keep its position or false if it should be
+/// dropped to the ground.
+bool Item_ShouldKeepPosition(entity item);
+
+/// \brief Returns whether the item is expiring (i.e. its strength, shield and
+/// superweapon timers expire while it is on the ground).
+/// \param[in] item Item to check.
+/// \return True if the item is expiring, false otherwise.
+bool Item_IsExpiring(entity item);
+
+/// \brief Sets the item expiring status (i.e. whether its strength, shield
+/// and superweapon timers expire while it is on the ground).
+/// \param[in,out] item Item to adjust.
+/// \param[in] expiring Whether item is expiring.
+/// \return No return.
+void Item_SetExpiring(entity item, bool expiring);
--- /dev/null
+#include "main.qh"
+
+#include "anticheat.qh"
+#include "hook.qh"
+#include "damage.qh"
+#include "world.qh"
+#include "spawnpoints.qh"
+#include <server/gamelog.qh>
+
+#include "bot/api.qh"
+
+#include "command/common.qh"
+
+#include <server/mutators/_mod.qh>
+#include "weapons/csqcprojectile.qh"
+#include <server/weapons/common.qh>
+#include <server/compat/quake3.qh>
+
+#include "../common/constants.qh"
+#include "../common/deathtypes/all.qh"
+#include "../common/debug.qh"
+#include "../common/mapinfo.qh"
+#include "../common/util.qh"
+
+#include "../common/vehicles/all.qh"
+#include <common/monsters/sv_monsters.qh>
+#include <common/weapons/_all.qh>
+
+#include "../lib/csqcmodel/sv_model.qh"
+
+#include "../lib/warpzone/common.qh"
+#include "../lib/warpzone/server.qh"
+
+void CreatureFrame_hotliquids(entity this)
+{
+ if (this.contents_damagetime >= time)
+ {
+ return;
+ }
+
+ this.contents_damagetime = time + autocvar_g_balance_contents_damagerate;
+
+ if (this.flags & FL_PROJECTILE)
+ {
+ if (this.watertype == CONTENT_LAVA)
+ Damage (this, NULL, NULL, autocvar_g_balance_contents_projectiledamage * autocvar_g_balance_contents_damagerate * this.waterlevel, DEATH_LAVA.m_id, DMG_NOWEP, this.origin, '0 0 0');
+ else if (this.watertype == CONTENT_SLIME)
+ Damage (this, NULL, NULL, autocvar_g_balance_contents_projectiledamage * autocvar_g_balance_contents_damagerate * this.waterlevel, DEATH_SLIME.m_id, DMG_NOWEP, this.origin, '0 0 0');
+ }
+ else
+ {
+ if (STAT(FROZEN, this))
+ {
+ if (this.watertype == CONTENT_LAVA)
+ Damage(this, NULL, NULL, 10000, DEATH_LAVA.m_id, DMG_NOWEP, this.origin, '0 0 0');
+ else if (this.watertype == CONTENT_SLIME)
+ Damage(this, NULL, NULL, 10000, DEATH_SLIME.m_id, DMG_NOWEP, this.origin, '0 0 0');
+ }
+ else if (this.watertype == CONTENT_LAVA)
+ {
+ if (this.watersound_finished < time)
+ {
+ this.watersound_finished = time + 0.5;
+ sound (this, CH_PLAYER_SINGLE, SND_LAVA, VOL_BASE, ATTEN_NORM);
+ }
+ Damage (this, NULL, NULL, autocvar_g_balance_contents_playerdamage_lava * autocvar_g_balance_contents_damagerate * this.waterlevel, DEATH_LAVA.m_id, DMG_NOWEP, this.origin, '0 0 0');
+ if(autocvar_g_balance_contents_playerdamage_lava_burn)
+ Fire_AddDamage(this, NULL, autocvar_g_balance_contents_playerdamage_lava_burn * this.waterlevel, autocvar_g_balance_contents_playerdamage_lava_burn_time * this.waterlevel, DEATH_LAVA.m_id);
+ }
+ else if (this.watertype == CONTENT_SLIME)
+ {
+ if (this.watersound_finished < time)
+ {
+ this.watersound_finished = time + 0.5;
+ sound (this, CH_PLAYER_SINGLE, SND_SLIME, VOL_BASE, ATTEN_NORM);
+ }
+ Damage (this, NULL, NULL, autocvar_g_balance_contents_playerdamage_slime * autocvar_g_balance_contents_damagerate * this.waterlevel, DEATH_SLIME.m_id, DMG_NOWEP, this.origin, '0 0 0');
+ }
+ }
+}
+
+void CreatureFrame_Liquids(entity this)
+{
+ if (this.watertype <= CONTENT_WATER && this.waterlevel > 0) // workaround a retarded bug made by id software :P (yes, it's that old of a bug)
+ {
+ if (!(this.flags & FL_INWATER))
+ {
+ this.flags |= FL_INWATER;
+ this.contents_damagetime = 0;
+ }
+
+ CreatureFrame_hotliquids(this);
+ }
+ else
+ {
+ if (this.flags & FL_INWATER)
+ {
+ // play leave water sound
+ this.flags &= ~FL_INWATER;
+ this.contents_damagetime = 0;
+ }
+ }
+}
+
+void CreatureFrame_FallDamage(entity this)
+{
+ if(IS_VEHICLE(this) || (this.flags & FL_PROJECTILE))
+ return; // vehicles and projectiles don't receive fall damage
+ if(!(this.velocity || this.oldvelocity))
+ return; // if the entity hasn't moved and isn't moving, then don't do anything
+
+ // check for falling damage
+ bool have_hook = false;
+ for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
+ {
+ .entity weaponentity = weaponentities[slot];
+ if(this.(weaponentity).hook && this.(weaponentity).hook.state)
+ {
+ have_hook = true;
+ break;
+ }
+ }
+ if(!have_hook)
+ {
+ float dm; // dm is the velocity DECREASE. Velocity INCREASE should never cause a sound or any damage.
+ if(autocvar_g_balance_falldamage_onlyvertical)
+ dm = fabs(this.oldvelocity.z) - vlen(this.velocity);
+ else
+ dm = vlen(this.oldvelocity) - vlen(this.velocity);
+ if (IS_DEAD(this))
+ dm = (dm - autocvar_g_balance_falldamage_deadminspeed) * autocvar_g_balance_falldamage_factor;
+ else
+ dm = min((dm - autocvar_g_balance_falldamage_minspeed) * autocvar_g_balance_falldamage_factor, autocvar_g_balance_falldamage_maxdamage);
+ if (dm > 0)
+ {
+ tracebox(this.origin, this.mins, this.maxs, this.origin - '0 0 1', MOVE_NOMONSTERS, this);
+ if (!(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NODAMAGE))
+ Damage (this, NULL, NULL, dm, DEATH_FALL.m_id, DMG_NOWEP, this.origin, '0 0 0');
+ }
+ }
+
+ if(autocvar_g_maxspeed > 0 && vdist(this.velocity, >, autocvar_g_maxspeed))
+ Damage (this, NULL, NULL, 100000, DEATH_SHOOTING_STAR.m_id, DMG_NOWEP, this.origin, '0 0 0');
+}
+
+void CreatureFrame_All()
+{
+ if(game_stopped || time < game_starttime)
+ return;
+
+ IL_EACH(g_damagedbycontents, it.damagedbycontents,
+ {
+ if (it.move_movetype == MOVETYPE_NOCLIP) continue;
+ CreatureFrame_Liquids(it);
+ CreatureFrame_FallDamage(it);
+ it.oldvelocity = it.velocity;
+ });
+}
+
+void Pause_TryPause(bool ispaused)
+{
+ int n = 0;
+ FOREACH_CLIENT(IS_PLAYER(it) && IS_REAL_CLIENT(it), {
+ if (PHYS_INPUT_BUTTON_CHAT(it) != ispaused) return;
+ ++n;
+ });
+ if (!n) return;
+ setpause(ispaused);
+}
+
+void SV_PausedTic(float elapsedtime)
+{
+ if (!server_is_dedicated) Pause_TryPause(false);
+}
+
+/*
+=============
+StartFrame
+
+Called before each frame by the server
+=============
+*/
+
+bool game_delay_last;
+
+bool autocvar_sv_autopause = false;
+void systems_update();
+void sys_phys_update(entity this, float dt);
+void StartFrame()
+{
+ // TODO: if move is more than 50ms, split it into two moves (this matches QWSV behavior and the client prediction)
+ IL_EACH(g_players, IS_FAKE_CLIENT(it), sys_phys_update(it, frametime));
+ IL_EACH(g_players, IS_FAKE_CLIENT(it), PlayerPreThink(it));
+
+ execute_next_frame();
+ if (autocvar_sv_autopause && !server_is_dedicated) Pause_TryPause(true);
+
+ delete_fn = remove_unsafely; // not during spawning!
+ serverprevtime = servertime;
+ servertime = time;
+ serverframetime = frametime;
+
+#ifdef PROFILING
+ if(time > client_cefc_accumulatortime + 1)
+ {
+ float t = client_cefc_accumulator / (time - client_cefc_accumulatortime);
+ int c_seeing = 0;
+ int c_seen = 0;
+ FOREACH_CLIENT(true, {
+ if(IS_REAL_CLIENT(it))
+ ++c_seeing;
+ if(IS_PLAYER(it))
+ ++c_seen;
+ });
+ LOG_INFO(
+ "CEFC time: ", ftos(t * 1000), "ms; ",
+ "CEFC calls per second: ", ftos(c_seeing * (c_seen - 1) / t), "; ",
+ "CEFC 100% load at: ", ftos(solve_quadratic(t, -t, -1) * '0 1 0')
+ );
+ client_cefc_accumulatortime = time;
+ client_cefc_accumulator = 0;
+ }
+#endif
+
+ IL_EACH(g_projectiles, it.csqcprojectile_clientanimate, CSQCProjectile_Check(it));
+
+ if (RedirectionThink()) return;
+
+ UncustomizeEntitiesRun();
+ InitializeEntitiesRun();
+
+ WarpZone_StartFrame();
+
+ sys_frametime = autocvar_sys_ticrate * autocvar_slowmo;
+ if (sys_frametime <= 0) sys_frametime = 1.0 / 60.0; // somewhat safe fallback
+
+ if (timeout_status == TIMEOUT_LEADTIME) // just before the timeout (when timeout_status will be TIMEOUT_ACTIVE)
+ orig_slowmo = autocvar_slowmo; // slowmo will be restored after the timeout
+
+ // detect when the pre-game countdown (if any) has ended and the game has started
+ bool game_delay = (time < game_starttime);
+ if (autocvar_sv_eventlog && game_delay_last && !game_delay)
+ GameLogEcho(":startdelay_ended");
+ game_delay_last = game_delay;
+
+ CreatureFrame_All();
+ CheckRules_World();
+
+ if (warmup_stage && !game_stopped && warmup_limit > 0 && time >= warmup_limit) {
+ ReadyRestart();
+ return;
+ }
+
+ bot_serverframe();
+ anticheat_startframe();
+ MUTATOR_CALLHOOK(SV_StartFrame);
+
+ GlobalStats_updateglobal();
+ FOREACH_CLIENT(true, GlobalStats_update(it));
+ IL_EACH(g_players, IS_FAKE_CLIENT(it), PlayerPostThink(it));
+}
+
+.vector originjitter;
+.vector anglesjitter;
+.float anglejitter;
+.string gametypefilter;
+.string cvarfilter;
+
+/**
+ * Evaluate an expression of the form: [+ | -]? [var[op]val | [op]var | val | var] ...
+ * +: all must match. this is the default
+ * -: one must NOT match
+ *
+ * var>x
+ * var<x
+ * var>=x
+ * var<=x
+ * var==x
+ * var!=x
+ * var===x
+ * var!==x
+ */
+bool expr_evaluate(string s)
+{
+ bool ret = false;
+ if (str2chr(s, 0) == '+') {
+ s = substring(s, 1, -1);
+ } else if (str2chr(s, 0) == '-') {
+ ret = true;
+ s = substring(s, 1, -1);
+ }
+ bool expr_fail = false;
+ for (int i = 0, n = tokenize_console(s); i < n; ++i) {
+ int o;
+ string k, v;
+ s = argv(i);
+ #define X(expr) \
+ if (expr) \
+ continue; \
+ expr_fail = true; \
+ break;
+
+ #define BINOP(op, len, expr) \
+ if ((o = strstrofs(s, op, 0)) >= 0) { \
+ k = substring(s, 0, o); \
+ v = substring(s, o + len, -1); \
+ X(expr); \
+ }
+ BINOP(">=", 2, cvar(k) >= stof(v));
+ BINOP("<=", 2, cvar(k) <= stof(v));
+ BINOP(">", 1, cvar(k) > stof(v));
+ BINOP("<", 1, cvar(k) < stof(v));
+ BINOP("==", 2, cvar(k) == stof(v));
+ BINOP("!=", 2, cvar(k) != stof(v));
+ BINOP("===", 3, cvar_string(k) == v);
+ BINOP("!==", 3, cvar_string(k) != v);
+ {
+ k = s;
+ bool b = true;
+ if (str2chr(k, 0) == '!') {
+ k = substring(s, 1, -1);
+ b = false;
+ }
+ float f = stof(k);
+ bool isnum = ftos(f) == k;
+ X(boolean(isnum ? f : cvar(k)) == b);
+ }
+ #undef BINOP
+ #undef X
+ }
+ if (!expr_fail) {
+ ret = !ret;
+ }
+ // now ret is true if we want to keep the item, and false if we want to get rid of it
+ return ret;
+}
+
+void SV_OnEntityPreSpawnFunction(entity this)
+{
+ if (this)
+ if (this.gametypefilter != "")
+ if (!isGametypeInFilter(MapInfo_LoadedGametype, teamplay, have_team_spawns, this.gametypefilter))
+ {
+ delete(this);
+ return;
+ }
+ if (this.cvarfilter != "" && !expr_evaluate(this.cvarfilter)) {
+ delete(this);
+ return;
+ }
+
+ if (DoesQ3ARemoveThisEntity(this)) {
+ delete(this);
+ return;
+ }
+
+ set_movetype(this, this.movetype);
+
+ if (this.monster_attack) {
+ IL_PUSH(g_monster_targets, this);
+ }
+
+ // support special -1 and -2 angle from radiant
+ if (this.angles == '0 -1 0') {
+ this.angles = '-90 0 0';
+ } else if (this.angles == '0 -2 0') {
+ this.angles = '+90 0 0';
+ }
+
+ #define X(out, in) MACRO_BEGIN \
+ if (in != 0) { out = out + (random() * 2 - 1) * in; } \
+ MACRO_END
+ X(this.origin.x, this.originjitter.x); X(this.origin.y, this.originjitter.y); X(this.origin.z, this.originjitter.z);
+ X(this.angles.x, this.anglesjitter.x); X(this.angles.y, this.anglesjitter.y); X(this.angles.z, this.anglesjitter.z);
+ X(this.angles.y, this.anglejitter);
+ #undef X
+
+ if (MUTATOR_CALLHOOK(OnEntityPreSpawn, this)) {
+ delete(this);
+ return;
+ }
+}
+
+void WarpZone_PostInitialize_Callback()
+{
+ // create waypoint links for warpzones
+ entity tracetest_ent = spawn();
+ setsize(tracetest_ent, PL_MIN_CONST, PL_MAX_CONST);
+ tracetest_ent.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_PLAYERCLIP | DPCONTENTS_BOTCLIP;
+ //for(entity e = warpzone_first; e; e = e.warpzone_next)
+ for(entity e = NULL; (e = find(e, classname, "trigger_warpzone")); )
+ waypoint_spawnforteleporter_wz(e, tracetest_ent);
+ delete(tracetest_ent);
+}
+
+/*
+==================
+main
+
+unused but required by the engine
+==================
+*/
+void main ()
+{
+
+}
--- /dev/null
+#pragma once
+
+bool expr_evaluate(string s);
+
+#ifdef PROFILING
+float client_cefc_accumulator;
+float client_cefc_accumulatortime;
+#endif
+
+float servertime, serverprevtime, serverframetime;
+
+.vector oldvelocity; // for fall damage
+
+.float watersound_finished;
+
+.bool iscreature;
+.float species;
+
+.float contents_damagetime;
+
+/*
+==================
+main
+
+unused but required by the engine
+==================
+*/
+void main ();
#include "mapvoting.qh"
-#include <server/defs.qh>
+#include <server/client.qh>
+#include <common/weapons/_all.qh>
+#include <common/stats.qh>
+#include <server/gamelog.qh>
#include <server/miscfunctions.qh>
-#include "g_world.qh"
+#include "world.qh"
#include "command/cmd.qh"
#include "command/getreplies.qh"
#include "../common/constants.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;
}
#include "antilag.qh"
#include "command/common.qh"
-#include "constants.qh"
-#include "g_hook.qh"
+#include "client.qh"
+#include "damage.qh"
+#include "hook.qh"
+#include "world.qh"
+#include <server/gamelog.qh>
#include "ipban.qh"
+#include <server/items/items.qh>
#include <server/mutators/_mod.qh>
-#include "../common/t_items.qh"
+#include <server/spawnpoints.qh>
+#include <server/main.qh>
#include "mapvoting.qh"
#include "resources.qh"
-#include "items.qh"
+#include <server/items/spawning.qh>
#include "player.qh"
#include "weapons/accuracy.qh"
+#include "weapons/common.qh"
#include "weapons/csqcprojectile.qh"
#include "weapons/selection.qh"
#include "../common/command/_mod.qh"
#include "../common/playerstats.qh"
#include "../common/teams.qh"
#include "../common/mapobjects/subs.qh"
+#include <common/mapobjects/trigger/hurt.qh>
+#include <common/mapobjects/target/location.qh>
#include "../common/util.qh"
#include "../common/turrets/sv_turrets.qh"
#include <common/weapons/_all.qh>
if (server_is_dedicated) print(input);
}
-string GameLog_ProcessIP(string s)
-{
- if(!autocvar_sv_eventlog_ipv6_delimiter)
- return s;
- return strreplace(":", "_", s);
-}
-
-void GameLogEcho(string s)
-{
- string fn;
- int matches;
-
- if (autocvar_sv_eventlog_files)
- {
- if (!logfile_open)
- {
- logfile_open = true;
- matches = autocvar_sv_eventlog_files_counter + 1;
- cvar_set("sv_eventlog_files_counter", itos(matches));
- fn = ftos(matches);
- if (strlen(fn) < 8)
- fn = strcat(substring("00000000", 0, 8 - strlen(fn)), fn);
- fn = strcat(autocvar_sv_eventlog_files_nameprefix, fn, autocvar_sv_eventlog_files_namesuffix);
- logfile = fopen(fn, FILE_APPEND);
- fputs(logfile, ":logversion:3\n");
- }
- if (logfile >= 0)
- {
- if (autocvar_sv_eventlog_files_timestamps)
- fputs(logfile, strcat(":time:", strftime(true, "%Y-%m-%d %H:%M:%S", "\n", s, "\n")));
- else
- fputs(logfile, strcat(s, "\n"));
- }
- }
- if (autocvar_sv_eventlog_console)
- {
- dedicated_print(strcat(s, "\n"));
- }
-}
-
-void GameLogInit()
-{
- logfile_open = 0;
- // will be opened later
-}
-
-void GameLogClose()
-{
- if (logfile_open && logfile >= 0)
- {
- fclose(logfile);
- logfile = -1;
- }
-}
-
entity findnearest(vector point, bool checkitems, vector axismod)
{
vector dist;
return o;
}
-REPLICATE(autoswitch, bool, "cl_autoswitch");
-
-REPLICATE(cvar_cl_allow_uid2name, bool, "cl_allow_uid2name");
-
-REPLICATE(cvar_cl_allow_uidranking, bool, "cl_allow_uidranking");
-
-REPLICATE(cvar_cl_autoscreenshot, int, "cl_autoscreenshot");
-
-REPLICATE(cvar_cl_autotaunt, float, "cl_autotaunt");
-
-REPLICATE(cvar_cl_clippedspectating, bool, "cl_clippedspectating");
-
-REPLICATE(cvar_cl_handicap, float, "cl_handicap");
-
-REPLICATE(cvar_cl_gunalign, int, "cl_gunalign");
-
-REPLICATE(cvar_cl_jetpack_jump, bool, "cl_jetpack_jump");
-
-REPLICATE(cvar_cl_movement_track_canjump, bool, "cl_movement_track_canjump");
-
-REPLICATE(cvar_cl_newusekeysupported, bool, "cl_newusekeysupported");
-
-REPLICATE(cvar_cl_noantilag, bool, "cl_noantilag");
-
-REPLICATE(cvar_cl_physics, string, "cl_physics");
-
-REPLICATE(cvar_cl_voice_directional, int, "cl_voice_directional");
-
-REPLICATE(cvar_cl_voice_directional_taunt_attenuation, float, "cl_voice_directional_taunt_attenuation");
-
-REPLICATE(cvar_cl_weaponimpulsemode, int, "cl_weaponimpulsemode");
-
-REPLICATE(cvar_g_xonoticversion, string, "g_xonoticversion");
-
-REPLICATE(cvar_cl_cts_noautoswitch, bool, "cl_cts_noautoswitch");
-
-REPLICATE(cvar_cl_weapon_switch_reload, bool, "cl_weapon_switch_reload");
-
-REPLICATE(cvar_cl_weapon_switch_fallback_to_impulse, bool, "cl_weapon_switch_fallback_to_impulse");
-
/**
* @param f -1: cleanup, 0: request, 1: receive
*/
#pragma once
-#include <server/defs.qh>
-#include <server/g_world.qh>
+#include <common/weapons/_all.qh>
+#include <common/stats.qh>
+#include <server/client.qh>
+#include <server/world.qh>
-#include <common/t_items.qh>
+#include <server/items/items.qh>
#include <server/mutators/_mod.qh>
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);
/** print(), but only print if the server is not local */
void dedicated_print(string input);
-string GameLog_ProcessIP(string s);
-
-void GameLogEcho(string s);
-
-void GameLogInit();
-
-void GameLogClose();
-
void GetCvars(entity this, entity store, int f);
string GetMapname();
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);
// copies a string to a tempstring (so one can strunzone it)
string strcat1(string s) = #115; // FRIK_FILE
-float logfile_open;
-float logfile;
-
/*
// NOTE: DO NOT USE THIS FUNCTION TOO OFTEN.
// IT WILL MOST PROBABLY DESTROY _ALL_ OTHER TEMP
float sv_autotaunt;
float sv_taunt;
+float g_footsteps, g_grappling_hook;
+float g_warmup_allguns;
+float g_warmup_allow_timeout;
+float warmup_stage;
+float g_jetpack;
+
+bool sv_ready_restart;
+bool sv_ready_restart_after_countdown;
+bool sv_ready_restart_repeatable;
+
+float sv_clones;
+float sv_foginterval;
+
void readlevelcvars()
{
if(cvar("sv_allow_fullbright"))
/**/
MUTATOR_HOOKABLE(PlayerDied, EV_PlayerDied);
+/** called when showing an obituary for the player. return true to show nothing (workarounds may be needed) */
+#define EV_ClientObituary(i, o) \
+ /** inflictor */ i(entity, MUTATOR_ARGV_0_entity) \
+ /** attacker */ i(entity, MUTATOR_ARGV_1_entity) \
+ /** target */ i(entity, MUTATOR_ARGV_2_entity) \
+ /** deathtype */ i(float, MUTATOR_ARGV_3_float) \
+ /** wep entity */ i(entity, MUTATOR_ARGV_4_entity) \
+ /** anonymous killer*/ o(bool, MUTATOR_ARGV_5_bool) \
+ /**/
+MUTATOR_HOOKABLE(ClientObituary, EV_ClientObituary);
+
/** allows overriding the frag centerprint messages */
#define EV_FragCenterMessage(i, o) \
/** attacker */ i(entity, MUTATOR_ARGV_0_entity) \
#include "loader.qh"
-#include <server/defs.qh>
+#include <common/weapons/_all.qh>
+#include <common/stats.qh>
#include <server/miscfunctions.qh>
STATIC_INIT_LATE(Gametype) {
/**
- Manhattan Menas we expect to move up,down left or right
- No diagonal moves espected. (like moving bewteen city blocks)
+ Manhattan heuristic means we expect to move up, down left or right
+ No diagonal moves expected. (like moving between city blocks)
**/
-float pathlib_h_manhattan(vector a,vector b)
+float pathlib_h_manhattan(vector a, vector b)
{
//h(n) = D * (abs(n.x-goal.x) + abs(n.y-goal.y))
}
/**
- This heuristic consider both stright and disagonal moves
- to have teh same cost.
+ This heuristic consider both straight and diagonal moves
+ to have the same cost.
**/
-float pathlib_h_diagonal(vector a,vector b)
+float pathlib_h_diagonal(vector a, vector b)
{
//h(n) = D * max(abs(n.x-goal.x), abs(n.y-goal.y))
float hx = fabs(a.x - b.x);
float hy = fabs(a.y - b.y);
- float h = pathlib_movecost * max(hx,hy);
+ float h = pathlib_movecost * max(hx, hy);
return h;
}
/**
- This heuristic only considers the stright line distance.
- Will usualy mean a lower H then G meaning A* Will speand more
- and run slower.
+ This heuristic only considers the straight line distance.
+ Usually means a lower H then G, resulting in A* spreading more
+ (and running slower).
**/
-float pathlib_h_euclidean(vector a,vector b)
+float pathlib_h_euclidean(vector a, vector b)
{
return vlen(a - b);
}
/**
- This heuristic consider both stright and disagonal moves,
- But has a separate cost for diagonal moves.
+ This heuristic consider both straight and diagonal moves,
+ but has a separate cost for diagonal moves.
**/
float pathlib_h_diagonal2(vector a,vector b)
{
}
/**
- This heuristic consider both stright and disagonal moves,
+ This heuristic consider both straight and diagonal moves,
But has a separate cost for diagonal moves.
**/
-float pathlib_h_diagonal2sdp(vector preprev,vector prev,vector point,vector end)
+float pathlib_h_diagonal2sdp(vector preprev, vector prev, vector point, vector end)
{
//h_diagonal(n) = min(abs(n.x-goal.x), abs(n.y-goal.y))
//h_straight(n) = (abs(n.x-goal.x) + abs(n.y-goal.y))
vector d1 = normalize(preprev - point);
vector d2 = normalize(prev - point);
- float m = vlen(d1-d2);
+ float m = vlen(d1 - d2);
return h * m;
}
-float pathlib_h_diagonal3(vector a,vector b)
+float pathlib_h_diagonal3(vector a, vector b)
{
float hx = fabs(a.x - b.x);
float hy = fabs(a.y - b.y);
#include "pathlib.qh"
#include "utility.qh"
+/*
vector plib_points2[8];
vector plib_points[8];
float plib_fvals[8];
++fc2;
}
- /*
- nap = pathlib_nodeatpoint(plib_points[i]);
- if(nap)
- if not nap.owner == closedlist)
- {
- }
- */
+ //nap = pathlib_nodeatpoint(plib_points[i]);
+ //if(nap)
+ //if not nap.owner == closedlist)
+ //{
+ //}
}
pathlib_makenode(node, start, bp, goal, pathlib_gridsize);
return pathlib_open_cnt;
}
+*/
float pathlib_expandnode_star(entity node, vector start, vector goal)
{
return pathlib_open_cnt;
}
+/*
float pathlib_expandnode_octagon(entity node, vector start, vector goal)
{
vector point;
point = where + f + r;
pathlib_makenode(node, start, point, goal, pathlib_movecost);
-
// Forward-left
point = where + f - r;
pathlib_makenode(node, start, point, goal, pathlib_movecost);
-
// Back-right
point = where - f + r;
pathlib_makenode(node, start, point, goal, pathlib_movecost);
return pathlib_open_cnt;
}
+*/
float pathlib_expandnode_box(entity node, vector start, vector goal)
{
#include "main.qh"
-#include <server/defs.qh>
+#include <common/weapons/_all.qh>
+#include <common/stats.qh>
#include <server/miscfunctions.qh>
#include "pathlib.qh"
#include "utility.qh"
#include "movenode.qh"
-#include <server/defs.qh>
+#include <common/mapobjects/triggers.qh>
+#include <common/weapons/_all.qh>
+#include <common/stats.qh>
#include <server/miscfunctions.qh>
#include "pathlib.qh"
#include "utility.qh"
float pathlib_wpp_expand(entity wp)
{
- if(wp.wp00) pathlib_wpp_open(wp,wp.wp00,wp.wp00mincost); else return 0;
- if(wp.wp01) pathlib_wpp_open(wp,wp.wp01,wp.wp01mincost); else return 1;
- if(wp.wp02) pathlib_wpp_open(wp,wp.wp02,wp.wp02mincost); else return 2;
- if(wp.wp03) pathlib_wpp_open(wp,wp.wp03,wp.wp03mincost); else return 3;
- if(wp.wp04) pathlib_wpp_open(wp,wp.wp04,wp.wp04mincost); else return 4;
- if(wp.wp05) pathlib_wpp_open(wp,wp.wp05,wp.wp05mincost); else return 5;
- if(wp.wp06) pathlib_wpp_open(wp,wp.wp06,wp.wp06mincost); else return 6;
- if(wp.wp07) pathlib_wpp_open(wp,wp.wp07,wp.wp07mincost); else return 7;
- if(wp.wp08) pathlib_wpp_open(wp,wp.wp08,wp.wp08mincost); else return 8;
- if(wp.wp09) pathlib_wpp_open(wp,wp.wp09,wp.wp09mincost); else return 9;
- if(wp.wp10) pathlib_wpp_open(wp,wp.wp10,wp.wp10mincost); else return 10;
- if(wp.wp11) pathlib_wpp_open(wp,wp.wp11,wp.wp11mincost); else return 11;
- if(wp.wp12) pathlib_wpp_open(wp,wp.wp12,wp.wp12mincost); else return 12;
- if(wp.wp13) pathlib_wpp_open(wp,wp.wp13,wp.wp13mincost); else return 13;
- if(wp.wp14) pathlib_wpp_open(wp,wp.wp14,wp.wp14mincost); else return 14;
- if(wp.wp15) pathlib_wpp_open(wp,wp.wp15,wp.wp15mincost); else return 15;
- if(wp.wp16) pathlib_wpp_open(wp,wp.wp16,wp.wp16mincost); else return 16;
- if(wp.wp17) pathlib_wpp_open(wp,wp.wp17,wp.wp17mincost); else return 17;
- if(wp.wp18) pathlib_wpp_open(wp,wp.wp18,wp.wp18mincost); else return 18;
- if(wp.wp19) pathlib_wpp_open(wp,wp.wp19,wp.wp19mincost); else return 19;
- if(wp.wp20) pathlib_wpp_open(wp,wp.wp20,wp.wp20mincost); else return 20;
- if(wp.wp21) pathlib_wpp_open(wp,wp.wp21,wp.wp21mincost); else return 21;
- if(wp.wp22) pathlib_wpp_open(wp,wp.wp22,wp.wp22mincost); else return 22;
- if(wp.wp23) pathlib_wpp_open(wp,wp.wp23,wp.wp23mincost); else return 23;
- if(wp.wp24) pathlib_wpp_open(wp,wp.wp24,wp.wp24mincost); else return 24;
- if(wp.wp25) pathlib_wpp_open(wp,wp.wp25,wp.wp25mincost); else return 25;
- if(wp.wp26) pathlib_wpp_open(wp,wp.wp26,wp.wp26mincost); else return 26;
- if(wp.wp27) pathlib_wpp_open(wp,wp.wp27,wp.wp27mincost); else return 27;
- if(wp.wp28) pathlib_wpp_open(wp,wp.wp28,wp.wp28mincost); else return 28;
- if(wp.wp29) pathlib_wpp_open(wp,wp.wp29,wp.wp29mincost); else return 29;
- if(wp.wp30) pathlib_wpp_open(wp,wp.wp30,wp.wp30mincost); else return 30;
- if(wp.wp31) pathlib_wpp_open(wp,wp.wp31,wp.wp31mincost); else return 31;
+ if(wp.wp00) pathlib_wpp_open(wp,wp.wp00, wp.wp00mincost); else return 0;
+ if(wp.wp01) pathlib_wpp_open(wp,wp.wp01, wp.wp01mincost); else return 1;
+ if(wp.wp02) pathlib_wpp_open(wp,wp.wp02, wp.wp02mincost); else return 2;
+ if(wp.wp03) pathlib_wpp_open(wp,wp.wp03, wp.wp03mincost); else return 3;
+ if(wp.wp04) pathlib_wpp_open(wp,wp.wp04, wp.wp04mincost); else return 4;
+ if(wp.wp05) pathlib_wpp_open(wp,wp.wp05, wp.wp05mincost); else return 5;
+ if(wp.wp06) pathlib_wpp_open(wp,wp.wp06, wp.wp06mincost); else return 6;
+ if(wp.wp07) pathlib_wpp_open(wp,wp.wp07, wp.wp07mincost); else return 7;
+ if(wp.wp08) pathlib_wpp_open(wp,wp.wp08, wp.wp08mincost); else return 8;
+ if(wp.wp09) pathlib_wpp_open(wp,wp.wp09, wp.wp09mincost); else return 9;
+ if(wp.wp10) pathlib_wpp_open(wp,wp.wp10, wp.wp10mincost); else return 10;
+ if(wp.wp11) pathlib_wpp_open(wp,wp.wp11, wp.wp11mincost); else return 11;
+ if(wp.wp12) pathlib_wpp_open(wp,wp.wp12, wp.wp12mincost); else return 12;
+ if(wp.wp13) pathlib_wpp_open(wp,wp.wp13, wp.wp13mincost); else return 13;
+ if(wp.wp14) pathlib_wpp_open(wp,wp.wp14, wp.wp14mincost); else return 14;
+ if(wp.wp15) pathlib_wpp_open(wp,wp.wp15, wp.wp15mincost); else return 15;
+ if(wp.wp16) pathlib_wpp_open(wp,wp.wp16, wp.wp16mincost); else return 16;
+ if(wp.wp17) pathlib_wpp_open(wp,wp.wp17, wp.wp17mincost); else return 17;
+ if(wp.wp18) pathlib_wpp_open(wp,wp.wp18, wp.wp18mincost); else return 18;
+ if(wp.wp19) pathlib_wpp_open(wp,wp.wp19, wp.wp19mincost); else return 19;
+ if(wp.wp20) pathlib_wpp_open(wp,wp.wp20, wp.wp20mincost); else return 20;
+ if(wp.wp21) pathlib_wpp_open(wp,wp.wp21, wp.wp21mincost); else return 21;
+ if(wp.wp22) pathlib_wpp_open(wp,wp.wp22, wp.wp22mincost); else return 22;
+ if(wp.wp23) pathlib_wpp_open(wp,wp.wp23, wp.wp23mincost); else return 23;
+ if(wp.wp24) pathlib_wpp_open(wp,wp.wp24, wp.wp24mincost); else return 24;
+ if(wp.wp25) pathlib_wpp_open(wp,wp.wp25, wp.wp25mincost); else return 25;
+ if(wp.wp26) pathlib_wpp_open(wp,wp.wp26, wp.wp26mincost); else return 26;
+ if(wp.wp27) pathlib_wpp_open(wp,wp.wp27, wp.wp27mincost); else return 27;
+ if(wp.wp28) pathlib_wpp_open(wp,wp.wp28, wp.wp28mincost); else return 28;
+ if(wp.wp29) pathlib_wpp_open(wp,wp.wp29, wp.wp29mincost); else return 29;
+ if(wp.wp30) pathlib_wpp_open(wp,wp.wp30, wp.wp30mincost); else return 30;
+ if(wp.wp31) pathlib_wpp_open(wp,wp.wp31, wp.wp31mincost); else return 31;
return 32;
}
else
pathlib_wpp_open = pathlib_wpp_openncb;
- pathlib_heuristic = pathlib_h_none;
+ pathlib_heuristic = pathlib_h_none; // We run Dijkstra, A* does not make sense with variable distanced nodes.
if (!openlist)
openlist = spawn();
vector pathlib_walknode(entity this, vector start, vector end, float doedge);
var vector pathlib_movenode(entity this, vector start, vector end, float doedge);
+//float pathlib_expandnode_starf(entity node, vector start, vector goal);
float pathlib_expandnode_star(entity node, vector start, vector goal);
float pathlib_expandnode_box(entity node, vector start, vector goal);
-float pathlib_expandnode_octagon(entity node, vector start, vector goal);
+//float pathlib_expandnode_octagon(entity node, vector start, vector goal);
var float pathlib_expandnode(entity node, vector start, vector goal);
float pathlib_g_static(entity parent, vector to, float static_cost);
var bool buildpath_nodefilter(vector n,vector c,vector p);
var float pathlib_wpp_waypointcallback(entity wp, entity wp_prev);
+
+IntrusiveList g_pathlib_nodes;
+STATIC_INIT(g_pathlib_nodes) { g_pathlib_nodes = IL_NEW(); }
#include "utility.qh"
-#include <server/defs.qh>
+#include <common/weapons/_all.qh>
+#include <common/stats.qh>
#include <server/miscfunctions.qh>
#include "pathlib.qh"
#include <common/effects/all.qh>
#include "bot/api.qh"
#include "cheats.qh"
+#include "client.qh"
#include "clientkill.qh"
-#include "g_damage.qh"
+#include "damage.qh"
+#include "world.qh"
#include "handicap.qh"
#include "miscfunctions.qh"
#include "portals.qh"
#include "teamplay.qh"
+#include <server/main.qh>
+#include "weapons/common.qh"
#include "weapons/throwing.qh"
#include "command/common.qh"
+#include "command/vote.qh"
#include "../common/state.qh"
#include "../common/anim.qh"
#include "../common/animdecide.qh"
#include "../common/gamemodes/sv_rules.qh"
#include "../common/deathtypes/all.qh"
#include "../common/mapobjects/subs.qh"
+#include <common/mapobjects/teleporters.qh>
#include "../common/playerstats.qh"
#include "../lib/csqcmodel/sv_model.qh"
#include "../common/wepent.qh"
#include "weapons/weaponstats.qh"
+#include <server/weapons/weaponsystem.qh>
#include "../common/animdecide.qh"
animbits |= ANIMSTATE_FROZEN;
if(this.move_movetype == MOVETYPE_FOLLOW)
animbits |= ANIMSTATE_FOLLOW;
- if(this.crouch)
+ if(IS_DUCKED(this))
animbits |= ANIMSTATE_DUCK;
animdecide_setstate(this, animbits, false);
animdecide_setimplicitstate(this, IS_ONGROUND(this));
}
}
-void calculate_player_respawn_time(entity this)
-{
- if(MUTATOR_CALLHOOK(CalculateRespawnTime, this))
- return;
-
- float gametype_setting_tmp;
- float sdelay_max = GAMETYPE_DEFAULTED_SETTING(respawn_delay_max);
- float sdelay_small = GAMETYPE_DEFAULTED_SETTING(respawn_delay_small);
- float sdelay_large = GAMETYPE_DEFAULTED_SETTING(respawn_delay_large);
- float sdelay_small_count = GAMETYPE_DEFAULTED_SETTING(respawn_delay_small_count);
- float sdelay_large_count = GAMETYPE_DEFAULTED_SETTING(respawn_delay_large_count);
- float waves = GAMETYPE_DEFAULTED_SETTING(respawn_waves);
-
- float pcount = 1; // Include myself whether or not team is already set right and I'm a "player".
- if (teamplay)
- {
- FOREACH_CLIENT(IS_PLAYER(it) && it != this, {
- if(it.team == this.team)
- ++pcount;
- });
- if (sdelay_small_count == 0)
- sdelay_small_count = 1;
- if (sdelay_large_count == 0)
- sdelay_large_count = 1;
- }
- else
- {
- FOREACH_CLIENT(IS_PLAYER(it) && it != this, {
- ++pcount;
- });
- if (sdelay_small_count == 0)
- {
- if (IS_INDEPENDENT_PLAYER(this))
- {
- // Players play independently. No point in requiring enemies.
- sdelay_small_count = 1;
- }
- else
- {
- // Players play AGAINST each other. Enemies required.
- sdelay_small_count = 2;
- }
- }
- if (sdelay_large_count == 0)
- {
- if (IS_INDEPENDENT_PLAYER(this))
- {
- // Players play independently. No point in requiring enemies.
- sdelay_large_count = 1;
- }
- else
- {
- // Players play AGAINST each other. Enemies required.
- sdelay_large_count = 2;
- }
- }
- }
-
- float sdelay;
-
- if (pcount <= sdelay_small_count)
- sdelay = sdelay_small;
- else if (pcount >= sdelay_large_count)
- sdelay = sdelay_large;
- else // NOTE: this case implies sdelay_large_count > sdelay_small_count.
- sdelay = sdelay_small + (sdelay_large - sdelay_small) * (pcount - sdelay_small_count) / (sdelay_large_count - sdelay_small_count);
-
- if(waves)
- this.respawn_time = ceil((time + sdelay) / waves) * waves;
- else
- this.respawn_time = time + sdelay;
-
- if(sdelay < sdelay_max)
- this.respawn_time_max = time + sdelay_max;
- else
- this.respawn_time_max = this.respawn_time;
-
- if((sdelay + waves >= 5.0) && (this.respawn_time - time > 1.75))
- this.respawn_countdown = 10; // first number to count down from is 10
- else
- this.respawn_countdown = -1; // do not count down
-
- if(autocvar_g_forced_respawn)
- this.respawn_flags = this.respawn_flags | RESPAWN_FORCE;
-}
-
void PlayerDamage(entity this, entity inflictor, entity attacker, float damage, int deathtype, .entity weaponentity, vector hitloc, vector force)
{
vector v;
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;
.float pushltime;
.bool istypefrag;
+.float death_time;
+
.float CopyBody_nextthink;
.void(entity this) CopyBody_think;
void CopyBody_Think(entity this);
void PlayerCorpseDamage(entity this, entity inflictor, entity attacker, float damage, int deathtype, .entity weaponentity, vector hitloc, vector force);
-// g_<gametype>_str:
-// If 0, default is used.
-// If <0, 0 is used.
-// Otherwise, g_str (default value) is used.
-// For consistency, negative values there are mapped to zero too.
-#define GAMETYPE_DEFAULTED_SETTING(str) \
- ((gametype_setting_tmp = cvar(strcat("g_", GetGametype(), "_" #str))), \
- (gametype_setting_tmp < 0) ? 0 \
- : (gametype_setting_tmp == 0 || autocvar_g_respawn_delay_forced) ? max(0, autocvar_g_##str) \
- : gametype_setting_tmp)
-
-void calculate_player_respawn_time(entity this);
-
void PlayerDamage(entity this, entity inflictor, entity attacker, float damage, int deathtype, .entity weaponentity, vector hitloc, vector force);
bool PlayerHeal(entity targ, entity inflictor, float amount, float limit);
+
+IntrusiveList g_clones;
+STATIC_INIT(g_clones) { g_clones = IL_NEW(); }
#include "portals.qh"
#include <common/effects/all.qh>
-#include "g_hook.qh"
+#include "hook.qh"
#include "mutators/_mod.qh"
+#include <server/client.qh>
+#include <server/weapons/common.qh>
#include "../common/constants.qh"
#include "../common/deathtypes/all.qh"
#include "../common/notifications/all.qh"
#include "../common/mapobjects/teleporters.qh"
+#include <common/mapobjects/triggers.qh>
#include "../common/mapobjects/subs.qh"
#include "../common/util.qh"
#include <common/weapons/_all.qh>
#include "../lib/warpzone/common.qh"
#include "../common/vehicles/vehicle.qh"
#include "../common/vehicles/sv_vehicles.qh"
+#include <common/weapons/weapon/porto.qh>
#include <server/player.qh>
+#include <server/damage.qh>
#define PORTALS_ARE_NOT_SOLID
#include "race.qh"
-#include <server/defs.qh>
+#include <common/weapons/_all.qh>
+#include <common/stats.qh>
+#include <server/damage.qh>
+#include <server/world.qh>
#include <server/miscfunctions.qh>
+#include <server/weapons/common.qh>
#include "client.qh"
+#include "cheats.qh"
#include "portals.qh"
#include "scores.qh"
#include "spawnpoints.qh"
#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>
#pragma once
+.string stored_netname; // TODO: store this information independently of race-based gamemodes
+
float race_teams;
// scores
#include "round_handler.qh"
-#include <server/defs.qh>
+#include <server/world.qh>
#include <server/miscfunctions.qh>
#include "campaign.qh"
#include "command/vote.qh"
+#include <common/mapobjects/triggers.qh>
#include "../common/util.qh"
void round_handler_Think(entity this)
#include "scores.qh"
#include "command/common.qh"
-#include "defs.qh"
-#include <server/g_world.qh>
+#include <common/weapons/_all.qh>
+#include "client.qh"
+#include <server/world.qh>
#include <server/miscfunctions.qh>
#include <server/mutators/_mod.qh>
#include <server/round_handler.qh>
#include "scores_rules.qh"
-#include <server/defs.qh>
+#include <common/weapons/_all.qh>
+#include <common/stats.qh>
#include <server/miscfunctions.qh>
#include "client.qh"
#include "scores.qh"
#include "spawnpoints.qh"
#include <server/mutators/_mod.qh>
-#include "g_world.qh"
+#include "world.qh"
#include "miscfunctions.qh"
#include "race.qh"
-#include "defs.qh"
+#include <common/weapons/_all.qh>
+#include <common/stats.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/mapobjects/triggers.qh>
#include "../common/util.qh"
#include "../lib/warpzone/common.qh"
#include "../lib/warpzone/util_server.qh"
#include <server/utils.qh>
+#include <server/command/vote.qh>
bool SpawnPoint_Send(entity this, entity to, int sf)
{
const int SPAWN_PRIO_RACE_PREVIOUS_SPAWN = 50;
const int SPAWN_PRIO_GOOD_DISTANCE = 10;
+bool some_spawn_has_been_used;
+int have_team_spawns; // 0 = no team spawns requested, -1 = team spawns requested but none found, 1 = team spawns requested and found
+int have_team_spawns_forteams; // if Xth bit is 1 then team X has spawns else it has no spawns; team 0 is the "no-team"
+
.vector spawnpoint_score;
float spawnpoint_nag;
bool SpawnEvent_Send(entity this, entity to, int sf);
entity SelectSpawnPoint(entity this, bool anypoint);
spawnfunc(info_player_deathmatch);
void spawnpoint_use(entity this, entity actor, entity trigger);
+
+USING(spawn_evalfunc_t, vector(entity this, entity player, entity spot, vector current));
+.spawn_evalfunc_t spawn_evalfunc;
+
+.int restriction;
+
+IntrusiveList g_spawnpoints;
+STATIC_INIT(g_spawnpoints) { g_spawnpoints = IL_NEW(); }
+++ /dev/null
-#include "sv_main.qh"
-
-#include "anticheat.qh"
-#include "g_hook.qh"
-#include "g_damage.qh"
-#include "g_world.qh"
-
-#include "bot/api.qh"
-
-#include "command/common.qh"
-
-#include <server/mutators/_mod.qh>
-#include "weapons/csqcprojectile.qh"
-#include <server/compat/quake3.qh>
-
-#include "../common/constants.qh"
-#include "../common/deathtypes/all.qh"
-#include "../common/debug.qh"
-#include "../common/mapinfo.qh"
-#include "../common/util.qh"
-
-#include "../common/vehicles/all.qh"
-#include <common/monsters/sv_monsters.qh>
-#include <common/weapons/_all.qh>
-
-#include "../lib/csqcmodel/sv_model.qh"
-
-#include "../lib/warpzone/common.qh"
-#include "../lib/warpzone/server.qh"
-
-void CreatureFrame_hotliquids(entity this)
-{
- if (this.dmgtime >= time)
- {
- return;
- }
-
- this.dmgtime = time + autocvar_g_balance_contents_damagerate;
-
- if (this.flags & FL_PROJECTILE)
- {
- if (this.watertype == CONTENT_LAVA)
- Damage (this, NULL, NULL, autocvar_g_balance_contents_projectiledamage * autocvar_g_balance_contents_damagerate * this.waterlevel, DEATH_LAVA.m_id, DMG_NOWEP, this.origin, '0 0 0');
- else if (this.watertype == CONTENT_SLIME)
- Damage (this, NULL, NULL, autocvar_g_balance_contents_projectiledamage * autocvar_g_balance_contents_damagerate * this.waterlevel, DEATH_SLIME.m_id, DMG_NOWEP, this.origin, '0 0 0');
- }
- else
- {
- if (STAT(FROZEN, this))
- {
- if (this.watertype == CONTENT_LAVA)
- Damage(this, NULL, NULL, 10000, DEATH_LAVA.m_id, DMG_NOWEP, this.origin, '0 0 0');
- else if (this.watertype == CONTENT_SLIME)
- Damage(this, NULL, NULL, 10000, DEATH_SLIME.m_id, DMG_NOWEP, this.origin, '0 0 0');
- }
- else if (this.watertype == CONTENT_LAVA)
- {
- if (this.watersound_finished < time)
- {
- this.watersound_finished = time + 0.5;
- sound (this, CH_PLAYER_SINGLE, SND_LAVA, VOL_BASE, ATTEN_NORM);
- }
- Damage (this, NULL, NULL, autocvar_g_balance_contents_playerdamage_lava * autocvar_g_balance_contents_damagerate * this.waterlevel, DEATH_LAVA.m_id, DMG_NOWEP, this.origin, '0 0 0');
- if(autocvar_g_balance_contents_playerdamage_lava_burn)
- Fire_AddDamage(this, NULL, autocvar_g_balance_contents_playerdamage_lava_burn * this.waterlevel, autocvar_g_balance_contents_playerdamage_lava_burn_time * this.waterlevel, DEATH_LAVA.m_id);
- }
- else if (this.watertype == CONTENT_SLIME)
- {
- if (this.watersound_finished < time)
- {
- this.watersound_finished = time + 0.5;
- sound (this, CH_PLAYER_SINGLE, SND_SLIME, VOL_BASE, ATTEN_NORM);
- }
- Damage (this, NULL, NULL, autocvar_g_balance_contents_playerdamage_slime * autocvar_g_balance_contents_damagerate * this.waterlevel, DEATH_SLIME.m_id, DMG_NOWEP, this.origin, '0 0 0');
- }
- }
-}
-
-void CreatureFrame_Liquids(entity this)
-{
- if (this.watertype <= CONTENT_WATER && this.waterlevel > 0) // workaround a retarded bug made by id software :P (yes, it's that old of a bug)
- {
- if (!(this.flags & FL_INWATER))
- {
- this.flags |= FL_INWATER;
- this.dmgtime = 0;
- }
-
- CreatureFrame_hotliquids(this);
- }
- else
- {
- if (this.flags & FL_INWATER)
- {
- // play leave water sound
- this.flags &= ~FL_INWATER;
- this.dmgtime = 0;
- }
- }
-}
-
-void CreatureFrame_FallDamage(entity this)
-{
- if(IS_VEHICLE(this) || (this.flags & FL_PROJECTILE))
- return; // vehicles and projectiles don't receive fall damage
- if(!(this.velocity || this.oldvelocity))
- return; // if the entity hasn't moved and isn't moving, then don't do anything
-
- // check for falling damage
- bool have_hook = false;
- for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
- {
- .entity weaponentity = weaponentities[slot];
- if(this.(weaponentity).hook && this.(weaponentity).hook.state)
- {
- have_hook = true;
- break;
- }
- }
- if(!have_hook)
- {
- float dm; // dm is the velocity DECREASE. Velocity INCREASE should never cause a sound or any damage.
- if(autocvar_g_balance_falldamage_onlyvertical)
- dm = fabs(this.oldvelocity.z) - vlen(this.velocity);
- else
- dm = vlen(this.oldvelocity) - vlen(this.velocity);
- if (IS_DEAD(this))
- dm = (dm - autocvar_g_balance_falldamage_deadminspeed) * autocvar_g_balance_falldamage_factor;
- else
- dm = min((dm - autocvar_g_balance_falldamage_minspeed) * autocvar_g_balance_falldamage_factor, autocvar_g_balance_falldamage_maxdamage);
- if (dm > 0)
- {
- tracebox(this.origin, this.mins, this.maxs, this.origin - '0 0 1', MOVE_NOMONSTERS, this);
- if (!(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NODAMAGE))
- Damage (this, NULL, NULL, dm, DEATH_FALL.m_id, DMG_NOWEP, this.origin, '0 0 0');
- }
- }
-
- if(autocvar_g_maxspeed > 0 && vdist(this.velocity, >, autocvar_g_maxspeed))
- Damage (this, NULL, NULL, 100000, DEATH_SHOOTING_STAR.m_id, DMG_NOWEP, this.origin, '0 0 0');
-}
-
-void CreatureFrame_All()
-{
- if(game_stopped || time < game_starttime)
- return;
-
- IL_EACH(g_damagedbycontents, it.damagedbycontents,
- {
- if (it.move_movetype == MOVETYPE_NOCLIP) continue;
- CreatureFrame_Liquids(it);
- CreatureFrame_FallDamage(it);
- it.oldvelocity = it.velocity;
- });
-}
-
-void Pause_TryPause(bool ispaused)
-{
- int n = 0;
- FOREACH_CLIENT(IS_PLAYER(it) && IS_REAL_CLIENT(it), {
- if (PHYS_INPUT_BUTTON_CHAT(it) != ispaused) return;
- ++n;
- });
- if (!n) return;
- setpause(ispaused);
-}
-
-void SV_PausedTic(float elapsedtime)
-{
- if (!server_is_dedicated) Pause_TryPause(false);
-}
-
-/*
-=============
-StartFrame
-
-Called before each frame by the server
-=============
-*/
-
-bool game_delay_last;
-
-bool autocvar_sv_autopause = false;
-void systems_update();
-void sys_phys_update(entity this, float dt);
-void StartFrame()
-{
- // TODO: if move is more than 50ms, split it into two moves (this matches QWSV behavior and the client prediction)
- IL_EACH(g_players, IS_FAKE_CLIENT(it), sys_phys_update(it, frametime));
- IL_EACH(g_players, IS_FAKE_CLIENT(it), PlayerPreThink(it));
-
- execute_next_frame();
- if (autocvar_sv_autopause && !server_is_dedicated) Pause_TryPause(true);
-
- delete_fn = remove_unsafely; // not during spawning!
- serverprevtime = servertime;
- servertime = time;
- serverframetime = frametime;
-
-#ifdef PROFILING
- if(time > client_cefc_accumulatortime + 1)
- {
- float t = client_cefc_accumulator / (time - client_cefc_accumulatortime);
- int c_seeing = 0;
- int c_seen = 0;
- FOREACH_CLIENT(true, {
- if(IS_REAL_CLIENT(it))
- ++c_seeing;
- if(IS_PLAYER(it))
- ++c_seen;
- });
- LOG_INFO(
- "CEFC time: ", ftos(t * 1000), "ms; ",
- "CEFC calls per second: ", ftos(c_seeing * (c_seen - 1) / t), "; ",
- "CEFC 100% load at: ", ftos(solve_quadratic(t, -t, -1) * '0 1 0')
- );
- client_cefc_accumulatortime = time;
- client_cefc_accumulator = 0;
- }
-#endif
-
- IL_EACH(g_projectiles, it.csqcprojectile_clientanimate, CSQCProjectile_Check(it));
-
- if (RedirectionThink()) return;
-
- UncustomizeEntitiesRun();
- InitializeEntitiesRun();
-
- WarpZone_StartFrame();
-
- sys_frametime = autocvar_sys_ticrate * autocvar_slowmo;
- if (sys_frametime <= 0) sys_frametime = 1.0 / 60.0; // somewhat safe fallback
-
- if (timeout_status == TIMEOUT_LEADTIME) // just before the timeout (when timeout_status will be TIMEOUT_ACTIVE)
- orig_slowmo = autocvar_slowmo; // slowmo will be restored after the timeout
-
- // detect when the pre-game countdown (if any) has ended and the game has started
- bool game_delay = (time < game_starttime);
- if (autocvar_sv_eventlog && game_delay_last && !game_delay)
- GameLogEcho(":startdelay_ended");
- game_delay_last = game_delay;
-
- CreatureFrame_All();
- CheckRules_World();
-
- if (warmup_stage && !game_stopped && warmup_limit > 0 && time >= warmup_limit) {
- ReadyRestart();
- return;
- }
-
- bot_serverframe();
- anticheat_startframe();
- MUTATOR_CALLHOOK(SV_StartFrame);
-
- GlobalStats_updateglobal();
- FOREACH_CLIENT(true, GlobalStats_update(it));
- IL_EACH(g_players, IS_FAKE_CLIENT(it), PlayerPostThink(it));
-}
-
-.vector originjitter;
-.vector anglesjitter;
-.float anglejitter;
-.string gametypefilter;
-.string cvarfilter;
-
-/**
- * Evaluate an expression of the form: [+ | -]? [var[op]val | [op]var | val | var] ...
- * +: all must match. this is the default
- * -: one must NOT match
- *
- * var>x
- * var<x
- * var>=x
- * var<=x
- * var==x
- * var!=x
- * var===x
- * var!==x
- */
-bool expr_evaluate(string s)
-{
- bool ret = false;
- if (str2chr(s, 0) == '+') {
- s = substring(s, 1, -1);
- } else if (str2chr(s, 0) == '-') {
- ret = true;
- s = substring(s, 1, -1);
- }
- bool expr_fail = false;
- for (int i = 0, n = tokenize_console(s); i < n; ++i) {
- int o;
- string k, v;
- s = argv(i);
- #define X(expr) \
- if (expr) \
- continue; \
- expr_fail = true; \
- break;
-
- #define BINOP(op, len, expr) \
- if ((o = strstrofs(s, op, 0)) >= 0) { \
- k = substring(s, 0, o); \
- v = substring(s, o + len, -1); \
- X(expr); \
- }
- BINOP(">=", 2, cvar(k) >= stof(v));
- BINOP("<=", 2, cvar(k) <= stof(v));
- BINOP(">", 1, cvar(k) > stof(v));
- BINOP("<", 1, cvar(k) < stof(v));
- BINOP("==", 2, cvar(k) == stof(v));
- BINOP("!=", 2, cvar(k) != stof(v));
- BINOP("===", 3, cvar_string(k) == v);
- BINOP("!==", 3, cvar_string(k) != v);
- {
- k = s;
- bool b = true;
- if (str2chr(k, 0) == '!') {
- k = substring(s, 1, -1);
- b = false;
- }
- float f = stof(k);
- bool isnum = ftos(f) == k;
- X(boolean(isnum ? f : cvar(k)) == b);
- }
- #undef BINOP
- #undef X
- }
- if (!expr_fail) {
- ret = !ret;
- }
- // now ret is true if we want to keep the item, and false if we want to get rid of it
- return ret;
-}
-
-void SV_OnEntityPreSpawnFunction(entity this)
-{
- if (this)
- if (this.gametypefilter != "")
- if (!isGametypeInFilter(MapInfo_LoadedGametype, teamplay, have_team_spawns, this.gametypefilter))
- {
- delete(this);
- return;
- }
- if (this.cvarfilter != "" && !expr_evaluate(this.cvarfilter)) {
- delete(this);
- return;
- }
-
- if (DoesQ3ARemoveThisEntity(this)) {
- delete(this);
- return;
- }
-
- set_movetype(this, this.movetype);
-
- if (this.monster_attack) {
- IL_PUSH(g_monster_targets, this);
- }
-
- // support special -1 and -2 angle from radiant
- if (this.angles == '0 -1 0') {
- this.angles = '-90 0 0';
- } else if (this.angles == '0 -2 0') {
- this.angles = '+90 0 0';
- }
-
- #define X(out, in) MACRO_BEGIN \
- if (in != 0) { out = out + (random() * 2 - 1) * in; } \
- MACRO_END
- X(this.origin.x, this.originjitter.x); X(this.origin.y, this.originjitter.y); X(this.origin.z, this.originjitter.z);
- X(this.angles.x, this.anglesjitter.x); X(this.angles.y, this.anglesjitter.y); X(this.angles.z, this.anglesjitter.z);
- X(this.angles.y, this.anglejitter);
- #undef X
-
- if (MUTATOR_CALLHOOK(OnEntityPreSpawn, this)) {
- delete(this);
- return;
- }
-}
-
-void WarpZone_PostInitialize_Callback()
-{
- // create waypoint links for warpzones
- entity tracetest_ent = spawn();
- setsize(tracetest_ent, PL_MIN_CONST, PL_MAX_CONST);
- tracetest_ent.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_PLAYERCLIP | DPCONTENTS_BOTCLIP;
- //for(entity e = warpzone_first; e; e = e.warpzone_next)
- for(entity e = NULL; (e = find(e, classname, "trigger_warpzone")); )
- waypoint_spawnforteleporter_wz(e, tracetest_ent);
- delete(tracetest_ent);
-}
-
-/*
-==================
-main
-
-unused but required by the engine
-==================
-*/
-void main ()
-{
-
-}
+++ /dev/null
-#pragma once
-
-bool expr_evaluate(string s);
-
-#ifdef PROFILING
-float client_cefc_accumulator;
-float client_cefc_accumulatortime;
-#endif
-
-/*
-==================
-main
-
-unused but required by the engine
-==================
-*/
-void main ();
#undef IT_SUIT
#undef IT_QUAD
+#undef STATE_TOP
+#undef STATE_BOTTOM
+#undef STATE_UP
+#undef STATE_DOWN
+
#pragma noref 0
#define IT_SUIT _IT_SUIT /* BIT(21) */
#define IT_QUAD _IT_QUAD /* BIT(22) */
+#define STATE_TOP _STATE_TOP /* 0 */
+#define STATE_BOTTOM _STATE_BOTTOM /* 1 */
+#define STATE_UP _STATE_UP /* 2 */
+#define STATE_DOWN _STATE_DOWN /* 3 */
+
#pragma noref 1
#include "teamplay.qh"
#include "client.qh"
+#include <server/gamelog.qh>
+#include <server/damage.qh>
#include "race.qh"
#include "scores.qh"
#include "scores_rules.qh"
team_ent.m_num_bots = 0;
}
setthink(balance, TeamBalance_Destroy);
+ balance.nextthink = time;
int teams_mask = 0;
string teament_name = string_null;
#pragma once
-#include "defs.qh"
#include "miscfunctions.qh"
#include "autocvars.qh"
#include "client.qh"
#include "weapons/common.qh"
#include "weapons/selection.qh"
#include <common/items/item.qh>
+#include <common/mapobjects/defs.qh>
#include <common/physics/player.qh>
#include <common/weapons/_all.qh>
#include <common/vehicles/all.qh>
#include "accuracy.qh"
+#include <server/client.qh>
#include <server/mutators/_mod.qh>
+#include <server/damage.qh>
#include <common/constants.qh>
#include <common/net_linked.qh>
+#include <server/player.qh>
#include <common/teams.qh>
#include <common/util.qh>
#include <common/weapons/_all.qh>
#pragma once
-#include <server/defs.qh>
+#include <common/weapons/_all.qh>
+#include <common/stats.qh>
#include <server/miscfunctions.qh>
.bool cvar_cl_accuracy_data_share;
#include "common.qh"
-#include <server/defs.qh>
+#include <common/weapons/_all.qh>
+#include <common/stats.qh>
+#include <server/damage.qh>
+#include <server/items/items.qh>
#include <server/miscfunctions.qh>
-#include <common/t_items.qh>
#include <common/constants.qh>
#include <common/net_linked.qh>
#include <common/deathtypes/all.qh>
void W_PlayStrengthSound(entity player);
float W_CheckProjectileDamage(entity inflictor, entity projowner, int deathtype, float exception);
void W_PrepareExplosionByDamage(entity this, entity attacker, void(entity this) explode);
+
+.float misc_bulletcounter;
+
+.int projectiledeathtype;
+
+.float fade_time;
+.float fade_rate;
+
+.entity realowner;
+
+#define PROJECTILE_MAKETRIGGER(e) (e).solid = SOLID_CORPSE; (e).dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_CORPSE
+// when doing this, hagar can go through clones
+// #define PROJECTILE_MAKETRIGGER(e) (e).solid = SOLID_BBOX
+
+.int missile_flags;
+const int MIF_SPLASH = BIT(1);
+const int MIF_ARC = BIT(2);
+const int MIF_PROXY = BIT(3);
+const int MIF_GUIDED_MANUAL = BIT(4);
+const int MIF_GUIDED_HEAT = BIT(5);
+const int MIF_GUIDED_LASER = BIT(6);
+const int MIF_GUIDED_AI = BIT(7);
+const int MIF_GUIDED_TAG = BIT(7);
+const int MIF_GUIDED_ALL = MIF_GUIDED_MANUAL | MIF_GUIDED_HEAT | MIF_GUIDED_LASER | MIF_GUIDED_AI | MIF_GUIDED_TAG;
+const int MIF_GUIDED_TRACKING = MIF_GUIDED_HEAT | MIF_GUIDED_LASER | MIF_GUIDED_AI | MIF_GUIDED_TAG;
+const int MIF_GUIDED_CONFUSABLE = MIF_GUIDED_HEAT | MIF_GUIDED_AI;
+
+IntrusiveList g_projectiles;
+STATIC_INIT(g_projectiles) { g_projectiles = IL_NEW(); }
#include "csqcprojectile.qh"
-#include <server/defs.qh>
+#include <common/weapons/_all.qh>
+#include <common/stats.qh>
+#include <server/items/items.qh>
#include <server/miscfunctions.qh>
-#include <common/t_items.qh>
#include "../command/common.qh"
#include "hitplot.qh"
-#include <server/defs.qh>
+#include <server/client.qh>
+#include <common/weapons/_all.qh>
+#include <common/stats.qh>
+#include <server/world.qh>
#include <server/miscfunctions.qh>
#include "../antilag.qh"
#include <common/weapons/_all.qh>
#include "selection.qh"
#include "weaponsystem.qh"
-#include <common/t_items.qh>
-#include <server/items.qh>
+#include <server/items/items.qh>
+#include <server/items/spawning.qh>
#include <common/constants.qh>
#include <common/net_linked.qh>
#include <common/util.qh>
#include <common/items/item.qh>
#include <common/weapons/_all.qh>
+#include <common/replicate.qh>
#include <common/state.qh>
+#include <common/mapobjects/triggers.qh>
#include <common/mutators/mutator/waypoints/waypointsprites.qh>
#include <common/wepent.qh>
#pragma once
-#include <server/defs.qh>
+#include <common/weapons/_all.qh>
+#include <common/stats.qh>
#include <server/miscfunctions.qh>
+.int selectweapon; // last selected weapon of the player
+
+.WepSet dual_weapons;
+
// switch between weapons
void Send_WeaponComplain(entity e, float wpn, float type);
#include "weaponsystem.qh"
#include "../resources.qh"
#include <server/mutators/_mod.qh>
-#include <common/t_items.qh>
-#include <server/items.qh>
+#include <server/items/items.qh>
+#include <server/items/spawning.qh>
#include <common/weapons/_all.qh>
.bool m_isreplaced; ///< Holds whether the weapon has been replaced.
#pragma once
-#include <server/defs.qh>
+#include <common/weapons/_all.qh>
+#include <common/stats.qh>
#include <server/miscfunctions.qh>
string W_Apply_Weaponreplace(string in);
#include "weaponsystem.qh"
#include "../resources.qh"
-#include "../items.qh"
+#include <server/items/spawning.qh>
#include <server/mutators/_mod.qh>
-#include <common/t_items.qh>
-#include "../g_damage.qh"
+#include <server/items/items.qh>
+#include "../damage.qh"
#include <common/items/item.qh>
#include <common/mapinfo.qh>
#include <common/notifications/all.qh>
#pragma once
-#include <server/defs.qh>
+#include <common/weapons/_all.qh>
+#include <common/stats.qh>
#include <server/miscfunctions.qh>
.float savenextthink;
#include "hitplot.qh"
#include "weaponsystem.qh"
-#include "../g_damage.qh"
+#include "../damage.qh"
+#include <server/main.qh>
#include "../antilag.qh"
#include <common/constants.qh>
// 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);
}
#pragma once
-#include <server/defs.qh>
+#include <common/weapons/_all.qh>
+#include <common/stats.qh>
#include <server/miscfunctions.qh>
vector w_shotorg;
// Ballistics Tracing
// ====================
+.float ballistics_density;
+
+// for railgun damage (hitting multiple enemies)
+.bool railgunhit;
+.float railgunhitsolidbackup;
+.vector railgunhitloc;
+
+IntrusiveList g_railgunhit;
+STATIC_INIT(g_railgunhit) { g_railgunhit = IL_NEW(); }
+
.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);
#include "weaponstats.qh"
-#include <server/defs.qh>
+#include <common/weapons/_all.qh>
+#include <common/stats.qh>
#include <server/miscfunctions.qh>
-#include "../g_world.qh"
+#include "../world.qh"
#include <common/weapons/_all.qh>
#include "selection.qh"
#include "../command/common.qh"
+#include <server/client.qh>
+#include <server/damage.qh>
+#include <server/world.qh>
+#include <server/items/items.qh>
#include <server/mutators/_mod.qh>
#include "../round_handler.qh"
#include <server/cheats.qh>
#include <server/resources.qh>
-#include <common/t_items.qh>
#include <common/animdecide.qh>
#include <common/constants.qh>
+#include <common/items/_mod.qh>
#include <common/net_linked.qh>
+#include <common/mapobjects/platforms.qh>
#include <common/monsters/_mod.qh>
#include <common/notifications/all.qh>
#include <common/util.qh>
#pragma once
-#include <server/defs.qh>
#include <server/miscfunctions.qh>
+#define INDEPENDENT_ATTACK_FINISHED 1
+
+// there is 2 weapon tics that can run in one server frame
+const int W_TICSPERFRAME = 2;
+
+// VorteX: standalone think for weapons, so normal think on weaponentity can be reserved by weaponflashes (which needs update even player dies)
+.float weapon_nextthink;
+.void(Weapon thiswep, entity actor, .entity weaponentity, int fire) weapon_think;
+
float internalteam;
entity weapon_dropevent_item;
+// reset to 0 on weapon switch
+// may be useful to all weapons
+.float bulletcounter;
+
..entity weaponentity_fld;
+.float weapon_load[REGISTRY_MAX(Weapons)];
+.int ammo_none; // used by the reloading system, must always be 0
+.int clip_load;
+.int old_clip_load;
+.int clip_size;
+
+.float attack_finished_for[REGISTRY_MAX(Weapons) * MAX_WEAPONSLOTS];
+.float attack_finished_single[MAX_WEAPONSLOTS];
+#if INDEPENDENT_ATTACK_FINISHED
+#define ATTACK_FINISHED_FOR(ent, w, slot) ((ent).(attack_finished_for[((w) - WEP_FIRST) * MAX_WEAPONSLOTS + (slot)]))
+#else
+#define ATTACK_FINISHED_FOR(ent, w, slot) ((ent).attack_finished_single[slot])
+#endif
+#define ATTACK_FINISHED(ent, w) ATTACK_FINISHED_FOR(ent, ent.(w).m_weapon.m_id, weaponslot(w))
+
void CL_SpawnWeaponentity(entity e, .entity weaponentity);
+void w_clear(Weapon thiswep, entity actor, .entity weaponentity, int fire);
+
+void w_ready(Weapon thiswep, entity actor, .entity weaponentity, int fire);
+
vector CL_Weapon_GetShotOrg(float wpn);
bool weaponUseForbidden(entity player);
--- /dev/null
+#include "world.qh"
+
+#include "anticheat.qh"
+#include "antilag.qh"
+#include "bot/api.qh"
+#include "campaign.qh"
+#include "cheats.qh"
+#include "client.qh"
+#include "command/common.qh"
+#include "command/getreplies.qh"
+#include "command/sv_cmd.qh"
+#include "command/vote.qh"
+#include "hook.qh"
+#include <server/gamelog.qh>
+#include <server/damage.qh>
+#include "ipban.qh"
+#include "mapvoting.qh"
+#include <server/mutators/_mod.qh>
+#include "race.qh"
+#include "scores.qh"
+#include "scores_rules.qh"
+#include "spawnpoints.qh"
+#include "teamplay.qh"
+#include "weapons/weaponstats.qh"
+#include <server/weapons/common.qh>
+#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 "../common/monsters/sv_monsters.qh"
+#include "../common/vehicles/all.qh"
+#include "../common/notifications/all.qh"
+#include "../common/physics/player.qh"
+#include "../common/playerstats.qh"
+#include "../common/stats.qh"
+#include "../common/teams.qh"
+#include <common/mapobjects/triggers.qh>
+#include "../common/mapobjects/trigger/secret.qh"
+#include "../common/mapobjects/target/music.qh"
+#include "../common/util.qh"
+#include "../common/items/_mod.qh"
+#include <common/weapons/_all.qh>
+#include "../common/state.qh"
+
+const float LATENCY_THINKRATE = 10;
+.float latency_sum;
+.float latency_cnt;
+.float latency_time;
+entity pingplreport;
+void PingPLReport_Think(entity this)
+{
+ float delta;
+ entity e;
+
+ delta = 3 / maxclients;
+ if(delta < sys_frametime)
+ delta = 0;
+ this.nextthink = time + delta;
+
+ e = edict_num(this.cnt + 1);
+ if(IS_CLIENT(e) && IS_REAL_CLIENT(e))
+ {
+ WriteHeader(MSG_BROADCAST, TE_CSQC_PINGPLREPORT);
+ WriteByte(MSG_BROADCAST, this.cnt);
+ WriteShort(MSG_BROADCAST, bound(1, CS(e).ping, 65535));
+ WriteByte(MSG_BROADCAST, min(ceil(CS(e).ping_packetloss * 255), 255));
+ WriteByte(MSG_BROADCAST, min(ceil(CS(e).ping_movementloss * 255), 255));
+
+ // record latency times for clients throughout the match so we can report it to playerstats
+ if(time > (CS(e).latency_time + LATENCY_THINKRATE))
+ {
+ CS(e).latency_sum += CS(e).ping;
+ CS(e).latency_cnt += 1;
+ CS(e).latency_time = time;
+ //print("sum: ", ftos(CS(e).latency_sum), ", cnt: ", ftos(CS(e).latency_cnt), ", avg: ", ftos(CS(e).latency_sum / CS(e).latency_cnt), ".\n");
+ }
+ }
+ else
+ {
+ WriteHeader(MSG_BROADCAST, TE_CSQC_PINGPLREPORT);
+ WriteByte(MSG_BROADCAST, this.cnt);
+ WriteShort(MSG_BROADCAST, 0);
+ WriteByte(MSG_BROADCAST, 0);
+ WriteByte(MSG_BROADCAST, 0);
+ }
+ this.cnt = (this.cnt + 1) % maxclients;
+}
+void PingPLReport_Spawn()
+{
+ pingplreport = new_pure(pingplreport);
+ setthink(pingplreport, PingPLReport_Think);
+ pingplreport.nextthink = time;
+}
+
+const float SPAWNFLAG_NO_WAYPOINTS_FOR_ITEMS = 1;
+string redirection_target;
+float world_initialized;
+
+void SetDefaultAlpha()
+{
+ if (!MUTATOR_CALLHOOK(SetDefaultAlpha))
+ {
+ default_player_alpha = autocvar_g_player_alpha;
+ if(default_player_alpha == 0)
+ default_player_alpha = 1;
+ default_weapon_alpha = default_player_alpha;
+ }
+}
+
+void GotoFirstMap(entity this)
+{
+ float n;
+ if(autocvar__sv_init)
+ {
+ // cvar_set("_sv_init", "0");
+ // we do NOT set this to 0 any more, so someone "accidentally" changing
+ // to this "init" map on a dedicated server will cause no permanent
+ // harm
+ if(autocvar_g_maplist_shuffle)
+ ShuffleMaplist();
+ n = tokenizebyseparator(autocvar_g_maplist, " ");
+ cvar_set("g_maplist_index", ftos(n - 1)); // jump to map 0 in GotoNextMap
+
+ MapInfo_Enumerate();
+ MapInfo_FilterGametype(MapInfo_CurrentGametype(), MapInfo_CurrentFeatures(), MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags(), 0);
+
+ if(!DoNextMapOverride(1))
+ GotoNextMap(1);
+
+ return;
+ }
+
+ if(time < 5)
+ {
+ this.nextthink = time;
+ }
+ else
+ {
+ this.nextthink = time + 1;
+ LOG_INFO("Waiting for _sv_init being set to 1 by initialization scripts...");
+ }
+}
+
+void cvar_changes_init()
+{
+ float h;
+ string k, v, d;
+ float n, i, adding, pureadding;
+
+ strfree(cvar_changes);
+ strfree(cvar_purechanges);
+ cvar_purechanges_count = 0;
+
+ h = buf_create();
+ buf_cvarlist(h, "", "_"); // exclude all _ cvars as they are temporary
+ n = buf_getsize(h);
+
+ adding = true;
+ pureadding = true;
+
+ for(i = 0; i < n; ++i)
+ {
+ k = bufstr_get(h, i);
+
+#define BADPREFIX(p) if(substring(k, 0, strlen(p)) == p) continue
+#define BADPRESUFFIX(p,s) if(substring(k, 0, strlen(p)) == p && substring(k, -strlen(s), -1) == s) continue
+#define BADCVAR(p) if(k == p) continue
+
+ // general excludes and namespaces for server admin used cvars
+ BADPREFIX("help_"); // PN's server has this listed as changed, let's not rat him out for THAT
+
+ // internal
+ BADPREFIX("csqc_");
+ BADPREFIX("cvar_check_");
+ BADCVAR("gamecfg");
+ BADCVAR("g_configversion");
+ BADCVAR("halflifebsp");
+ BADCVAR("sv_mapformat_is_quake2");
+ BADCVAR("sv_mapformat_is_quake3");
+ BADPREFIX("sv_world");
+
+ // client
+ BADPREFIX("chase_");
+ BADPREFIX("cl_");
+ BADPREFIX("con_");
+ BADPREFIX("scoreboard_");
+ BADPREFIX("g_campaign");
+ BADPREFIX("g_waypointsprite_");
+ BADPREFIX("gl_");
+ BADPREFIX("joy");
+ BADPREFIX("hud_");
+ BADPREFIX("m_");
+ BADPREFIX("menu_");
+ BADPREFIX("net_slist_");
+ BADPREFIX("r_");
+ BADPREFIX("sbar_");
+ BADPREFIX("scr_");
+ BADPREFIX("snd_");
+ BADPREFIX("show");
+ BADPREFIX("sensitivity");
+ BADPREFIX("userbind");
+ BADPREFIX("v_");
+ BADPREFIX("vid_");
+ BADPREFIX("crosshair");
+ BADCVAR("mod_q3bsp_lightmapmergepower");
+ BADCVAR("mod_q3bsp_nolightmaps");
+ BADCVAR("fov");
+ BADCVAR("mastervolume");
+ BADCVAR("volume");
+ BADCVAR("bgmvolume");
+ BADCVAR("in_pitch_min");
+ BADCVAR("in_pitch_max");
+
+ // private
+ BADCVAR("developer");
+ BADCVAR("log_dest_udp");
+ BADCVAR("net_address");
+ BADCVAR("net_address_ipv6");
+ BADCVAR("port");
+ BADCVAR("savedgamecfg");
+ BADCVAR("serverconfig");
+ BADCVAR("sv_autoscreenshot");
+ BADCVAR("sv_heartbeatperiod");
+ BADCVAR("sv_vote_master_password");
+ BADCVAR("sys_colortranslation");
+ BADCVAR("sys_specialcharactertranslation");
+ BADCVAR("timeformat");
+ BADCVAR("timestamps");
+ BADCVAR("g_require_stats");
+ BADPREFIX("developer_");
+ BADPREFIX("g_ban_");
+ BADPREFIX("g_banned_list");
+ BADPREFIX("g_require_stats_");
+ BADPREFIX("g_chat_flood_");
+ BADPREFIX("g_ghost_items");
+ BADPREFIX("g_playerstats_");
+ BADPREFIX("g_voice_flood_");
+ BADPREFIX("log_file");
+ BADPREFIX("quit_");
+ BADPREFIX("rcon_");
+ BADPREFIX("sv_allowdownloads");
+ BADPREFIX("sv_autodemo");
+ BADPREFIX("sv_curl_");
+ BADPREFIX("sv_eventlog");
+ BADPREFIX("sv_logscores_");
+ BADPREFIX("sv_master");
+ BADPREFIX("sv_weaponstats_");
+ BADPREFIX("sv_waypointsprite_");
+ BADCVAR("rescan_pending");
+
+ // these can contain player IDs, so better hide
+ BADPREFIX("g_forced_team_");
+ BADCVAR("sv_muteban_list");
+ BADCVAR("sv_voteban_list");
+ BADCVAR("sv_allow_customplayermodels_idlist");
+ BADCVAR("sv_allow_customplayermodels_speciallist");
+
+ // mapinfo
+ BADCVAR("fraglimit");
+ BADCVAR("g_arena");
+ BADCVAR("g_assault");
+ BADCVAR("g_ca");
+ BADCVAR("g_ca_teams");
+ BADCVAR("g_conquest");
+ BADCVAR("g_conquest_teams");
+ BADCVAR("g_ctf");
+ BADCVAR("g_cts");
+ BADCVAR("g_dotc");
+ BADCVAR("g_dm");
+ BADCVAR("g_domination");
+ BADCVAR("g_domination_default_teams");
+ BADCVAR("g_duel");
+ BADCVAR("g_duel_not_dm_maps");
+ BADCVAR("g_freezetag");
+ BADCVAR("g_freezetag_teams");
+ BADCVAR("g_invasion_teams");
+ BADCVAR("g_invasion_type");
+ BADCVAR("g_jailbreak");
+ BADCVAR("g_jailbreak_teams");
+ BADCVAR("g_keepaway");
+ BADCVAR("g_keyhunt");
+ BADCVAR("g_keyhunt_teams");
+ BADCVAR("g_lms");
+ BADCVAR("g_nexball");
+ BADCVAR("g_onslaught");
+ BADCVAR("g_race");
+ BADCVAR("g_race_laps_limit");
+ BADCVAR("g_race_qualifying_timelimit");
+ BADCVAR("g_race_qualifying_timelimit_override");
+ BADCVAR("g_runematch");
+ BADCVAR("g_shootfromeye");
+ BADCVAR("g_snafu");
+ BADCVAR("g_survival");
+ BADCVAR("g_survival_not_dm_maps");
+ BADCVAR("g_tdm");
+ BADCVAR("g_tdm_on_dm_maps");
+ BADCVAR("g_tdm_teams");
+ BADCVAR("g_vip");
+ BADCVAR("leadlimit");
+ BADCVAR("nextmap");
+ BADCVAR("teamplay");
+ BADCVAR("timelimit");
+ BADCVAR("g_mapinfo_settemp_acl");
+ BADCVAR("g_mapinfo_ignore_warnings");
+ BADCVAR("g_maplist_ignore_sizes");
+ BADCVAR("g_maplist_sizes_count_bots");
+
+ // long
+ BADCVAR("hostname");
+ BADCVAR("g_maplist");
+ BADCVAR("g_maplist_mostrecent");
+ BADCVAR("sv_motd");
+
+ v = cvar_string(k);
+ d = cvar_defstring(k);
+ if(v == d)
+ continue;
+
+ if(adding)
+ {
+ cvar_changes = strcat(cvar_changes, k, " \"", v, "\" // \"", d, "\"\n");
+ if(strlen(cvar_changes) > 16384)
+ {
+ cvar_changes = "// too many settings have been changed to show them here\n";
+ adding = 0;
+ }
+ }
+
+ // now check if the changes are actually gameplay relevant
+
+ // does nothing gameplay relevant
+ BADCVAR("captureleadlimit_override");
+ BADCVAR("condump_stripcolors");
+ BADCVAR("gameversion");
+ BADCVAR("fs_gamedir");
+ BADCVAR("g_allow_oldvortexbeam");
+ BADCVAR("g_balance_kill_delay");
+ BADCVAR("g_buffs_pickup_anyway");
+ BADCVAR("g_buffs_randomize");
+ BADCVAR("g_buffs_randomize_teamplay");
+ BADCVAR("g_campcheck_distance");
+ BADCVAR("g_chatsounds");
+ BADCVAR("g_ca_point_leadlimit");
+ BADCVAR("g_ca_point_limit");
+ BADCVAR("g_ctf_captimerecord_always");
+ BADCVAR("g_ctf_flag_glowtrails");
+ BADCVAR("g_ctf_dynamiclights");
+ BADCVAR("g_ctf_flag_pickup_verbosename");
+ BADPRESUFFIX("g_ctf_flag_", "_model");
+ BADPRESUFFIX("g_ctf_flag_", "_skin");
+ BADCVAR("g_domination_point_leadlimit");
+ BADCVAR("g_forced_respawn");
+ BADCVAR("g_freezetag_point_leadlimit");
+ BADCVAR("g_freezetag_point_limit");
+ BADCVAR("g_glowtrails");
+ BADCVAR("g_hats");
+ BADCVAR("g_casings");
+ BADCVAR("g_invasion_point_limit");
+ BADCVAR("g_jump_grunt");
+ BADCVAR("g_keepaway_ballcarrier_effects");
+ BADCVAR("g_keepawayball_effects");
+ BADCVAR("g_keyhunt_point_leadlimit");
+ BADCVAR("g_nexball_goalleadlimit");
+ BADCVAR("g_new_toys_autoreplace");
+ BADCVAR("g_new_toys_use_pickupsound");
+ BADCVAR("g_physics_predictall");
+ BADCVAR("g_piggyback");
+ BADCVAR("g_playerclip_collisions");
+ BADCVAR("g_spawn_alloweffects");
+ BADCVAR("g_tdm_point_leadlimit");
+ BADCVAR("g_tdm_point_limit");
+ BADCVAR("leadlimit_and_fraglimit");
+ BADCVAR("leadlimit_override");
+ BADCVAR("pausable");
+ BADCVAR("sv_announcer");
+ BADCVAR("sv_checkforpacketsduringsleep");
+ BADCVAR("sv_damagetext");
+ BADCVAR("sv_db_saveasdump");
+ BADCVAR("sv_intermission_cdtrack");
+ BADCVAR("sv_mapchange_delay");
+ BADCVAR("sv_minigames");
+ BADCVAR("sv_namechangetimer");
+ BADCVAR("sv_precacheplayermodels");
+ BADCVAR("sv_radio");
+ BADCVAR("sv_stepheight");
+ BADCVAR("sv_timeout");
+ BADCVAR("sv_weapons_modeloverride");
+ BADCVAR("w_prop_interval");
+ BADPREFIX("chat_");
+ BADPREFIX("crypto_");
+ BADPREFIX("gameversion_");
+ BADPREFIX("g_chat_");
+ BADPREFIX("g_ctf_captimerecord_");
+ BADPREFIX("g_hats_");
+ BADPREFIX("g_maplist_");
+ BADPREFIX("g_mod_");
+ BADPREFIX("g_respawn_");
+ BADPREFIX("net_");
+ BADPREFIX("notification_");
+ BADPREFIX("prvm_");
+ BADPREFIX("skill_");
+ BADPREFIX("sv_allow_");
+ BADPREFIX("sv_cullentities_");
+ BADPREFIX("sv_maxidle_");
+ BADPREFIX("sv_minigames_");
+ BADPREFIX("sv_radio_");
+ BADPREFIX("sv_timeout_");
+ BADPREFIX("sv_vote_");
+ BADPREFIX("timelimit_");
+
+ // allowed changes to server admins (please sync this to server.cfg)
+ // vi commands:
+ // :/"impure"/,$d
+ // :g!,^\/\/[^ /],d
+ // :%s,//\([^ ]*\).*,BADCVAR("\1");,
+ // :%!sort
+ // yes, this does contain some redundant stuff, don't really care
+ BADPREFIX("bot_ai_");
+ BADCVAR("bot_config_file");
+ BADCVAR("bot_number");
+ BADCVAR("bot_prefix");
+ BADCVAR("bot_suffix");
+ BADCVAR("capturelimit_override");
+ BADCVAR("fraglimit_override");
+ BADCVAR("gametype");
+ BADCVAR("g_antilag");
+ BADCVAR("g_balance_teams");
+ BADCVAR("g_balance_teams_prevent_imbalance");
+ BADCVAR("g_balance_teams_scorefactor");
+ BADCVAR("g_ban_sync_trusted_servers");
+ BADCVAR("g_ban_sync_uri");
+ BADCVAR("g_buffs");
+ BADCVAR("g_ca_teams_override");
+ BADCVAR("g_ctf_fullbrightflags");
+ BADCVAR("g_ctf_ignore_frags");
+ BADCVAR("g_ctf_leaderboard");
+ BADCVAR("g_domination_point_limit");
+ BADCVAR("g_domination_teams_override");
+ BADCVAR("g_freezetag_teams_override");
+ BADCVAR("g_friendlyfire");
+ BADCVAR("g_fullbrightitems");
+ BADCVAR("g_fullbrightplayers");
+ BADCVAR("g_keyhunt_point_limit");
+ BADCVAR("g_keyhunt_teams_override");
+ BADCVAR("g_lms_lives_override");
+ BADCVAR("g_maplist");
+ BADCVAR("g_maxplayers");
+ BADCVAR("g_mirrordamage");
+ BADCVAR("g_nexball_goallimit");
+ BADCVAR("g_norecoil");
+ BADCVAR("g_physics_clientselect");
+ BADCVAR("g_pinata");
+ BADCVAR("g_powerups");
+ BADCVAR("g_player_brightness");
+ BADCVAR("g_rocket_flying");
+ BADCVAR("g_rocket_flying_disabledelays");
+ BADCVAR("g_spawnshieldtime");
+ BADCVAR("g_start_delay");
+ BADCVAR("g_superspectate");
+ BADCVAR("g_tdm_teams_override");
+ BADCVAR("g_warmup");
+ BADCVAR("g_weapon_stay"); BADPRESUFFIX("g_", "_weapon_stay");
+ BADCVAR("hostname");
+ BADCVAR("log_file");
+ BADCVAR("maxplayers");
+ BADCVAR("minplayers");
+ BADCVAR("minplayers_per_team");
+ BADCVAR("net_address");
+ BADCVAR("port");
+ BADCVAR("rcon_password");
+ BADCVAR("rcon_restricted_commands");
+ BADCVAR("rcon_restricted_password");
+ BADCVAR("skill");
+ BADCVAR("sv_adminnick");
+ BADCVAR("sv_autoscreenshot");
+ BADCVAR("sv_autotaunt");
+ BADCVAR("sv_curl_defaulturl");
+ BADCVAR("sv_defaultcharacter");
+ BADCVAR("sv_defaultcharacterskin");
+ BADCVAR("sv_defaultplayercolors");
+ BADCVAR("sv_defaultplayermodel");
+ BADCVAR("sv_defaultplayerskin");
+ BADCVAR("sv_maxidle");
+ BADCVAR("sv_maxrate");
+ BADCVAR("sv_motd");
+ BADCVAR("sv_public");
+ BADCVAR("sv_ready_restart");
+ BADCVAR("sv_status_privacy");
+ BADCVAR("sv_taunt");
+ BADCVAR("sv_vote_call");
+ BADCVAR("sv_vote_commands");
+ BADCVAR("sv_vote_majority_factor");
+ BADCVAR("sv_vote_master");
+ BADCVAR("sv_vote_master_commands");
+ BADCVAR("sv_vote_master_password");
+ BADCVAR("sv_vote_simple_majority_factor");
+ BADCVAR("teamplay_mode");
+ BADCVAR("timelimit_override");
+ BADPREFIX("g_warmup_");
+ BADPREFIX("sv_info_");
+ BADPREFIX("sv_ready_restart_");
+
+ // mutators that announce themselves properly to the server browser
+ BADCVAR("g_instagib");
+ BADCVAR("g_new_toys");
+ BADCVAR("g_nix");
+ BADCVAR("g_grappling_hook");
+ BADCVAR("g_jetpack");
+
+ // temporary for testing
+ // TODO remove before 0.8.3 release
+ BADCVAR("g_ca_weaponarena");
+ BADCVAR("g_freezetag_weaponarena");
+ BADCVAR("g_lms_weaponarena");
+ BADCVAR("g_ctf_stalemate_time");
+
+ if(cvar_string("g_mod_balance") == "Testing")
+ {
+ // (temporary) while using the Testing balance, any weapon balance cvars are allowed to be changed
+ BADPREFIX("g_balance_");
+ }
+
+#undef BADPRESUFFIX
+#undef BADPREFIX
+#undef BADCVAR
+
+ if(pureadding)
+ {
+ cvar_purechanges = strcat(cvar_purechanges, k, " \"", v, "\" // \"", d, "\"\n");
+ if(strlen(cvar_purechanges) > 16384)
+ {
+ cvar_purechanges = "// too many settings have been changed to show them here\n";
+ pureadding = 0;
+ }
+ }
+ ++cvar_purechanges_count;
+ // WARNING: this variable is used for the server list
+ // NEVER dare to skip this code!
+ // Hacks to intentionally appearing as "pure server" even though you DO have
+ // modified settings may be punished by removal from the server list.
+ // You can do to the variables cvar_changes and cvar_purechanges all you want,
+ // though.
+ }
+ buf_del(h);
+ if(cvar_changes == "")
+ cvar_changes = "// this server runs at default server settings\n";
+ else
+ cvar_changes = strcat("// this server runs at modified server settings:\n", cvar_changes);
+ cvar_changes = strzone(cvar_changes);
+ if(cvar_purechanges == "")
+ cvar_purechanges = "// this server runs at default gameplay settings\n";
+ else
+ cvar_purechanges = strcat("// this server runs at modified gameplay settings:\n", cvar_purechanges);
+ cvar_purechanges = strzone(cvar_purechanges);
+}
+
+entity randomseed;
+bool RandomSeed_Send(entity this, entity to, int sf)
+{
+ WriteHeader(MSG_ENTITY, ENT_CLIENT_RANDOMSEED);
+ WriteShort(MSG_ENTITY, this.cnt);
+ return true;
+}
+void RandomSeed_Think(entity this)
+{
+ this.cnt = bound(0, floor(random() * 65536), 65535);
+ this.nextthink = time + 5;
+
+ this.SendFlags |= 1;
+}
+void RandomSeed_Spawn()
+{
+ randomseed = new_pure(randomseed);
+ setthink(randomseed, RandomSeed_Think);
+ Net_LinkEntity(randomseed, false, 0, RandomSeed_Send);
+
+ getthink(randomseed)(randomseed); // sets random seed and nextthink
+}
+
+spawnfunc(__init_dedicated_server)
+{
+ // handler for _init/_init map (only for dedicated server initialization)
+
+ world_initialized = -1; // don't complain
+
+ delete_fn = remove_unsafely;
+
+ entity e = spawn();
+ setthink(e, GotoFirstMap);
+ e.nextthink = time; // this is usually 1 at this point
+
+ e = new(info_player_deathmatch); // safeguard against player joining
+
+ // assign reflectively to avoid "assignment to world" warning
+ for (int i = 0, n = numentityfields(); i < n; ++i) {
+ string k = entityfieldname(i);
+ if (k == "classname") {
+ // safeguard against various stuff ;)
+ putentityfieldstring(i, this, "worldspawn");
+ break;
+ }
+ }
+
+ // needs to be done so early because of the constants they create
+ static_init();
+ static_init_late();
+ static_init_precache();
+
+ IL_PUSH(g_spawnpoints, e); // just incase
+
+ MapInfo_Enumerate();
+ MapInfo_FilterGametype(MapInfo_CurrentGametype(), MapInfo_CurrentFeatures(), MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags(), 0);
+}
+
+void __init_dedicated_server_shutdown() {
+ MapInfo_Shutdown();
+}
+
+STATIC_INIT_EARLY(maxclients)
+{
+ maxclients = 0;
+ for (entity head = nextent(NULL); head; head = nextent(head)) {
+ ++maxclients;
+ }
+}
+
+void default_delayedinit(entity this)
+{
+ if(!scores_initialized)
+ ScoreRules_generic();
+}
+
+void InitGameplayMode()
+{
+ VoteReset();
+
+ // find out good world mins/maxs bounds, either the static bounds found by looking for solid, or the mapinfo specified bounds
+ get_mi_min_max(1);
+ // assign reflectively to avoid "assignment to world" warning
+ int done = 0; for (int i = 0, n = numentityfields(); i < n; ++i) {
+ string k = entityfieldname(i); vector v = (k == "mins") ? mi_min : (k == "maxs") ? mi_max : '0 0 0';
+ if (v) {
+ putentityfieldstring(i, world, sprintf("%v", v));
+ if (++done == 2) break;
+ }
+ }
+ // currently, NetRadiant's limit is 131072 qu for each side
+ // distance from one corner of a 131072qu cube to the opposite corner is approx. 227023 qu
+ // set the distance according to map size but don't go over the limit to avoid issues with float precision
+ // in case somebody makes extremely large maps
+ max_shot_distance = min(230000, vlen(world.maxs - world.mins));
+
+ MapInfo_LoadMapSettings(mapname);
+ GameRules_teams(false);
+
+ if (!cvar_value_issafe(world.fog))
+ {
+ LOG_INFO("The current map contains a potentially harmful fog setting, ignored");
+ world.fog = string_null;
+ }
+ if(MapInfo_Map_fog != "")
+ {
+ if(MapInfo_Map_fog == "none")
+ world.fog = string_null;
+ else
+ world.fog = strzone(MapInfo_Map_fog);
+ }
+ clientstuff = strzone(MapInfo_Map_clientstuff);
+
+ MapInfo_ClearTemps();
+
+ gamemode_name = MapInfo_Type_ToText(MapInfo_LoadedGametype);
+
+ cache_mutatormsg = strzone("");
+ cache_lastmutatormsg = strzone("");
+
+ InitializeEntity(NULL, default_delayedinit, INITPRIO_GAMETYPE_FALLBACK);
+}
+
+void Map_MarkAsRecent(string m);
+float world_already_spawned;
+spawnfunc(worldspawn)
+{
+ server_is_dedicated = boolean(stof(cvar_defstring("is_dedicated")));
+
+ bool wantrestart = false;
+ {
+ if (!server_is_dedicated)
+ {
+ // force unloading of server pk3 files when starting a listen server
+ // localcmd("\nfs_rescan\n"); // FIXME: does more harm than good, has unintended side effects. What we really want is to unload temporary pk3s only
+ // restore csqc_progname too
+ string expect = "csprogs.dat";
+ wantrestart = cvar_string("csqc_progname") != expect;
+ cvar_set("csqc_progname", expect);
+ }
+ else
+ {
+ // Try to use versioned csprogs from pk3
+ // Only ever use versioned csprogs.dat files on dedicated servers;
+ // we need to reset csqc_progname on clients ourselves, and it's easier if the client's release name is constant
+ string pk3csprogs = "csprogs-" WATERMARK ".dat";
+ // This always works; fall back to it if a versioned csprogs.dat is suddenly missing
+ string select = "csprogs.dat";
+ if (fexists(pk3csprogs)) select = pk3csprogs;
+ if (cvar_string("csqc_progname") != select)
+ {
+ cvar_set("csqc_progname", select);
+ wantrestart = true;
+ }
+ // Check for updates on startup
+ // We do it this way for atomicity so that connecting clients still match the server progs and don't disconnect
+ int sentinel = fopen("progs.txt", FILE_READ);
+ if (sentinel >= 0)
+ {
+ string switchversion = fgets(sentinel);
+ fclose(sentinel);
+ if (switchversion != "" && switchversion != WATERMARK)
+ {
+ LOG_INFOF("Switching progs: " WATERMARK " -> %s", switchversion);
+ // if it doesn't exist, assume either:
+ // a) the current program was overwritten
+ // b) this is a client only update
+ string newprogs = sprintf("progs-%s.dat", switchversion);
+ if (fexists(newprogs))
+ {
+ cvar_set("sv_progs", newprogs);
+ wantrestart = true;
+ }
+ string newcsprogs = sprintf("csprogs-%s.dat", switchversion);
+ if (fexists(newcsprogs))
+ {
+ cvar_set("csqc_progname", newcsprogs);
+ wantrestart = true;
+ }
+ }
+ }
+ }
+ if (wantrestart)
+ {
+ LOG_INFO("Restart requested");
+ changelevel(mapname);
+ // let initialization continue, shutdown depends on it
+ }
+ }
+
+ if(world_already_spawned)
+ error("world already spawned - you may have EXACTLY ONE worldspawn!");
+ world_already_spawned = true;
+
+ delete_fn = remove_safely; // during spawning, watch what you remove!
+
+ cvar_changes_init(); // do this very early now so it REALLY matches the server config
+
+ // needs to be done so early because of the constants they create
+ static_init();
+
+ ServerProgsDB = db_load(strcat("server.db", autocvar_sessionid));
+
+ TemporaryDB = db_create();
+
+ // 0 normal
+ lightstyle(0, "m");
+
+ // 1 FLICKER (first variety)
+ lightstyle(1, "mmnmmommommnonmmonqnmmo");
+
+ // 2 SLOW STRONG PULSE
+ lightstyle(2, "abcdefghijklmnopqrstuvwxyzyxwvutsrqponmlkjihgfedcba");
+
+ // 3 CANDLE (first variety)
+ lightstyle(3, "mmmmmaaaaammmmmaaaaaabcdefgabcdefg");
+
+ // 4 FAST STROBE
+ lightstyle(4, "mamamamamama");
+
+ // 5 GENTLE PULSE 1
+ lightstyle(5,"jklmnopqrstuvwxyzyxwvutsrqponmlkj");
+
+ // 6 FLICKER (second variety)
+ lightstyle(6, "nmonqnmomnmomomno");
+
+ // 7 CANDLE (second variety)
+ lightstyle(7, "mmmaaaabcdefgmmmmaaaammmaamm");
+
+ // 8 CANDLE (third variety)
+ lightstyle(8, "mmmaaammmaaammmabcdefaaaammmmabcdefmmmaaaa");
+
+ // 9 SLOW STROBE (fourth variety)
+ lightstyle(9, "aaaaaaaazzzzzzzz");
+
+ // 10 FLUORESCENT FLICKER
+ lightstyle(10, "mmamammmmammamamaaamammma");
+
+ // 11 SLOW PULSE NOT FADE TO BLACK
+ lightstyle(11, "abcdefghijklmnopqrrqponmlkjihgfedcba");
+
+ // styles 32-62 are assigned by the spawnfunc_light program for switchable lights
+
+ // 63 testing
+ lightstyle(63, "a");
+
+ if(autocvar_g_campaign)
+ CampaignPreInit();
+
+ Map_MarkAsRecent(mapname);
+
+ PlayerStats_GameReport_Init(); // we need this to be initiated before InitGameplayMode
+
+ InitGameplayMode();
+ static_init_late();
+ static_init_precache();
+ readlevelcvars();
+ GrappleHookInit();
+
+ GameRules_limit_fallbacks();
+
+ if(warmup_limit == 0)
+ warmup_limit = (autocvar_timelimit > 0) ? autocvar_timelimit * 60 : autocvar_timelimit;
+
+ player_count = 0;
+ bot_waypoints_for_items = autocvar_g_waypoints_for_items;
+ if(bot_waypoints_for_items == 1)
+ if(this.spawnflags & SPAWNFLAG_NO_WAYPOINTS_FOR_ITEMS)
+ bot_waypoints_for_items = 0;
+
+ WaypointSprite_Init();
+
+ GameLogInit(); // prepare everything
+ // NOTE for matchid:
+ // changing the logic generating it is okay. But:
+ // it HAS to stay <= 64 chars
+ // character set: ASCII 33-126 without the following characters: : ; ' " \ $
+ if(autocvar_sv_eventlog)
+ {
+ string s = sprintf("%s.%s.%06d", itos(autocvar_sv_eventlog_files_counter), strftime(false, "%s"), floor(random() * 1000000));
+ matchid = strzone(s);
+
+ GameLogEcho(strcat(":gamestart:", GetGametype(), "_", GetMapname(), ":", s));
+ s = ":gameinfo:mutators:LIST";
+
+ MUTATOR_CALLHOOK(BuildMutatorsString, s);
+ s = M_ARGV(0, string);
+
+ // initialiation stuff, not good in the mutator system
+ if(!autocvar_g_use_ammunition)
+ s = strcat(s, ":no_use_ammunition");
+
+ // initialiation stuff, not good in the mutator system
+ if(autocvar_g_pickup_items == 0)
+ s = strcat(s, ":no_pickup_items");
+ if(autocvar_g_pickup_items > 0)
+ s = strcat(s, ":pickup_items");
+
+ // initialiation stuff, not good in the mutator system
+ if(autocvar_g_weaponarena != "0")
+ s = strcat(s, ":", autocvar_g_weaponarena, " arena");
+
+ // TODO to mutator system
+ if(autocvar_g_norecoil)
+ s = strcat(s, ":norecoil");
+
+ // TODO to mutator system
+ if(autocvar_g_powerups == 0)
+ s = strcat(s, ":no_powerups");
+ if(autocvar_g_powerups > 0)
+ s = strcat(s, ":powerups");
+
+ GameLogEcho(s);
+ GameLogEcho(":gameinfo:end");
+ }
+ else
+ matchid = strzone(ftos(random()));
+
+ cvar_set("nextmap", "");
+
+ SetDefaultAlpha();
+
+ if(autocvar_g_campaign)
+ CampaignPostInit();
+
+ Ban_LoadBans();
+
+ MapInfo_Enumerate();
+ MapInfo_FilterGametype(MapInfo_CurrentGametype(), MapInfo_CurrentFeatures(), MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags(), 1);
+
+ if(fexists(strcat("scripts/", mapname, ".arena")))
+ cvar_settemp("sv_q3acompat_machineshotgunswap", "1");
+
+ if(fexists(strcat("scripts/", mapname, ".defi")))
+ cvar_settemp("sv_q3defragcompat", "1");
+
+ if(whichpack(strcat("maps/", mapname, ".cfg")) != "")
+ {
+ int fd = fopen(strcat("maps/", mapname, ".cfg"), FILE_READ);
+ if(fd != -1)
+ {
+ string s;
+ while((s = fgets(fd)))
+ {
+ int l = tokenize_console(s);
+ if(l < 2)
+ continue;
+ if(argv(0) == "cd")
+ {
+ string trackname = argv(2);
+ LOG_INFO("Found ^1UNSUPPORTED^7 cd loop command in .cfg file; put this line in mapinfo instead:");
+ LOG_INFO(" cdtrack ", trackname);
+ if (cvar_value_issafe(trackname))
+ {
+ string newstuff = strcat(clientstuff, "cd loop \"", trackname, "\"\n");
+ strcpy(clientstuff, newstuff);
+ }
+ }
+ else if(argv(0) == "fog")
+ {
+ LOG_INFO("Found ^1UNSUPPORTED^7 fog command in .cfg file; put this line in worldspawn in the .map/.bsp/.ent file instead:");
+ LOG_INFO(" \"fog\" \"", s, "\"");
+ }
+ else if(argv(0) == "set")
+ {
+ LOG_INFO("Found ^1UNSUPPORTED^7 set command in .cfg file; put this line in mapinfo instead:");
+ LOG_INFO(" clientsettemp_for_type all ", argv(1), " ", argv(2));
+ }
+ else if(argv(0) != "//")
+ {
+ LOG_INFO("Found ^1UNSUPPORTED^7 set command in .cfg file; put this line in mapinfo instead:");
+ LOG_INFO(" clientsettemp_for_type all ", argv(0), " ", argv(1));
+ }
+ }
+ fclose(fd);
+ }
+ }
+
+ WeaponStats_Init();
+
+ Nagger_Init();
+
+ // set up information replies for clients and server to use
+ maplist_reply = strzone(getmaplist());
+ lsmaps_reply = strzone(getlsmaps());
+ monsterlist_reply = strzone(getmonsterlist());
+ for(int i = 0; i < 10; ++i)
+ {
+ string s = getrecords(i);
+ if (s)
+ records_reply[i] = strzone(s);
+ }
+ ladder_reply = strzone(getladder());
+ rankings_reply = strzone(getrankings());
+
+ // begin other init
+ ClientInit_Spawn();
+ RandomSeed_Spawn();
+ PingPLReport_Spawn();
+
+ CheatInit();
+
+ if (!wantrestart) localcmd("\n_sv_hook_gamestart ", GetGametype(), "\n");
+
+ // fill sv_curl_serverpackages from .serverpackage files
+ if (autocvar_sv_curl_serverpackages_auto)
+ {
+ string s = "csprogs-" WATERMARK ".txt";
+ // remove automatically managed files from the list to prevent duplicates
+ for (int i = 0, n = tokenize_console(cvar_string("sv_curl_serverpackages")); i < n; ++i)
+ {
+ string pkg = argv(i);
+ if (startsWith(pkg, "csprogs-")) continue;
+ if (endsWith(pkg, "-serverpackage.txt")) continue;
+ if (endsWith(pkg, ".serverpackage")) continue; // OLD legacy
+ s = cons(s, pkg);
+ }
+ // add automatically managed files to the list
+ #define X(match) MACRO_BEGIN \
+ int fd = search_begin(match, true, false); \
+ if (fd >= 0) \
+ { \
+ for (int i = 0, j = search_getsize(fd); i < j; ++i) \
+ { \
+ s = cons(s, search_getfilename(fd, i)); \
+ } \
+ search_end(fd); \
+ } \
+ MACRO_END
+ X("*-serverpackage.txt");
+ X("*.serverpackage");
+ #undef X
+ cvar_set("sv_curl_serverpackages", s);
+ }
+
+ // MOD AUTHORS: change this, and possibly remove a few of the blocks below to ignore certain changes
+ modname = "Xonotic";
+ // physics/balance/config changes that count as mod
+ if(cvar_string("g_mod_physics") != cvar_defstring("g_mod_physics"))
+ modname = cvar_string("g_mod_physics");
+ if(cvar_string("g_mod_balance") != cvar_defstring("g_mod_balance") && cvar_string("g_mod_balance") != "Testing")
+ modname = cvar_string("g_mod_balance");
+ if(cvar_string("g_mod_config") != cvar_defstring("g_mod_config"))
+ modname = cvar_string("g_mod_config");
+ // extra mutators that deserve to count as mod
+ MUTATOR_CALLHOOK(SetModname, modname);
+ modname = M_ARGV(0, string);
+
+ // save it for later
+ modname = strzone(modname);
+
+ WinningConditionHelper(this); // set worldstatus
+
+ world_initialized = 1;
+ __spawnfunc_spawn_all();
+}
+
+spawnfunc(light)
+{
+ //makestatic (this); // Who the f___ did that?
+ delete(this);
+}
+
+string GetGametype()
+{
+ return MapInfo_Type_ToString(MapInfo_LoadedGametype);
+}
+
+string GetMapname()
+{
+ return mapname;
+}
+
+float Map_Count, Map_Current;
+string Map_Current_Name;
+
+// NOTE: this now expects the map list to be already tokenized and the count in Map_Count
+int GetMaplistPosition()
+{
+ string map = GetMapname();
+ int idx = autocvar_g_maplist_index;
+
+ if(idx >= 0)
+ {
+ if(idx < Map_Count)
+ {
+ if(map == argv(idx))
+ {
+ return idx;
+ }
+ }
+ }
+
+ for(int pos = 0; pos < Map_Count; ++pos)
+ {
+ if(map == argv(pos))
+ return pos;
+ }
+
+ // resume normal maplist rotation if current map is not in g_maplist
+ return idx;
+}
+
+bool MapHasRightSize(string map)
+{
+ int minplayers = max(0, floor(autocvar_minplayers));
+ if (teamplay)
+ minplayers = max(0, floor(autocvar_minplayers_per_team) * AvailableTeams());
+ if (autocvar_g_maplist_check_waypoints
+ && (currentbots || autocvar_bot_number || player_count < minplayers))
+ {
+ string checkwp_msg = strcat("checkwp ", map);
+ if(!fexists(strcat("maps/", map, ".waypoints")))
+ {
+ LOG_TRACE(checkwp_msg, ": no waypoints");
+ return false;
+ }
+ LOG_TRACE(checkwp_msg, ": has waypoints");
+ }
+
+ if(autocvar_g_maplist_ignore_sizes)
+ return true;
+
+ // open map size restriction file
+ string opensize_msg = strcat("opensize ", map);
+ float fh = fopen(strcat("maps/", map, ".sizes"), FILE_READ);
+ int player_limit = ((autocvar_g_maplist_sizes_count_maxplayers) ? GetPlayerLimit() : 0);
+ int pcount = ((player_limit > 0) ? min(player_count, player_limit) : player_count); // bind it to the player limit so that forced spectators don't influence the limits
+ if(!autocvar_g_maplist_sizes_count_bots)
+ pcount -= currentbots;
+ if(fh >= 0)
+ {
+ opensize_msg = strcat(opensize_msg, ": ok, ");
+ int mapmin = stoi(fgets(fh));
+ int mapmax = stoi(fgets(fh));
+ fclose(fh);
+ if(pcount < mapmin)
+ {
+ LOG_TRACE(opensize_msg, "not enough");
+ return false;
+ }
+ if(mapmax && pcount > mapmax)
+ {
+ LOG_TRACE(opensize_msg, "too many");
+ return false;
+ }
+ LOG_TRACE(opensize_msg, "right size");
+ return true;
+ }
+ LOG_TRACE(opensize_msg, ": not found");
+ return true;
+}
+
+string Map_Filename(float position)
+{
+ return strcat("maps/", argv(position), ".bsp");
+}
+
+void Map_MarkAsRecent(string m)
+{
+ cvar_set("g_maplist_mostrecent", strwords(cons(m, autocvar_g_maplist_mostrecent), max(0, autocvar_g_maplist_mostrecent_count)));
+}
+
+float Map_IsRecent(string m)
+{
+ return strhasword(autocvar_g_maplist_mostrecent, m);
+}
+
+float Map_Check(float position, float pass)
+{
+ string filename;
+ string map_next;
+ map_next = argv(position);
+ if(pass <= 1)
+ {
+ if(Map_IsRecent(map_next))
+ return 0;
+ }
+ filename = Map_Filename(position);
+ if(MapInfo_CheckMap(map_next))
+ {
+ if(pass == 2)
+ return 1;
+ if(MapHasRightSize(map_next))
+ return 1;
+ return 0;
+ }
+ else
+ LOG_DEBUG( "Couldn't select '", filename, "'..." );
+
+ return 0;
+}
+
+void Map_Goto_SetStr(string nextmapname)
+{
+ if(getmapname_stored != "")
+ strunzone(getmapname_stored);
+ if(nextmapname == "")
+ getmapname_stored = "";
+ else
+ getmapname_stored = strzone(nextmapname);
+}
+
+void Map_Goto_SetFloat(float position)
+{
+ cvar_set("g_maplist_index", ftos(position));
+ Map_Goto_SetStr(argv(position));
+}
+
+void Map_Goto(float reinit)
+{
+ MapInfo_LoadMap(getmapname_stored, reinit);
+}
+
+// return codes of map selectors:
+// -1 = temporary failure (that is, try some method that is guaranteed to succeed)
+// -2 = permanent failure
+float MaplistMethod_Iterate() // usual method
+{
+ float pass, i;
+
+ LOG_TRACE("Trying MaplistMethod_Iterate");
+
+ for(pass = 1; pass <= 2; ++pass)
+ {
+ for(i = 1; i < Map_Count; ++i)
+ {
+ float mapindex;
+ mapindex = (i + Map_Current) % Map_Count;
+ if(Map_Check(mapindex, pass))
+ return mapindex;
+ }
+ }
+ return -1;
+}
+
+float MaplistMethod_Repeat() // fallback method
+{
+ LOG_TRACE("Trying MaplistMethod_Repeat");
+
+ if(Map_Check(Map_Current, 2))
+ return Map_Current;
+ return -2;
+}
+
+float MaplistMethod_Random() // random map selection
+{
+ float i, imax;
+
+ LOG_TRACE("Trying MaplistMethod_Random");
+
+ imax = 42;
+
+ for(i = 0; i <= imax; ++i)
+ {
+ float mapindex;
+ mapindex = (Map_Current + floor(random() * (Map_Count - 1) + 1)) % Map_Count; // any OTHER map
+ if(Map_Check(mapindex, 1))
+ return mapindex;
+ }
+ return -1;
+}
+
+float MaplistMethod_Shuffle(float exponent) // more clever shuffling
+// the exponent sets a bias on the map selection:
+// the higher the exponent, the less likely "shortly repeated" same maps are
+{
+ float i, j, imax, insertpos;
+
+ LOG_TRACE("Trying MaplistMethod_Shuffle");
+
+ imax = 42;
+
+ for(i = 0; i <= imax; ++i)
+ {
+ string newlist;
+
+ // now reinsert this at another position
+ insertpos = (random() ** (1 / exponent)); // ]0, 1]
+ insertpos = insertpos * (Map_Count - 1); // ]0, Map_Count - 1]
+ insertpos = ceil(insertpos) + 1; // {2, 3, 4, ..., Map_Count}
+ LOG_TRACE("SHUFFLE: insert pos = ", ftos(insertpos));
+
+ // insert the current map there
+ newlist = "";
+ for(j = 1; j < insertpos; ++j) // i == 1: no loop, will be inserted as first; however, i == 1 has been excluded above
+ newlist = strcat(newlist, " ", argv(j));
+ newlist = strcat(newlist, " ", argv(0)); // now insert the just selected map
+ for(j = insertpos; j < Map_Count; ++j) // i == Map_Count: no loop, has just been inserted as last
+ newlist = strcat(newlist, " ", argv(j));
+ newlist = substring(newlist, 1, strlen(newlist) - 1);
+ cvar_set("g_maplist", newlist);
+ Map_Count = tokenizebyseparator(autocvar_g_maplist, " ");
+
+ // NOTE: the selected map has just been inserted at (insertpos-1)th position
+ Map_Current = insertpos - 1; // this is not really valid, but this way the fallback has a chance of working
+ if(Map_Check(Map_Current, 1))
+ return Map_Current;
+ }
+ return -1;
+}
+
+void Maplist_Init()
+{
+ float i = Map_Count = 0;
+ if(autocvar_g_maplist != "")
+ {
+ Map_Count = tokenizebyseparator(autocvar_g_maplist, " ");
+ for (i = 0; i < Map_Count; ++i)
+ {
+ if (Map_Check(i, 2))
+ break;
+ }
+ }
+
+ if (i == Map_Count)
+ {
+ bprint( "Maplist contains no usable maps! Resetting it to default map list.\n" );
+ cvar_set("g_maplist", MapInfo_ListAllAllowedMaps(MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags() | MAPINFO_FLAG_NOAUTOMAPLIST));
+ if(autocvar_g_maplist_shuffle)
+ ShuffleMaplist();
+ if(!server_is_dedicated)
+ localcmd("\nmenu_cmd sync\n");
+ Map_Count = tokenizebyseparator(autocvar_g_maplist, " ");
+ }
+ if(Map_Count == 0)
+ error("empty maplist, cannot select a new map");
+ Map_Current = bound(0, GetMaplistPosition(), Map_Count - 1);
+
+ strcpy(Map_Current_Name, argv(Map_Current)); // will be automatically freed on exit thanks to DP
+ // this may or may not be correct, but who cares, in the worst case a map
+ // isn't chosen in the first pass that should have been
+}
+
+string GetNextMap()
+{
+ Maplist_Init();
+ float nextMap = -1;
+
+ if(nextMap == -1)
+ if(autocvar_g_maplist_shuffle > 0)
+ nextMap = MaplistMethod_Shuffle(autocvar_g_maplist_shuffle + 1);
+
+ if(nextMap == -1)
+ if(autocvar_g_maplist_selectrandom)
+ nextMap = MaplistMethod_Random();
+
+ if(nextMap == -1)
+ nextMap = MaplistMethod_Iterate();
+
+ if(nextMap == -1)
+ nextMap = MaplistMethod_Repeat();
+
+ if(nextMap >= 0)
+ {
+ Map_Goto_SetFloat(nextMap);
+ return getmapname_stored;
+ }
+
+ return "";
+}
+
+float DoNextMapOverride(float reinit)
+{
+ if(autocvar_g_campaign)
+ {
+ CampaignPostIntermission();
+ alreadychangedlevel = true;
+ return true;
+ }
+ if(autocvar_quit_when_empty)
+ {
+ if(player_count <= currentbots)
+ {
+ localcmd("quit\n");
+ alreadychangedlevel = true;
+ return true;
+ }
+ }
+ if(autocvar_quit_and_redirect != "")
+ {
+ redirection_target = strzone(autocvar_quit_and_redirect);
+ alreadychangedlevel = true;
+ return true;
+ }
+ if (!reinit && autocvar_samelevel) // if samelevel is set, stay on same level
+ {
+ localcmd("restart\n");
+ alreadychangedlevel = true;
+ return true;
+ }
+ if(autocvar_nextmap != "")
+ {
+ string m;
+ m = GameTypeVote_MapInfo_FixName(autocvar_nextmap);
+ cvar_set("nextmap",m);
+
+ if(!m || gametypevote)
+ return false;
+ if(autocvar_sv_vote_gametype)
+ {
+ Map_Goto_SetStr(m);
+ return false;
+ }
+
+ if(MapInfo_CheckMap(m))
+ {
+ Map_Goto_SetStr(m);
+ Map_Goto(reinit);
+ alreadychangedlevel = true;
+ return true;
+ }
+ }
+ if(!reinit && autocvar_lastlevel)
+ {
+ cvar_settemp_restore();
+ localcmd("set lastlevel 0\ntogglemenu 1\n");
+ alreadychangedlevel = true;
+ return true;
+ }
+ return false;
+}
+
+void GotoNextMap(float reinit)
+{
+ //string nextmap;
+ //float n, nummaps;
+ //string s;
+ if (alreadychangedlevel)
+ return;
+ alreadychangedlevel = true;
+
+ string nextMap = GetNextMap();
+ if(nextMap == "")
+ error("Everything is broken - cannot find a next map. Please report this to the developers.");
+ Map_Goto(reinit);
+}
+
+
+/*
+============
+IntermissionThink
+
+When the player presses attack or jump, change to the next level
+============
+*/
+.float autoscreenshot;
+void IntermissionThink(entity this)
+{
+ FixIntermissionClient(this);
+
+ float server_screenshot = (autocvar_sv_autoscreenshot && CS(this).cvar_cl_autoscreenshot);
+ float client_screenshot = (CS(this).cvar_cl_autoscreenshot == 2);
+
+ if( (server_screenshot || client_screenshot)
+ && ((this.autoscreenshot > 0) && (time > this.autoscreenshot)) )
+ {
+ this.autoscreenshot = -1;
+ if(IS_REAL_CLIENT(this)) { stuffcmd(this, sprintf("\nscreenshot screenshots/autoscreenshot/%s-%s.jpg; echo \"^5A screenshot has been taken at request of the server.\"\n", GetMapname(), strftime(false, "%s"))); }
+ return;
+ }
+
+ if (time < intermission_exittime)
+ return;
+
+ if(!mapvote_initialized)
+ if (time < intermission_exittime + 10 && !(PHYS_INPUT_BUTTON_ATCK(this) || PHYS_INPUT_BUTTON_JUMP(this) || PHYS_INPUT_BUTTON_ATCK2(this) || PHYS_INPUT_BUTTON_HOOK(this) || PHYS_INPUT_BUTTON_USE(this)))
+ return;
+
+ MapVote_Start();
+}
+
+/*
+===============================================================================
+
+RULES
+
+===============================================================================
+*/
+
+void DumpStats(float final)
+{
+ float file;
+ string s;
+ float to_console;
+ float to_eventlog;
+ float to_file;
+ float i;
+
+ to_console = autocvar_sv_logscores_console;
+ to_eventlog = autocvar_sv_eventlog;
+ to_file = autocvar_sv_logscores_file;
+
+ if(!final)
+ {
+ to_console = true; // always print printstats replies
+ to_eventlog = false; // but never print them to the event log
+ }
+
+ if(to_eventlog)
+ if(autocvar_sv_eventlog_console)
+ to_console = false; // otherwise we get the output twice
+
+ if(final)
+ s = ":scores:";
+ else
+ s = ":status:";
+ s = strcat(s, GetGametype(), "_", GetMapname(), ":", ftos(rint(time)));
+
+ if(to_console)
+ LOG_INFO(s);
+ if(to_eventlog)
+ GameLogEcho(s);
+
+ file = -1;
+ if(to_file)
+ {
+ file = fopen(autocvar_sv_logscores_filename, FILE_APPEND);
+ if(file == -1)
+ to_file = false;
+ else
+ fputs(file, strcat(s, "\n"));
+ }
+
+ s = strcat(":labels:player:", GetPlayerScoreString(NULL, 0));
+ if(to_console)
+ LOG_INFO(s);
+ if(to_eventlog)
+ GameLogEcho(s);
+ if(to_file)
+ fputs(file, strcat(s, "\n"));
+
+ FOREACH_CLIENT(IS_REAL_CLIENT(it) || (IS_BOT_CLIENT(it) && autocvar_sv_logscores_bots), {
+ s = strcat(":player:see-labels:", GetPlayerScoreString(it, 0), ":");
+ s = strcat(s, ftos(rint(time - CS(it).jointime)), ":");
+ if(IS_PLAYER(it) || MUTATOR_CALLHOOK(GetPlayerStatus, it))
+ s = strcat(s, ftos(it.team), ":");
+ else
+ s = strcat(s, "spectator:");
+
+ if(to_console)
+ LOG_INFO(s, playername(it, false));
+ if(to_eventlog)
+ GameLogEcho(strcat(s, ftos(it.playerid), ":", playername(it, false)));
+ if(to_file)
+ fputs(file, strcat(s, playername(it, false), "\n"));
+ });
+
+ if(teamplay)
+ {
+ s = strcat(":labels:teamscores:", GetTeamScoreString(0, 0));
+ if(to_console)
+ LOG_INFO(s);
+ if(to_eventlog)
+ GameLogEcho(s);
+ if(to_file)
+ fputs(file, strcat(s, "\n"));
+
+ for(i = 1; i < 16; ++i)
+ {
+ s = strcat(":teamscores:see-labels:", GetTeamScoreString(i, 0));
+ s = strcat(s, ":", ftos(i));
+ if(to_console)
+ LOG_INFO(s);
+ if(to_eventlog)
+ GameLogEcho(s);
+ if(to_file)
+ fputs(file, strcat(s, "\n"));
+ }
+ }
+
+ if(to_console)
+ LOG_INFO(":end");
+ if(to_eventlog)
+ GameLogEcho(":end");
+ if(to_file)
+ {
+ fputs(file, ":end\n");
+ fclose(file);
+ }
+}
+
+void FixIntermissionClient(entity e)
+{
+ if(!e.autoscreenshot) // initial call
+ {
+ e.autoscreenshot = time + 0.8; // used for autoscreenshot
+ SetResourceExplicit(e, RES_HEALTH, -2342);
+ // first intermission phase; voting phase has positive health (used to decide whether to send SVC_FINALE or not)
+ for (int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
+ {
+ .entity weaponentity = weaponentities[slot];
+ if(e.(weaponentity))
+ {
+ e.(weaponentity).effects = EF_NODRAW;
+ if (e.(weaponentity).weaponchild)
+ e.(weaponentity).weaponchild.effects = EF_NODRAW;
+ }
+ }
+ if(IS_REAL_CLIENT(e))
+ {
+ stuffcmd(e, "\nscr_printspeed 1000000\n");
+ RandomSelection_Init();
+ FOREACH_WORD(autocvar_sv_intermission_cdtrack, true, {
+ RandomSelection_AddString(it, 1, 1);
+ });
+ if (RandomSelection_chosen_string != "")
+ {
+ stuffcmd(e, sprintf("\ncd loop %s\n", RandomSelection_chosen_string));
+ }
+ msg_entity = e;
+ WriteByte(MSG_ONE, SVC_INTERMISSION);
+ }
+ }
+}
+
+/*
+go to the next level for deathmatch
+only called if a time or frag limit has expired
+*/
+void NextLevel()
+{
+ game_stopped = true;
+ intermission_running = 1; // game over
+
+ // enforce a wait time before allowing changelevel
+ if(player_count > 0)
+ intermission_exittime = time + autocvar_sv_mapchange_delay;
+ else
+ intermission_exittime = -1;
+
+ /*
+ WriteByte (MSG_ALL, SVC_CDTRACK);
+ WriteByte (MSG_ALL, 3);
+ WriteByte (MSG_ALL, 3);
+ // done in FixIntermission
+ */
+
+ //pos = FindIntermission ();
+
+ VoteReset();
+
+ DumpStats(true);
+
+ // send statistics
+ PlayerStats_GameReport(true);
+ WeaponStats_Shutdown();
+
+ Kill_Notification(NOTIF_ALL, NULL, MSG_CENTER, CPID_Null); // kill all centerprints now
+
+ if(autocvar_sv_eventlog)
+ GameLogEcho(":gameover");
+
+ GameLogClose();
+
+ FOREACH_CLIENT(IS_PLAYER(it), {
+ FixIntermissionClient(it);
+ if(it.winning)
+ bprint(playername(it, false), " ^7wins.\n");
+ });
+
+ target_music_kill();
+
+ if(autocvar_g_campaign)
+ CampaignPreIntermission();
+
+ MUTATOR_CALLHOOK(MatchEnd);
+
+ localcmd("\nsv_hook_gameend\n");
+}
+
+
+float InitiateSuddenDeath()
+{
+ // Check first whether normal overtimes could be added before initiating suddendeath mode
+ // - for this timelimit_overtime needs to be >0 of course
+ // - also check the winning condition calculated in the previous frame and only add normal overtime
+ // again, if at the point at which timelimit would be extended again, still no winner was found
+ if (!autocvar_g_campaign && checkrules_overtimesadded >= 0
+ && (checkrules_overtimesadded < autocvar_timelimit_overtimes || autocvar_timelimit_overtimes < 0)
+ && autocvar_timelimit_overtime && !(g_race && !g_race_qualifying))
+ {
+ return 1; // need to call InitiateOvertime later
+ }
+ else
+ {
+ if(!checkrules_suddendeathend)
+ {
+ if(autocvar_g_campaign)
+ checkrules_suddendeathend = time; // no suddendeath in campaign
+ else
+ checkrules_suddendeathend = time + 60 * autocvar_timelimit_suddendeath;
+ if(g_race && !g_race_qualifying)
+ race_StartCompleting();
+ }
+ return 0;
+ }
+}
+
+void InitiateOvertime() // ONLY call this if InitiateSuddenDeath returned true
+{
+ ++checkrules_overtimesadded;
+ //add one more overtime by simply extending the timelimit
+ cvar_set("timelimit", ftos(autocvar_timelimit + autocvar_timelimit_overtime));
+ Send_Notification(NOTIF_ALL, NULL, MSG_CENTER, CENTER_OVERTIME_TIME, autocvar_timelimit_overtime * 60);
+}
+
+float GetWinningCode(float fraglimitreached, float equality)
+{
+ if(autocvar_g_campaign == 1)
+ {
+ if(fraglimitreached)
+ return WINNING_YES;
+ else
+ return WINNING_NO;
+ }
+ else
+ {
+ if(equality)
+ {
+ if(fraglimitreached)
+ return WINNING_STARTSUDDENDEATHOVERTIME;
+ else
+ return WINNING_NEVER;
+ }
+ else
+ {
+ if(fraglimitreached)
+ return WINNING_YES;
+ else
+ return WINNING_NO;
+ }
+ }
+}
+
+// set the .winning flag for exactly those players with a given field value
+void SetWinners(.float field, float value)
+{
+ FOREACH_CLIENT(IS_PLAYER(it), { it.winning = (it.(field) == value); });
+}
+
+// set the .winning flag for those players with a given field value
+void AddWinners(.float field, float value)
+{
+ FOREACH_CLIENT(IS_PLAYER(it), {
+ if(it.(field) == value)
+ it.winning = 1;
+ });
+}
+
+// clear the .winning flags
+void ClearWinners()
+{
+ FOREACH_CLIENT(IS_PLAYER(it), { it.winning = 0; });
+}
+
+void ShuffleMaplist()
+{
+ cvar_set("g_maplist", shufflewords(autocvar_g_maplist));
+}
+
+int fragsleft_last;
+float WinningCondition_Scores(float limit, float leadlimit)
+{
+ // TODO make everything use THIS winning condition (except LMS)
+ WinningConditionHelper(NULL);
+
+ if(teamplay)
+ {
+ for (int i = 1; i < 5; ++i)
+ {
+ Team_SetTeamScore(Team_GetTeamFromIndex(i),
+ TeamScore_GetCompareValue(Team_IndexToTeam(i)));
+ }
+ }
+
+ ClearWinners();
+ if(WinningConditionHelper_winner)
+ WinningConditionHelper_winner.winning = 1;
+ if(WinningConditionHelper_winnerteam >= 0)
+ SetWinners(team, WinningConditionHelper_winnerteam);
+
+ if(WinningConditionHelper_lowerisbetter)
+ {
+ WinningConditionHelper_topscore = -WinningConditionHelper_topscore;
+ WinningConditionHelper_secondscore = -WinningConditionHelper_secondscore;
+ limit = -limit;
+ }
+
+ if(WinningConditionHelper_zeroisworst)
+ leadlimit = 0; // not supported in this mode
+
+ if(MUTATOR_CALLHOOK(Scores_CountFragsRemaining))
+ {
+ float fragsleft;
+ if (checkrules_suddendeathend && time >= checkrules_suddendeathend)
+ {
+ fragsleft = 1;
+ }
+ else
+ {
+ fragsleft = FLOAT_MAX;
+ float leadingfragsleft = FLOAT_MAX;
+ if (limit)
+ fragsleft = limit - WinningConditionHelper_topscore;
+ if (leadlimit)
+ leadingfragsleft = WinningConditionHelper_secondscore + leadlimit - WinningConditionHelper_topscore;
+
+ if (limit && leadlimit && autocvar_leadlimit_and_fraglimit)
+ fragsleft = max(fragsleft, leadingfragsleft);
+ else
+ fragsleft = min(fragsleft, leadingfragsleft);
+ }
+
+ if (fragsleft_last != fragsleft) // do not announce same remaining frags multiple times
+ {
+ if (fragsleft == 1)
+ Send_Notification(NOTIF_ALL, NULL, MSG_ANNCE, ANNCE_REMAINING_FRAG_1);
+ else if (fragsleft == 2)
+ Send_Notification(NOTIF_ALL, NULL, MSG_ANNCE, ANNCE_REMAINING_FRAG_2);
+ else if (fragsleft == 3)
+ Send_Notification(NOTIF_ALL, NULL, MSG_ANNCE, ANNCE_REMAINING_FRAG_3);
+
+ fragsleft_last = fragsleft;
+ }
+ }
+
+ bool fraglimit_reached = (limit && WinningConditionHelper_topscore >= limit);
+ bool leadlimit_reached = (leadlimit && WinningConditionHelper_topscore - WinningConditionHelper_secondscore >= leadlimit);
+
+ bool limit_reached;
+ // only respect leadlimit_and_fraglimit when both limits are set or the game will never end
+ if (limit && leadlimit && autocvar_leadlimit_and_fraglimit)
+ limit_reached = (fraglimit_reached && leadlimit_reached);
+ else
+ limit_reached = (fraglimit_reached || leadlimit_reached);
+
+ return GetWinningCode(
+ WinningConditionHelper_topscore && limit_reached,
+ WinningConditionHelper_equality
+ );
+}
+
+float WinningCondition_RanOutOfSpawns()
+{
+ if(have_team_spawns <= 0)
+ return WINNING_NO;
+
+ if(!autocvar_g_spawn_useallspawns)
+ return WINNING_NO;
+
+ if(!some_spawn_has_been_used)
+ return WINNING_NO;
+
+ for (int i = 1; i < 5; ++i)
+ {
+ Team_SetTeamScore(Team_GetTeamFromIndex(i), 0);
+ }
+
+ FOREACH_CLIENT(IS_PLAYER(it) && !IS_DEAD(it),
+ {
+ if (Team_IsValidTeam(it.team))
+ {
+ Team_SetTeamScore(Team_GetTeam(it.team), 1);
+ }
+ });
+
+ IL_EACH(g_spawnpoints, true,
+ {
+ if (Team_IsValidTeam(it.team))
+ {
+ Team_SetTeamScore(Team_GetTeam(it.team), 1);
+ }
+ });
+
+ ClearWinners();
+ float team1_score = Team_GetTeamScore(Team_GetTeamFromIndex(1));
+ float team2_score = Team_GetTeamScore(Team_GetTeamFromIndex(2));
+ float team3_score = Team_GetTeamScore(Team_GetTeamFromIndex(3));
+ float team4_score = Team_GetTeamScore(Team_GetTeamFromIndex(4));
+ if(team1_score + team2_score + team3_score + team4_score == 0)
+ {
+ checkrules_equality = true;
+ return WINNING_YES;
+ }
+ else if(team1_score + team2_score + team3_score + team4_score == 1)
+ {
+ float t, i;
+ if(team1_score)
+ t = 1;
+ else if(team2_score)
+ t = 2;
+ else if(team3_score)
+ t = 3;
+ else // if(team4_score)
+ t = 4;
+ entity balance = TeamBalance_CheckAllowedTeams(NULL);
+ for(i = 0; i < MAX_TEAMSCORE; ++i)
+ {
+ for (int j = 1; j <= NUM_TEAMS; ++j)
+ {
+ if (t == j)
+ {
+ continue;
+ }
+ if (!TeamBalance_IsTeamAllowed(balance, j))
+ {
+ continue;
+ }
+ TeamScore_AddToTeam(Team_IndexToTeam(j), i, -1000);
+ }
+ }
+
+ AddWinners(team, t);
+ return WINNING_YES;
+ }
+ else
+ return WINNING_NO;
+}
+
+/*
+============
+CheckRules_World
+
+Exit deathmatch games upon conditions
+============
+*/
+void CheckRules_World()
+{
+ VoteThink();
+ MapVote_Think();
+
+ SetDefaultAlpha();
+
+ if (intermission_running) // someone else quit the game already
+ {
+ if(player_count == 0) // Nobody there? Then let's go to the next map
+ MapVote_Start();
+ // this will actually check the player count in the next frame
+ // again, but this shouldn't hurt
+ return;
+ }
+
+ float timelimit = autocvar_timelimit * 60;
+ float fraglimit = autocvar_fraglimit;
+ float leadlimit = autocvar_leadlimit;
+ if (leadlimit < 0) leadlimit = 0;
+
+ if(warmup_stage || time <= game_starttime) // NOTE: this is <= to prevent problems in the very tic where the game starts
+ {
+ if(timelimit > 0)
+ timelimit = 0; // timelimit is not made for warmup
+ if(fraglimit > 0)
+ fraglimit = 0; // no fraglimit for now
+ leadlimit = 0; // no leadlimit for now
+ }
+
+ if(timelimit > 0)
+ {
+ timelimit += game_starttime;
+ }
+ else if (timelimit < 0)
+ {
+ // endmatch
+ NextLevel();
+ return;
+ }
+
+ float wantovertime;
+ wantovertime = 0;
+
+ if(checkrules_suddendeathend)
+ {
+ if(!checkrules_suddendeathwarning)
+ {
+ checkrules_suddendeathwarning = true;
+ if(g_race && !g_race_qualifying)
+ Send_Notification(NOTIF_ALL, NULL, MSG_CENTER, CENTER_RACE_FINISHLAP);
+ else
+ Send_Notification(NOTIF_ALL, NULL, MSG_CENTER, CENTER_OVERTIME_FRAG);
+ }
+ }
+ else
+ {
+ if (timelimit && time >= timelimit)
+ {
+ if(g_race && (g_race_qualifying == 2) && timelimit > 0)
+ {
+ float totalplayers;
+ float playerswithlaps;
+ float readyplayers;
+ totalplayers = playerswithlaps = readyplayers = 0;
+ FOREACH_CLIENT(IS_PLAYER(it), {
+ ++totalplayers;
+ if(GameRules_scoring_add(it, RACE_FASTEST, 0))
+ ++playerswithlaps;
+ if(it.ready)
+ ++readyplayers;
+ });
+
+ // at least 2 of the players have completed a lap: start the RACE
+ // otherwise, the players should end the qualifying on their own
+ if(readyplayers || playerswithlaps >= 2)
+ {
+ checkrules_suddendeathend = 0;
+ ReadyRestart(); // go to race
+ return;
+ }
+ else
+ wantovertime |= InitiateSuddenDeath();
+ }
+ else
+ wantovertime |= InitiateSuddenDeath();
+ }
+ }
+
+ if (checkrules_suddendeathend && time >= checkrules_suddendeathend)
+ {
+ NextLevel();
+ return;
+ }
+
+ int checkrules_status = WinningCondition_RanOutOfSpawns();
+ if(checkrules_status == WINNING_YES)
+ bprint("Hey! Someone ran out of spawns!\n");
+ else if(MUTATOR_CALLHOOK(CheckRules_World, checkrules_status, timelimit, fraglimit))
+ checkrules_status = M_ARGV(0, float);
+ else
+ checkrules_status = WinningCondition_Scores(fraglimit, leadlimit);
+
+ if(checkrules_status == WINNING_STARTSUDDENDEATHOVERTIME)
+ {
+ checkrules_status = WINNING_NEVER;
+ checkrules_overtimesadded = -1;
+ wantovertime |= InitiateSuddenDeath();
+ }
+
+ if(checkrules_status == WINNING_NEVER)
+ // equality cases! Nobody wins if the overtime ends in a draw.
+ ClearWinners();
+
+ if(wantovertime)
+ {
+ if(checkrules_status == WINNING_NEVER)
+ InitiateOvertime();
+ else
+ checkrules_status = WINNING_YES;
+ }
+
+ if(checkrules_suddendeathend)
+ if(checkrules_status != WINNING_NEVER || time >= checkrules_suddendeathend)
+ checkrules_status = WINNING_YES;
+
+ if(checkrules_status == WINNING_YES)
+ {
+ //print("WINNING\n");
+ NextLevel();
+ }
+}
+
+string GotoMap(string m)
+{
+ m = GameTypeVote_MapInfo_FixName(m);
+ if (!m)
+ return "The map you suggested is not available on this server.";
+ if (!autocvar_sv_vote_gametype)
+ if(!MapInfo_CheckMap(m))
+ return "The map you suggested does not support the current game mode.";
+ cvar_set("nextmap", m);
+ cvar_set("timelimit", "-1");
+ if(mapvote_initialized || alreadychangedlevel)
+ {
+ if(DoNextMapOverride(0))
+ return "Map switch initiated.";
+ else
+ return "Hm... no. For some reason I like THIS map more.";
+ }
+ else
+ return "Map switch will happen after scoreboard.";
+}
+
+bool autocvar_sv_gameplayfix_multiplethinksperframe = true;
+void RunThink(entity this)
+{
+ // don't let things stay in the past.
+ // it is possible to start that way by a trigger with a local time.
+ if(this.nextthink <= 0 || this.nextthink > time + frametime)
+ return;
+
+ float oldtime = time; // do we need to save this?
+
+ for (int iterations = 0; iterations < 128 && !wasfreed(this); iterations++)
+ {
+ time = max(oldtime, this.nextthink);
+ this.nextthink = 0;
+
+ if(getthink(this))
+ getthink(this)(this);
+ // mods often set nextthink to time to cause a think every frame,
+ // we don't want to loop in that case, so exit if the new nextthink is
+ // <= the time the qc was told, also exit if it is past the end of the
+ // frame
+ if(this.nextthink <= time || this.nextthink > oldtime + frametime || !autocvar_sv_gameplayfix_multiplethinksperframe)
+ break;
+ }
+
+ time = oldtime;
+}
+
+bool autocvar_sv_freezenonclients;
+void Physics_Frame()
+{
+ if(autocvar_sv_freezenonclients)
+ return;
+
+ IL_EACH(g_moveables, true,
+ {
+ if(IS_CLIENT(it) || it.move_movetype == MOVETYPE_PHYSICS)
+ continue;
+
+ //set_movetype(it, it.move_movetype);
+ // inline the set_movetype function, since this is called a lot
+ it.movetype = (it.move_qcphysics) ? MOVETYPE_QCENTITY : it.move_movetype;
+
+ if(it.move_qcphysics && it.move_movetype != MOVETYPE_NONE)
+ Movetype_Physics_NoMatchTicrate(it, PHYS_INPUT_TIMELENGTH, false);
+
+ if(it.movetype >= MOVETYPE_USER_FIRST && it.movetype <= MOVETYPE_USER_LAST) // these cases have no think handling
+ {
+ if(it.move_movetype == MOVETYPE_PUSH || it.move_movetype == MOVETYPE_FAKEPUSH)
+ continue; // these movetypes have no regular think function
+ // handle thinking here
+ if (getthink(it) && it.nextthink > 0 && it.nextthink <= time + frametime)
+ RunThink(it);
+ }
+ });
+
+ if(autocvar_sv_gameplayfix_delayprojectiles >= 0)
+ return;
+
+ // make a second pass to see if any ents spawned this frame and make
+ // sure they run their move/think. this is verified by checking .move_time, which will never be 0 if the entity has moved
+ IL_EACH(g_moveables, it.move_qcphysics,
+ {
+ if(IS_CLIENT(it) || it.move_time || it.move_movetype == MOVETYPE_NONE || it.move_movetype == MOVETYPE_PHYSICS)
+ continue;
+ Movetype_Physics_NoMatchTicrate(it, PHYS_INPUT_TIMELENGTH, false);
+ });
+}
+
+void systems_update();
+void EndFrame()
+{
+ anticheat_endframe();
+
+ Physics_Frame();
+
+ FOREACH_CLIENT(IS_REAL_CLIENT(it), {
+ entity e = IS_SPEC(it) ? it.enemy : it;
+ if (e.typehitsound) {
+ STAT(TYPEHIT_TIME, it) = time;
+ } else if (e.killsound) {
+ STAT(KILL_TIME, it) = time;
+ } else if (e.damage_dealt) {
+ STAT(HIT_TIME, it) = time;
+ STAT(DAMAGE_DEALT_TOTAL, it) += ceil(e.damage_dealt);
+ }
+ });
+ // add 1 frametime because after this, engine SV_Physics
+ // increases time by a frametime and then networks the frame
+ // add another frametime because client shows everything with
+ // 1 frame of lag (cl_nolerp 0). The last +1 however should not be
+ // needed!
+ float altime = time + frametime * (1 + autocvar_g_antilag_nudge);
+ FOREACH_CLIENT(true, {
+ it.typehitsound = false;
+ it.damage_dealt = 0;
+ it.killsound = false;
+ antilag_record(it, CS(it), altime);
+ });
+ IL_EACH(g_monsters, true,
+ {
+ antilag_record(it, it, altime);
+ });
+ IL_EACH(g_projectiles, it.classname == "nade",
+ {
+ antilag_record(it, it, altime);
+ });
+ systems_update();
+ IL_ENDFRAME();
+}
+
+
+/*
+ * RedirectionThink:
+ * returns true if redirecting
+ */
+float redirection_timeout;
+float redirection_nextthink;
+float RedirectionThink()
+{
+ float clients_found;
+
+ if(redirection_target == "")
+ return false;
+
+ if(!redirection_timeout)
+ {
+ cvar_set("sv_public", "-2");
+ redirection_timeout = time + 0.6; // this will only try twice... should be able to keep more clients
+ if(redirection_target == "self")
+ bprint("^3SERVER NOTICE:^7 restarting the server\n");
+ else
+ bprint("^3SERVER NOTICE:^7 redirecting everyone to ", redirection_target, "\n");
+ }
+
+ if(time < redirection_nextthink)
+ return true;
+
+ redirection_nextthink = time + 1;
+
+ clients_found = 0;
+ FOREACH_CLIENT(IS_REAL_CLIENT(it), {
+ // TODO add timer
+ LOG_INFO("Redirecting: sending connect command to ", it.netname);
+ if(redirection_target == "self")
+ stuffcmd(it, "\ndisconnect; defer ", ftos(autocvar_quit_and_redirect_timer), " reconnect\n");
+ else
+ stuffcmd(it, strcat("\ndisconnect; defer ", ftos(autocvar_quit_and_redirect_timer), " \"connect ", redirection_target, "\"\n"));
+ ++clients_found;
+ });
+
+ LOG_INFO("Redirecting: ", ftos(clients_found), " clients left.");
+
+ if(time > redirection_timeout || clients_found == 0)
+ localcmd("\nwait; wait; wait; quit\n");
+
+ return true;
+}
+
+void RestoreGame()
+{
+ // Loaded from a save game
+ // some things then break, so let's work around them...
+
+ // Progs DB (capture records)
+ ServerProgsDB = db_load(strcat("server.db", autocvar_sessionid));
+
+ // Mapinfo
+ MapInfo_Shutdown();
+ MapInfo_Enumerate();
+ MapInfo_FilterGametype(MapInfo_CurrentGametype(), MapInfo_CurrentFeatures(), MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags(), 1);
+ WeaponStats_Init();
+
+ TargetMusic_RestoreGame();
+}
+
+void Shutdown()
+{
+ game_stopped = 2;
+
+ if(world_initialized > 0)
+ {
+ world_initialized = 0;
+
+ // if a timeout is active, reset the slowmo value to normal
+ if(timeout_status == TIMEOUT_ACTIVE)
+ cvar_set("slowmo", ftos(orig_slowmo));
+
+ LOG_TRACE("Saving persistent data...");
+ Ban_SaveBans();
+
+ // playerstats with unfinished match
+ PlayerStats_GameReport(false);
+
+ if(!cheatcount_total)
+ {
+ if(autocvar_sv_db_saveasdump)
+ db_dump(ServerProgsDB, strcat("server.db", autocvar_sessionid));
+ else
+ db_save(ServerProgsDB, strcat("server.db", autocvar_sessionid));
+ }
+ if(autocvar_developer > 0)
+ {
+ if(autocvar_sv_db_saveasdump)
+ db_dump(TemporaryDB, "server-temp.db");
+ else
+ db_save(TemporaryDB, "server-temp.db");
+ }
+ CheatShutdown(); // must be after cheatcount check
+ db_close(ServerProgsDB);
+ db_close(TemporaryDB);
+ LOG_TRACE("Saving persistent data... done!");
+ // tell the bot system the game is ending now
+ bot_endgame();
+
+ WeaponStats_Shutdown();
+ MapInfo_Shutdown();
+ }
+ else if(world_initialized == 0)
+ {
+ LOG_INFO("NOTE: crashed before even initializing the world, not saving persistent data");
+ }
+ else
+ {
+ __init_dedicated_server_shutdown();
+ }
+}
--- /dev/null
+#pragma once
+
+float checkrules_equality;
+float checkrules_suddendeathwarning;
+float checkrules_suddendeathend;
+float checkrules_overtimesadded; //how many overtimes have been already added
+
+// flag set on worldspawn so that the code knows if it is dedicated or not
+bool server_is_dedicated;
+
+string cvar_changes;
+string cvar_purechanges;
+float cvar_purechanges_count;
+
+string modname;
+
+string gamemode_name;
+
+string clientstuff;
+
+string matchid;
+
+.string fog;
+
+float intermission_running;
+float intermission_exittime;
+float alreadychangedlevel;
+
+string cache_mutatormsg;
+string cache_lastmutatormsg;
+
+float default_player_alpha;
+float default_weapon_alpha;
+
+// database
+float ServerProgsDB;
+float TemporaryDB;
+
+.float winning;
+const int WINNING_NO = 0; // no winner, but time limits may terminate the game
+const int WINNING_YES = 1; // winner found
+const int WINNING_NEVER = 2; // no winner, enter overtime if time limit is reached
+const int WINNING_STARTSUDDENDEATHOVERTIME = 3; // no winner, enter suddendeath overtime NOW
+
+float WinningCondition_Scores(float limit, float leadlimit);
+void SetWinners(.float field, float value);
+void IntermissionThink(entity this);
+void GotoNextMap(float reinit);
+void ReadyRestart();
+
+string GetGametype();
+
+void DumpStats(float final);
+float Map_IsRecent(string m);
+string GetNextMap();
+void ShuffleMaplist();
+void Map_Goto_SetStr(string nextmapname);
+void Map_Goto(float reinit);
+void Map_MarkAsRecent(string m);
+float DoNextMapOverride(float reinit);
+void CheckRules_World();
+float RedirectionThink();
+
+IntrusiveList g_moveables;
+STATIC_INIT(g_moveables) { g_moveables = IL_NEW(); }
#!/usr/bin/env bash
set -eu
+
+# This script creates / updates the _mod.qc / _mod.qh / _mod.inc files based on
+# the qc / qh files present in the qcsrc folder.
+
cd ${0%/*}
cd ..
ROOT=$PWD/
+++ /dev/null
-cellammo\r
-{\r
- dpreflectcube cubemaps/default/sky\r
- dpoffsetmapping - 0.5 match8 128\r
- {\r
- map textures/items/cellammo\r
- rgbgen lightingDiffuse\r
- }\r
-}
\ No newline at end of file
--- /dev/null
+cellammo
+{
+ dpreflectcube cubemaps/default/sky
+ dpoffsetmapping - 0.5 match8 128
+ {
+ map textures/items/cellammo
+ rgbgen lightingDiffuse
+ }
+}
\ No newline at end of file
gl_polyblend 0 // whether to use screen tints, this has now been replaced by a better system in CSQC
r_motionblur 0 // motion blur value, default is 0
r_damageblur 0 // motion blur when damaged, default is 0 (removed in Xonotic)
+net_slist_queriespersecond 60 // to be reduced if any major issues arise (ping times increased etc.)
r_bloom_blur 4
r_bloom_brighten 2
seta cl_projectiles_sloppy 1 "sloppy projectiles, may temporarily penetrate walls"
cl_stainmaps 0
cl_particles_smoke 1
-vid_gl20 1
+set vid_gl20 1
+set gl_vbo 3
r_glsl_deluxemapping 1
r_glsl_offsetmapping 0
r_glsl_offsetmapping_lod 1
set developer_csqcentities 0 "csqc entity spam"
seta cl_forceplayermodels 0 "make everyone look like your own model (requires server to have sv_defaultcharacter 0)"
-seta cl_forceplayercolors 0 "make enemies look like your own color (requires server to have sv_defaultcharacter 0); set it to 2 to enable it even in teamplay (only when there is exactly one enemy team)"
+seta cl_forceplayercolors 0 "make enemies look like your own color (requires server to have sv_defaultcharacter 0); 2: enable it even in teamplay (only when there is exactly one enemy team); 3: enable it only playing Duel"
seta cl_forcemyplayermodel "" "set to the model file name you want to show yourself as (does not affect how enemies look with cl_forceplayermodels)"
seta cl_forcemyplayerskin 0 "set to the skin number you want to show yourself as (does not affect how enemies look with cl_forceplayermodels)"
seta cl_forcemyplayercolors 0 "set to the color value (encoding is same as _cl_color) for your own player model (ignored in teamplay; does not affect how enemies look with cl_forceplayermodels)"
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"
sv_gameplayfix_q2airaccelerate 1
sv_gameplayfix_stepmultipletimes 1
sv_gameplayfix_stepdown 2
+sv_gameplayfix_unstickplayers 2
// only available in qc physics
set sv_gameplayfix_stepdown_maxspeed 0 "maximum speed walking entities can be moving for stepping down to apply - requires sv_qcphysics 1"