diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2274b55f..840ec331 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -27,7 +27,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Check out files - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: submodules: true fetch-depth: 0 @@ -35,10 +35,9 @@ jobs: lfs: false - name: Add msbuild to PATH - uses: microsoft/setup-msbuild@v1.0.2 + uses: microsoft/setup-msbuild@v1.1.3 - name: Generate project files - #run: tools/premake5 vs2022 --ci-build run: tools/premake5 vs2022 - name: Set up problem matching @@ -48,7 +47,7 @@ jobs: run: msbuild /m /v:minimal /p:Configuration=${{matrix.configuration}} /p:Platform=x64 build/h2-mod.sln - name: Upload ${{matrix.configuration}} binaries - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3.1.0 with: name: ${{matrix.configuration}} binaries path: | @@ -56,7 +55,7 @@ jobs: build/bin/x64/${{matrix.configuration}}/h2-mod.pdb - name: Upload ${{matrix.configuration}} data artifacts - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3.1.0 with: name: ${{matrix.configuration}} data artifacts path: | @@ -76,12 +75,12 @@ jobs: run: echo "FED_MASTER_PATH=${{ secrets.FED_MASTER_SSH_PATH_DEV }}" >> $GITHUB_ENV - name: Download Release binaries - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: name: Release binaries - name: Download Release data artifacts - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: name: Release data artifacts path: data @@ -103,13 +102,13 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Remove old data files - run: ssh ${{ secrets.FED_MASTER_SSH_USER }}@${{ secrets.FED_MASTER_SSH_ADDRESS }} rm -rf ${{ env.FED_MASTER_PATH }}/h2-mod/data/* + run: ssh ${{ secrets.FED_MASTER_SSH_USER }}@${{ secrets.FED_MASTER_SSH_ADDRESS }} rm -rf ${{ env.FED_MASTER_PATH }}/h2-mod/* - name: Upload h2-mod binary run: rsync -avz h2-mod.exe ${{ secrets.FED_MASTER_SSH_USER }}@${{ secrets.FED_MASTER_SSH_ADDRESS }}:${{ env.FED_MASTER_PATH }}/h2-mod/ - name: Upload data files - run: rsync -avz ./data/ ${{ secrets.FED_MASTER_SSH_USER }}@${{ secrets.FED_MASTER_SSH_ADDRESS }}:${{ env.FED_MASTER_PATH }}/h2-mod/data/ + run: rsync -avz ./data/ ${{ secrets.FED_MASTER_SSH_USER }}@${{ secrets.FED_MASTER_SSH_ADDRESS }}:${{ env.FED_MASTER_PATH }}/h2-mod/ - name: Publish changes run: ssh ${{ secrets.FED_MASTER_SSH_USER }}@${{ secrets.FED_MASTER_SSH_ADDRESS }} ${{ secrets.FED_MASTER_SSH_CHANGE_PUBLISH_COMMAND }} diff --git a/.gitmodules b/.gitmodules index 3fa56e25..1c83538a 100644 --- a/.gitmodules +++ b/.gitmodules @@ -43,3 +43,9 @@ [submodule "deps/curl"] path = deps/curl url = https://github.com/curl/curl.git +[submodule "deps/gsc-tool-h2"] + path = deps/gsc-tool-h2 + url = https://github.com/fedddddd/gsc-tool-h2.git +[submodule "deps/json"] + path = deps/json + url = https://github.com/nlohmann/json.git diff --git a/README.md b/README.md index b805c1f7..39ae5668 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,6 @@ ![license](https://img.shields.io/github/license/fedddddd/h2-mod.svg) [![open bugs](https://img.shields.io/github/issues/fedddddd/h2-mod/bug?label=bugs)](https://github.com/fedddddd/h2-mod/issues?q=is%3Aissue+is%3Aopen+label%3Abug) [![Build](https://github.com/fedddddd/h2-mod/workflows/Build/badge.svg)](https://github.com/fedddddd/h2-mod/actions) -[![Build status](https://ci.appveyor.com/api/projects/status/0sh80kdnsvm53rno?svg=true)](https://ci.appveyor.com/project/fedddddd/h2-mod) [![Discord](https://img.shields.io/discord/955362057581129738?color=%237289DA&label=members&logo=discord&logoColor=%23FFFFFF)](https://discord.gg/dpnRn2tKT9) # H2: Mod @@ -15,7 +14,7 @@ **NOTE**: Cracked/Pirated versions of the game are **NOT** compatible with this mod, if you run such a version and have issues/crashes when running the client read **Step 2**. -1. Download the latest **[release](https://github.com/fedddddd/h2-mod/releases/latest/download/h2-mod.exe)** or **[develop](https://ci.appveyor.com/api/projects/fedddddd/h2-mod/artifacts/build%2Fbin%2Fx64%2FRelease%2Fh2-mod.exe?branch=develop&job=Environment%3A%20APPVEYOR_BUILD_WORKER_IMAGE%3DVisual%20Studio%202022%2C%20PREMAKE_ACTION%3Dvs2022%2C%20CI%3D1%3B%20Configuration%3A%20Release)** build +1. Download the latest **[release](https://github.com/fedddddd/h2-mod/releases/latest/download/h2-mod.exe)** or **[develop](https://master.fed0001.xyz/data-dev/h2-mod.exe)** build 2. Drop the file in your **Call of Duty: Modern Warfare 2 Campaign Remastered** installation folder. If you don't have the game installed (or own a cracked/pirated copy of it) you can download it for free from the official **Battle.Net** servers using [Battle.Net Installer](https://github.com/barncastle/Battle.Net-Installer) and executing this command: @@ -60,3 +59,5 @@ This project is based on [IW6x](https://github.com/XLabsProject/iw6x-client) and * [momo5502](https://github.com/momo5502) * [JariKCoding](https://github.com/JariKCoding/CoDLuaDecompiler) * [xensik](https://github.com/xensik/gsc-tool/) +* [ZoneTool](https://github.com/ZoneTool/zonetool) +* [quaK](https://github.com/Joelrau) diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index 400aa2b2..00000000 --- a/appveyor.yml +++ /dev/null @@ -1,41 +0,0 @@ -# AppVeyor CI configuration - -version: "#{build} ({branch})" - -environment: - matrix: - - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2022 - PREMAKE_ACTION: vs2022 - CI: 1 - -branches: - only: - - develop - - main - -skip_branch_with_pr: true - -configuration: - - Debug - - Release - -platform: x64 - -install: - - ps: | - Write-Host "Updating version information..." -ForegroundColor Cyan - Update-AppveyorBuild -Version $(& tools/premake5.exe version | select -Last 1) - - git submodule update --init --recursive - - ps: | - Write-Host "Generating project files with premake..." -ForegroundColor Cyan - & "./tools/premake5.exe" $env:PREMAKE_ACTION - Write-Host "Generated" -ForegroundColor Green - -build: - project: build/h2-mod.sln - parallel: true - verbosity: minimal - -artifacts: - - path: build/version.txt - - path: build/bin/**/h2-mod.exe \ No newline at end of file diff --git a/assets/github/banner.png b/assets/github/banner.png index 60577d55..ffa68664 100644 Binary files a/assets/github/banner.png and b/assets/github/banner.png differ diff --git a/data/cdata/english/sound/voiceovers/afcaves/afcaves_nkl_2_3_r.flac b/data/cdata/english/sound/voiceovers/afcaves/afcaves_nkl_2_3_r.flac new file mode 100644 index 00000000..cb61ebcd Binary files /dev/null and b/data/cdata/english/sound/voiceovers/afcaves/afcaves_nkl_2_3_r.flac differ diff --git a/data/cdata/english_safe/sound/voiceovers/afcaves/afcaves_nkl_2_3_r.flac b/data/cdata/english_safe/sound/voiceovers/afcaves/afcaves_nkl_2_3_r.flac new file mode 100644 index 00000000..cb61ebcd Binary files /dev/null and b/data/cdata/english_safe/sound/voiceovers/afcaves/afcaves_nkl_2_3_r.flac differ diff --git a/data/cdata/japanese_partial/sound/voiceovers/afcaves/afcaves_nkl_2_3_r.flac b/data/cdata/japanese_partial/sound/voiceovers/afcaves/afcaves_nkl_2_3_r.flac new file mode 100644 index 00000000..cb61ebcd Binary files /dev/null and b/data/cdata/japanese_partial/sound/voiceovers/afcaves/afcaves_nkl_2_3_r.flac differ diff --git a/data/cdata/russian/sound/voiceovers/dcwhite/dcwhite_cpd_21_5.flac b/data/cdata/russian/sound/voiceovers/dcwhite/dcwhite_cpd_21_5.flac new file mode 100644 index 00000000..6f9f2a64 Binary files /dev/null and b/data/cdata/russian/sound/voiceovers/dcwhite/dcwhite_cpd_21_5.flac differ diff --git a/data/cdata/russian_partial/sound/voiceovers/afcaves/afcaves_nkl_2_3_r.flac b/data/cdata/russian_partial/sound/voiceovers/afcaves/afcaves_nkl_2_3_r.flac new file mode 100644 index 00000000..cb61ebcd Binary files /dev/null and b/data/cdata/russian_partial/sound/voiceovers/afcaves/afcaves_nkl_2_3_r.flac differ diff --git a/data/cdata/spanishna/sound/voiceovers/afcaves/afcaves_nkl_2_3_r.flac b/data/cdata/spanishna/sound/voiceovers/afcaves/afcaves_nkl_2_3_r.flac new file mode 100644 index 00000000..cb61ebcd Binary files /dev/null and b/data/cdata/spanishna/sound/voiceovers/afcaves/afcaves_nkl_2_3_r.flac differ diff --git a/data/cdata/ui_scripts/branding/__init__.lua b/data/cdata/ui_scripts/branding/__init__.lua new file mode 100644 index 00000000..6e11c3a8 --- /dev/null +++ b/data/cdata/ui_scripts/branding/__init__.lua @@ -0,0 +1,298 @@ +local spacing = 10 +local topoffset = 15 + +local extrawidth = 50 +local extraheight1 = 0 + +local function makelink(element, link) + element:setHandleMouseMove(true) + element:setHandleMouseButton(true) + element:registerAnimationState("focused", { + color = { + r = 1, + g = 1, + b = 1 + } + }) + + local entered = false + element:registerEventHandler("mouseenter", function() + if (not entered) then + Engine.PlaySound(CoD.SFX.MouseOver) + entered = true + end + + element:animateToState("focused") + end) + + element:registerEventHandler("mouseleave", function() + entered = false + element:animateToState("default") + end) + + element:registerEventHandler("leftmousedown", function() + Engine.PlaySound(CoD.SFX.MouseClick) + game:openlink(link) + end) +end + +local addlinkinfo = function(menu, key, value, link) + local text = Engine.Localize(value) + local element = menu:AddInfo(Engine.Localize(key), function() + return text + end) + + local linkelement = element:getFirstChild():getNextSibling() + makelink(linkelement, link) +end + +local function getnumcredits() + local csv = "credits.csv" + local rowcount = Engine.TableGetRowCount(csv) + return rowcount +end + +local extraheight2 = getnumcredits() * 25 / 2 + +local function addcredits(menu) + local cols = { + name = 0, + link = 1 + } + + local csv = "credits.csv" + local rowcount = Engine.TableGetRowCount(csv) + + local num = 0 + local creditselement = LUI.UIElement.new({ + topAnchor = true, + leftAnchor = true, + left = 500, + width = 30, + top = 255 + }) + + menu:addElement(creditselement) + + menu:AddInfo(Engine.Localize("MENU_CREDITS"), function() + return "" + end) + + local num = 0 + local addcredit = function(name, link) + local row = num % 4 + local col = num >= 4 and 0 or 1 + local text = Engine.Localize(name) + + local element = LUI.UIText.new({ + rightAnchor = true, + topAnchor = true, + right = -10 + (col * -100), + top = 25 * row, + width = 90, + height = LUI.MenuGenericButtons.ButtonLabelFont.Height * 0.8, + font = LUI.MenuGenericButtons.ButtonLabelFont.Font, + color = Colors.h1.light_grey, + alignment = Engine.IsRightToLeftLanguage() and LUI.Alignment.None or LUI.Alignment.Right + }) + + element.id = "credits_" .. num + element:setText(text) + creditselement:addElement(element) + makelink(element, link) + + num = num + 1 + end + + for i = 0, rowcount - 1 do + local name = Engine.TableLookupByRow(csv, i, cols.name) + local link = Engine.TableLookupByRow(csv, i, cols.link) + addcredit(name, link) + end +end + +LUI.MenuBuilder.m_types_build["SystemInfo"] = function (f6_arg0, f6_arg1) + local f6_local0 = LUI.MenuTemplate.spMenuOffset + local title = "LUA_MENU_SYSTEM_INFO_CAPS" + + local f6_local2 = false + local f6_local3 = 0 + + local menu = LUI.MenuTemplate.new(f6_arg0, { + menu_title = title, + menu_top_indent = f6_local0 + f6_local3, + showSelectButton = false, + skipAnim = f6_local2 + }) + + menu:setClass(LUI.SystemInfo) + menu:PopulateMissingProps(f6_arg1) + menu:ValidateProps(f6_arg1) + menu.id = "systemInfo_id" + + local f6_local5 = 300 + local f6_local6 = LUI.MenuTemplate.ListTop + f6_local0 + local f6_local7 = f6_arg1.menu_height + if not f6_local7 then + f6_local7 = f6_local5 + end + + f6_local7 = f6_local7 + f6_local6 - extraheight1 + + local f6_local9 = luiglobals.GenericMenuDims.OptionMenuWidth + 100 + local f6_local10 = menu.properties + local topoffset2 = LUI.MenuTemplate.ListTop + LUI.MenuTemplate.spMenuOffset + + local decobox = LUI.MenuBuilder.BuildRegisteredType("h1_box_deco", { + decoTopOffset = topoffset2 - topoffset + 15, + decoBottomOffset = -f6_local7, + decoRightOffset = -665 + extrawidth + }) + + menu:addElement(decobox) + + local decoleft = CoD.CreateState(0, 0.5, 8, 0.5, CoD.AnchorTypes.TopLeft) + decoleft.color = luiglobals.Colors.h1.light_grey + decobox:addElement(LUI.UILine.new(decoleft)) + + local decoright = CoD.CreateState(0, 0.5, -8, 0.5, CoD.AnchorTypes.TopRight) + decoright.color = luiglobals.Colors.h1.light_grey + decobox:addElement(LUI.UILine.new(decoright)) + + local element = LUI.UIVerticalList.new({ + leftAnchor = true, + rightAnchor = true, + topAnchor = true, + bottomAnchor = true, + left = spacing, + right = 100, + top = topoffset2 + 15, + bottom = 0, + spacing = spacing * 0.8 + }) + + element.id = "systemInfoList_id" + menu.vlist = element + menu:addElement(element) + + local optionmenuwidth = luiglobals.GenericMenuDims.OptionMenuWidth + luiglobals.GenericMenuDims.OptionMenuWidth = optionmenuwidth + extrawidth + + menu:AddInfo(Engine.Localize("MENU_SYSINFO_VERSION"), function() + return Engine.GetBuildNumber() + end) + + addlinkinfo(menu, "MENU_SYSINFO_CUSTOMER_SUPPORT_LINK", "MENU_SYSINFO_CUSTOMER_SUPPORT_URL", "github") + + luiglobals.GenericMenuDims.OptionMenuWidth = optionmenuwidth + + menu:AddBackButton() + menu:registerEventHandler("menu_close", LUI.SystemInfo.LeaveMenu) + + return menu +end + +local startmap = Engine.StreamingInstallMap +Engine.StreamingInstallMap = function(map, args, ...) + if (args == "set ui_play_credits 1; devmap ending;") then + LUI.FlowManager.RequestAddMenu(nil, "credits_menu") + else + startmap(map, args, ...) + end +end + +local creditsmap = function() + LUI.FlowManager.PushMenuStackToDVar() + + if LUI.LevelSelect.IsAllLevelCompleted() then + Engine.SetDvarString("ui_char_museum_mode", "credits_2", true) + else + Engine.SetDvarString("ui_char_museum_mode", "credits_black", true) + end + + startmap("ending", "set ui_play_credits 1; devmap ending;") +end + +LUI.MenuBuilder.registerType("credits_menu", function(f6_arg0, f6_arg1) + local f6_local0 = LUI.MenuTemplate.spMenuOffset + local title = "MENU_SP_CREDITS_CAPS" + + local f6_local2 = false + local f6_local3 = 0 + + local menu = LUI.MenuTemplate.new(f6_arg0, { + menu_title = title, + menu_top_indent = f6_local0 + f6_local3, + showSelectButton = false, + skipAnim = f6_local2 + }) + + menu:AddButton("MENU_SP_CREDITS_CAPS", creditsmap, nil, true, nil, { + desc_text = Engine.Localize("@LUA_MENU_CREDITS_DESC") + }) + + menu:setClass(LUI.SystemInfo) + menu:PopulateMissingProps(f6_arg1) + menu:ValidateProps(f6_arg1) + menu.id = "systemInfo_id" + + local f6_local5 = 300 + local f6_local6 = LUI.MenuTemplate.ListTop + f6_local0 + local f6_local7 = f6_arg1.menu_height + if not f6_local7 then + f6_local7 = f6_local5 + end + + f6_local7 = f6_local7 + f6_local6 - extraheight2 + + local f6_local9 = luiglobals.GenericMenuDims.OptionMenuWidth + 100 + local f6_local10 = menu.properties + local topoffset2 = LUI.MenuTemplate.ListTop + LUI.MenuTemplate.spMenuOffset + 50 + + local decobox = LUI.MenuBuilder.BuildRegisteredType("h1_box_deco", { + decoTopOffset = topoffset2 - topoffset + 15, + decoBottomOffset = -f6_local7, + decoRightOffset = -665 + extrawidth + }) + + menu:addElement(decobox) + + local decoleft = CoD.CreateState(0, 0.5, 8, 0.5, CoD.AnchorTypes.TopLeft) + decoleft.color = luiglobals.Colors.h1.light_grey + decobox:addElement(LUI.UILine.new(decoleft)) + + local decoright = CoD.CreateState(0, 0.5, -8, 0.5, CoD.AnchorTypes.TopRight) + decoright.color = luiglobals.Colors.h1.light_grey + decobox:addElement(LUI.UILine.new(decoright)) + + local element = LUI.UIVerticalList.new({ + leftAnchor = true, + rightAnchor = true, + topAnchor = true, + bottomAnchor = true, + left = spacing, + right = 100, + top = topoffset2 + 15, + bottom = 0, + spacing = spacing * 0.8 + }) + + element.id = "systemInfoList_id" + menu.vlist = element + menu:addElement(element) + + local optionmenuwidth = luiglobals.GenericMenuDims.OptionMenuWidth + luiglobals.GenericMenuDims.OptionMenuWidth = optionmenuwidth + extrawidth + + addlinkinfo(menu, "MENU_SYSINFO_CUSTOMER_SUPPORT_LINK", "MENU_SYSINFO_CUSTOMER_SUPPORT_URL", "github") + addlinkinfo(menu, "MENU_SYSINFO_DONATION_LINK", "MENU_SYSINFO_DONATION_URL", "donate") + + addcredits(menu) + + luiglobals.GenericMenuDims.OptionMenuWidth = optionmenuwidth + + menu:AddBackButton() + menu:registerEventHandler("menu_close", LUI.SystemInfo.LeaveMenu) + + return menu +end) diff --git a/data/ui_scripts/mods/__init__.lua b/data/cdata/ui_scripts/mods/__init__.lua similarity index 100% rename from data/ui_scripts/mods/__init__.lua rename to data/cdata/ui_scripts/mods/__init__.lua diff --git a/data/ui_scripts/mods/loading.lua b/data/cdata/ui_scripts/mods/loading.lua similarity index 50% rename from data/ui_scripts/mods/loading.lua rename to data/cdata/ui_scripts/mods/loading.lua index 7918d7f0..bf5c0bee 100644 --- a/data/ui_scripts/mods/loading.lua +++ b/data/cdata/ui_scripts/mods/loading.lua @@ -1,14 +1,3 @@ -game:addlocalizedstring("MENU_MODS", "MODS") -game:addlocalizedstring("MENU_MODS_DESC", "Load installed mods.") -game:addlocalizedstring("LUA_MENU_MOD_DESC_DEFAULT", "Load &&1.") -game:addlocalizedstring("LUA_MENU_MOD_DESC", "&&1\nAuthor: &&2\nVersion: &&3") -game:addlocalizedstring("LUA_MENU_LOADED_MOD", "Loaded mod: ^3&&1") -game:addlocalizedstring("LUA_MENU_AVAILABLE_MODS", "Available mods") -game:addlocalizedstring("LUA_MENU_UNLOAD", "Unload") -game:addlocalizedstring("LUA_MENU_UNLOAD_DESC", "Unload the currently loaded mod.") -game:addlocalizedstring("LUA_MENU_WORKSHOP", "Workshop") -game:addlocalizedstring("LUA_MENU_WORKSHOP_DESC", "Download and install mods.") - function createdivider(menu, text) local element = LUI.UIElement.new( { leftAnchor = true, @@ -50,25 +39,22 @@ LUI.addmenubutton("main_campaign", { }) function getmodname(path) - local name = path - game:addlocalizedstring(name, name) - game:addlocalizedstring("LUA_MENU_MOD_DESC_DEFAULT", "Load &&1.") - local desc = Engine.Localize("LUA_MENU_MOD_DESC_DEFAULT", name) - local infofile = path .. "/info.json" + local modinfo = mods.getinfo(path) - if (io.fileexists(infofile)) then - pcall(function() - local data = json.decode(io.readfile(infofile)) - game:addlocalizedstring(data.description, data.description) - game:addlocalizedstring(data.author, data.author) - game:addlocalizedstring(data.version, data.version) - desc = Engine.Localize("@LUA_MENU_MOD_DESC", - data.description, data.author, data.version) - name = data.name - end) + if (not modinfo.isvalid) then + game:addlocalizedstring(path, path) + local desc = Engine.Localize("LUA_MENU_MOD_DESC_DEFAULT", path) + + return path, desc + else + game:addlocalizedstring(modinfo.name, modinfo.name) + game:addlocalizedstring(modinfo.description, modinfo.description) + game:addlocalizedstring(modinfo.author, modinfo.author) + game:addlocalizedstring(modinfo.version, modinfo.version) + local desc = Engine.Localize("@LUA_MENU_MOD_DESC", + modinfo.description, modinfo.author, modinfo.version) + return modinfo.name, desc end - - return name, desc end LUI.MenuBuilder.registerType("mods_menu", function(a1) @@ -77,16 +63,17 @@ LUI.MenuBuilder.registerType("mods_menu", function(a1) exclusiveController = 0, menu_width = 400, menu_top_indent = LUI.MenuTemplate.spMenuOffset, - showTopRightSmallBar = true + showTopRightSmallBar = true, + uppercase_title = true }) - menu:AddButton("@LUA_MENU_WORKSHOP", function() + --[[menu:AddButton("@LUA_MENU_WORKSHOP", function() if (LUI.MenuBuilder.m_types_build["mods_workshop_menu"]) then LUI.FlowManager.RequestAddMenu(nil, "mods_workshop_menu") end end, nil, true, nil, { desc_text = Engine.Localize("@LUA_MENU_WORKSHOP_DESC") - }) + })--]] local modfolder = game:getloadedmod() if (modfolder ~= "") then @@ -102,21 +89,21 @@ LUI.MenuBuilder.registerType("mods_menu", function(a1) createdivider(menu, Engine.Localize("@LUA_MENU_AVAILABLE_MODS")) - if (io.directoryexists("mods")) then - local mods = io.listfiles("mods/") - for i = 1, #mods do - if (io.directoryexists(mods[i]) and not io.directoryisempty(mods[i])) then - local name, desc = getmodname(mods[i]) + local contentpresent = false - if (mods[i] ~= modfolder) then - game:addlocalizedstring(name, name) - menu:AddButton(name, function() - Engine.Exec("loadmod " .. mods[i]) - end, nil, true, nil, { - desc_text = desc - }) - end - end + local mods = mods.getlist() + for i = 1, #mods do + contentpresent = true + + local name, desc = getmodname(mods[i]) + + if (mods[i] ~= modfolder) then + game:addlocalizedstring(name, name) + menu:AddButton(name, function() + Engine.Exec("loadmod " .. mods[i]) + end, nil, true, nil, { + desc_text = desc + }) end end @@ -127,7 +114,10 @@ LUI.MenuBuilder.registerType("mods_menu", function(a1) LUI.Options.InitScrollingList(menu.list, nil) menu:CreateBottomDivider() - menu.optionTextInfo = LUI.Options.AddOptionTextInfo(menu) + + if (contentpresent) then + menu.optionTextInfo = LUI.Options.AddOptionTextInfo(menu) + end return menu end) diff --git a/data/ui_scripts/mods/store.lua b/data/cdata/ui_scripts/mods/store.lua similarity index 100% rename from data/ui_scripts/mods/store.lua rename to data/cdata/ui_scripts/mods/store.lua diff --git a/data/cdata/ui_scripts/patches/__init__.lua b/data/cdata/ui_scripts/patches/__init__.lua new file mode 100644 index 00000000..da3e488b --- /dev/null +++ b/data/cdata/ui_scripts/patches/__init__.lua @@ -0,0 +1 @@ +require("unlockall") diff --git a/data/cdata/ui_scripts/patches/unlockall.lua b/data/cdata/ui_scripts/patches/unlockall.lua new file mode 100644 index 00000000..fd33a69e --- /dev/null +++ b/data/cdata/ui_scripts/patches/unlockall.lua @@ -0,0 +1,33 @@ +if (Engine.InFrontend()) then + local levelselectmenu = LUI.sp_menus.LevelSelectMenu + levelselectmenu.DisplayUnlockAllFooterPrompt = function(f79_arg0, f79_arg1) + if Engine.GetDvarBool("profileMenuOption_hasUnlockedAll_SP") then + f79_arg0:AddHelp({ + name = "add_button_helper_text", + button_ref = "button_alt2", + helper_text = Engine.Localize("@LUA_MENU_CANCEL_UNLOCK_CAPS"), + side = "right", + clickable = true + }, levelselectmenu.SetUnlockAll) + else + f79_arg0:AddHelp({ + name = "add_button_helper_text", + button_ref = "button_alt2", + helper_text = Engine.Localize("@LUA_MENU_CAMPAIGN_UNLOCKED_ALL_TITLE"), + side = "right", + clickable = true + }, levelselectmenu.UnlockAllPopup) + end + end + + levelselectmenu.UnlockAllPopup = function(f70_arg0, f70_arg1) + LUI.FlowManager.RequestAddMenu(nil, "request_yesno_popup_generic", true, f70_arg1.controller, nil, { + popup_title = Engine.Localize("@LUA_MENU_CAMPAIGN_UNLOCKED_ALL_TITLE"), + yes_action = levelselectmenu.SetUnlockAll, + message_text = Engine.Localize("@MENU_COMPLETED_CHEAT") .. ". " .. + Engine.Localize("@LUA_MENU_CAMPAIGN_UNLOCKED_ALL_DESC") + }) + end +end + +CoD.AllowUnlockAllInShip = true diff --git a/data/ui_scripts/settings/__init__.lua b/data/cdata/ui_scripts/settings/__init__.lua similarity index 58% rename from data/ui_scripts/settings/__init__.lua rename to data/cdata/ui_scripts/settings/__init__.lua index 26b798ac..42ecd260 100644 --- a/data/ui_scripts/settings/__init__.lua +++ b/data/cdata/ui_scripts/settings/__init__.lua @@ -1,27 +1,4 @@ -game:addlocalizedstring("MENU_GENERAL", "GENERAL") -game:addlocalizedstring("MENU_GENERAL_DESC", "Set the client's settings.") -game:addlocalizedstring("LUA_MENU_AUTO_UPDATE", "Automatic updates") -game:addlocalizedstring("LUA_MENU_CHECK_UPDATES", "Check for updates") -game:addlocalizedstring("LUA_MENU_CHECK_UPDATES_DESC", "Check for updates.") -game:addlocalizedstring("LUA_MENU_DRAWING", "Drawing") -game:addlocalizedstring("LUA_MENU_UPDATES", "Updates") -game:addlocalizedstring("LUA_MENU_RENDERING", "Rendering") - -game:addlocalizedstring("LUA_MENU_DRAW_FPS", "Draw FPS") -game:addlocalizedstring("LUA_MENU_DRAW_FPS_DESC", "Enable or disable drawing fps or viewpos on screen.") -game:addlocalizedstring("LUA_MENU_FPS_ONLY", "FPS only") -game:addlocalizedstring("LUA_MENU_FPS_AND_VIEWPOS", "FPS and View Pos") - -game:addlocalizedstring("LUA_MENU_DRAW_SPEED", "Draw speed") -game:addlocalizedstring("LUA_MENU_DRAW_SPEED_DESC", "Enable or disable drawing the player speed on screen.") - -game:addlocalizedstring("LUA_MENU_DRAW_SPEEDGRAPH", "Draw speed graph") -game:addlocalizedstring("LUA_MENU_DRAW_SPEEDGRAPH_DESC", "Enable or disable the speed graph.") - -game:addlocalizedstring("LUA_MENU_R_FULLBRIGHT", "Fullbright") -game:addlocalizedstring("LUA_MENU_R_FULLBRIGHT_DESC", "Change the fullbright mode.") -game:addlocalizedstring("LUA_MENU_MODE2", "Mode 2") -game:addlocalizedstring("LUA_MENU_MODE3", "Mode 3") +require("language") function createdivider(menu, text) local element = LUI.UIElement.new({ @@ -62,10 +39,10 @@ LUI.MenuBuilder.m_types_build["settings_menu"] = function(a1) createdivider(menu, "@LUA_MENU_UPDATES") LUI.Options.CreateOptionButton( - menu, - "cg_auto_update", - "@LUA_MENU_AUTO_UPDATE", - "Enable or disable automatic updates on startup.", + menu, + "cg_auto_update", + "@LUA_MENU_AUTO_UPDATE", + "@LUA_MENU_AUTO_UPDATE_DESC", { { text = "@LUA_MENU_ENABLED", @@ -87,10 +64,10 @@ LUI.MenuBuilder.m_types_build["settings_menu"] = function(a1) createdivider(menu, "@LUA_MENU_DRAWING") LUI.Options.CreateOptionButton( - menu, - "cg_drawFps", - "@LUA_MENU_DRAW_FPS", - "@LUA_MENU_DRAW_FPS_DESC", + menu, + "cg_drawFPS", + "@LUA_MENU_DRAW_FPS", + "@LUA_MENU_DRAW_FPS_DESC", { { text = "@LUA_MENU_DISABLED", @@ -108,10 +85,10 @@ LUI.MenuBuilder.m_types_build["settings_menu"] = function(a1) ) LUI.Options.CreateOptionButton( - menu, - "cg_drawSpeed", - "@LUA_MENU_DRAW_SPEED", - "Enable or disable drawing the player speed on screen.", + menu, + "cg_drawSpeed", + "@LUA_MENU_DRAW_SPEED", + "@LUA_MENU_DRAW_SPEED_DESC", { { text = "@LUA_MENU_ENABLED", @@ -125,9 +102,9 @@ LUI.MenuBuilder.m_types_build["settings_menu"] = function(a1) ) LUI.Options.CreateOptionButton( - menu, - "cg_speedGraph", - "@LUA_MENU_DRAW_SPEEDGRAPH", + menu, + "cg_speedGraph", + "@LUA_MENU_DRAW_SPEEDGRAPH", "@LUA_MENU_DRAW_SPEEDGRAPH_DESC", { { @@ -144,10 +121,10 @@ LUI.MenuBuilder.m_types_build["settings_menu"] = function(a1) createdivider(menu, "@LUA_MENU_RENDERING") LUI.Options.CreateOptionButton( - menu, - "r_fullbright", - "@LUA_MENU_R_FULLBRIGHT", - "@LUA_MENU_R_FULLBRIGHT_DESC", + menu, + "r_fullbright", + "@LUA_MENU_R_FULLBRIGHT", + "@LUA_MENU_R_FULLBRIGHT_DESC", { { text = "@LUA_MENU_DISABLED", @@ -168,6 +145,44 @@ LUI.MenuBuilder.m_types_build["settings_menu"] = function(a1) } ) + createdivider(menu, "@LUA_MENU_AUDIO_OPTIONS") + + LUI.Options.CreateOptionButton( + menu, + "snd_musicDisabledForCustomSoundtrack", + "@LUA_MENU_MUSIC", + "@LUA_MENU_MUSIC_DESC", + { + { + text = "@LUA_MENU_DISABLED", + value = true + }, + { + text = "@LUA_MENU_ENABLED", + value = false + }, + } + ) + + createdivider(menu, "@MENU_GAME_BEGINNING") + + LUI.Options.CreateOptionButton( + menu, + "intro", + "@LUA_MENU_INTRO", + "@LUA_MENU_INTRO_DESC", + { + { + text = "@LUA_MENU_DISABLED", + value = false + }, + { + text = "@LUA_MENU_ENABLED", + value = true + }, + } + ) + LUI.Options.InitScrollingList(menu.list, nil) LUI.Options.AddOptionTextInfo(menu) @@ -175,3 +190,21 @@ LUI.MenuBuilder.m_types_build["settings_menu"] = function(a1) return menu end + +if not Engine.InFrontend() then + LUI.MenuTemplate.AddVignette = function(f36_arg0) + if not LUI.FlowManager.IsMenuTopmost(Engine.GetLuiRoot(), "advanced_video") then + local f36_local0 = CoD.CreateState(0, 0, 0, 0, CoD.AnchorTypes.All) + f36_local0.material = RegisterMaterial("h1_ui_bg_vignette") + local self = LUI.UIImage.new(f36_local0) + self:setupFullWindowElement() + f36_arg0:addElement(self) + end + end + LUI.MenuTemplate.InitInGameBkg = function(f38_arg0, f38_arg1, f38_arg2, f38_arg3) + LUI.MenuTemplate.AddDarken(f38_arg0, f38_arg1, f38_arg3, 0.55) + if not Engine.IsMultiplayer() and not LUI.FlowManager.IsMenuTopmost(Engine.GetLuiRoot(), "advanced_video") then + LUI.MenuTemplate.AddWorldBlur(f38_arg0, f38_arg1) + end + end +end diff --git a/data/cdata/ui_scripts/settings/language.lua b/data/cdata/ui_scripts/settings/language.lua new file mode 100644 index 00000000..942c19bb --- /dev/null +++ b/data/cdata/ui_scripts/settings/language.lua @@ -0,0 +1,161 @@ +LUI.addmenubutton("pc_controls", { + index = 4, + text = "@LUA_MENU_CHOOSE_LANGUAGE", + description = Engine.Localize("@LUA_MENU_CHOOSE_LANGUAGE_DESC"), + callback = function() + LUI.FlowManager.RequestAddMenu(nil, "choose_language_menu") + end +}) + +local universalfont = RegisterFont("fonts/mix.ttf", 30) + +local function setuniversalfont(lang) + LUI.MenuGenericButtons.ButtonLabelFont.Font = universalfont +end + +local function togglecustomfonts() + LUI.FlowManager.RequestAddMenu(nil, "generic_yesno_popup", false, nil, true, { + popup_title = Engine.Localize("@MENU_CCS_RESTART_CONFIRMATION_TITLE"), + message_text = Engine.Localize("@MENU_HDR_REBOOT_DESC"), + yes_action = function() + config.set("disable_custom_fonts", not config.get("disable_custom_fonts")) + updater.relaunch() + end + }) +end + +LUI.MenuBuilder.registerType("choose_language_menu", function(a1) + local menu = LUI.MenuTemplate.new(a1, { + menu_title = "@LUA_MENU_CHOOSE_LANGUAGE", + menu_list_divider_top_offset = -(LUI.H1MenuTab.tabChangeHoldingElementHeight + H1MenuDims.spacing), + menu_width = 240, + uppercase_title = true + }) + + local languages = Engine.GetSupportedLanguages() + local originalfont = LUI.MenuGenericButtons.ButtonLabelFont.Font + + for i = 1, #languages do + local id = languages[i].id + + local lang = Engine.GetCurrentLanguage() + + if language.isasian() or not language.isnonlatin() or not config.get("disable_custom_fonts") then + setuniversalfont(id) + end + + local button = menu:AddButton("", function() + LUI.FlowManager.RequestAddMenu(nil, "choose_language_confirm_popup", false, nil, true, { + language = languages[i].id + }) + end, languages[i].id == lang, true, nil, { + desc_text = Engine.Localize("LOCALE_" .. (languages[i].id)) + }) + + local label = button:getFirstDescendentById("text_label") + label:setText(Engine.ToUpperCase(languages[i].name)) + end + + LUI.MenuGenericButtons.ButtonLabelFont.Font = originalfont + + LUI.Options.InitScrollingList(menu.list, nil, { + rows = 10 + }) + + LUI.Options.AddOptionTextInfo(menu) + + if (language.isnonlatin() and not language.iscustom()) then + if (config.get("disable_custom_fonts")) then + menu:AddHelp({ + name = "add_button_helper_text", + button_ref = "button_alt2", + helper_text = Engine.Localize("@LUA_MENU_FALLBACK_ENABLE"), + side = "right", + clickable = true + }, togglecustomfonts) + else + menu:AddHelp({ + name = "add_button_helper_text", + button_ref = "button_alt2", + helper_text = Engine.Localize("@LUA_MENU_FALLBACK_DISABLE"), + side = "right", + clickable = true + }, togglecustomfonts) + end + end + + menu:AddBackButton() + + return menu +end) + +-- fix for Y-offset in button text (russian_partial, default font) +if config.get("language") == "russian_partial" and config.get("disable_custom_fonts") then + LUI.UIButtonText.IsOffsetedLanguage = function() + return true + end +end + +if not (config.get("disable_custom_fonts")) then + -- fix for Y-offset in button text (global patch, custom font) + LUI.UIButtonText.IsOffsetedLanguage = function() + return false + end + + -- fix for ammo counter (polish/russian) + if not Engine.InFrontend() then + local weaponinfodef = LUI.MenuBuilder.m_definitions["WeaponInfoHudDef"] + LUI.MenuBuilder.m_definitions["WeaponInfoHudDef"] = function(...) + local rus = CoD.Language.Russian + CoD.Language.Russian = 1337 + local pol = CoD.Language.Polish + CoD.Language.Polish = 1338 + local res = weaponinfodef(...) + CoD.Language.Russian = rus + CoD.Language.Polish = pol + return res + end + else + local levelselectmenu = LUI.sp_menus.LevelSelectMenu + local setupinfobox = levelselectmenu.SetupInfoBoxLeftForArcadeMode + levelselectmenu.SetupInfoBoxLeftForArcadeMode = function(...) + local rus = CoD.Language.Russian + CoD.Language.Russian = 1337 + local pol = CoD.Language.Polish + CoD.Language.Polish = 1338 + local res = setupinfobox(...) + CoD.Language.Russian = rus + CoD.Language.Polish = pol + return res + end + end + + -- fix for ammo counter (global patch) + if language.isnonlatin() then + local scale = function(size) + return size * 720 / 1080 + end + + CoD.TextSettings.SP_HudAmmoStatusText = { + Font = RegisterFont("fonts/mix_gothic.ttf", 16), + Height = 16 + } + + CoD.TextSettings.SP_HudAmmoCounterFont = { + Font = RegisterFont("fonts/mix_gothic.ttf", 34), + Height = 34 + } + + CoD.TextSettings.HudAmmoCounterFont = { + Font = RegisterFont("fonts/mix_gothic.ttf", 105), + Height = 64 + } + -- forced gothic font for headers (arabic/slavic) + if language.isslavic() or language.isarabic() then + CoD.TextSettings.H2TitleFont = { + Font = RegisterFont("fonts/mix_gothic.ttf", 56), + Height = scale(56) + } + end + end +end diff --git a/data/ui_scripts/branding/__init__.lua b/data/ui_scripts/branding/__init__.lua deleted file mode 100644 index 89368f2d..00000000 --- a/data/ui_scripts/branding/__init__.lua +++ /dev/null @@ -1,92 +0,0 @@ -local spacing = 10 -local topoffset = 15 - -local extrawidth = 50 -local extraheight = 40 - -LUI.MenuBuilder.m_types_build["SystemInfo"] = function (f6_arg0, f6_arg1) - local f6_local0 = LUI.MenuTemplate.spMenuOffset - local title = "LUA_MENU_SYSTEM_INFO_CAPS" - - local f6_local2 = false - local f6_local3 = 0 - - local menu = LUI.MenuTemplate.new(f6_arg0, { - menu_title = title, - menu_top_indent = f6_local0 + f6_local3, - showSelectButton = false, - skipAnim = f6_local2 - }) - - menu:setClass(LUI.SystemInfo) - menu:PopulateMissingProps(f6_arg1) - menu:ValidateProps(f6_arg1) - menu.id = "systemInfo_id" - - local f6_local5 = 300 - local f6_local6 = LUI.MenuTemplate.ListTop + f6_local0 - local f6_local7 = f6_arg1.menu_height - if not f6_local7 then - f6_local7 = f6_local5 - end - - f6_local7 = f6_local7 + f6_local6 - extraheight - - local f6_local9 = luiglobals.GenericMenuDims.OptionMenuWidth + 100 - local f6_local10 = menu.properties - local topoffset2 = LUI.MenuTemplate.ListTop + LUI.MenuTemplate.spMenuOffset - - local decobox = LUI.MenuBuilder.BuildRegisteredType("h1_box_deco", { - decoTopOffset = topoffset2 - topoffset + 15, - decoBottomOffset = -f6_local7, - decoRightOffset = -665 + extrawidth - }) - - menu:addElement(decobox) - - local decoleft = CoD.CreateState(0, 0.5, 8, 0.5, CoD.AnchorTypes.TopLeft) - decoleft.color = luiglobals.Colors.h1.light_grey - decobox:addElement(LUI.UILine.new(decoleft)) - - local decoright = CoD.CreateState(0, 0.5, -8, 0.5, CoD.AnchorTypes.TopRight) - decoright.color = luiglobals.Colors.h1.light_grey - decobox:addElement(LUI.UILine.new(decoright)) - - local element = LUI.UIVerticalList.new({ - leftAnchor = true, - rightAnchor = true, - topAnchor = true, - bottomAnchor = true, - left = spacing, - right = 100, - top = topoffset2 + 15, - bottom = 0, - spacing = spacing * 0.8 - }) - - element.id = "systemInfoList_id" - menu.vlist = element - menu:addElement(element) - - local optionmenuwidth = luiglobals.GenericMenuDims.OptionMenuWidth - luiglobals.GenericMenuDims.OptionMenuWidth = optionmenuwidth + extrawidth - - menu:AddInfo(Engine.Localize("MENU_SYSINFO_VERSION"), function() - return Engine.GetBuildNumber() - end) - - menu:AddInfo(Engine.Localize("MENU_SYSINFO_CUSTOMER_SUPPORT_LINK"), function() - return Engine.Localize("MENU_SYSINFO_CUSTOMER_SUPPORT_URL") - end) - - menu:AddInfo(Engine.Localize("MENU_SYSINFO_DONATION_LINK"), function() - return Engine.Localize("MENU_SYSINFO_DONATION_URL") - end) - - luiglobals.GenericMenuDims.OptionMenuWidth = optionmenuwidth - - menu:AddBackButton() - menu:registerEventHandler("menu_close", LUI.SystemInfo.LeaveMenu) - - return menu -end \ No newline at end of file diff --git a/data/ui_scripts/patches/__init__.lua b/data/ui_scripts/patches/__init__.lua deleted file mode 100644 index 9002be83..00000000 --- a/data/ui_scripts/patches/__init__.lua +++ /dev/null @@ -1,27 +0,0 @@ -local maps = { - "af_caves", - "af_chase", - "airport", - "arcadia", - "boneyard", - "cliffhanger", - "contingency", - "dc_whitehouse", - "dcburning", - "dcemp", - "ending", - "estate", - "favela", - "favela_escape", - "gulag", - "invasion", - "oilrig", - "roadkill", - "trainer", - "museum", -} - -for i = 1, #maps do - local string = "LUA_MENU_SP_LOCATION_" .. maps[i]:upper() - game:addlocalizedstring(string, string) -end diff --git a/data/zone_source/ara_h2_mod_common.csv b/data/zone_source/ara_h2_mod_common.csv new file mode 100644 index 00000000..fcb21674 --- /dev/null +++ b/data/zone_source/ara_h2_mod_common.csv @@ -0,0 +1 @@ +localize,arabic \ No newline at end of file diff --git a/data/zone_source/build.txt b/data/zone_source/build.txt new file mode 100644 index 00000000..aca38044 --- /dev/null +++ b/data/zone_source/build.txt @@ -0,0 +1,27 @@ +ara_h2_mod_common +deu_h2_mod_common +eng_h2_mod_common +eng_h2_mod_patch_af_caves +ens_h2_mod_common +ens_h2_mod_patch_af_caves +fra_h2_mod_common +h2_mod_common +h2_mod_patch_af_caves +h2_mod_patch_dc_whitehouse +h2_mod_pre_gfx +ita_h2_mod_common +jpf_h2_mod_common +jpp_h2_mod_common +jpp_h2_mod_patch_af_caves +kor_h2_mod_common +pol_h2_mod_common +por_h2_mod_common +rup_h2_mod_common +rup_h2_mod_patch_af_caves +rus_h2_mod_common +rus_h2_mod_patch_dc_whitehouse +sch_h2_mod_common +sna_h2_mod_common +sna_h2_mod_patch_af_caves +spa_h2_mod_common +tch_h2_mod_common diff --git a/data/zone_source/cze_h2_mod_common.csv b/data/zone_source/cze_h2_mod_common.csv new file mode 100644 index 00000000..2b550465 --- /dev/null +++ b/data/zone_source/cze_h2_mod_common.csv @@ -0,0 +1,2 @@ +localize,czech +stringtable,video/subtitles.csv \ No newline at end of file diff --git a/data/zone_source/deu_h2_mod_common.csv b/data/zone_source/deu_h2_mod_common.csv new file mode 100644 index 00000000..dacfeb4c --- /dev/null +++ b/data/zone_source/deu_h2_mod_common.csv @@ -0,0 +1 @@ +localize,german \ No newline at end of file diff --git a/data/zone_source/eng_h2_mod_common.csv b/data/zone_source/eng_h2_mod_common.csv new file mode 100644 index 00000000..ad5605d3 --- /dev/null +++ b/data/zone_source/eng_h2_mod_common.csv @@ -0,0 +1,2 @@ +localize,english +stringtable,video/subtitles.csv \ No newline at end of file diff --git a/data/zone_source/eng_h2_mod_patch_af_caves.csv b/data/zone_source/eng_h2_mod_patch_af_caves.csv new file mode 100644 index 00000000..ed5756f0 --- /dev/null +++ b/data/zone_source/eng_h2_mod_patch_af_caves.csv @@ -0,0 +1 @@ +sound,afcaves_nkl_goodluck \ No newline at end of file diff --git a/data/zone_source/ens_h2_mod_common.csv b/data/zone_source/ens_h2_mod_common.csv new file mode 100644 index 00000000..19f4c463 --- /dev/null +++ b/data/zone_source/ens_h2_mod_common.csv @@ -0,0 +1,2 @@ +localize,english_safe +stringtable,video/subtitles.csv \ No newline at end of file diff --git a/data/zone_source/ens_h2_mod_patch_af_caves.csv b/data/zone_source/ens_h2_mod_patch_af_caves.csv new file mode 100644 index 00000000..ed5756f0 --- /dev/null +++ b/data/zone_source/ens_h2_mod_patch_af_caves.csv @@ -0,0 +1 @@ +sound,afcaves_nkl_goodluck \ No newline at end of file diff --git a/data/zone_source/fra_h2_mod_common.csv b/data/zone_source/fra_h2_mod_common.csv new file mode 100644 index 00000000..9b2dbec0 --- /dev/null +++ b/data/zone_source/fra_h2_mod_common.csv @@ -0,0 +1 @@ +localize,french \ No newline at end of file diff --git a/data/zone_source/h2_mod_common.csv b/data/zone_source/h2_mod_common.csv new file mode 100644 index 00000000..bd763196 --- /dev/null +++ b/data/zone_source/h2_mod_common.csv @@ -0,0 +1,2 @@ +localize,english +stringtable,credits.csv diff --git a/data/zone_source/h2_mod_patch_af_caves.csv b/data/zone_source/h2_mod_patch_af_caves.csv new file mode 100644 index 00000000..e69de29b diff --git a/data/zone_source/h2_mod_patch_dc_whitehouse.csv b/data/zone_source/h2_mod_patch_dc_whitehouse.csv new file mode 100644 index 00000000..e69de29b diff --git a/data/zone_source/h2_mod_pre_gfx.csv b/data/zone_source/h2_mod_pre_gfx.csv new file mode 100644 index 00000000..d460b0f6 --- /dev/null +++ b/data/zone_source/h2_mod_pre_gfx.csv @@ -0,0 +1,5 @@ +stringtable,font_replacements.csv +ttf,fonts/ibmplexsansarabic-semibold_custom.ttf +ttf,fonts/mix.ttf +ttf,fonts/mix_gothic.ttf +ttf,fonts/mix_open.ttf \ No newline at end of file diff --git a/data/zone_source/ita_h2_mod_common.csv b/data/zone_source/ita_h2_mod_common.csv new file mode 100644 index 00000000..1705a41b --- /dev/null +++ b/data/zone_source/ita_h2_mod_common.csv @@ -0,0 +1 @@ +localize,italian \ No newline at end of file diff --git a/data/zone_source/jpf_h2_mod_common.csv b/data/zone_source/jpf_h2_mod_common.csv new file mode 100644 index 00000000..82dbc6a5 --- /dev/null +++ b/data/zone_source/jpf_h2_mod_common.csv @@ -0,0 +1 @@ +localize,japanese_full \ No newline at end of file diff --git a/data/zone_source/jpp_h2_mod_common.csv b/data/zone_source/jpp_h2_mod_common.csv new file mode 100644 index 00000000..fd88ef04 --- /dev/null +++ b/data/zone_source/jpp_h2_mod_common.csv @@ -0,0 +1 @@ +localize,japanese_partial \ No newline at end of file diff --git a/data/zone_source/jpp_h2_mod_patch_af_caves.csv b/data/zone_source/jpp_h2_mod_patch_af_caves.csv new file mode 100644 index 00000000..ed5756f0 --- /dev/null +++ b/data/zone_source/jpp_h2_mod_patch_af_caves.csv @@ -0,0 +1 @@ +sound,afcaves_nkl_goodluck \ No newline at end of file diff --git a/data/zone_source/kor_h2_mod_common.csv b/data/zone_source/kor_h2_mod_common.csv new file mode 100644 index 00000000..44b82ad3 --- /dev/null +++ b/data/zone_source/kor_h2_mod_common.csv @@ -0,0 +1 @@ +localize,korean \ No newline at end of file diff --git a/data/zone_source/pol_h2_mod_common.csv b/data/zone_source/pol_h2_mod_common.csv new file mode 100644 index 00000000..e5eb6beb --- /dev/null +++ b/data/zone_source/pol_h2_mod_common.csv @@ -0,0 +1 @@ +localize,polish \ No newline at end of file diff --git a/data/zone_source/por_h2_mod_common.csv b/data/zone_source/por_h2_mod_common.csv new file mode 100644 index 00000000..7fdb2bf6 --- /dev/null +++ b/data/zone_source/por_h2_mod_common.csv @@ -0,0 +1 @@ +localize,portuguese \ No newline at end of file diff --git a/data/zone_source/rup_h2_mod_common.csv b/data/zone_source/rup_h2_mod_common.csv new file mode 100644 index 00000000..30914c90 --- /dev/null +++ b/data/zone_source/rup_h2_mod_common.csv @@ -0,0 +1,2 @@ +localize,russian_partial +stringtable,video/subtitles.csv \ No newline at end of file diff --git a/data/zone_source/rup_h2_mod_patch_af_caves.csv b/data/zone_source/rup_h2_mod_patch_af_caves.csv new file mode 100644 index 00000000..ed5756f0 --- /dev/null +++ b/data/zone_source/rup_h2_mod_patch_af_caves.csv @@ -0,0 +1 @@ +sound,afcaves_nkl_goodluck \ No newline at end of file diff --git a/data/zone_source/rus_h2_mod_common.csv b/data/zone_source/rus_h2_mod_common.csv new file mode 100644 index 00000000..c41c7781 --- /dev/null +++ b/data/zone_source/rus_h2_mod_common.csv @@ -0,0 +1,2 @@ +localize,russian +stringtable,video/subtitles.csv \ No newline at end of file diff --git a/data/zone_source/rus_h2_mod_patch_dc_whitehouse.csv b/data/zone_source/rus_h2_mod_patch_dc_whitehouse.csv new file mode 100644 index 00000000..f406325b --- /dev/null +++ b/data/zone_source/rus_h2_mod_patch_dc_whitehouse.csv @@ -0,0 +1 @@ +sound,dcwhite_cpd_burnitdown \ No newline at end of file diff --git a/data/zone_source/sch_h2_mod_common.csv b/data/zone_source/sch_h2_mod_common.csv new file mode 100644 index 00000000..d5a16e93 --- /dev/null +++ b/data/zone_source/sch_h2_mod_common.csv @@ -0,0 +1 @@ +localize,simplified_chinese \ No newline at end of file diff --git a/data/zone_source/sna_h2_mod_common.csv b/data/zone_source/sna_h2_mod_common.csv new file mode 100644 index 00000000..4f5218d5 --- /dev/null +++ b/data/zone_source/sna_h2_mod_common.csv @@ -0,0 +1 @@ +localize,spanishna \ No newline at end of file diff --git a/data/zone_source/sna_h2_mod_patch_af_caves.csv b/data/zone_source/sna_h2_mod_patch_af_caves.csv new file mode 100644 index 00000000..ed5756f0 --- /dev/null +++ b/data/zone_source/sna_h2_mod_patch_af_caves.csv @@ -0,0 +1 @@ +sound,afcaves_nkl_goodluck \ No newline at end of file diff --git a/data/zone_source/spa_h2_mod_common.csv b/data/zone_source/spa_h2_mod_common.csv new file mode 100644 index 00000000..c3d7c1f2 --- /dev/null +++ b/data/zone_source/spa_h2_mod_common.csv @@ -0,0 +1 @@ +localize,spanish \ No newline at end of file diff --git a/data/zone_source/tch_h2_mod_common.csv b/data/zone_source/tch_h2_mod_common.csv new file mode 100644 index 00000000..201d2000 --- /dev/null +++ b/data/zone_source/tch_h2_mod_common.csv @@ -0,0 +1 @@ +localize,traditional_chinese \ No newline at end of file diff --git a/data/zonetool/cze_h2_mod_common/video/subtitles.csv b/data/zonetool/cze_h2_mod_common/video/subtitles.csv new file mode 100644 index 00000000..bb9c00c4 --- /dev/null +++ b/data/zonetool/cze_h2_mod_common/video/subtitles.csv @@ -0,0 +1,188 @@ +af_caves_load,14,17.5,"^2MacTavish: ^7Máme jednu dobrou UMP. Oni jich mají tisíce.", +af_caves_load,18,21,"^2MacTavish: ^7Ani nevíme jestli jsou ty informace vůbec k něčemu.", +af_caves_load,21.3,22.3,"^2MacTavish: ^7Pricei.", +af_caves_load,23.3,24.3,"^2MacTavish: ^7..Pricei?", +af_caves_load,25,30.2,"^2Price: ^7Zdravý člověk ráno nevstane s představou, že tohle je poslední den života na Zemi.", +af_caves_load,30.5,33.5,"^2Price: ^7Myslím, že to není prokletí, ale přepych. ", +af_caves_load,33.5,36.7,"^2Price: ^7Vědět, že už jsi blízko konce je docela osvobuzující. ", +af_caves_load,37.5,40,"^2Price: ^7Skvělý čas na ohlédnutí se zpět.", +af_caves_load,41,46,"^2Price: ^7Přemoženi. V oslabení. Bezhlavě na sebevražedné misi.", +af_caves_load,46,50,"^2Price: ^7Ale ten písek a kameny tady, potřísněné tisíci lety boje...", +af_caves_load,51.2,54,"^2Price: ^7Za tohle si nás budou pamatovat. ", +af_caves_load,54.5,60,"^2Price: ^7Protože ze všech těch největších nočních můr si právě tuhle vybíráme my sami.", +af_caves_load,60,63.4,"^2Price: ^7Míříme neústupně kupředu jako výdech z nitra Země.", +af_caves_load,64,66.7,"^2Price: ^7S vášní v našich srdcích a s cílem na dohled: ", +af_caves_load,67.8,69.5,"^2Price: ^7Dokážem to.", +af_caves_load,70,72,"^2Price: ^7Zabijem ho.", +af_chase_load,16.3,18,"^2Price: ^7Tohle jen pro pořádek.", +af_chase_load,18.3,21,"^2Price: ^7Dějiny jsou psané vítězi.", +af_chase_load,22,24,"^2Price: ^7A dějiny jsou plné lhářů.", +af_chase_load,25,30,"^2Price: ^7Jestli přežije a my ne, bude zapsána ta jeho pravda -", +af_chase_load,30,32,"^2Price: ^7- a naše ztracena. ", +af_chase_load,32,39,"^2Price: ^7Shepherd bude hrdina. Protože co potřebujete, abyste změnili svět, je jedna dobrá lež a řeka plná krve.", +af_chase_load,40,45,"^2Price: ^7Chystá se dokončit největší trik, jaký kdy lhář hrál v historii.", +af_chase_load,45.7,48,"^2Price: ^7Jeho pravda bude jeho pravdou", +af_chase_load,48,52.2,"^2Price: ^7Ale jen když přežije a my zemřeme", +airport_load,7.5,11,"^2Shepherd: ^7Zbytek Task Force 141 je v ACS, Allene.", +airport_load,12,16,"^2Shepherd: ^7Dva muži srovnali se zemí celou základnu. Nyní po vás žádám víc. ", +airport_load,18,23,"^2Shepherd: ^7Včera jsi byl vojákem v první linii. Ale dnes už jsou první linie historií.", +airport_load,23,29,"^2Shepherd: ^7Uniformy relikviemi. Válka zuří všude. A budou tu oběti.", +airport_load,36,41,"^2Shepherd: ^7Tenhle Makarov bojuje svou vlastní válku a nemá žádná pravidla. Žádné zábrany.", +airport_load,41,44.3,"^2Shepherd: ^7Nevadí mu mučení, obchod s bílým masem, ani genocida.", +airport_load,45,52,"^2Shepherd: ^7Není oddaný žádné vlajce či krajině nebo jakýmkoliv ideálům. Mění krev za peníze.", +airport_load,53,55,"^2Shepherd: ^7Odteď je to tvůj nej přítel", +airport_load,56,59.3,"^2Shepherd: ^7Nechtěj ani vědět kolik už stálo jen tě k němu dostat.", +airport_load,60,62.6,"^2Shepherd: ^7Bude to stát i část tebe samotného. ", +airport_load,64,67,"^2Shepherd: ^7Ale nebude to nic, v porovnání s tím, co zachráníš.", +arcadia_load,25,27.2,"^2Shepherd: ^7Vypněte někdo tu zatracenou TV", +arcadia_load,29,33,"^2Shepherd: ^7Moje jednotka je mimo naši vlast. Přebírám velení vaší jednotky, Seržante Foley. ", +arcadia_load,34,36,"^2Sgt. Foley: ^7Ano pane. Velení je vaše.", +arcadia_load,37,40,"^2Shepherd: ^7Vymohl jsem pro vás Strykera z Osmé obrněné.", +arcadia_load,46,48,"^2Sgt. Foley: ^7Honey Badger je umíněná děvka pane", +arcadia_load,48,52,"^2Shepherd: ^7Zavede vás dovnitř. Rusové pronikají přes naši obranu do naší zóny.", +arcadia_load,52,54,"^2Shepherd: ^7Nemůžem si dovolit o ni přijít.", +arcadia_load,54.6,58.3,"^2Sgt. Foley: ^7Jen to vyznačte na mapě pane. Nedostanou ji.", +boneyard_load,16.7,20,"^2MacTavish: ^7Roachi? Ghoste? Hlaste se, Ghoste! Jsi tam? Je tam někdo?", +boneyard_load,20,25,"^2Price: ^7Jsou mrtví Soape. Shepherd čistí dům. Jsem na cestě k tobě.", +boneyard_load,26,28,"^2MacTavish: ^7Shepherd nás zradil. ", +boneyard_load,28,31,"^2Price: ^7Aby tě někdo zradil, musíš mu věřit. Já nikomu nevěřím.", +boneyard_load,31.3,34,"^2Price: ^7Nikolai, ozvi se. Vidíš naši lokaci?", +boneyard_load,34,38,"^2Nikolai: ^7Da. Jsem na cestě Pricei. Nejsem ale sám.", +boneyard_load,38,41,"^2Nikolai: ^7Máte tu Shepherdovy muže na jedné straně, Makarovovy na druhé. ", +boneyard_load,43,45,"^2Price: ^7Pak je teda budeme muset odklidit všechny.", +boneyard_load,45,47,"^2Nikolai: ^7Necháme je, ať se vyřídí navzájem.", +boneyard_load,47,50,"^2Nikolai: ^7Tak či tak, uvidíme se na druhé straně můj příteli.", +cliffhanger_load,23.3,25,"^2Sv. Allen: ^7Tak jak vypadám?", +cliffhanger_load,25,27,"^2Shepherd: ^7Jako jeden z těch zlých. ", +cliffhanger_load,27,29,"^2Shepherd: ^7Skvělé pro tvoje krytí.", +cliffhanger_load,29,31,"^2Sv. Allen: ^7Hlavní cena je Makarov. ", +cliffhanger_load,31,36,"^2Shepherd: ^7Makarov není žádná hlavní cena. Je to kurva. Nejhorší zdivočelý vrah.", +cliffhanger_load,37,40,"^2Shepherd: ^7Jen nezapomeň na svou novou identitu. Udrží tě naživu. ", +cliffhanger_load,41,45.5,"^2Shepherd: ^7Vítej ve 141. Nejlepší jednotce bojovníků na světě.", +cliffhanger_load,46,49,"^2Sv. Allen: ^7Je to čest pane. Kdy se seznámím se zbytkem týmu?", +cliffhanger_load,49.3,53.5,"^2Shepherd: ^7Zrovna mají za úkol zajistit zřícený ACS modul za nepřátelskou linií.", +cliffhanger_load,54,56,"^2Sv. Allen: ^7Jsou pod vodou? ", +cliffhanger_load,56,59,"^2Shepherd: ^7Spíš teď někde mrznou.", +contingency_load,12,14,"^2Kapitán MacTavish: ^7Přenos téměř hotov.", +contingency_load,16.3,19,"^2Kapitán MacTavish: ^7Generále Shepherde máte na drátě kapitána Price.", +contingency_load,20,22,"^2Shepherd: ^7Zpět do hry, kapitáne.", +contingency_load,22,24,"^2Kapitán Price: ^7Spíš bych řekl: „Kdo uteče vyhraje“", +contingency_load,24,27,"^2Kapitán Price: ^7Tady je to horší, než to peklo odkud jsem teď přijel.", +contingency_load,28,31,"^2Shepherd: ^7Mysleli jsme, že nahodíme zpět ACS dřív než se do toho dostanou Rusové", +contingency_load,32,33,"^2Shepherd: ^7Mýlili jsme se.", +contingency_load,33.6,38,"^2Shepherd: ^7Makarov pak udělal ze Spojených státu svého obětního beránka. Pak už byly všude jen plameny.", +contingency_load,39,41,"^2Shepherd: ^7Co je to za obrázky co mi posíláte? ", +contingency_load,41.6,46,"^2Kapitán Price: ^7Chcete-li uhasit zapálený ropný vrt, tak musíte zařídit pořádně velkou explozi, pane.", +contingency_load,46,48.2,"^2Kapitán Price: ^7Vytáhne kyslík. Udusí plamen.", +contingency_load,49,54,"^2Shepherd: ^7Pricei, byl jste zavřený příliš dlouho. Srovnejte si to v hlavě synu.", +contingency_load,55,58,"^2Kapitán Price: ^7Shepherde, jste schopen pro vítězství udělat co je nutné? ", +contingency_load,58.6,60,"^2Shepherd: ^7Kdykoliv.", +contingency_load,60.5,65,"^2Kapitán Price: ^7Máme tu zatraceně velkej oheň. Budeme potřebovat větší výbuch.", +contingency_load,66,70.2,"^2Shepherd: ^7Byl jste ve vězení asi opravdu moc dlouho Pricei. Soustřeďte se na Makarova.", +contingency_load,71,73,"^2Kapitán Price: ^7Nemáme čas pane. Tuhle válku musíme ukončit dnes. ", +contingency_load,73,76,"^2Shepherd: ^7Neptám se vás Pricei. Je to rozkaz! Budete...", +contingency_load,79,82,"^2Kapitán Price: ^7Vypadá to, že jsme ztratili spojení.", +dcburning_load,8,18,"^2 ^7OBYVATELÉ OKRESU PRINCE GEORGE JSOU INSTRUOVÁNI, ABY ŠLI PŘÍMO NA ZDRAVOTNÍ ODDĚLENÍ NA 147 KIRKWOOD AVE. ",1 +dcburning_load,18,27,"^2 ^7PICK-UP KAŽDÝCH 15 MINUT OD KAMPUSU COMMUNITY COLLEGE V UNIVERZITNÍM MĚSTĚ. /// PROBÍHÁ NOUZOVÁ EVAKUACE. /// ",1 +dcburning_load,27,36,"^2 ^7OKAMŽITĚ SE VYDEJTE DO NEJBLIŽŠÍHO SERVISNÍHO PŘÍSTŘEŠKU. VOJÁCI TAM BUDOU, ABY SE S VÁMI SETKALI. ",1 +dcburning_load,36,44,"^2 ^7PŘINESTE PRŮKAZ TOTOŽNOSTI S FOTOGRAFIÍ A NE VÍCE NEŽ JEDNU POLOŽKU ZAVAZADEL NA OSOBU. /// BUĎTE SI VĚDOMI SVÉHO OKOLÍ. BUĎTE VE STŘEHU.",1 +dcemp_load,27,31.5,"^2Ministr obrany: ^7Pánové, raketa míří na východní pobřeží. Ztratíme Bílý dům.", +dcemp_load,32,35,"^2Shepherd: ^7Už jsme ho postavili jednou, postavíme ho zase.", +dcemp_load,36,37,"^2Ministr obrany: ^7A oběti? ", +dcemp_load,37.8,45,"^2Shepherd: ^7Zřejmě od 30,000 do 50,000. Záleží na přesné poloze detonace. Systém se zhroutí.", +dcemp_load,46,49,"^2Ministr obrany: ^7Generále Shepherde, varoval jste nás. Měli jsme poslouchat.", +dcemp_load,49.5,55,"^2Shepherd: ^7Až budou mluvit o této chvíli, my nebudeme ti co byli na stráži, když Amerika umírala.", +dcemp_load,55.2,61,"^2Shepherd: ^7Za tohle všechno nese zodpovědnost jeden muž. Musí vědět o Makarovovi. ", +dcemp_load,61.8,65,"^2Ministr obrany: ^7Cokoliv potřebujete Generále. Máte volnou ruku.", +estate_load,7,12,"^2Shepherd: ^7Byl to rušný týden. Ztratili jsme víc než v nejhorších nočních můrách. Ale dostaneme se z toho.", +estate_load,16,20.3,"^2Shepherd: ^7Mám volnou ruku. A hodlám využít všech možností jak zabít Makarova.", +estate_load,22,28,"^2Shepherd: ^7I přesto co svět říká, my nejsme barbaři, nezabíjíme civilisty. Jsme přesní.", +estate_load,30,34,"^2Shepherd: ^7Ve stínech se ukrývá ďábelský chlap a my ho přivedeme na světlo.", +estate_load,34.7,38,"^2Shepherd: ^7Jakmile všichni spatří jeho tvář, napíšeme historii pánové.", +estate_load,42.5,46.2,"^2Shepherd: ^7Tohle jsou poslední bezpečná útočiště na Zemi pro Makarova a jeho muže.", +estate_load,47,49.3,"^2Kapitán Price: ^7Vypadá to, že budeme muset být asi na dvou místech.", +estate_load,50,51,"^2Shepherd: ^7Nemožné?", +estate_load,51,53,"^2Kapitán Price: ^7Ne pro 1-4-1.", +estate_load,53,55.4,"^2Ghost: ^7Padesátiprocentní šance dostat Makarova, eh?", +estate_load,56,59,"^2Ghost: ^7Kapitáne Pricei, žádám o svolení postarat se s Roachem o ten úkryt. ", +estate_load,59.8,63,"^2Kapitán Price: ^7Schváleno. Soap a já si vezmeme vrakoviště v Afghánistánu. ", +estate_load,63.3,69,"^2Shepherd: ^7Výborně. Odřízneme jim všechny únikové cesty. Dnes to skončí.", +estate_load,70,74,"^2Kapitán Price: ^7Hm. Přísahal bych, že jsem tuhle válku ukončili včera.", +favela_escape_load,28.3,30.5,"^2Ghost: ^7Nemůžu tu nikoho chytit.", +favela_escape_load,38,42.5,"^2Kapitán MacTavish: ^7Rusové si museli zkopírovat ten ACS modul. Mají klíče ke všem dveřím v Americe.", +favela_escape_load,42.5,48,"^2Ghost: ^7A teď zabíjejí tisíc Američanů za každého mrtvého civilistu v Moskvě. Vypadá to že už nemáme přátele.", +favela_escape_load,49.2,52,"^2Kapitán MacTavish: ^7Jednoho znám. Pojďme najít telefonní budku.", +favela_escape_load,53.3,59,"^2Ghost: ^7Vše co od Rojase máme je to, že chlap, kterého Makarov nesnáší víc než Američany, je zavřenej ve věznici.", +favela_escape_load,59.5,65,"^2Kapitán MacTavish: ^7To je všechno. Jestli to toho psychopata přiláká, pověsíme ho ze stromu jako návnadu.", +favela_load,13,16.5,"^2Ghost: ^7Rusové nenechají tenhle masakr bez odezvy. Bude to krvavý.", +favela_load,17,20,"^2Kapitán MacTavish: ^7Pravda příteli. V očích celého světa jsou teď oběťmi.", +favela_load,20,24.3,"^2Kapitán MacTavish: ^7Nikdo neřekne ani slovo, když budou Rusové mlátit všechny Američany na dohled. ", +favela_load,24.3,30,"^2Shepherd: ^7Makarov byl o krok napřed. Zanechal tisíce těl u nohou Američanů.", +favela_load,31,36.6,"^2Kapitán MacTavish: ^7Jsme jediní, kteří ví že to udělal Makarov. Naše důvěryhodnost zemřela s Allenem. Potřebujeme důkaz.", +favela_load,37.3,39.3,"^2Shepherd: ^7Jdeme po stopách.", +favela_load,45,47,"^2Shepherd: ^7Alejandro Rojas.", +favela_load,48.5,50,"^2Kapitán MacTavish: ^7Nikdy jsem o něm neslyšel. ", +favela_load,50,53,"^2Shepherd: ^7Znáte ho jako Červený Alex. Podporoval útok.", +favela_load,54.5,59,"^2Kapitán MacTavish: ^7Jediná kulka pro rozpoutání hněvu celého národa. Což znamená... ", +favela_load,59,61,"^2Shepherd: ^7Naše letenka k Makarovovi. ", +gulag_load,16,19,"^2Kapitán MacTavish: ^7Šestá jednotka se zbrojí. Čas zakročit.", +gulag_load,20.7,24,"^2Kapitán MacTavish: ^7Tahle budova má dlouhou historii. Žádná část není hezká.", +gulag_load,24,28,"^2Kapitán MacTavish: ^7Nejdříve to byl zámek s žalářem. Byl postaven, aby vydržel jakýkoliv útok.", +gulag_load,28.8,33.2,"^2Kapitán MacTavish: ^7Budova přežila mnoho tuhých zim. Okupanti... ti tolik štěstí neměli.", +gulag_load,34,37,"^2Kapitán MacTavish: ^7Klášter. Ten nepřežil čistku.", +gulag_load,37,41,"^2Kapitán MacTavish: ^7Za poslední století ji používali pro lidi, kteří se jim nehodili, ale zároveň je nemohli zabít. ", +gulag_load,43,48,"^2Kapitán MacTavish: ^7To místo je plné přeživších obětí minulé války... a to bych přísahal, že jsme ji vyhráli my.", +gulag_load,48,53,"^2Kapitán MacTavish: ^7Předpokládám, že teď to bude jako den na závodišti: vsadíme na starého koně a všechny překvapíme.", +gulag_load,53.8,58,"^2Kapitán MacTavish: ^7Šest-dva-sedm je návnada, kterou mu nadhodíme.", +intro_credits_load,20,22,"^2SAS: ^7To je ten nováček pane.", +intro_credits_load,25,27,"^2Kapitán Price: ^7Proč se sakra jmenuješ – Soap?", +intro_credits_load,43.5,45.2,"^1Al-Asad: ^7Válka je způsob podvodu.", +intro_credits_load,48.5,51.5,"^2Kapitán Price: ^7Nikolai je ve velkých problémech. Musíme ho odtud dostat…", +intro_credits_load,52,54,"^2Kapitán Price: ^7O své přátele se staráme.", +intro_credits_load,64,67,"^2Kapitán Price: ^7Zakhaev. Imran Zakhaev.", +intro_credits_load,78,82,"^1Zakhaev: ^7Krev mého syna je na jejich rukou.", +intro_credits_load,89,93.5,"^2Kapitán Price: ^7Delta One X-Ray, máme vypustenou raketu. Opakuji vupustili raketu...", +invasion_load,22,26,"^2Sídlo NORAD: ^7Sand Bravo, vidíme 70 objektů ve vaší zóně, prosím ověřte to.", +invasion_load,27,31.5,"^2Nome AFB: ^7Velmi vtipné, základno. Negativní, přepínám.", +invasion_load,31.8,33.9,"^2NORAD Controller: ^7Jo, může to být závada v jednom z ACS modulů.", +invasion_load,34,38,"^2Sídlo NORAD: ^7Sand Bravo, spouštíme diagnostiku pro odhalení případné chyby.", +invasion_load,39,42.2,"^2Nome AFB: ^7Obloha je čistá základno. Máte tam nějaký duchy. Přepínám.", +invasion_load,43,48,"^2Sídlo NORAD: ^7Zulu X-Ray 6. V sektoru jsou stopy po asi 100 objektech, prosím ověřte.", +invasion_load,49,55,"^2Vandenberg AFB: ^7Negativní. Máme čisté zorné pole. Nevím co vám na to mám říct. Sluneční výboje? Dnes je vysoká sluneční aktivita. ", +invasion_load,55.8,61,"^2Sídlo NORAD: ^7Sierra Delta, uh... možná tu máme menší ACS chybu. Máte něco v zorném poli?", +invasion_load,61.3,63,"^2Letový dispečer: ^7Jsou všude!", +invasion_load,63,65,"^2Sídlo NORAD: ^7Sierra Delta, opakuji!", +invasion_load,65,69,"^2Letový dispečer: ^7Koukám na stíhačky přes I-95! Jak se tam zatraceně dostaly?", +invasion_load,69,73,"^2Sídlo NORAD: ^7Vydržte! Zkusím kontaktovat nejbližší jednotku v daném sektoru.", +invasion_load,73,79,"^2Sgt. Foley: ^7Rozumím. Tady První batalion, 75. pluk, Seržant Foley, velitel Hunter dva-jedna. Slyšíte, přepínám?", +invasion_load,79,87,"^2Sídlo NORAD: ^7Všem stanicím - satelitní zabezpečení bylo vypnuto. SOSUS a Pave Paws jsou momentálně nefunkční.", +oilrig_load,20.8,24,"^2Kapitán MacTavish: ^7Vypadá to, že míříme špatným směrem pane. Neměli bychom se vrátit do boje?", +oilrig_load,24,26,"^2Shepherd: ^7Kolem je spousta bojů, MacTavishi.", +oilrig_load,27,33,"^2Shepherd: ^7Jsem rád, že jste to v Jižní Americe zvládli. Seskupujete se s 6. jednotkou. Budete vést protiútok.", +oilrig_load,35,42,"^2Shepherd: ^7Vězeň šest-dva-sedm. Věříme že je to ten, kterého chce Makarov. Nemůžeme se k němu ale dostat.", +oilrig_load,45,47,"^2Kapitán MacTavish: ^7Ropná plošina?", +oilrig_load,47,49,"^2Shepherd: ^7Rusové je používají jako SAM základny. ", +oilrig_load,50,56,"^2Shepherd: ^7Pracovníci jsou živými štíty, takže to nemůžeme jen tak odpálit. A tahle je nejméně chráněná.", +oilrig_load,58.8,62,"^2Shepherd: ^7Hoši, vím že vás teď posílám do sebevražedné akce...", +oilrig_load,62,67,"^2Kapitán MacTavish: ^7Brání si to, což znamená, že to chceme. Obzvlášť, jestli nás to dovede k šest-dva-sedmičce.", +roadkill_load,8,12.3,"^2Shepherd: ^7Jsme nejmocnější vojenská jednotka v historii lidstva.", +roadkill_load,13,15,"^2Shepherd: ^7Každý boj je náš boj.", +roadkill_load,16,21,"^2Shepherd: ^7Protože co se stane tady, má dopad na záležitosti tam. Nemůžeme se nezúčastnit.", +roadkill_load,22,30,"^2Shepherd: ^7Způsoby moderního boje znamenají rozdíl mezi prosperitou vašich lidí a naprostou zkázou.", +roadkill_load,30.5,37,"^2Shepherd: ^7Nemůžeme vám dát svobodu. Ale můžeme vám říct jak ji získat.", +roadkill_load,37,41.0,"^2Shepherd: ^7A to, moji přátelé, je cennější než celá vojenská základna plná železa", +roadkill_load,42.5,48,"^2Shepherd: ^7Jasně, že záleží na tom kdo má jak velkou armádu, ale mnohem víc záleží na tom kdo jí velí.", +roadkill_load,49,53,"^2Shepherd: ^7Tohle je čas pro hrdiny. Čas pro legendy.", +roadkill_load,54,56,"^2Shepherd: ^7Dějiny jsou psané vítězi.", +roadkill_load,57,59,"^2Shepherd: ^7Pojďme do toho.", +trainer_load,10.7,14,"^2Shepherd: ^7Čím víc se věci mění, tím víc zůstavají stejný.", +trainer_load,15,21,"^2Shepherd: ^7Hranice se posouvají, noví hráči přicházejí, ale síla si vždy najde cestu až na vrchol. ", +trainer_load,24,29,"^2Shepherd: ^7Bojovali jsme vedle Rusů. Měli jsme vědět, že nás za to budou nenávidět.", +trainer_load,30,35,"^2Shepherd: ^7Dějiny jsou psané vítězi. Teď tu stojím a myslím že jsme vyhráli.", +trainer_load,37,41,"^2Shepherd: ^7Ale vždy, když se zbavíte nepřítele, najdou si náhraduo někoho mnohem horšího.", +trainer_load,43.8,48,"^2Shepherd: ^7Mění se lokace, důvody, úkoly.", +trainer_load,49,52,"^2Shepherd: ^7Včerejší nepřátelé jsou dnešní rekruti.", +trainer_load,52,59,"^2Shepherd: ^7Vycvič je pro boj vedle sebe a modli se, aby se nerozhodli nenávidět tě i za to.", +trainer_load,70,72,"^2Shepherd: ^7Stejná sračka, jinej den. ", +trainer_load,72.8,77,"^2Shepherd: ^7Víte co hledám seržante Foley. Mějte oči otevřené.", +trainer_load,78,82,"^2Sgt. Foley: ^7Dnes ke mě dorazí nová jednotka pane. Pošlu vám to nejlepší co mám.", diff --git a/data/zonetool/eng_h2_mod_common/localizedstrings/english.json b/data/zonetool/eng_h2_mod_common/localizedstrings/english.json new file mode 100644 index 00000000..05197dc4 --- /dev/null +++ b/data/zonetool/eng_h2_mod_common/localizedstrings/english.json @@ -0,0 +1,38 @@ +{ + "DEADQUOTE_ALL_THAT_IS_NECESSARY": "\"When bad men combine, the good must associate;\nelse they will fall, one by one, an unpitied sacrifice in a contemptible struggle.\"", + "DEADQUOTE_ALL_WARFARE_IS_BASED": "\"Warfare is the way of deception.\"", + "DEADQUOTE_BEFORE_YOU_EMBARK_UPON": "\"Curse someone, then you will get two graves.\"", + "DEADQUOTE_BEFORE_YOU_EMBARK_UPON_AUTHOR": "- Japanese proverb", + "DEADQUOTE_DO_NOTHING": "\"The strongest of all warriors are these two — Time and Patience.\"", + "DEADQUOTE_DO_NOTHING_AUTHOR": "- Leo Tolstoy, War and Peace", + "DEADQUOTE_GOD_TAKES_SIDES": "\"God is not on the side of the big battalions,\nbut on the side of those who shoot best.\"", + "DEADQUOTE_GOD_TAKES_SIDES_AUTHOR": "- Voltaire", + "DEADQUOTE_IN_WAR_TRUTH_IS_THE_FIRST_AUTHOR": "- Unknown", + "DEADQUOTE_LIVE_WELL_IT_IS_THE_GREATEST": "\"Living well is the best revenge.\"", + "DEADQUOTE_LIVE_WELL_IT_IS_THE_GREATEST_AUTHOR": "- from Proverbs collected\nby George Herbert", + "DEADQUOTE_NATION_GREAT_DISTINCT": "\"The nation that will insist on drawing a broad line of demarcation between the fighting man and the thinking man is liable to find its fighting done by fools and its thinking done by cowards.\"", + "DEADQUOTE_NATION_GREAT_DISTINCT_AUTHOR": "- Sir William Butler, British Army officer", + "DEADQUOTE_NEARLY_ALL_MEN_CAN_STAND": "\"If you want to find out what a man is to the bottom, give him power.\nAny man can stand adversity - only a great man can stand prosperity.\"", + "DEADQUOTE_NEARLY_ALL_MEN_CAN_STAND_AUTHOR": "- Robert G. Ingersoll", + "DEADQUOTE_NO_BATTLE_PLAN_SURVIVES_AUTHOR": "- Helmuth von Moltke", + "DEADQUOTE_REVENGE_AT_FIRST_THOUGH": "\"Revenge, at first though sweet,\nBitter ere long back on itself recoils.\"", + "DEADQUOTE_REVENGE_AT_FIRST_THOUGH_AUTHOR": "- John Milton, Paradise Lost", + "DEADQUOTE_REVENGE_IS_PROFITABLE": "\"Revenge is profitable, gratitude is expensive.\"", + "DEADQUOTE_ROUGH_MEN_READY": "\"Those who 'abjure' violence can only do so because others are committing violence on their behalf.\"", + "DEADQUOTE_THE_END_OF_WAR_AUTHOR": "- George Santayana", + "DEADQUOTE_THE_INDEFINITE_COMBINATION": "\"The indefinite combination of human fallibility and nuclear weapons will destroy nations.\"", + "DEADQUOTE_THE_WILL_TO_WIN": "\"War is such an unjust and ugly thing\n that those who wage it try to stifle their consciences.\"", + "DEADQUOTE_THE_WILL_TO_WIN_AUTHOR": "- Leo Tolstoy", + "DEADQUOTE_TRY_TO_LOOK_UNIMPORTANT": "\"Everyone thinks of changing the world, but no one thinks of changing himself.\"", + "DEADQUOTE_TRY_TO_LOOK_UNIMPORTANT_AUTHOR": "- Leo Tolstoy", + "DEADQUOTE_WAR_DOES_NOT_DETERMINE_AUTHOR": "- Unknown", + "DEADQUOTE_WAR_IS_DELIGHTFUL_TO": "\"War is sweet to those that never have experienced it.\"", + "DEADQUOTE_WAR_IS_DELIGHTFUL_TO_AUTHOR": "- Pindar", + "DEADQUOTE_WE_KNOW_WHERE_THEY_ARE": "\"We know where they [Iraq's WMD] are.\nThey're in the area around Tikrit and Baghdad and east, west, south and north somewhat.\"", + "DEADQUOTE_WE_KNOW_WHERE_THEY_ARE_AUTHOR": "- Donald Rumsfeld,\nUS SecDef in 2003", + "DEADQUOTE_WE_SLEEP_SAFELY_IN_OUR": "\"The greater the state, the more wrong and cruel its patriotism, and the greater is the sum of suffering upon which its power is founded.\"", + "DEADQUOTE_WE_SLEEP_SAFELY_IN_OUR_AUTHOR": "- Leo Tolstoy", + "DEADQUOTE_WORLD_WAR_IV": "\"The only way to win the next world war is to prevent it.\"", + "DEADQUOTE_WORLD_WAR_IV_AUTHOR": "- Dwight D. Eisenhower", + "SUBTITLE_AFCAVES_NKL_GOODLUCK23": "^2Nikolai: ^7Then good luck, my friend. God be with you." +} \ No newline at end of file diff --git a/data/zonetool/eng_h2_mod_common/video/subtitles.csv b/data/zonetool/eng_h2_mod_common/video/subtitles.csv new file mode 100644 index 00000000..3959f663 --- /dev/null +++ b/data/zonetool/eng_h2_mod_common/video/subtitles.csv @@ -0,0 +1,188 @@ +af_caves_load,14,17.5,^2MacTavish: ^7We've got one good UMP. They've got a thousand. , +af_caves_load,18,21,^2MacTavish: ^7We don't even know if Makarov's intel's any good. , +af_caves_load,21.3,22.3,^2MacTavish: ^7Price. , +af_caves_load,23.3,24.3,^2MacTavish: ^7...Price?, +af_caves_load,25,30.2,^2Price: ^7The healthy human mind doesn't wake up in the morning thinking this is its last day on Earth. , +af_caves_load,30.5,33.5,^2Price: ^7But I think that's a luxury. Not a curse. , +af_caves_load,33.5,36.7,^2Price: ^7To know you're close to the end is a kind of freedom. , +af_caves_load,37.5,40,^2Price: ^7Good time to take... inventory. , +af_caves_load,41,46,^2Price: ^7Outgunned. Outnumbered. Out of our minds. On a suicide mission. , +af_caves_load,46,50,"^2Price: ^7But the sand and rocks here, stained with thousands of years of warfare...", +af_caves_load,51.2,54,^2Price: ^7They will remember us. For this., +af_caves_load,54.5,60,"^2Price: ^7Because out of all our vast array of nightmares, this is the one we choose for ourselves. ", +af_caves_load,60,63.4,^2Price: ^7We go forward like a breath exhaled from the Earth. , +af_caves_load,64,66.7,^2Price: ^7With vigor in our hearts and one goal in sight:, +af_caves_load,67.8,69.5,^2Price: ^7We. Will. , +af_caves_load,70,72,^2Price: ^7Kill him. , +af_chase_load,16.3,18,^2Price: ^7This is for the record., +af_chase_load,18.3,21,^2Price: ^7History is written by the victor., +af_chase_load,22,24,^2Price: ^7History is filled with liars. , +af_chase_load,25,30,"^2Price: ^7If he lives and we die, his truth becomes written - ", +af_chase_load,30,32,^2Price: ^7- and ours is lost., +af_chase_load,32,39,^2Price: ^7Shepherd will be a hero. 'Cause all you need to change the world is one good lie and a river of blood., +af_chase_load,40,45,^2Price: ^7He's about to complete the greatest trick a liar ever played on history., +af_chase_load,45.7,48,^2Price: ^7His truth will be the truth., +af_chase_load,48,52.2,"^2Price: ^7But only if he lives, and we die.", +airport_load,7.5,11,"^2Shepherd: ^7The rest of Task Force 141 brought in the ACS, Allen. ", +airport_load,12,16,^2Shepherd: ^7Two men took down an entire base. I ask much more from you now. , +airport_load,18,23,^2Shepherd: ^7Yesterday you were a soldier on the front lines. But today front lines are history. , +airport_load,23,29,^2Shepherd: ^7Uniforms are relics. The war rages everywhere. And there will be casualties. , +airport_load,36,41,^2Shepherd: ^7This man Makarov is fighting his own war and he has no rules. No boundaries. , +airport_load,41,44.3,"^2Shepherd: ^7He doesn't flinch at torture, human trafficking, or genocide.", +airport_load,45,52,^2Shepherd: ^7He's not loyal to a flag or a country or any set of ideals. He trades blood for money. , +airport_load,53,55,^2Shepherd: ^7He's your new best friend. , +airport_load,56,59.3,^2Shepherd: ^7You don't want to know what it's cost already to put you next to him., +airport_load,60,62.6,^2Shepherd: ^7It will cost you a piece of yourself., +airport_load,64,67,^2Shepherd: ^7It will cost nothing compared to everything you'll save. , +arcadia_load,25,27.2,^2Shepherd: ^7Someone turn off that damn TV., +arcadia_load,29,33,"^2Shepherd: ^7My Task Force is out of the country. I'm commandeering your unit, Sergeant Foley.", +arcadia_load,34,36,"^2Sgt. Foley: ^7Yes, Sir. All yours, Sir.", +arcadia_load,37,40,^2Shepherd: ^7I've requisitioned a Stryker from the Eighth Armored., +arcadia_load,46,48,"^2Sgt. Foley: ^7Honey Badger's a mean bitch, Sir.", +arcadia_load,48,52,^2Shepherd: ^7She'll walk you in. The Russians are burning through our defenses and our intel. , +arcadia_load,52,54,^2Shepherd: ^7Can't let 'em take this corner., +arcadia_load,54.6,58.3,"^2Sgt. Foley: ^7Just point it out on the map, Sir. They won't take it. ", +boneyard_load,16.7,20,"^2MacTavish: ^7Roach? Ghost? Come in, Ghost! Do you copy? Does anyone copy?", +boneyard_load,20,25,"^2Price: ^7They're dead, Soap. Shepherd's cleaning house. I'm working my way back to you. ", +boneyard_load,26,28,^2MacTavish: ^7Shepherd betrayed us. , +boneyard_load,28,31,^2Price: ^7Have to trust someone to be betrayed. I never did. , +boneyard_load,31.3,34,"^2Price: ^7Nikolai, come in. Do you have our location? ", +boneyard_load,34,38,"^2Nikolai: ^7Da. Inbound, Price. But I am not the only one. ", +boneyard_load,38,41,"^2Nikolai: ^7You've got Shepherd's men on one side, Makarov's on the other. ", +boneyard_load,43,45,^2Price: ^7We'll have to take them all out then. , +boneyard_load,45,47,^2Nikolai: ^7Or let them take each other out. , +boneyard_load,47,50,"^2Nikolai: ^7Either way, I'll see you on the other side my friend. ", +cliffhanger_load,23.3,25,^2PFC Allen: ^7So how do I look? , +cliffhanger_load,25,27,^2Shepherd: ^7Like one of the bad guys., +cliffhanger_load,27,29,^2Shepherd: ^7Perfect for your undercover assignment. , +cliffhanger_load,29,31,^2PFC Allen: ^7So Makarov is the prize. , +cliffhanger_load,31,36,^2Shepherd: ^7Makarov's no prize. He's a whore. A mad-dog killer for the highest bidder., +cliffhanger_load,37,40,^2Shepherd: ^7Just remember your new identity. It'll keep you alive. , +cliffhanger_load,41,45.5,^2Shepherd: ^7Welcome to the 141. Best handpicked group of warriors on the planet. , +cliffhanger_load,46,49,"^2PFC Allen: ^7It's an honor, Sir. When do I meet the rest of the team? ", +cliffhanger_load,49.3,53.5,^2Shepherd: ^7They're on a mission recovering a downed ACS module behind enemy lines. , +cliffhanger_load,54,56,^2PFC Allen: ^7Their feet wet? , +cliffhanger_load,56,59,^2Shepherd: ^7Imagine they're just about freezing right now. , +contingency_load,12,14,^2Captain MacTavish: ^7Uplink nearly complete. , +contingency_load,16.3,19,^2Captain MacTavish: ^7General Shepherd you're online with Captain Price. , +contingency_load,20,22,"^2Shepherd: ^7Back from the brink, Captain. ", +contingency_load,22,24,"^2Captain Price: ^7\"Out of the frying pan\" is more like it.", +contingency_load,24,27,^2Captain Price: ^7This world looks more like hell than the one I just left. , +contingency_load,28,31,^2Shepherd: ^7We thought we'd recovered the ACS before the Russians could crack it. , +contingency_load,32,33,^2Shepherd: ^7We were wrong. , +contingency_load,33.6,38,^2Shepherd: ^7Then Makarov turned the U.S. into his scapegoat. Next thing you know there's flames everywhere. , +contingency_load,39,41,^2Shepherd: ^7What's this image you're sending me?, +contingency_load,41.6,46,"^2Captain Price: ^7You wanna put out an oil fire, Sir, you set off a bigger explosion right next to it.", +contingency_load,46,48.2,^2Captain Price: ^7Sucks away the oxygen. Snuffs the flame. , +contingency_load,49,54,"^2Shepherd: ^7Price, you been locked away too long. Better get your mind right, son. ", +contingency_load,55,58,"^2Captain Price: ^7Shepherd, are you willing to do what is necessary to win? ", +contingency_load,58.6,60,^2Shepherd: ^7Always. , +contingency_load,60.5,65,^2Captain Price: ^7We got ourselves a pretty big fire. Gonna need a huge bang. , +contingency_load,66,70.2,"^2Shepherd: ^7You've been in the Gulag too long, Price. Focus on taking out Makarov. ", +contingency_load,71,73,"^2Captain Price: ^7No time, Sir. We need to end this war today. ", +contingency_load,73,76,"^2Shepherd: ^7I'm not asking you, Price. This is an order! You're to...", +contingency_load,79,82,^2Captain Price: ^7Looks like we lost our connection. , +dcburning_load,8,18,^2 ^7PRINCE GEORGE'S COUNTY RESIDENTS ARE INSTRUCTED TO GO DIRECTLY TO THE HEALTH DEPARTMENT AT 147 KIRKWOOD AVE. ,1 +dcburning_load,18,27,^2 ^7PICK-UPS EVERY 15 MINUTES FROM COMMUNITY COLLEGE CAMPUS IN UNIVERSITY TOWN. /// EMERGENCY EVACUATION IN PROGRESS. /// ,1 +dcburning_load,27,36,^2 ^7HEAD IMMEDIATELY TO YOUR NEAREST SERVICE SHELTER. TROOPS WILL BE THERE TO MEET YOU. ,1 +dcburning_load,36,44,^2 ^7BRING A PHOTO ID AND NO MORE THAN ONE BAGGAGE ITEM PER PERSON. /// BE AWARE OF YOUR SURROUNDINGS. REMAIN ALERT.,1 +dcemp_load,27,31.5,"^2SecDef: ^7Gentlemen, the missile's vector puts it en route to the East Coast. We will lose the White House. ", +dcemp_load,32,35,"^2Shepherd: ^7We've rebuilt it before, we'll rebuild it again. ", +dcemp_load,36,37,^2SecDef: ^7Casualties?, +dcemp_load,37.8,45,"^2Shepherd: ^7Possibly 30,000 to 50,000. Depends on the exact location of the detonation. All systems will go down. ", +dcemp_load,46,49,"^2SecDef: ^7General Shepherd, you warned us. We should've listened. ", +dcemp_load,49.5,55,"^2Shepherd: ^7When they speak of this moment, we will not be the ones who stood guard while America died.", +dcemp_load,55.2,61,^2Shepherd: ^7One man is responsible for all this. Makarov must be brought to light. , +dcemp_load,61.8,65,"^2SecDef: ^7Whatever you need, General. You've got a blank check. ", +estate_load,7,12,"^2Shepherd: ^7It's been a tough week, gentlemen. We've lost more than we ever dreamed. But we will recover. ", +estate_load,16,20.3,\n^2Shepherd: ^7I've got a blank check. And we're gonna use every cent of it killin' Makarov. , +estate_load,22,28,"^2Shepherd: ^7Despite what the world may say, we are not savages, we don't kill civilians. We use precision. ", +estate_load,30,34,^2Shepherd: ^7There's an evil man hiding in these shadows and we're gonna bring him into the light. , +estate_load,34.7,38,"^2Shepherd: ^7Once his face is revealed, we will write history, gentlemen. ", +estate_load,42.5,46.2,^2Shepherd: ^7These are the last safe havens left on Earth for Makarov and his men. , +estate_load,47,49.3,^2Captain Price: ^7Sounds like we gotta be in two places at once. , +estate_load,50,51,^2Shepherd: ^7Impossible? , +estate_load,51,53,^2Captain Price: ^7Not for the One-Four-One. , +estate_load,53,55.4,"^2Ghost: ^7Fifty-fifty chance to take out Makarov, eh? ", +estate_load,56,59,"^2Ghost: ^7Captain Price, request permission to take the safehouse with Roach. ", +estate_load,59.8,63,^2Captain Price: ^7Granted. Soap and I will take the boneyard in Afghanistan. , +estate_load,63.3,69,^2Shepherd: ^7Very well. We will cut off all avenues of escape. This ends now., +estate_load,70,74,^2Captain Price: ^7Strange. I coulda sworn we ended this war yesterday. , +favela_escape_load,28.3,30.5,^2Ghost: ^7I can't get anyone on the horn. , +favela_escape_load,38,42.5,^2Captain MacTavish: ^7The Russians must've copied the ACS module. Got the key to every lock in America. , +favela_escape_load,42.5,48,^2Ghost: ^7And they're killing a thousand Americans for every dead civilian in Moscow. Looks like we're all outta friends. , +favela_escape_load,49.2,52,"^2Captain MacTavish: ^7I know a guy. Let's find a payphone, if they still exist. ", +favela_escape_load,53.3,59,^2Ghost: ^7All we got outta Rojas is that the only guy Makarov hates worse than Americans is locked up in a Gulag. , +favela_escape_load,59.5,65,"^2Captain MacTavish: ^7It's all we got. If this con's the bait to catch that psychopath, let's hang him from a tree. ", +favela_load,13,16.5,\n^2Ghost: ^7The Russians ain't gonna let this massacre go unanswered. It's gonna get bloody., +favela_load,17,20,"\n^2Captain MacTavish: ^7Too right, mate. Now, in the eyes of the world, they're the victims.", +favela_load,20,24.3,^2Captain MacTavish: ^7No one's gonna say a word when the Russians club every American they can reach., +favela_load,24.3,30,^2Shepherd: ^7Makarov was one move ahead. Now he's left thousands of bodies at the feet of an American., +favela_load,31,36.6,^2Captain MacTavish: ^7We're the only ones who know it was Makarov's op. Our credibility died with Allen. We need proof. , +favela_load,37.3,39.3,^2Shepherd: ^7Follow the shell., +favela_load,45,47,^2Shepherd: ^7Alejandro Rojas., +favela_load,48.5,50,"^2Captain MacTavish: ^7Never heard of him, Sir. ", +favela_load,50,53,^2Shepherd: ^7You know him as Alex the Red. He supplied the assault. , +favela_load,54.5,59,^2Captain MacTavish: ^7One bullet to unleash the fury of a whole nation. Which means..., +favela_load,59,61,^2Shepherd: ^7He's our ticket to Makarov., +gulag_load,16,19,^2Captain MacTavish: ^7Sixth Fleet's mopping up. Time to move in. , +gulag_load,20.7,24,"^2Captain MacTavish: ^7Long history, this building. Not much of it pretty. ", +gulag_load,24,28,^2Captain MacTavish: ^7Started out as a castle. With an actual dungeon. Built to withstand any siege. , +gulag_load,28.8,33.2,^2Captain MacTavish: ^7Building survived every brutal winter. The occupants... they weren't so lucky. , +gulag_load,34,37,^2Captain MacTavish: ^7The Monastery. Didn't survive the Purges., +gulag_load,37,41,"^2Captain MacTavish: ^7Over the last century it's played host to anyone the government didn't want, but couldn't kill. ", +gulag_load,43,48,^2Captain MacTavish: ^7Place is filled with living casualties of the last war... which I swear I thought we'd won. , +gulag_load,48,53,"^2Captain MacTavish: ^7But I suppose it's all a day at the races: you back the losing horse, and this is where you end up. ", +gulag_load,53.8,58,"^2Captain MacTavish: ^7Six-Two-Seven is the piece of meat Makarov wants, so let's cut him loose. ", +intro_credits_load,20,22,^2SAS: ^7It's the F.N.G. sir., +intro_credits_load,25,27,^2Captain Price: ^7What the hell kind of name is Soap?, +intro_credits_load,43.5,45.2,"^1Al-Asad: ^7Warfare is the way of deception.", +intro_credits_load,48.5,51.5,^2Captain Price: ^7Nikolai's in hell right now. We're gonna walk him out…, +intro_credits_load,52,54,^2Captain Price: ^7We take care of our friends., +intro_credits_load,64,67,^2Captain Price: ^7Zakhaev. Imran Zakhaev., +intro_credits_load,78,82,^1Zakhaev: ^7My son's blood on their hands., +intro_credits_load,89,93.5,"^2Captain Price: ^7Delta One X-Ray, we have a missile launch, I repeat we have a missile...", +invasion_load,22,26,"^2NORAD HQ: ^7Sand Bravo, we're reading 70 bogeys in your sector, please verify. ", +invasion_load,27,31.5,"^2Nome AFB: ^7Very funny, Station. That's a big negative, over.", +invasion_load,31.8,33.9,"^2NORAD Controller: ^7Yeah, might be a glitch in one of the ACS modules.", +invasion_load,34,38,"^2NORAD HQ: ^7Sand Bravo, be advised, running diagnostics to scan for malfunction. ", +invasion_load,39,42.2,"^2Nome AFB: ^7The skies are clear, Station. You got yourself some phantom dots. Over. ", +invasion_load,43,48,"^2NORAD HQ: ^7Zulu X-Ray 6. Signs in your sector of some 100 bogeys, please advise. ", +invasion_load,49,55,"^2Vandenberg AFB: ^7Negatory, Station. Scope is clear. I dunno what to tell ya. Solar interference? Heavy sunspot activity today. ", +invasion_load,55.8,61,"^2NORAD HQ: ^7Sierra Delta, uh... we may have a minor ACS fault here. Do you have anything on your scope?", +invasion_load,61.3,63,^2Air Traffic Controller: ^7They're everywhere!, +invasion_load,63,65,"^2NORAD HQ: ^7Sierra Delta, repeat! ", +invasion_load,65,69,^2Air Traffic Controller: ^7I'm lookin' at fighter jets over I-95! How the hell did they get through? , +invasion_load,69,73,^2NORAD HQ: ^7Standby! Attempting to contact the nearest unit in that sector., +invasion_load,73,79,"^2Sgt. Foley: ^7I read you. This is First Battalion, 75th Ranger Regiment, Sergeant Foley, acting commander of Hunter Two-One. Do you copy over? ", +invasion_load,79,87,"^2NORAD HQ: ^7All stations, be advised - satellite surveillance has been disabled. SOSUS and Pave Paws arrays are inoperative at this time.", +oilrig_load,20.8,24,"^2Captain MacTavish: ^7Seems we're headed the wrong direction, Sir. Shouldn't we be coming back to the fight? ", +oilrig_load,24,26,"^2Shepherd: ^7Plenty of fight to go around, MacTavish. ", +oilrig_load,27,33,^2Shepherd: ^7Glad you made it outta South America. You're meeting up with the 6th Fleet. Leadin' the counter-strike. , +oilrig_load,35,42,^2Shepherd: ^7Prisoner Six-Two-Seven. We believe that's who Makarov's got the mad-on for. But we can't get to him. , +oilrig_load,45,47,"^2Captain MacTavish: ^7Oilrigs, Sir? ", +oilrig_load,47,49,^2Shepherd: ^7Russians are using them as SAM sites. , +oilrig_load,50,56,"^2Shepherd: ^7Oil workers are human shields, so we can't just blow up the rigs wholesale. And this one is the least defended. ", +oilrig_load,58.8,62,"^2Shepherd: ^7Boys, I know I'm sending you into the meat grinder on this one...", +oilrig_load,62,67,"^2Captain MacTavish: ^7They're defending it, so it means we want it. Especially if it gets us to Six-Two-Seven. ", +roadkill_load,8,12.3,^2Shepherd: ^7We are the most powerful military force in the history of man., +roadkill_load,13,15,^2Shepherd: ^7Every fight is our fight. , +roadkill_load,16,21,"^2Shepherd: ^7Because what happens over here, matters over there. We don't get to sit one out. ", +roadkill_load,22,30,"^2Shepherd: ^7Learning to use the tools of modern warfare is the difference between the prospering of your people, and utter destruction. ", +roadkill_load,30.5,37,^2Shepherd: ^7We can't give you freedom. But we can give you the know-how to acquire it. , +roadkill_load,37,41.0,"^2Shepherd: ^7And that, my friends, is worth more than a whole army base of steel. ", +roadkill_load,42.5,48,"^2Shepherd: ^7Sure it matters who's got the biggest stick, but it matters a helluva lot more who's swinging it. ", +roadkill_load,49,53,^2Shepherd: ^7This is a time for heroes. A time for legends. , +roadkill_load,54,56,^2Shepherd: ^7History is written by the victors., +roadkill_load,57,59,^2Shepherd: ^7Let's get to work., +trainer_load,10.7,14,"^2Shepherd: ^7The more things change, the more they stay the same. ", +trainer_load,15,21,"^2Shepherd: ^7Boundaries shift, new players step in, but power always finds a place to rest its head. ", +trainer_load,24,29,^2Shepherd: ^7We fought and bled alongside the Russians. We shoulda known they'd hate us for it. , +trainer_load,30,35,"^2Shepherd: ^7History is written by the victor. And here I am, \nthinking we'd won. ", +trainer_load,37,41,^2Shepherd: ^7But you bring down one enemy and they find someone even worse to replace him. , +trainer_load,43.8,48,"^2Shepherd: ^7Locations change, the rationale, the objective. ", +trainer_load,49,52,^2Shepherd: ^7Yesterday's enemies are today's recruits. , +trainer_load,52,59,"^2Shepherd: ^7Train them to fight alongside you, and pray they don't eventually decide to hate you for it too. ", +trainer_load,70,72,"^2Shepherd: ^7Same shit, different day. ", +trainer_load,72.8,77,"^2Shepherd: ^7You know what I'm looking for, Sergeant Foley. Keep your eyes open. ", +trainer_load,78,82,"^2Sgt. Foley: ^7Got a new batch hittin' the pit today, Sir. I'll send you the best I find. ", diff --git a/data/zonetool/eng_h2_mod_patch_af_caves/sounds/afcaves_nkl_goodluck.json b/data/zonetool/eng_h2_mod_patch_af_caves/sounds/afcaves_nkl_goodluck.json new file mode 100644 index 00000000..a77097b6 --- /dev/null +++ b/data/zonetool/eng_h2_mod_patch_af_caves/sounds/afcaves_nkl_goodluck.json @@ -0,0 +1,199 @@ +{ + "aliasName": "afcaves_nkl_goodluck", + "count": 1, + "head": [ + { + "aliasName": "afcaves_nkl_goodluck", + "secondaryAliasName": null, + "chainAliasName": null, + "subtitle": "SUBTITLE_AFCAVES_NKL_GOODLUCK23", + "mixerGroup": null, + "soundfile": { + "type": 2, + "exists": true, + "totalMsec": 4568, + "isLocalized": true, + "isStreamed": true, + "fileIndex": 0, + "raw": { + "dir": "voiceovers/afcaves", + "name": "afcaves_nkl_2_3_r" + } + }, + "flags": 2097562, + "priority": 18, + "dspBus": "voices_critical", + "volMod": "voices_dialog_radio", + "volMin": 0.7936999797821045, + "volMax": 0.7936999797821045, + "pitchMin": 1.0, + "pitchMax": 1.0, + "distMin": 120.0, + "distMax": 600.0, + "velocityMin": 0.0, + "probability": 1.0, + "sequence": 1, + "startDelay": 0, + "masterPriority": 100, + "masterPercentage": 0.20000000298023224, + "slavePercentage": 1.0, + "playbackPercentage": 100, + "lfePercentage": 0.0, + "centerPercentage": 0.0, + "poly": 1, + "polyGlobal": 174, + "polyEntityType": 0, + "polyGlobalType": 0, + "envelopMin": 0.0, + "envelopMax": 0.0, + "envelopPercentage": 0.0, + "reverbWetMixOverride": 0.0, + "reverbMultiplier": 0.0, + "smartPanDistance2d": 0.0, + "smartPanDistance3d": 0.0, + "smartPanAttenuation3d": 1.0, + "stereo3dAngle": 0, + "stereo3dStart": 0.0, + "stereo3dEnd": 0.0, + "sndContext": null, + "sndCurve": "$default", + "lpfCurve": "$default", + "hpfCurve": "$defaultHpf", + "reverbSendCurve": "$default", + "speakerMap": { + "channelMaps": [ + { + "speakerCount": 2, + "speakers": [ + { + "levels0": 1.0, + "levels1": 0.0, + "numLevels": 1, + "speaker": 0 + }, + { + "levels0": 1.0, + "levels1": 0.0, + "numLevels": 1, + "speaker": 1 + } + ] + }, + { + "speakerCount": 6, + "speakers": [ + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 1, + "speaker": 0 + }, + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 1, + "speaker": 1 + }, + { + "levels0": 1.0, + "levels1": 0.0, + "numLevels": 1, + "speaker": 2 + }, + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 1, + "speaker": 3 + }, + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 1, + "speaker": 4 + }, + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 1, + "speaker": 5 + } + ] + }, + { + "speakerCount": 2, + "speakers": [ + { + "levels0": 1.0, + "levels1": 0.0, + "numLevels": 2, + "speaker": 0 + }, + { + "levels0": 0.0, + "levels1": 1.0, + "numLevels": 2, + "speaker": 1 + } + ] + }, + { + "speakerCount": 6, + "speakers": [ + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 2, + "speaker": 0 + }, + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 2, + "speaker": 1 + }, + { + "levels0": 0.5, + "levels1": 0.5, + "numLevels": 2, + "speaker": 2 + }, + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 2, + "speaker": 3 + }, + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 2, + "speaker": 4 + }, + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 2, + "speaker": 5 + } + ] + } + ], + "isDefault": false, + "name": "radio" + }, + "allowDoppler": 0, + "dopplerPreset": null, + "unknown": { + "pad": [ + { + "bytes": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "subtype": null + } + ], + "u1": 4, + "u2": 0.0010000000474974513 + } + } + ] +} \ No newline at end of file diff --git a/data/zonetool/ens_h2_mod_common/localizedstrings/english_safe.json b/data/zonetool/ens_h2_mod_common/localizedstrings/english_safe.json new file mode 100644 index 00000000..05197dc4 --- /dev/null +++ b/data/zonetool/ens_h2_mod_common/localizedstrings/english_safe.json @@ -0,0 +1,38 @@ +{ + "DEADQUOTE_ALL_THAT_IS_NECESSARY": "\"When bad men combine, the good must associate;\nelse they will fall, one by one, an unpitied sacrifice in a contemptible struggle.\"", + "DEADQUOTE_ALL_WARFARE_IS_BASED": "\"Warfare is the way of deception.\"", + "DEADQUOTE_BEFORE_YOU_EMBARK_UPON": "\"Curse someone, then you will get two graves.\"", + "DEADQUOTE_BEFORE_YOU_EMBARK_UPON_AUTHOR": "- Japanese proverb", + "DEADQUOTE_DO_NOTHING": "\"The strongest of all warriors are these two — Time and Patience.\"", + "DEADQUOTE_DO_NOTHING_AUTHOR": "- Leo Tolstoy, War and Peace", + "DEADQUOTE_GOD_TAKES_SIDES": "\"God is not on the side of the big battalions,\nbut on the side of those who shoot best.\"", + "DEADQUOTE_GOD_TAKES_SIDES_AUTHOR": "- Voltaire", + "DEADQUOTE_IN_WAR_TRUTH_IS_THE_FIRST_AUTHOR": "- Unknown", + "DEADQUOTE_LIVE_WELL_IT_IS_THE_GREATEST": "\"Living well is the best revenge.\"", + "DEADQUOTE_LIVE_WELL_IT_IS_THE_GREATEST_AUTHOR": "- from Proverbs collected\nby George Herbert", + "DEADQUOTE_NATION_GREAT_DISTINCT": "\"The nation that will insist on drawing a broad line of demarcation between the fighting man and the thinking man is liable to find its fighting done by fools and its thinking done by cowards.\"", + "DEADQUOTE_NATION_GREAT_DISTINCT_AUTHOR": "- Sir William Butler, British Army officer", + "DEADQUOTE_NEARLY_ALL_MEN_CAN_STAND": "\"If you want to find out what a man is to the bottom, give him power.\nAny man can stand adversity - only a great man can stand prosperity.\"", + "DEADQUOTE_NEARLY_ALL_MEN_CAN_STAND_AUTHOR": "- Robert G. Ingersoll", + "DEADQUOTE_NO_BATTLE_PLAN_SURVIVES_AUTHOR": "- Helmuth von Moltke", + "DEADQUOTE_REVENGE_AT_FIRST_THOUGH": "\"Revenge, at first though sweet,\nBitter ere long back on itself recoils.\"", + "DEADQUOTE_REVENGE_AT_FIRST_THOUGH_AUTHOR": "- John Milton, Paradise Lost", + "DEADQUOTE_REVENGE_IS_PROFITABLE": "\"Revenge is profitable, gratitude is expensive.\"", + "DEADQUOTE_ROUGH_MEN_READY": "\"Those who 'abjure' violence can only do so because others are committing violence on their behalf.\"", + "DEADQUOTE_THE_END_OF_WAR_AUTHOR": "- George Santayana", + "DEADQUOTE_THE_INDEFINITE_COMBINATION": "\"The indefinite combination of human fallibility and nuclear weapons will destroy nations.\"", + "DEADQUOTE_THE_WILL_TO_WIN": "\"War is such an unjust and ugly thing\n that those who wage it try to stifle their consciences.\"", + "DEADQUOTE_THE_WILL_TO_WIN_AUTHOR": "- Leo Tolstoy", + "DEADQUOTE_TRY_TO_LOOK_UNIMPORTANT": "\"Everyone thinks of changing the world, but no one thinks of changing himself.\"", + "DEADQUOTE_TRY_TO_LOOK_UNIMPORTANT_AUTHOR": "- Leo Tolstoy", + "DEADQUOTE_WAR_DOES_NOT_DETERMINE_AUTHOR": "- Unknown", + "DEADQUOTE_WAR_IS_DELIGHTFUL_TO": "\"War is sweet to those that never have experienced it.\"", + "DEADQUOTE_WAR_IS_DELIGHTFUL_TO_AUTHOR": "- Pindar", + "DEADQUOTE_WE_KNOW_WHERE_THEY_ARE": "\"We know where they [Iraq's WMD] are.\nThey're in the area around Tikrit and Baghdad and east, west, south and north somewhat.\"", + "DEADQUOTE_WE_KNOW_WHERE_THEY_ARE_AUTHOR": "- Donald Rumsfeld,\nUS SecDef in 2003", + "DEADQUOTE_WE_SLEEP_SAFELY_IN_OUR": "\"The greater the state, the more wrong and cruel its patriotism, and the greater is the sum of suffering upon which its power is founded.\"", + "DEADQUOTE_WE_SLEEP_SAFELY_IN_OUR_AUTHOR": "- Leo Tolstoy", + "DEADQUOTE_WORLD_WAR_IV": "\"The only way to win the next world war is to prevent it.\"", + "DEADQUOTE_WORLD_WAR_IV_AUTHOR": "- Dwight D. Eisenhower", + "SUBTITLE_AFCAVES_NKL_GOODLUCK23": "^2Nikolai: ^7Then good luck, my friend. God be with you." +} \ No newline at end of file diff --git a/data/zonetool/ens_h2_mod_common/video/subtitles.csv b/data/zonetool/ens_h2_mod_common/video/subtitles.csv new file mode 100644 index 00000000..3959f663 --- /dev/null +++ b/data/zonetool/ens_h2_mod_common/video/subtitles.csv @@ -0,0 +1,188 @@ +af_caves_load,14,17.5,^2MacTavish: ^7We've got one good UMP. They've got a thousand. , +af_caves_load,18,21,^2MacTavish: ^7We don't even know if Makarov's intel's any good. , +af_caves_load,21.3,22.3,^2MacTavish: ^7Price. , +af_caves_load,23.3,24.3,^2MacTavish: ^7...Price?, +af_caves_load,25,30.2,^2Price: ^7The healthy human mind doesn't wake up in the morning thinking this is its last day on Earth. , +af_caves_load,30.5,33.5,^2Price: ^7But I think that's a luxury. Not a curse. , +af_caves_load,33.5,36.7,^2Price: ^7To know you're close to the end is a kind of freedom. , +af_caves_load,37.5,40,^2Price: ^7Good time to take... inventory. , +af_caves_load,41,46,^2Price: ^7Outgunned. Outnumbered. Out of our minds. On a suicide mission. , +af_caves_load,46,50,"^2Price: ^7But the sand and rocks here, stained with thousands of years of warfare...", +af_caves_load,51.2,54,^2Price: ^7They will remember us. For this., +af_caves_load,54.5,60,"^2Price: ^7Because out of all our vast array of nightmares, this is the one we choose for ourselves. ", +af_caves_load,60,63.4,^2Price: ^7We go forward like a breath exhaled from the Earth. , +af_caves_load,64,66.7,^2Price: ^7With vigor in our hearts and one goal in sight:, +af_caves_load,67.8,69.5,^2Price: ^7We. Will. , +af_caves_load,70,72,^2Price: ^7Kill him. , +af_chase_load,16.3,18,^2Price: ^7This is for the record., +af_chase_load,18.3,21,^2Price: ^7History is written by the victor., +af_chase_load,22,24,^2Price: ^7History is filled with liars. , +af_chase_load,25,30,"^2Price: ^7If he lives and we die, his truth becomes written - ", +af_chase_load,30,32,^2Price: ^7- and ours is lost., +af_chase_load,32,39,^2Price: ^7Shepherd will be a hero. 'Cause all you need to change the world is one good lie and a river of blood., +af_chase_load,40,45,^2Price: ^7He's about to complete the greatest trick a liar ever played on history., +af_chase_load,45.7,48,^2Price: ^7His truth will be the truth., +af_chase_load,48,52.2,"^2Price: ^7But only if he lives, and we die.", +airport_load,7.5,11,"^2Shepherd: ^7The rest of Task Force 141 brought in the ACS, Allen. ", +airport_load,12,16,^2Shepherd: ^7Two men took down an entire base. I ask much more from you now. , +airport_load,18,23,^2Shepherd: ^7Yesterday you were a soldier on the front lines. But today front lines are history. , +airport_load,23,29,^2Shepherd: ^7Uniforms are relics. The war rages everywhere. And there will be casualties. , +airport_load,36,41,^2Shepherd: ^7This man Makarov is fighting his own war and he has no rules. No boundaries. , +airport_load,41,44.3,"^2Shepherd: ^7He doesn't flinch at torture, human trafficking, or genocide.", +airport_load,45,52,^2Shepherd: ^7He's not loyal to a flag or a country or any set of ideals. He trades blood for money. , +airport_load,53,55,^2Shepherd: ^7He's your new best friend. , +airport_load,56,59.3,^2Shepherd: ^7You don't want to know what it's cost already to put you next to him., +airport_load,60,62.6,^2Shepherd: ^7It will cost you a piece of yourself., +airport_load,64,67,^2Shepherd: ^7It will cost nothing compared to everything you'll save. , +arcadia_load,25,27.2,^2Shepherd: ^7Someone turn off that damn TV., +arcadia_load,29,33,"^2Shepherd: ^7My Task Force is out of the country. I'm commandeering your unit, Sergeant Foley.", +arcadia_load,34,36,"^2Sgt. Foley: ^7Yes, Sir. All yours, Sir.", +arcadia_load,37,40,^2Shepherd: ^7I've requisitioned a Stryker from the Eighth Armored., +arcadia_load,46,48,"^2Sgt. Foley: ^7Honey Badger's a mean bitch, Sir.", +arcadia_load,48,52,^2Shepherd: ^7She'll walk you in. The Russians are burning through our defenses and our intel. , +arcadia_load,52,54,^2Shepherd: ^7Can't let 'em take this corner., +arcadia_load,54.6,58.3,"^2Sgt. Foley: ^7Just point it out on the map, Sir. They won't take it. ", +boneyard_load,16.7,20,"^2MacTavish: ^7Roach? Ghost? Come in, Ghost! Do you copy? Does anyone copy?", +boneyard_load,20,25,"^2Price: ^7They're dead, Soap. Shepherd's cleaning house. I'm working my way back to you. ", +boneyard_load,26,28,^2MacTavish: ^7Shepherd betrayed us. , +boneyard_load,28,31,^2Price: ^7Have to trust someone to be betrayed. I never did. , +boneyard_load,31.3,34,"^2Price: ^7Nikolai, come in. Do you have our location? ", +boneyard_load,34,38,"^2Nikolai: ^7Da. Inbound, Price. But I am not the only one. ", +boneyard_load,38,41,"^2Nikolai: ^7You've got Shepherd's men on one side, Makarov's on the other. ", +boneyard_load,43,45,^2Price: ^7We'll have to take them all out then. , +boneyard_load,45,47,^2Nikolai: ^7Or let them take each other out. , +boneyard_load,47,50,"^2Nikolai: ^7Either way, I'll see you on the other side my friend. ", +cliffhanger_load,23.3,25,^2PFC Allen: ^7So how do I look? , +cliffhanger_load,25,27,^2Shepherd: ^7Like one of the bad guys., +cliffhanger_load,27,29,^2Shepherd: ^7Perfect for your undercover assignment. , +cliffhanger_load,29,31,^2PFC Allen: ^7So Makarov is the prize. , +cliffhanger_load,31,36,^2Shepherd: ^7Makarov's no prize. He's a whore. A mad-dog killer for the highest bidder., +cliffhanger_load,37,40,^2Shepherd: ^7Just remember your new identity. It'll keep you alive. , +cliffhanger_load,41,45.5,^2Shepherd: ^7Welcome to the 141. Best handpicked group of warriors on the planet. , +cliffhanger_load,46,49,"^2PFC Allen: ^7It's an honor, Sir. When do I meet the rest of the team? ", +cliffhanger_load,49.3,53.5,^2Shepherd: ^7They're on a mission recovering a downed ACS module behind enemy lines. , +cliffhanger_load,54,56,^2PFC Allen: ^7Their feet wet? , +cliffhanger_load,56,59,^2Shepherd: ^7Imagine they're just about freezing right now. , +contingency_load,12,14,^2Captain MacTavish: ^7Uplink nearly complete. , +contingency_load,16.3,19,^2Captain MacTavish: ^7General Shepherd you're online with Captain Price. , +contingency_load,20,22,"^2Shepherd: ^7Back from the brink, Captain. ", +contingency_load,22,24,"^2Captain Price: ^7\"Out of the frying pan\" is more like it.", +contingency_load,24,27,^2Captain Price: ^7This world looks more like hell than the one I just left. , +contingency_load,28,31,^2Shepherd: ^7We thought we'd recovered the ACS before the Russians could crack it. , +contingency_load,32,33,^2Shepherd: ^7We were wrong. , +contingency_load,33.6,38,^2Shepherd: ^7Then Makarov turned the U.S. into his scapegoat. Next thing you know there's flames everywhere. , +contingency_load,39,41,^2Shepherd: ^7What's this image you're sending me?, +contingency_load,41.6,46,"^2Captain Price: ^7You wanna put out an oil fire, Sir, you set off a bigger explosion right next to it.", +contingency_load,46,48.2,^2Captain Price: ^7Sucks away the oxygen. Snuffs the flame. , +contingency_load,49,54,"^2Shepherd: ^7Price, you been locked away too long. Better get your mind right, son. ", +contingency_load,55,58,"^2Captain Price: ^7Shepherd, are you willing to do what is necessary to win? ", +contingency_load,58.6,60,^2Shepherd: ^7Always. , +contingency_load,60.5,65,^2Captain Price: ^7We got ourselves a pretty big fire. Gonna need a huge bang. , +contingency_load,66,70.2,"^2Shepherd: ^7You've been in the Gulag too long, Price. Focus on taking out Makarov. ", +contingency_load,71,73,"^2Captain Price: ^7No time, Sir. We need to end this war today. ", +contingency_load,73,76,"^2Shepherd: ^7I'm not asking you, Price. This is an order! You're to...", +contingency_load,79,82,^2Captain Price: ^7Looks like we lost our connection. , +dcburning_load,8,18,^2 ^7PRINCE GEORGE'S COUNTY RESIDENTS ARE INSTRUCTED TO GO DIRECTLY TO THE HEALTH DEPARTMENT AT 147 KIRKWOOD AVE. ,1 +dcburning_load,18,27,^2 ^7PICK-UPS EVERY 15 MINUTES FROM COMMUNITY COLLEGE CAMPUS IN UNIVERSITY TOWN. /// EMERGENCY EVACUATION IN PROGRESS. /// ,1 +dcburning_load,27,36,^2 ^7HEAD IMMEDIATELY TO YOUR NEAREST SERVICE SHELTER. TROOPS WILL BE THERE TO MEET YOU. ,1 +dcburning_load,36,44,^2 ^7BRING A PHOTO ID AND NO MORE THAN ONE BAGGAGE ITEM PER PERSON. /// BE AWARE OF YOUR SURROUNDINGS. REMAIN ALERT.,1 +dcemp_load,27,31.5,"^2SecDef: ^7Gentlemen, the missile's vector puts it en route to the East Coast. We will lose the White House. ", +dcemp_load,32,35,"^2Shepherd: ^7We've rebuilt it before, we'll rebuild it again. ", +dcemp_load,36,37,^2SecDef: ^7Casualties?, +dcemp_load,37.8,45,"^2Shepherd: ^7Possibly 30,000 to 50,000. Depends on the exact location of the detonation. All systems will go down. ", +dcemp_load,46,49,"^2SecDef: ^7General Shepherd, you warned us. We should've listened. ", +dcemp_load,49.5,55,"^2Shepherd: ^7When they speak of this moment, we will not be the ones who stood guard while America died.", +dcemp_load,55.2,61,^2Shepherd: ^7One man is responsible for all this. Makarov must be brought to light. , +dcemp_load,61.8,65,"^2SecDef: ^7Whatever you need, General. You've got a blank check. ", +estate_load,7,12,"^2Shepherd: ^7It's been a tough week, gentlemen. We've lost more than we ever dreamed. But we will recover. ", +estate_load,16,20.3,\n^2Shepherd: ^7I've got a blank check. And we're gonna use every cent of it killin' Makarov. , +estate_load,22,28,"^2Shepherd: ^7Despite what the world may say, we are not savages, we don't kill civilians. We use precision. ", +estate_load,30,34,^2Shepherd: ^7There's an evil man hiding in these shadows and we're gonna bring him into the light. , +estate_load,34.7,38,"^2Shepherd: ^7Once his face is revealed, we will write history, gentlemen. ", +estate_load,42.5,46.2,^2Shepherd: ^7These are the last safe havens left on Earth for Makarov and his men. , +estate_load,47,49.3,^2Captain Price: ^7Sounds like we gotta be in two places at once. , +estate_load,50,51,^2Shepherd: ^7Impossible? , +estate_load,51,53,^2Captain Price: ^7Not for the One-Four-One. , +estate_load,53,55.4,"^2Ghost: ^7Fifty-fifty chance to take out Makarov, eh? ", +estate_load,56,59,"^2Ghost: ^7Captain Price, request permission to take the safehouse with Roach. ", +estate_load,59.8,63,^2Captain Price: ^7Granted. Soap and I will take the boneyard in Afghanistan. , +estate_load,63.3,69,^2Shepherd: ^7Very well. We will cut off all avenues of escape. This ends now., +estate_load,70,74,^2Captain Price: ^7Strange. I coulda sworn we ended this war yesterday. , +favela_escape_load,28.3,30.5,^2Ghost: ^7I can't get anyone on the horn. , +favela_escape_load,38,42.5,^2Captain MacTavish: ^7The Russians must've copied the ACS module. Got the key to every lock in America. , +favela_escape_load,42.5,48,^2Ghost: ^7And they're killing a thousand Americans for every dead civilian in Moscow. Looks like we're all outta friends. , +favela_escape_load,49.2,52,"^2Captain MacTavish: ^7I know a guy. Let's find a payphone, if they still exist. ", +favela_escape_load,53.3,59,^2Ghost: ^7All we got outta Rojas is that the only guy Makarov hates worse than Americans is locked up in a Gulag. , +favela_escape_load,59.5,65,"^2Captain MacTavish: ^7It's all we got. If this con's the bait to catch that psychopath, let's hang him from a tree. ", +favela_load,13,16.5,\n^2Ghost: ^7The Russians ain't gonna let this massacre go unanswered. It's gonna get bloody., +favela_load,17,20,"\n^2Captain MacTavish: ^7Too right, mate. Now, in the eyes of the world, they're the victims.", +favela_load,20,24.3,^2Captain MacTavish: ^7No one's gonna say a word when the Russians club every American they can reach., +favela_load,24.3,30,^2Shepherd: ^7Makarov was one move ahead. Now he's left thousands of bodies at the feet of an American., +favela_load,31,36.6,^2Captain MacTavish: ^7We're the only ones who know it was Makarov's op. Our credibility died with Allen. We need proof. , +favela_load,37.3,39.3,^2Shepherd: ^7Follow the shell., +favela_load,45,47,^2Shepherd: ^7Alejandro Rojas., +favela_load,48.5,50,"^2Captain MacTavish: ^7Never heard of him, Sir. ", +favela_load,50,53,^2Shepherd: ^7You know him as Alex the Red. He supplied the assault. , +favela_load,54.5,59,^2Captain MacTavish: ^7One bullet to unleash the fury of a whole nation. Which means..., +favela_load,59,61,^2Shepherd: ^7He's our ticket to Makarov., +gulag_load,16,19,^2Captain MacTavish: ^7Sixth Fleet's mopping up. Time to move in. , +gulag_load,20.7,24,"^2Captain MacTavish: ^7Long history, this building. Not much of it pretty. ", +gulag_load,24,28,^2Captain MacTavish: ^7Started out as a castle. With an actual dungeon. Built to withstand any siege. , +gulag_load,28.8,33.2,^2Captain MacTavish: ^7Building survived every brutal winter. The occupants... they weren't so lucky. , +gulag_load,34,37,^2Captain MacTavish: ^7The Monastery. Didn't survive the Purges., +gulag_load,37,41,"^2Captain MacTavish: ^7Over the last century it's played host to anyone the government didn't want, but couldn't kill. ", +gulag_load,43,48,^2Captain MacTavish: ^7Place is filled with living casualties of the last war... which I swear I thought we'd won. , +gulag_load,48,53,"^2Captain MacTavish: ^7But I suppose it's all a day at the races: you back the losing horse, and this is where you end up. ", +gulag_load,53.8,58,"^2Captain MacTavish: ^7Six-Two-Seven is the piece of meat Makarov wants, so let's cut him loose. ", +intro_credits_load,20,22,^2SAS: ^7It's the F.N.G. sir., +intro_credits_load,25,27,^2Captain Price: ^7What the hell kind of name is Soap?, +intro_credits_load,43.5,45.2,"^1Al-Asad: ^7Warfare is the way of deception.", +intro_credits_load,48.5,51.5,^2Captain Price: ^7Nikolai's in hell right now. We're gonna walk him out…, +intro_credits_load,52,54,^2Captain Price: ^7We take care of our friends., +intro_credits_load,64,67,^2Captain Price: ^7Zakhaev. Imran Zakhaev., +intro_credits_load,78,82,^1Zakhaev: ^7My son's blood on their hands., +intro_credits_load,89,93.5,"^2Captain Price: ^7Delta One X-Ray, we have a missile launch, I repeat we have a missile...", +invasion_load,22,26,"^2NORAD HQ: ^7Sand Bravo, we're reading 70 bogeys in your sector, please verify. ", +invasion_load,27,31.5,"^2Nome AFB: ^7Very funny, Station. That's a big negative, over.", +invasion_load,31.8,33.9,"^2NORAD Controller: ^7Yeah, might be a glitch in one of the ACS modules.", +invasion_load,34,38,"^2NORAD HQ: ^7Sand Bravo, be advised, running diagnostics to scan for malfunction. ", +invasion_load,39,42.2,"^2Nome AFB: ^7The skies are clear, Station. You got yourself some phantom dots. Over. ", +invasion_load,43,48,"^2NORAD HQ: ^7Zulu X-Ray 6. Signs in your sector of some 100 bogeys, please advise. ", +invasion_load,49,55,"^2Vandenberg AFB: ^7Negatory, Station. Scope is clear. I dunno what to tell ya. Solar interference? Heavy sunspot activity today. ", +invasion_load,55.8,61,"^2NORAD HQ: ^7Sierra Delta, uh... we may have a minor ACS fault here. Do you have anything on your scope?", +invasion_load,61.3,63,^2Air Traffic Controller: ^7They're everywhere!, +invasion_load,63,65,"^2NORAD HQ: ^7Sierra Delta, repeat! ", +invasion_load,65,69,^2Air Traffic Controller: ^7I'm lookin' at fighter jets over I-95! How the hell did they get through? , +invasion_load,69,73,^2NORAD HQ: ^7Standby! Attempting to contact the nearest unit in that sector., +invasion_load,73,79,"^2Sgt. Foley: ^7I read you. This is First Battalion, 75th Ranger Regiment, Sergeant Foley, acting commander of Hunter Two-One. Do you copy over? ", +invasion_load,79,87,"^2NORAD HQ: ^7All stations, be advised - satellite surveillance has been disabled. SOSUS and Pave Paws arrays are inoperative at this time.", +oilrig_load,20.8,24,"^2Captain MacTavish: ^7Seems we're headed the wrong direction, Sir. Shouldn't we be coming back to the fight? ", +oilrig_load,24,26,"^2Shepherd: ^7Plenty of fight to go around, MacTavish. ", +oilrig_load,27,33,^2Shepherd: ^7Glad you made it outta South America. You're meeting up with the 6th Fleet. Leadin' the counter-strike. , +oilrig_load,35,42,^2Shepherd: ^7Prisoner Six-Two-Seven. We believe that's who Makarov's got the mad-on for. But we can't get to him. , +oilrig_load,45,47,"^2Captain MacTavish: ^7Oilrigs, Sir? ", +oilrig_load,47,49,^2Shepherd: ^7Russians are using them as SAM sites. , +oilrig_load,50,56,"^2Shepherd: ^7Oil workers are human shields, so we can't just blow up the rigs wholesale. And this one is the least defended. ", +oilrig_load,58.8,62,"^2Shepherd: ^7Boys, I know I'm sending you into the meat grinder on this one...", +oilrig_load,62,67,"^2Captain MacTavish: ^7They're defending it, so it means we want it. Especially if it gets us to Six-Two-Seven. ", +roadkill_load,8,12.3,^2Shepherd: ^7We are the most powerful military force in the history of man., +roadkill_load,13,15,^2Shepherd: ^7Every fight is our fight. , +roadkill_load,16,21,"^2Shepherd: ^7Because what happens over here, matters over there. We don't get to sit one out. ", +roadkill_load,22,30,"^2Shepherd: ^7Learning to use the tools of modern warfare is the difference between the prospering of your people, and utter destruction. ", +roadkill_load,30.5,37,^2Shepherd: ^7We can't give you freedom. But we can give you the know-how to acquire it. , +roadkill_load,37,41.0,"^2Shepherd: ^7And that, my friends, is worth more than a whole army base of steel. ", +roadkill_load,42.5,48,"^2Shepherd: ^7Sure it matters who's got the biggest stick, but it matters a helluva lot more who's swinging it. ", +roadkill_load,49,53,^2Shepherd: ^7This is a time for heroes. A time for legends. , +roadkill_load,54,56,^2Shepherd: ^7History is written by the victors., +roadkill_load,57,59,^2Shepherd: ^7Let's get to work., +trainer_load,10.7,14,"^2Shepherd: ^7The more things change, the more they stay the same. ", +trainer_load,15,21,"^2Shepherd: ^7Boundaries shift, new players step in, but power always finds a place to rest its head. ", +trainer_load,24,29,^2Shepherd: ^7We fought and bled alongside the Russians. We shoulda known they'd hate us for it. , +trainer_load,30,35,"^2Shepherd: ^7History is written by the victor. And here I am, \nthinking we'd won. ", +trainer_load,37,41,^2Shepherd: ^7But you bring down one enemy and they find someone even worse to replace him. , +trainer_load,43.8,48,"^2Shepherd: ^7Locations change, the rationale, the objective. ", +trainer_load,49,52,^2Shepherd: ^7Yesterday's enemies are today's recruits. , +trainer_load,52,59,"^2Shepherd: ^7Train them to fight alongside you, and pray they don't eventually decide to hate you for it too. ", +trainer_load,70,72,"^2Shepherd: ^7Same shit, different day. ", +trainer_load,72.8,77,"^2Shepherd: ^7You know what I'm looking for, Sergeant Foley. Keep your eyes open. ", +trainer_load,78,82,"^2Sgt. Foley: ^7Got a new batch hittin' the pit today, Sir. I'll send you the best I find. ", diff --git a/data/zonetool/ens_h2_mod_patch_af_caves/sounds/afcaves_nkl_goodluck.json b/data/zonetool/ens_h2_mod_patch_af_caves/sounds/afcaves_nkl_goodluck.json new file mode 100644 index 00000000..a77097b6 --- /dev/null +++ b/data/zonetool/ens_h2_mod_patch_af_caves/sounds/afcaves_nkl_goodluck.json @@ -0,0 +1,199 @@ +{ + "aliasName": "afcaves_nkl_goodluck", + "count": 1, + "head": [ + { + "aliasName": "afcaves_nkl_goodluck", + "secondaryAliasName": null, + "chainAliasName": null, + "subtitle": "SUBTITLE_AFCAVES_NKL_GOODLUCK23", + "mixerGroup": null, + "soundfile": { + "type": 2, + "exists": true, + "totalMsec": 4568, + "isLocalized": true, + "isStreamed": true, + "fileIndex": 0, + "raw": { + "dir": "voiceovers/afcaves", + "name": "afcaves_nkl_2_3_r" + } + }, + "flags": 2097562, + "priority": 18, + "dspBus": "voices_critical", + "volMod": "voices_dialog_radio", + "volMin": 0.7936999797821045, + "volMax": 0.7936999797821045, + "pitchMin": 1.0, + "pitchMax": 1.0, + "distMin": 120.0, + "distMax": 600.0, + "velocityMin": 0.0, + "probability": 1.0, + "sequence": 1, + "startDelay": 0, + "masterPriority": 100, + "masterPercentage": 0.20000000298023224, + "slavePercentage": 1.0, + "playbackPercentage": 100, + "lfePercentage": 0.0, + "centerPercentage": 0.0, + "poly": 1, + "polyGlobal": 174, + "polyEntityType": 0, + "polyGlobalType": 0, + "envelopMin": 0.0, + "envelopMax": 0.0, + "envelopPercentage": 0.0, + "reverbWetMixOverride": 0.0, + "reverbMultiplier": 0.0, + "smartPanDistance2d": 0.0, + "smartPanDistance3d": 0.0, + "smartPanAttenuation3d": 1.0, + "stereo3dAngle": 0, + "stereo3dStart": 0.0, + "stereo3dEnd": 0.0, + "sndContext": null, + "sndCurve": "$default", + "lpfCurve": "$default", + "hpfCurve": "$defaultHpf", + "reverbSendCurve": "$default", + "speakerMap": { + "channelMaps": [ + { + "speakerCount": 2, + "speakers": [ + { + "levels0": 1.0, + "levels1": 0.0, + "numLevels": 1, + "speaker": 0 + }, + { + "levels0": 1.0, + "levels1": 0.0, + "numLevels": 1, + "speaker": 1 + } + ] + }, + { + "speakerCount": 6, + "speakers": [ + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 1, + "speaker": 0 + }, + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 1, + "speaker": 1 + }, + { + "levels0": 1.0, + "levels1": 0.0, + "numLevels": 1, + "speaker": 2 + }, + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 1, + "speaker": 3 + }, + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 1, + "speaker": 4 + }, + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 1, + "speaker": 5 + } + ] + }, + { + "speakerCount": 2, + "speakers": [ + { + "levels0": 1.0, + "levels1": 0.0, + "numLevels": 2, + "speaker": 0 + }, + { + "levels0": 0.0, + "levels1": 1.0, + "numLevels": 2, + "speaker": 1 + } + ] + }, + { + "speakerCount": 6, + "speakers": [ + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 2, + "speaker": 0 + }, + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 2, + "speaker": 1 + }, + { + "levels0": 0.5, + "levels1": 0.5, + "numLevels": 2, + "speaker": 2 + }, + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 2, + "speaker": 3 + }, + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 2, + "speaker": 4 + }, + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 2, + "speaker": 5 + } + ] + } + ], + "isDefault": false, + "name": "radio" + }, + "allowDoppler": 0, + "dopplerPreset": null, + "unknown": { + "pad": [ + { + "bytes": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "subtype": null + } + ], + "u1": 4, + "u2": 0.0010000000474974513 + } + } + ] +} \ No newline at end of file diff --git a/data/zonetool/h2_mod_common/credits.csv b/data/zonetool/h2_mod_common/credits.csv new file mode 100644 index 00000000..8c8832d3 --- /dev/null +++ b/data/zonetool/h2_mod_common/credits.csv @@ -0,0 +1,8 @@ +MENU_CREDITS_1,credits_1, +MENU_CREDITS_2,credits_2, +MENU_CREDITS_3,credits_3, +MENU_CREDITS_4,credits_4, +MENU_CREDITS_5,credits_5, +MENU_CREDITS_6,credits_6, +MENU_CREDITS_7,credits_7, +MENU_CREDITS_8,credits_8, diff --git a/data/zonetool/h2_mod_pre_gfx/font_replacements.csv b/data/zonetool/h2_mod_pre_gfx/font_replacements.csv new file mode 100644 index 00000000..518f3e67 --- /dev/null +++ b/data/zonetool/h2_mod_pre_gfx/font_replacements.csv @@ -0,0 +1,25 @@ +arabic,fonts/bank.ttf,fonts/mix_gothic.ttf, +arabic,fonts/default.otf,fonts/mix.ttf, +arabic,fonts/defaultBold.otf,fonts/ibmplexsansarabic-semibold_custom.ttf, +czech,fonts/bank.ttf,fonts/mix_gothic.ttf, +czech,fonts/default.otf,fonts/mix.ttf, +czech,fonts/defaultBold.otf,fonts/mix_open.ttf, +japanese_full,fonts/default.otf,fonts/mix.ttf, +japanese_full,fonts/defaultBold.otf,fonts/mix_open.ttf, +japanese_partial,fonts/default.otf,fonts/mix.ttf, +japanese_partial,fonts/defaultBold.otf,fonts/mix_open.ttf, +korean,fonts/default.otf,fonts/mix.ttf, +korean,fonts/defaultBold.otf,fonts/mix_open.ttf, +polish,fonts/bank.ttf,fonts/mix_gothic.ttf, +polish,fonts/default.otf,fonts/mix.ttf, +polish,fonts/defaultBold.otf,fonts/mix_open.ttf, +russian,fonts/bank.ttf,fonts/mix_gothic.ttf, +russian,fonts/default.otf,fonts/mix.ttf, +russian,fonts/defaultBold.otf,fonts/mix_open.ttf, +russian_partial,fonts/bank.ttf,fonts/mix_gothic.ttf, +russian_partial,fonts/default.otf,fonts/mix.ttf, +russian_partial,fonts/defaultBold.otf,fonts/mix_open.ttf, +simplified_chinese,fonts/default.otf,fonts/mix.ttf, +simplified_chinese,fonts/defaultBold.otf,fonts/mix_open.ttf, +traditional_chinese,fonts/default.otf,fonts/mix.ttf, +traditional_chinese,fonts/defaultBold.otf,fonts/mix_open.ttf, \ No newline at end of file diff --git a/data/zonetool/h2_mod_pre_gfx/fonts/ibmplexsansarabic-semibold_custom.ttf b/data/zonetool/h2_mod_pre_gfx/fonts/ibmplexsansarabic-semibold_custom.ttf new file mode 100644 index 00000000..9d05fde6 Binary files /dev/null and b/data/zonetool/h2_mod_pre_gfx/fonts/ibmplexsansarabic-semibold_custom.ttf differ diff --git a/data/zonetool/h2_mod_pre_gfx/fonts/mix.ttf b/data/zonetool/h2_mod_pre_gfx/fonts/mix.ttf new file mode 100644 index 00000000..6bdf48ec Binary files /dev/null and b/data/zonetool/h2_mod_pre_gfx/fonts/mix.ttf differ diff --git a/data/zonetool/h2_mod_pre_gfx/fonts/mix_gothic.ttf b/data/zonetool/h2_mod_pre_gfx/fonts/mix_gothic.ttf new file mode 100644 index 00000000..b53aab74 Binary files /dev/null and b/data/zonetool/h2_mod_pre_gfx/fonts/mix_gothic.ttf differ diff --git a/data/zonetool/h2_mod_pre_gfx/fonts/mix_open.ttf b/data/zonetool/h2_mod_pre_gfx/fonts/mix_open.ttf new file mode 100644 index 00000000..404a4f26 Binary files /dev/null and b/data/zonetool/h2_mod_pre_gfx/fonts/mix_open.ttf differ diff --git a/data/zonetool/jpp_h2_mod_patch_af_caves/sounds/afcaves_nkl_goodluck.json b/data/zonetool/jpp_h2_mod_patch_af_caves/sounds/afcaves_nkl_goodluck.json new file mode 100644 index 00000000..a77097b6 --- /dev/null +++ b/data/zonetool/jpp_h2_mod_patch_af_caves/sounds/afcaves_nkl_goodluck.json @@ -0,0 +1,199 @@ +{ + "aliasName": "afcaves_nkl_goodluck", + "count": 1, + "head": [ + { + "aliasName": "afcaves_nkl_goodluck", + "secondaryAliasName": null, + "chainAliasName": null, + "subtitle": "SUBTITLE_AFCAVES_NKL_GOODLUCK23", + "mixerGroup": null, + "soundfile": { + "type": 2, + "exists": true, + "totalMsec": 4568, + "isLocalized": true, + "isStreamed": true, + "fileIndex": 0, + "raw": { + "dir": "voiceovers/afcaves", + "name": "afcaves_nkl_2_3_r" + } + }, + "flags": 2097562, + "priority": 18, + "dspBus": "voices_critical", + "volMod": "voices_dialog_radio", + "volMin": 0.7936999797821045, + "volMax": 0.7936999797821045, + "pitchMin": 1.0, + "pitchMax": 1.0, + "distMin": 120.0, + "distMax": 600.0, + "velocityMin": 0.0, + "probability": 1.0, + "sequence": 1, + "startDelay": 0, + "masterPriority": 100, + "masterPercentage": 0.20000000298023224, + "slavePercentage": 1.0, + "playbackPercentage": 100, + "lfePercentage": 0.0, + "centerPercentage": 0.0, + "poly": 1, + "polyGlobal": 174, + "polyEntityType": 0, + "polyGlobalType": 0, + "envelopMin": 0.0, + "envelopMax": 0.0, + "envelopPercentage": 0.0, + "reverbWetMixOverride": 0.0, + "reverbMultiplier": 0.0, + "smartPanDistance2d": 0.0, + "smartPanDistance3d": 0.0, + "smartPanAttenuation3d": 1.0, + "stereo3dAngle": 0, + "stereo3dStart": 0.0, + "stereo3dEnd": 0.0, + "sndContext": null, + "sndCurve": "$default", + "lpfCurve": "$default", + "hpfCurve": "$defaultHpf", + "reverbSendCurve": "$default", + "speakerMap": { + "channelMaps": [ + { + "speakerCount": 2, + "speakers": [ + { + "levels0": 1.0, + "levels1": 0.0, + "numLevels": 1, + "speaker": 0 + }, + { + "levels0": 1.0, + "levels1": 0.0, + "numLevels": 1, + "speaker": 1 + } + ] + }, + { + "speakerCount": 6, + "speakers": [ + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 1, + "speaker": 0 + }, + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 1, + "speaker": 1 + }, + { + "levels0": 1.0, + "levels1": 0.0, + "numLevels": 1, + "speaker": 2 + }, + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 1, + "speaker": 3 + }, + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 1, + "speaker": 4 + }, + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 1, + "speaker": 5 + } + ] + }, + { + "speakerCount": 2, + "speakers": [ + { + "levels0": 1.0, + "levels1": 0.0, + "numLevels": 2, + "speaker": 0 + }, + { + "levels0": 0.0, + "levels1": 1.0, + "numLevels": 2, + "speaker": 1 + } + ] + }, + { + "speakerCount": 6, + "speakers": [ + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 2, + "speaker": 0 + }, + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 2, + "speaker": 1 + }, + { + "levels0": 0.5, + "levels1": 0.5, + "numLevels": 2, + "speaker": 2 + }, + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 2, + "speaker": 3 + }, + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 2, + "speaker": 4 + }, + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 2, + "speaker": 5 + } + ] + } + ], + "isDefault": false, + "name": "radio" + }, + "allowDoppler": 0, + "dopplerPreset": null, + "unknown": { + "pad": [ + { + "bytes": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "subtype": null + } + ], + "u1": 4, + "u2": 0.0010000000474974513 + } + } + ] +} \ No newline at end of file diff --git a/data/zonetool/localizedstrings/arabic.json b/data/zonetool/localizedstrings/arabic.json new file mode 100644 index 00000000..0c838621 --- /dev/null +++ b/data/zonetool/localizedstrings/arabic.json @@ -0,0 +1,25 @@ +{ + "LOCALE_0": "يزيلجنإ", + "LOCALE_1": "يسنرف", + "LOCALE_2": "ةيناملأ", + "LOCALE_3": "يلاطيإ", + "LOCALE_4": "ةينابسألا", + "LOCALE_5": "ةيسورلا", + "LOCALE_6": "عيملت", + "LOCALE_7": "ةيلاغتربلا", + "LOCALE_8": "ةينابايلا", + "LOCALE_9": ")يئزج( ينابايلا", + "LOCALE_10": "ةيديلقتلا ةينيصلا", + "LOCALE_11": "ةطسبملا ةينيصلا", + "LOCALE_12": "يبرع", + "LOCALE_13": "ةيكيشتلا", + "LOCALE_14": ")ةينيتاللا اكيرمأ( ةينابسإلا", + "LOCALE_15": "ةيروكلا", + "LOCALE_16": ")ةنمآ( ةيزيلجنإلا ةغللا", + "LOCALE_17": "ةيسورلا )يئزج(", + "LUA_MENU_FALLBACK_DISABLE": "ةيئدبملا طوطخلا عجرتسا", + "LUA_MENU_FALLBACK_ENABLE": "ةصّصخم طوطخ مدختسا", + + "LUA_MENU_CAMPAIGN_UNLOCKED_ALL_TITLE": "ﻓﺘﺢ ﺟﻤﻴﻊ ﺍﻟﻤﻬﺎﻡ.", + "LUA_MENU_CANCEL_UNLOCK_CAPS": "ﺇﻟﻐﺎء ﺍﻟﻔﺘﺢ" +} \ No newline at end of file diff --git a/data/zonetool/localizedstrings/czech.json b/data/zonetool/localizedstrings/czech.json new file mode 100644 index 00000000..df42afaf --- /dev/null +++ b/data/zonetool/localizedstrings/czech.json @@ -0,0 +1,5611 @@ +{ + "LOCALE_0": "Angličtina", + "LOCALE_1": "Francouzština", + "LOCALE_2": "Němčina", + "LOCALE_3": "Italština", + "LOCALE_4": "Španělština", + "LOCALE_5": "Ruština", + "LOCALE_6": "Polština", + "LOCALE_7": "Portugalština", + "LOCALE_8": "Japonština", + "LOCALE_9": "Japonština (částečně)", + "LOCALE_10": "Čínština (složité)", + "LOCALE_11": "Čínština (zjednodušené)", + "LOCALE_12": "Arabština", + "LOCALE_13": "Čeština (částečně)\nOriginally translated by Ctihy\nPorted and corrected by VladWinner", + "LOCALE_14": "Španělština (Latinská Amerika)", + "LOCALE_15": "Korejština", + "LOCALE_16": "Angličtina (bezrizikový)", + "LOCALE_17": "Ruština (částečně)", + "LUA_MENU_FALLBACK_DISABLE": "Používat výchozí písma", + "LUA_MENU_FALLBACK_ENABLE": "Používat písma h2-mod", + "PRESENCE_SP_AF_CAVES": "Jako za starých časů", + "PRESENCE_SP_AF_CAVES_SYSTEM_DIALOG": "Jako za starých časů", + "MENU_SP_AF_CAVES": "Jako za starých časů", + "PRESENCE_SP_AF_CHASE": "Končící hra", + "PRESENCE_SP_ENDING": "Končící hra", + "PRESENCE_SP_AF_CHASE_SYSTEM_DIALOG": "Končící hra", + "PRESENCE_SP_ENDING_SYSTEM_DIALOG": "Končící hra", + "MENU_SP_AF_CHASE": "Končící hra", + "PRESENCE_SP_AIRPORT": "NEPOUŽÍVEJTE RUŠTINU", + "PRESENCE_SP_AIRPORT_SYSTEM_DIALOG": "NEPOUŽÍVEJTE RUŠTINU", + "MENU_SP_AIRPORT": "NEPOUŽÍVEJTE RUŠTINU", + "PRESENCE_SP_ARCADIA": "Důsledek", + "PRESENCE_SP_ARCADIA_SYSTEM_DIALOG": "Důsledek", + "MENU_SP_ARCADIA": "Důsledek", + "PRESENCE_SP_BONEYARD": "Nepřítel mého nepřítele", + "PRESENCE_SP_BONEYARD_SYSTEM_DIALOG": "Nepřítel mého nepřítele", + "MENU_SP_BONEYARD": "Nepřítel mého nepřítele", + "PRESENCE_SP_CLIFFHANGER": "Horolezec", + "PRESENCE_SP_CLIFFHANGER_SYSTEM_DIALOG": "Horolezec", + "MENU_SP_CLIFFHANGER": "Horolezec", + "PRESENCE_SP_CONTINGENCY": "Vyjímečná situace", + "PRESENCE_SP_CONTINGENCY_SYSTEM_DIALOG": "Vyjímečná situace", + "MENU_SP_CONTINGENCY": "Vyjímečná situace", + "PRESENCE_SP_DC_WHITEHOUSE": "Whiskey Hotel", + "PRESENCE_SP_DC_WHITEHOUSE_SYSTEM_DIALOG": "Whiskey Hotel", + "MENU_SP_DC_WHITEHOUSE": "Whiskey Hotel", + "PRESENCE_SP_DCBURNING": "Z vlastního podnětu", + "PRESENCE_SP_DCBURNING_SYSTEM_DIALOG": "Z vlastního podnětu", + "MENU_SP_DCBURNING": "Z vlastního podnětu", + "PRESENCE_SP_DCEMP": "Druhé slunce", + "PRESENCE_SP_DCEMP_SYSTEM_DIALOG": "Druhé slunce", + "MENU_SP_DCEMP": "Druhé slunce", + "PRESENCE_SP_ESTATE": "NEDOKONČENÉ ZÁLEŽITOSTI", + "PRESENCE_SP_ESTATE_SYSTEM_DIALOG": "NEDOKONČENÉ ZÁLEŽITOSTI", + "MENU_SP_ESTATE": "NEDOKONČENÉ ZÁLEŽITOSTI", + "PRESENCE_SP_FAVELA_ESCAPE": "Sršní hnízdo", + "PRESENCE_SP_FAVELA_ESCAPE_SYSTEM_DIALOG": "Sršní hnízdo", + "MENU_SP_FAVELA_ESCAPE": "Sršní hnízdo", + "PRESENCE_SP_FAVELA": "Zatčení", + "PRESENCE_SP_FAVELA_SYSTEM_DIALOG": "Zatčení", + "MENU_SP_FAVELA": "Zatčení", + "PRESENCE_SP_GULAG": "Pevnost", + "PRESENCE_SP_GULAG_SYSTEM_DIALOG": "Pevnost", + "MENU_SP_GULAG": "Pevnost", + "PRESENCE_SP_INVASION": "Vlkodlaci!", + "PRESENCE_SP_INVASION_SYSTEM_DIALOG": "Vlkodlaci!", + "MENU_SP_INVASION": "Vlkodlaci!", + "PRESENCE_SP_OILRIG": "Jediný klidný den... byl včera", + "PRESENCE_SP_OILRIG_SYSTEM_DIALOG": "Jediný klidný den... byl včera", + "MENU_SP_OILRIG": "Jediný klidný den... byl včera", + "PRESENCE_SP_ROADKILL": "Týmový hráč", + "PRESENCE_SP_ROADKILL_SYSTEM_DIALOG": "Týmový hráč", + "MENU_SP_ROADKILL": "Týmový hráč", + "PRESENCE_SP_TRAINER": "S.S.J.D.", + "PRESENCE_SP_TRAINER_SYSTEM_DIALOG": "S.S.J.D.", + "MENU_SP_TRAINER": "S.S.J.D.", + + "AF_CAVES_FOLLOW_PRICE": "Následuj kapitána Price", + "AF_CAVES_SUPPORT_PRICE": "Podpoř kapitána Price.", + "AF_CAVES_OBJ_MARKER_SUPPORT": "Podpora", + "AF_CAVES_OBJ_GET_C4": "Najdi C4, se kterou nastražíš na nepřátelské hlídky past.", + "AF_CAVES_OBJ_PLANT_C4": "Umísti C4 blízko dveří.", + "AF_CAVES_OBJ_MARKER_C4": "C4", + "AF_CAVES_OBJ_MARKER_C4_PLANT": "Umísti C4", + "AF_CAVES_HINT_C4_SWITCH": "Vytáhni C4 detonátor stisknutím ^3 [{+actionslot 2}] ^7.", + "AF_CAVES_OBJ_AMBUSH": "Seskup se s Pricem a napadněte nepřálskou hlídku.", + "AF_CAVES_HINT_C4_DETONATE": "Pro odpálení C4 stiskni ^3 [{+attack}] ^7.", + "AF_CAVES_LOCATE_SHEPHERD": "Najděte Shepherda.", + "AF_CAVES_OBJ_FLANK_AND_KILL": "Zneškodněte nepřátelský odpor.", + "AF_CAVES_LINE1": "„Jako za starých časů“", + "AF_CAVES_LINE2": "7.Den - [{FAKE_INTRO_TIME:17:32:22}]", + "AF_CAVES_LINE3": "'Soap' MacTavish", + "AF_CAVES_LINE4": "Sektor Hotel Bravo, Afghánistán", + "AF_CAVES_RAPPEL": "Zahákni se k zábradlí.", + "AF_CAVES_RAPPEL_HINT": "Zahákni se podržením ^3&&1^7.", + "AF_CAVES_DESCEND": "Brzdi držením ^3[{+attack}]^7.", + "AF_CAVES_OBJ_LEDGE_TRAVERSE": "Přejdi přes kamenný most", + "AF_CAVES_OBJ_BREACH": "Dostaň se k Shepherdovu velícímu centru", + "AF_CAVES_OBJ_DOOR_CONTROLS": "Nabourej se do ovládání dveří", + "AF_CAVES_USE_KEYBOARD": "Pro nabourání se do ovladání dveří podrž ^3&&1^7.", + "AF_CAVES_MISSIONFAIL_EXPLOSIVES": "Mise nesplněna.\nNastražené výbušniny detonovaly.", + "AF_CAVES_TIME_REMAINING": "Dostaň se ven do:", + "AF_CAVES_RAN_OUT_OF_TIME": "Nedostal jsi se ven včas.", + "AF_CAVES_OBJ_ESCAPE": "Uteč z jeskyně", + "AF_CAVES_OBJ_HUMMER": "Použij kulomet na Humvee", + "AF_CAVES_OBJ_HUMMER_GUNNER": "Zneškodni nepřátelský odpor", + "AF_CAVES_REGROUP_WITH_PRICE": "Seskup se s Pricem.", + "AF_CAVES_FELL_TO_DEATH": "Neutekl jsi včas.", + "AF_CAVES_DEADQUOTE_ABANDONED_PRICE": "Opustil jsi kapitána Price.", + + "AF_CHASE_OBJ_CRASH": "Prohledej místo nehody.", + "AF_CHASE_PURSUE": "Nenech Shepherda uprchnout.", + "AF_CHASE_MISSION_FAILED_KEEP_UP": "Shepherd utekl.", + "AF_CHASE_MISSION_FAILED_IN_THE_OPEN": "Snaž se zůstat mimo volnou plochu!", + "AF_CHASE_FAILED_TO_SHOOT_DOWN": "Shepherd uprchl ve vrtulníku.", + "AF_CHASE_FAILED_TO_PULL_KNIFE": "Price byl zabit.", + "AF_CHASE_LOCATE_SHEPHERD": "Najdi Shepherda.", + "AF_CHASE_KILL_SHEPHERD": "Zabij Shepherda.", + "AF_CHASE_PRESS_USE": "^3[{+activate}]^7", + "AF_CHASE_INTROSCREEN_LINE1": "„Končící hra“", + "AF_CHASE_INTROSCREEN_LINE2": "7.Den - [{FAKE_INTRO_TIME:18:10:22}]", + "AF_CHASE_INTROSCREEN_LINE3": "'Soap' MacTavish", + "AF_CHASE_INTROSCREEN_LINE4": "Sektor Hotel Bravo, Afghánistán", + "AF_CHASE_HINT_CRAWL_RIGHT": "^3[{+attack}]^7", + "AF_CHASE_HINT_CRAWL_LEFT": "^3Levá myš^7", + "AF_CHASE_FAILED_TO_CRAWL": "", + "AF_CHASE_HINT_MELEE_EMPTY": "^3[{+melee}]^7", + + "AIRPORT_LINE1": "„Nepoužívejte ruštinu“", + "AIRPORT_LINE2": "3.Den - 08:40:[{FAKE_INTRO_SECONDS:32}]", + "AIRPORT_LINE3": "Svob. Joseph Allen jako Alexei Borodin", + "AIRPORT_LINE4": "Zakhaevovo mezinárodní letiště", + "AIRPORT_LINE5": "Moskva, Rusko", + "AIRPORT_OBJ_COVER": "Neprozraď se.", + "AIRPORT_OBJ_TRUST": "Získej Makarovovu důvěru.", + "AIRPORT_OBJ_COVER_TRUST": "Neprozraď se a získej Makarovovu důvěru.", + "AIRPORT_OBJ_GET_IN_VAN": "Jdi do dodávky.", + "AIRPORT_OBJ_COVER_COST": "Za žádnou cenu... se neprozraď.", + "AIRPORT_FAIL_BLEW_COVER_FIRE": "Prozradil ses... nestřílej na Makarovovi muže.", + "AIRPORT_FAIL_BLEW_COVER_WANDER": "Prozradil ses... Přesvědč Makarova, že jsi oddaný jeho věci.", + "AIRPORT_FAIL_POLICE_BARRICADE": "Policejní jednotky jsou na střet příliš silné.", + "AIRPORT_OBJ_TRUST_COST": "Jdi za Makarovem.", + "AIRPORT_EXPLODING_JET_ENGINE_DEATH": "AIRPORT_EXPLODING_JET_ENGINE_DEATH\nLetecké motory mohou při střelbě explodovat.", + + "ARCADIA_INTROSCREEN_LINE_1": "„Důsledek“", + "ARCADIA_INTROSCREEN_LINE_2": "4. Den - 18:51:[{FAKE_INTRO_SECONDS:28}]", + "ARCADIA_INTROSCREEN_LINE_3": "Voj. James Ramirez", + "ARCADIA_INTROSCREEN_LINE_4": "1. Bn., 75. Ranger Regiment", + "ARCADIA_INTROSCREEN_LINE_5": "Severovýchodní Virginie, U.S.A.", + "ARCADIA_OBJECTIVE_AA_GUNS": "Najdi a znič protiletecké zbraně.", + "ARCADIA_OBJECTIVE_BROOKMERE": "Jdi na 4677 Brookmere Road.", + "ARCADIA_OBJECTIVE_INTEL": "Dostaň informace z 'krytu' na 4677 Brookmere Road.", + "ARCADIA_LASER_HINT": "Stisknutím^3 [{+actionslot 4}] ^7označíš cíl pro Stryker.\nPro potvrzení cílové oblasti použij^3 [{+attack}] ^7", + "ARCADIA_LASER_HINT_GOLFCOURSE": "Stisknutím^3 [{+actionslot 4}] ^7označíš zbraně AA.\nPoužij^3 [{+attack}] ^7pro potvrzení cílových vozidel.", + "ARCADIA_PICK_UP_BRIEFCASE_HINT": "Seber kufřík podržením &&1.", + + "BONEYARD_INTROSCREEN_LINE_1": "„Nepřítel mého nepřítele“", + "BONEYARD_INTROSCREEN_LINE_2": "6.Den - [{FAKE_INTRO_TIME:16:03:21}]", + "BONEYARD_INTROSCREEN_LINE_3": "Kpt. 'Soap' MacTavish", + "BONEYARD_INTROSCREEN_LINE_4": "160 mil JZ od Kandaháru, Afghánistán", + "BONEYARD_INTROSCREEN_LINE_5": "U.S. vrakoviště č. 437", + "BONEYARD_OBJ_RALLYPOINT": "Dostaň se na shromaždiště.", + "BONEYARD_OBJ_RIDE": "Dostaň se do UAZ.", + "BONEYARD_DEADQUOTE_MOUNT": "Nedostal ses do vozidla.", + "BONEYARD_OBJ_C130": "Dostaň se do Nikolaiova letadla.", + "BONEYARD_DEADQUOTE_CRASH": "Nedokázal si přebrat řízení vozidla.", + "BONEYARD_DEADQUOTE_TAKEOFF": "Nedostal ses do letadla.", + "BONEYARD_OBJ_RIDE_ICON": "Svézt se", + + "CLIFFHANGER_MRHR": "&&1 mR/hr", + "CLIFFHANGER_OBJ_FUEL_STATION": "Umísti výbušniny na čerpací stanici.", + "CLIFFHANGER_OBJ_C4": "Umísti výbušniny na nádrže s palivem.", + "CLIFFHANGER_OBJ_C4_MIG": "Umísti výbušniny na stíhačku MiG-29.", + "CLIFFHANGER_HINT_PRONE": "Skrč se stisknutím ^3[{goprone}]^7.", + "CLIFFHANGER_OBJ_PACKAGE": "Získej 'balíček'.", + "CLIFFHANGER_OBJ_FOLLOW": "Jdi za kapitánem MacTavishem.", + "CLIFFHANGER_OBJ_BASE": "Najdi cestu do základny.", + "CLIFFHANGER_OBJ_FIND_FUEL": "Najdi nádrže s palivem.", + "CLIFFHANGER_OBJ_STEALTH": "Spatřili tě. Zneškodni je.", + "CLIFFHANGER_FAIL_STEALTH_COUNT": "Upozornil jsi na sebe mnoho nepřátel.", + "CLIFFHANGER_FAIL_STEALTH_TIME": "Trvalo ti to příliš dlouho, spustil se alarm.", + "CLIFFHANGER_FAIL_PRICE_DEAD": "Nechal si kapitána MacTavishe zemřít.", + "CLIFFHANGER_MISSION_ABORT": "Kapitán MacTavish zrušil misi.", + "CLIFFHANGER_USE_SATELITE": "Vezmi ACS podržením ^3&&1^7.", + "CLIFFHANGER_OBJ_USE_SATELITE": "Vezmi ze satelitu data modul.", + "CLIFFHANGER_OBJ_GOTO_HANGER": "Dostaň se k satelitu.", + "CLIFFHANGER_OBJ_SNOWMOBILE": "Obstarej si snežný skůtr", + "CLIFFHANGER_OBJ_EXTRACT": "Dostaň se k extrakčnímu bodu.", + "CLIFFHANGER_OBJ_EVACUATE": "Uteč s kapitánem MacTavishem.", + "CLIFFHANGER_ACTIVATE_HEARTBEAT": "Aktivuj senzor srdečního tepu stisknutím^3[{weapnext}]^7.", + "CLIFFHANGER_SWITCH_HEARTBEAT": "Aktivuj senzor srdečního tepu stisknutím^3 [{+actionslot 3}] ^7.", + "CLIFFHANGER_OBJ_COMPUTER": "Získej ACS modul.", + "CLIFFHANGER_PRICE_DIED": "Kapitán MacTavish byl popraven.", + "CLIFFHANGER_RUN_OVER": "Kapitán MacTavish byl obklíčen.", + "CLIFFHANGER_BOARD": "Nastup držením ^3&&1^7.", + "CLIFFHANGER_MAKES_FIRST_JUMP": "Napoprvé to nikdo nezvládne...", + "CLIFFHANGER_HOLD_ON_TIGHT": "Drž se proboha.", + "CLIFFHANGER_LEFT_ICEPICK": "Podržením ^3Levé myši^7 se zavěs na levý hák.", + "CLIFFHANGER_RIGHT_ICEPICK": "Podržením ^3Pravé myši^7 se zavěs na pravý hák.", + "CLIFFHANGER_HOW_TO_CLIMB": "Jdi blíž k ledu a vylez podržením ^3Pravé myši^7.", + "CLIFFHANGER_LINE1": "„Horolezec“", + "CLIFFHANGER_LINE2": "2.Den - 07:35:[{FAKE_INTRO_SECONDS:32}]", + "CLIFFHANGER_LINE3": "Sgt. Gary 'Roach' Sanderson", + "CLIFFHANGER_LINE4": "Task Force 141", + "CLIFFHANGER_LINE5": "Pásmo Tian Shan, Kazachstán", + "CLIFFHANGER_E3_INTEREST_OF_TIME": "V závislosti na čase...", + "CLIFFHANGER_E3_NOT_AS_PLANNED": "Věci nejdou vždy podle plánu...", + + "CONTINGENCY_LINE1": "„Vyjímečná situace“", + "CONTINGENCY_LINE2": "5.Den - 11:22:[{FAKE_INTRO_SECONDS:32}]", + "CONTINGENCY_LINE3": "Sgt. Gary 'Roach' Sanderson", + "CONTINGENCY_LINE4": "Task Force 141", + "CONTINGENCY_LINE5": "14 mil SV od Petropavlovska, Rusko", + "CONTINGENCY_OBJ_DEFEND_SUB": "Drž nepřátele od ponorky.", + "CONTINGENCY_OBJ_ENTER_SUB": "Dostaň se k ponorce dříve než odpluje.", + "CONTINGENCY_OBJ_CONTROL_SUB": "Zmocni se ponorky.", + "CONTINGENCY_OBJ_TURN_KEY": "Zadej svůj klíč.", + "CONTINGENCY_OBJ_EXIT_SUB": "Uteč.", + "CONTINGENCY_OBJ_DEFEND": "Braň", + "CONTINGENCY_SUB_TIMER_EXPIRED": "Mise nesplněna. Nedostal jsi se k ponorce včas.", + "CONTINGENCY_OBJ_ENTER_BASE": "Najdi vchod do ponorkové základny.", + "CONTINGENCY_OBJ_PRICE": "Jdi za kapitánem Pricem.", + "CONTINGENCY_USE_DRONE": "Pro použití UAV stiskni^3 [{+actionslot 4}] ^7.", + "CONTINGENCY_TURN_KEY": "Pro odpálení hlavice podrž ^3 &&1 ^7.", + "CONTINGENCY_DONT_LEAVE": "Jdi za kapitánem Pricem.", + "CONTINGENCY_DONT_LEAVE_FAILURE": "Opustil jsi zónu mise.", + + "DC_WHITEHOUSE_INTROSCREEN_1": "„Whiskey Hotel“", + "DC_WHITEHOUSE_INTROSCREEN_2": "5.Den - 19:28:[{FAKE_INTRO_SECONDS:22}]", + "DC_WHITEHOUSE_INTROSCREEN_3": "Voj. James Ramirez", + "DC_WHITEHOUSE_INTROSCREEN_4": "1. Bn., 75th Ranger Regiment", + "DC_WHITEHOUSE_INTROSCREEN_5": "Washington, D.C., U.S.A.", + "DC_WHITEHOUSE_OBJ_BREACH_WH": "Dostaň se do pravého křídla.", + "DC_WHITEHOUSE_OBJ_DEPLOY_FLARE": "Zapal zelené světlice.", + "DC_WHITEHOUSE_FLARE_DEADQUOTE": "Nestihl jsi zastavit Hammerdown.", + "DC_WHITEHOUSE_OBJ_WHISKEY_HOTEL": "Jdi za Sgt. Foleym do Whiskey Hotelu.", + + "DCBURNING_INTROSCREEN_1": "„Z vlastního podnětu“", + "DCBURNING_INTROSCREEN_2": "5.Den - [{FAKE_INTRO_TIME:18:34:27}]", + "DCBURNING_INTROSCREEN_3": "Voj. James Ramirez", + "DCBURNING_INTROSCREEN_4": "1. Bn., 75th Ranger Regiment", + "DCBURNING_INTROSCREEN_5": "Washington, D.C., U.S.A.", + "DCBURNING_OBJ_FOLLOW_SGT_MACEY": "Jdi za Sgt. Foleym.", + "DCBURNING_OBJ_COMMERCE": "Zabezpeč nepřátelské 'hnízdo' na patém patře.", + "DCBURNING_OBJ_COMMERCE_DEFEND_SNIPE": "Odstřel nepřátele střílející na evakuační zónu.", + "DCBURNING_OBJ_COMMERCE_DEFEND_CROW": "Braň 'hnízdo'.", + "DCBURNING_OBJ_TEXT_DEFEND": "Braň", + "DCBURNING_OBJ_COMMERCE_DEFEND_JAVELIN": "Znič nepřátelské vozidla použitím Javelinu.", + "DCBURNING_OBJ_ROOFTOP": "Dostaň se k vrtulníku na střeše.", + "DCBURNING_OBJ_HELI_MOUNT": "Použij kulomet ve vrtulníku.", + "DCBURNING_OBJ_HELI_RIDE": "Zneškodni dostupné cíle.", + "DCBURNING_OBJ_CRASH_SITE": "Braň místo nehody.", + "DCBURNING_INFO_EVAC_SITE_HEALTH": "Zničení evak. zóny:", + "DCBURNING_MISSIONFAIL_CROWSNEST_SNIPE": "Mise nesplněna.\nEvakuační zóna je ztracena.", + "DCBURNING_MISSIONFAIL_LEFT_CHOPPER": "Kryj se uvnitř vrtulníku.", + "DCBURNING_SWITCH_HEARTBEAT": "Aktivuj srdeční senzor stisknutím^3 [{+actionslot 3}] ^7.", + "DCBURNING_TIME_REMAINING": "Dostaň se na střechu do:", + "DCBURNING_RAN_OUT_OF_TIME": "Nestihl jsi to včas.", + "DCBURNING_HINT_JAVELIN_SWITCH": "Vezmi si Javelin stisknutím ^3[{weapnext}]^7.", + "DCBURNING_HINT_JAVELIN_PICKUP": "Najdi Javelin proti nepřátelským vozidlům.", + "DCBURNING_HINT_JAVELIN_FIRE": "Znič nepřátelská vozidla.", + + "DCEMP_INTROSCREEN_1": "„Druhé slunce“", + "DCEMP_INTROSCREEN_2": "5.Den - 18:57:[{FAKE_INTRO_SECONDS:17}]", + "DCEMP_INTROSCREEN_3": "Voj. James Ramirez", + "DCEMP_INTROSCREEN_4": "1. Bn., 75th Ranger Regiment", + "DCEMP_INTROSCREEN_5": "Washington, D.C., U.S.A.", + "DCEMP_OBJ_FOLLOW_SGT_FOLEY": "Jdi za Sgt. Foleym.", + "DCEMP_OBJ_HELI_RIDE": "Zneškodni pozemní odpor.", + "DCEMP_OBJ_CRASH_SITE": "Braň místo nehody.", + "DCEMP_MISSIONFAIL_LEFT_CHOPPER": "Kryj se uvnitř zříceného vrtulníku.", + "DCEMP_SWITCH_HEARTBEAT": "Aktivuj senzor srdecního tepu stisknutím^3 [{+actionslot 3}] ^7.", + "DCEMP_RAN_OUT_OF_TIME": "Nedostal jsi se na střechu včas.", + "DCEMP_ISS_INTROSCREEN1": "Des. D. Hicks", + "DCEMP_ISS_INTROSCREEN2": "Mezinárodní vesmírná stanice", + "DCEMP_ISS_INTROSCREEN3": "350 km nad zemským povrchem", + "DCEMP_OBJ_FIND_SHELTER": "Dostaň se z ulice a najdi úkryt.", + "DCEMP_OBJ_WHISKEY_HOTEL": "Spolu se Sgt. Foleym se dostaň do Whiskey Hotelu.", + "DCEMP_OBJ_BREACH_WH": "Dostaň se do Bílého domu.", + "DCEMP_OBJ_DEPLOY_FLARE": "Zapal zelené světlice na střeše.", + "DCEMP_FLARE_DEADQUOTE": "Nezastavil jsi Hammerdown.", + + "ESTATE_INTROSCREEN_LINE_1": "„Nedokončené záležitosti“", + "ESTATE_INTROSCREEN_LINE_2": "6.Den - [{FAKE_INTRO_TIME:15:36:07}]", + "ESTATE_INTROSCREEN_LINE_3": "Sgt. Gary 'Roach' Sanderson", + "ESTATE_INTROSCREEN_LINE_4": "Task Force 141", + "ESTATE_INTROSCREEN_LINE_5": "Georgsko-Ruská hranice", + "ESTATE_OBJ_ASSASSINATE": "Zneškodni Vladimíra Makarova", + "ESTATE_OBJ_BREACH": "Dostaň se do Makarova úkrytu.", + "ESTATE_OBJ_REGROUP": "Seskup se s Ghostem.", + "ESTATE_OBJ_INTEL": "Pripoj DSM k Makarovově počítačové síti.", + "ESTATE_OBJ_DOWNLOAD": "Hlídej DSM do konce přenosu.", + "ESTATE_OBJ_RETRIEVE": "Vezmi DSM.", + "ESTATE_OBJ_LZ": "Dostaň se do extrakčního bodu.", + "ESTATE_OBJ_POINTER_PROTECT": "Hlídej", + "ESTATE_OBJ_POINTER_RETRIEVE": "Vezmi", + "ESTATE_DSM_FRAME": "DSM v6.04", + "ESTATE_DSM_WORKING": "...pracuji...", + "ESTATE_DSM_NETWORK_FOUND": "...síť nalezena...", + "ESTATE_DSM_IRONBOX": "...ironbox nalezen...", + "ESTATE_DSM_BYPASS": "...dešifrováno.", + "ESTATE_DSM_PROGRESS": "Souborů zkopírováno:", + "ESTATE_DSM_DLRATE": "Mbps", + "ESTATE_DSM_SLASH_TOTALFILES": "/2067", + "ESTATE_DSM_DLTIMELEFT": "Zbývající čas:", + "ESTATE_DSM_DLTIMELEFT_MINS": "minuty", + "ESTATE_DSM_DLTIMELEFT_SECS": "vteřiny", + "ESTATE_DSM_DL_RATEMETER": "při", + "ESTATE_OBJ_EXFIL": "Dostaň se k náhradnímu extrakčnímu bodu.", + "ESTATE_USE_CLAYMORE_HINT": "Použij claymore stisknutím^3 [{+actionslot 4}] ^7.", + "ESTATE_LEARN_PRONE": "Vyhni se minám podržením ^3[{+stance}]^7!", + "ESTATE_LEARN_PRONE_TOGGLE": "Podržením^3 [{toggleprone}] ^7se vyhneš minám!", + "ESTATE_LEARN_PRONE_HOLDDOWN": "Vyhni se minám stisknutím a podržením dolů ^3[{+prone}]^7!", + "ESTATE_REMIND_PRONE_LINE1": "Byl jsi zabit nášlapnou minou!", + "ESTATE_REMIND_PRONE_LINE2": "Vyhni se jim podržením ^3[{+stance}]^7.", + "ESTATE_REMIND_PRONE_LINE2_TOGGLE": "Vyhni se jim stisknutím ^3[{toggleprone}]^7.", + "ESTATE_REMIND_PRONE_LINE2_HOLDDOWN": "Vyhni se jim stisknutím a podržením dolů ^3[{+prone}]^7.", + "ESTATE_DSM_USE_HINT": "Připoj DSM k Makarovově počítači podržením ^3&&1^7.", + "ESTATE_DSM_PICKUP_HINT": "Vezmi DSM podržením ^3&&1^7.", + "ESTATE_DSM_DESTROYED_BY_PLAYER": "Dávej pozor kam střílíš! Zničil jsi DSM.", + "ESTATE_DSM_DESTROYED_BY_AI_GUNFIRE": "Nepřátelé rozstříleli a zničili DSM.", + "ESTATE_DSM_DESTROYED_BY_DESERTION": "DSM bylo zničeno. Braň svůj cíl.", + "ESTATE_FAKE_DEATH_QUOTE": "„Do posledního boje půjdu s tebou; z nitra pekla tě probodnu...“ - Herman Melville", + + "FAVELA_ESCAPE_OBJ_FOLLOW_SOAP": "Podpoř kapitána MacTavishe na cestě k přistávací zóně.", + "FAVELA_ESCAPE_OBJ_FOLLOW_MARKER": "Krytí", + "FAVELA_ESCAPE_OBJ_JUMP_MARKER": "Skoč", + "FAVELA_ESCAPE_OBJ_FLEE_RADIOTOWER": "Dostaň se jihovýchodní částí trhu do přistávací zóny.", + "FAVELA_ESCAPE_OBJ_MARKET_ESCAPE": "Uteč přes střechy k druhé přistávací zóně.", + "FAVELA_ESCAPE_OBJ_GET_BACK_TO_ROOF": "Dostaň se zpět na střechy.", + "FAVELA_ESCAPE_OBJ_GET_TO_CHOPPER": "Dostaň se k vrtulníku na jižním konci střech.", + "FAVELA_ESCAPE_HINT_SPRINT": "Pro sprint stiskni v pohybu ^3[{+breath_sprint}]^7.", + "FAVELA_ESCAPE_HINT_SPRINT_PC": "Pro sprint stiskni v pohybu ^3[+sprint}]^7.", + "FAVELA_ESCAPE_HINT_SPRINT_PC_ALT": "Pro sprint stiskni v pohybu ^3[{+breath_sprint}]^7", + "FAVELA_ESCAPE_SOLORUN_KEEP_MOVING": "Jsi zraněn. Zachraň si život!", + "FAVELA_ESCAPE_CHOPPER_TIMER": "Čas do odletu:", + "FAVELA_ESCAPE_CHOPPER_TIMER_EXPIRED": "Mise nesplněna: Nedokázal jsi se dostat k vrtulníku.", + "FAVELA_ESCAPE_DEADQUOTE_FAILED_CHOPPER_JUMP": "Bež a skoč na žebřík a dostaň se do vrtulníku.", + "FAVELA_ESCAPE_INTROSCREEN_LINE_1": "„Sršní hnízdo“", + "FAVELA_ESCAPE_INTROSCREEN_LINE_2": "4.Den - 16:19:[{FAKE_INTRO_SECONDS:40}]", + "FAVELA_ESCAPE_INTROSCREEN_LINE_3": "Sgt. Gary 'Roach' Sanderson", + "FAVELA_ESCAPE_INTROSCREEN_LINE_4": "Task Force 141", + "FAVELA_ESCAPE_INTROSCREEN_LINE_5": "Rio de Janeiro, 1700 stop A.S.L.", + + "FAVELA_INTROSCREEN_LINE_1": "„Zatčení“", + "FAVELA_INTROSCREEN_LINE_2": "4.Den - 15:08:[{FAKE_INTRO_SECONDS:16}]", + "FAVELA_INTROSCREEN_LINE_3": "Sgt. Gary 'Roach' Sanderson", + "FAVELA_INTROSCREEN_LINE_4": "Task Force 141", + "FAVELA_INTROSCREEN_LINE_5": "Rio de Janeiro, Brazílie", + "FAVELA_OBJ_REACH_TOP": "Prostřílej se k vrcholu favely a dostaň Rojase.", + "FAVELA_OBJ_CATCH_RUNNER": "Zajmi Rojasova společníka.", + "FAVELA_OBJ_CAPTURE": "Zajmi", + "FAVELA_KILLED_RUNNER": "Zabil jsi Rojasova společníka. Střílej tak, aby nezemřel!", + "FAVELA_RUNNER_GOT_AWAY": "Rojasův společník utekl!", + "FAVELA_ROJAS_KILLED": "Zabil jsi Rojase. Potřebujeme ho živého!", + + "GULAG_FIND_POW": "Zachraň vězně #627.", + "GULAG_CONTROL_ROOM": "Obsaď velící centrum věznice.", + "GULAG_BREACH_THE_BATHROOM": "Umísti trhavinu.", + "GULAG_CELL_DUTY": "Prohledej cely.", + "GULAG_HOLD_1_TO_RAPPEL": "Slez dolů podržením ^3&&1^7.", + "GULAG_HOLD_1_TO_SPIE": "Přichyť se podržením ^3&&1^7.", + "GULAG_ESCAPE": "Uteč z věznice.", + "GULAG_PRICE_KILLED": "POW byl zabit. Mise nesplněna.", + "GULAG_SHOWERS_TIMER": "Nynější čas:", + "GULAG_M203_DEATH": "Zneškodni SLAMRAAM granátometem M203.", + "GULAG_FOLLOW_SOAP": "Jdi s kapitánem MacTavishem do věznice.", + "GULAG_HINT_MELEE": "Stáhni nepřítele stisknutím ^3[{+melee}]^7.", + "GULAG_INTROSCREEN_1": "„Pevnost“", + "GULAG_INTROSCREEN_2": "5.Den - 07:42:[{FAKE_INTRO_SECONDS:17}]", + "GULAG_INTROSCREEN_3": "Sgt. Gary 'Roach' Sanderson", + "GULAG_INTROSCREEN_4": "Task Force 141", + "GULAG_INTROSCREEN_5": "40 mil východně od Petropavlovska, Rusko", + + "INVASION_LINE1": "„Vlkodlaci!“", + "INVASION_LINE2": "4.Den - 17:45:[{FAKE_INTRO_SECONDS:32}]", + "INVASION_LINE3": "Voj. James Ramirez", + "INVASION_LINE4": "1. Bn., 75th Ranger Regiment", + "INVASION_LINE5": "Severovýchodní Virginie, U.S.A.", + "INVASION_OBJ_FOLEY": "Jdi za Sgt. Foleym.", + "INVASION_OBJ_CRASH": "Prohledej místo nehody.", + "INVASION_OBJ_SENTRY": "Umísti M-5 na jižní stranu střechy.", + "INVASION_OBJ_ROOF": "Dostaň se na střechu Nateovy restaurace.", + "INVASION_OBJ_DEFEND": "Zneškodni nepřátelský útok.", + "INVASION_OBJ_PREDATOR": "Použij rozhraní Predátora.", + "INVASION_OBJ_REGROUP": "Seskup se u Nateovy restaurace.", + "INVASION_OBJ_BMPS": "Znič BTR80.", + "INVASION_OBJ_BURGERTOWN": "Zabezpeč Burger Town.", + "INVASION_OBJ_NATES_REGROUP": "", + "INVASION_OBJ_VIP_ESCORT": "Ochraň VIP.", + "INVASION_OBJ_BURGERTOWN_DEFEND": "Zneškodni nepřátelské jednotky.", + "INVASION_OBJ_ATTACK_HELI": "Znič nepřátelský vrtulník.", + "INVASION_OBJ_CONVOY": "Seskup se u konvoje.", + "INVASION_FAIL_SENTRY": "M-5 byla zničena.", + "INVASION_FAIL_PREZ": "Prezident zemřel.", + "INVASION_FAIL_ABANDONED": "Opustil jsi svoji jednotku.", + "INVASION_DRONE_PICKUP": "Vezmi si ovladaní k Predátorovi podržením &&1.", + "INVASION_USE_DRONE": "Ovládej Predátora stisknutím ^3[{+actionslot 4}]^7.", + "INVASION_THROW_SEMTEX": "Hoď lepivý Semtex granát stisknutím ^3[{+smoke}]^7.", + "INVASION_SMOKE_TOO_FAR": "Hodil jsi granát příliš daleko.", + "INVASION_GET_SEMTEX": "K získání dalších 'Semtex granátů' podrž u zásob^3[{+usereload}]^7.", + "INVASION_HELLFIRE_DRONE_VIEW": "KAMERA: UAV_DRONE_011", + "INVASION_HELLFIRE_MISSILE_VIEW": "KAMERA: RAKETA", + "INVASION_WAYPOINT_PROTECT": "Ochraň", + "INVASION_WAYPOINT_DEFEND": "Braň", + "INVASION_WAYPOINT_HOSTILES": "Cíle", + "INVASION_TOGGLE_ADS_WITH_STINGER": "Při použití Stingeru stiskni ^3[{+toggleads_throw}]^7", + "INVASION_ADS_WITH_STINGER": "Při použití Stingeru podrž ^3[{+speed_throw}]^7.", + "INVASION_THROW_SMOKE": "Hoď kouřový granát stisknutím ^3[{+smoke}]^7.", + "INVASION_GET_SMOKE": "Pro více kouřových granátů podrž u zásob ^3[{+usereload}]^7.", + + "OILRIG_INTROSCREEN_LINE_1": "„Jediný klidný den... byl včera“", + "OILRIG_INTROSCREEN_LINE_2": "5.Den - [{FAKE_INTRO_TIME:05:47:10}]", + "OILRIG_INTROSCREEN_LINE_3": "Sgt. Gary 'Roach' Sanderson", + "OILRIG_INTROSCREEN_LINE_4": "Task Force 141", + "OILRIG_INTROSCREEN_LINE_5": "Ropná plošina Vikhorevka 36, Rusko", + "OILRIG_OBJ_SOAP": "Kapt. MacTavish", + "OILRIG_OBJ_GHOST": "Ghost", + "OILRIG_OBJ_STEALTHKILL": "Potichu zneškodni stráže.", + "OILRIG_OBJ_HOSTAGES_SECURE": "Zachraň rukojmí. (&&1 zbývá)", + "OILRIG_OBJ_HOSTAGES_SECURE_DONE": "Zachraň rukojmí.", + "OILRIG_OBJ_C4_AMBUSH_PLANT": "Umístěte na mrtvá těla C4.", + "OILRIG_OBJ_AMBUSH": "Zaujměte u lešení výhodné pozice.", + "OILRIG_OBJ_EXPLOSIVES_LOCATE": "Zabezpeč jeřábníky na nejvyšším patře.", + "OILRIG_OBJ_ESCAPE": "Dostaň se k přistávací zóně vrtulníku.", + "OILRIG_HINT_AMBUSH_COVER": "Kryj se u lešení a překvap nepřítele.", + "OILRIG_HINT_C4_SWITCH": "Vytáhni si C4 detonátor stisknutím^3 [{+actionslot 2}] ^7.", + "OILRIG_HINT_C4_DETONATE": "Odpal C4 podržením ^3[{+speed_throw}]^7", + "OILRIG_HINT_THERMAL_WEAPON_USE": "Pro zneškodnění nepřátel v kouři použij zbraň s termálním viděním", + "OILRIG_HINT_THERMAL_WEAPON_FIND": "Pro zneškodnení nepřátel v kouři si najdi zbraň s termálním hledím", + "OILRIG_MISSIONFAIL_ENEMIES_ALERTED_HOSTAGES_KILLED": "Mise nesplněna. Upozornil jsi na sebe nepřátele a rukojmí byli popraveni.", + "OILRIG_MISSIONFAIL_EXPLOSIVES": "Mise nesplněna.\nNastražené výbušniny detonovaly.", + "OILRIG_MISSIONFAIL_EXPLOSIVES_NOTPLANTED": "Mise nesplněna.\nNeumístil si C4 včas.", + "OILRIG_MISSIONFAIL_WATER_DEATH": "Mise nesplněna.\nVyvaruj se spadnutí do vody.", + "OILRIG_MISSIONFAIL_HELI_DEATH": "Byl jsi zabit nepřátelským vrtulníkem.\nVrtulníky můžeš sestřelit raketami.", + "OILRIG_DEBUG_UNDERWATER": "Přeskočit sekvenci pod vodou\n(zdržující animace)", + "OILRIG_DEBUG_STEALTHKILLS": "Preskočit části tichého zabití\n(zdržující animace)", + + "ROADKILL_ONE_YEAR_AGO": "Před rokem...", + "ROADKILL_LINE_1": "„Týmový hráč“", + "ROADKILL_LINE_2": "1.Den - 16:08:[{FAKE_INTRO_SECONDS:32}]", + "ROADKILL_LINE_3": "Svob. Joseph Allen", + "ROADKILL_LINE_4": "1. Bn., 75th Ranger Regiment", + "ROADKILL_LINE_5": "Červená zóna, Afghánistán", + "ROADKILL_OBJECTIVE_BRIDGELAYER": "Braň most.", + "ROADKILL_OBJECTIVE_RIVERBANK": "Zneškodni nepřátelské pozorovatele.", + "ROADKILL_OBJECTIVE_HUMVEE": "Dostaň se do svého Humvee.", + "ROADKILL_OBJECTIVE_TARGETS": "Zneškodni co nejvíc cílů.", + "ROADKILL_OBJECTIVE_SCAN": "Prověř nepřátelskou aktivitu. Nestřílej dokud nezačnou oni.", + "ROADKILL_OBJECTIVE_SHEPHERD": "Hlas se generálu Shepherdovi.", + "ROADKILL_OBJECTIVE_JAVELIN": "Znič obrněná vozidla za řekou.", + "ROADKILL_OBJECTIVE_EXFIL": "Dostaň se k vyznačenému bodu.", + "ROADKILL_OBJECTIVE_DISMOUNT": "Hlídej okolí školy.", + "ROADKILL_OBJECTIVE_SCHOOL": "Zneškodni nepřátele v oblasti školy.", + "ROADKILL_OBJECTIVE_REPORT": "Na shromaždisti se hlas generálu Shepherdovi.", + "ROADKILL_OBJECTIVE_AIRSTRIKE": "Počkej na letecký útok.", + "ROADKILL_HOLD_TO_BOARD": "Nastup podržením ^3&&1^7.", + "ROADKILL_SHOT_TOO_MUCH": "Neplnění rozkazu nebude tolerováno.", + "ROADKILL_GOT_SNIPED": "Bylo by bezpečnější jet v konvoji.", + "ROADKILL_SHOT_UNARMED": "Nemáš právo střílet na nevinné civilisty.", + "ROADKILL_BRIDGELAYER_DESTROYED": "Most byl zničen.", + + "TRAINER_HINT_CROSSHAIR_CHANGES": "Čím větší zaměřovač je, tím méně přesně střílíš.", + "TRAINER_HINT_TURN_AROUND": "Otoč se a útoč na cíle jenž jsou na dostřel.", + "TRAINER_HINT_ADS_ACCURACY": "Střelba od boku není nikdy tak přesná jako střelba se zamířením.", + "TRAINER_USE_ROPE": "Stiskni a podrž ^3&&1^7 pro sklouznutí po laně.", + "TRAINER_SHIP_DIDNT_SPRINT": "Nesprintoval jsi.", + "TRAINER_SHIP_TOO_SLOW": "Byl jsi příliš pomalý.", + "TRAINER_ENEMIES_KILLED": "Zabito nepřátel: &&1/24", + "TRAINER_CIVVIES_KILLED": "Zabito civilistů: &&1/11", + "TRAINER_YOUR_TIME_IN_SECONDS": "Tvůj čas: &&1 sec", + "TRAINER_YOUR_TIME": "Tvůj čas:", + "TRAINER_YOUR_FINAL_TIME": "Tvůj konečný čas: &&1 sec", + "TRAINER_IW_BEST_TIME": "Nejlepší čas IW:", + "TRAINER_SHIP_JUMPED_TOO_EARLY": "Skočil jsi příliš brzy.", + "TRAINER_HIT_FRIENDLY": "Zasáhl jsi člena týmu.", + "TRAINER_HINT_FLASH": "Oslepující granát hodíš stiskem ^3[{+smoke}]^7.", + "TRAINER_MISSED_ENEMY_PENALTY": "Nezasažených nepřátel: +&&1 sec", + "TRAINER_MISSED_ENEMY_PENALTY_NONE": "Nezasažených nepřátel: --", + "TRAINER_KILLED_CIVVIES_PENALTY": "Civilistů zabito: +&&1 sec", + "TRAINER_KILLED_CIVVIES_NONE": "Civilistů zabito: --", + "TRAINER_ACCURACY_BONUS": "Odměna za přesnost: -&&1 sec", + "TRAINER_ACCURACY_BONUS_ZERO": "Odměna za přesnost: 0.0", + "TRAINER_ACCURACY_LABEL": "Přesnost: &&1%", + "TRAINER_C4_OBJECTIVE": "Pokud bude tvým úkolem umístit C4, uvidíš označené\nmísto.", + "TRAINER_HINT_GRENADE_TOO_LOW": "Při použití granátu musíš mířit nad cíl.", + "TRAINER_HINT_GL_TOO_LOW": "Při použití granátometu musíš mířit nad cíl.", + "TRAINER_AXIS_OPTION_MENU1": "Otočit ovládání", + "TRAINER_AXIS_OPTION_MENU2": "Přeješ si změnit ovládání", + "TRAINER_AXIS_OPTION_MENU1B": "nahoru a dolů?", + "TRAINER_AXIS_OPTION_MENU2B": "na původní nastavení?", + "TRAINER_AXIS_OPTION_MENU1_ALL": "Přeješ si otočit ovládání?", + "TRAINER_AXIS_OPTION_MENU2_ALL": "Přeješ si nechat nastavení takto?", + "TRAINER_LOOK_UP": "Podívej se nahoru.", + "TRAINER_LOOK_DOWN": "Podívej se dolů.", + "TRAINER_HINT_LAUNCHER_ICON": "Nyní máš na obrazu ikonu granátometu.", + "TRAINER_FIRED_NEAR_FRIENDLY": "Ohrozil jsi člena týmu.", + "TRAINER_MISSION_FAIL_FIRE_IN_CAMP": "Použití zbraně v nedovolených zónách nebude tolerováno.", + "TRAINER_INTROSCREEN_LINE_1": "„S.S.J.D.“", + "TRAINER_INTROSCREEN_LINE_2": "1.Den - 15:30:[{FAKE_INTRO_SECONDS:25}]", + "TRAINER_INTROSCREEN_LINE_3": "Svob. Joseph Allen", + "TRAINER_INTROSCREEN_LINE_4": "1. Bn., 75. Ranger Regiment", + "TRAINER_INTROSCREEN_LINE_5": "Vojenská základna Phoenix, Afghánistán", + "TRAINER_USE_YOUR_OBJECTIVE_INDICATOR": "Využij ukazatel cíle abys našel cvičnou dráhu.", + "TRAINER_PICK_UP_A_RIFLE_FROM": "Vezmi si zbraň ze stolu.", + "TRAINER_GET_A_PISTOL_FROM_THE": "Vezmi si ze stolu pistoli.", + "TRAINER_PICK_UP_THE_RIFLE_WITH": "Vezmi si pušku s granátometem.", + "TRAINER_PICK_UP_THE_C4_EXPLOSIVE": "Vezmi si C4.", + "TRAINER_RUN_THE_OBSTACLE_COURSE": "Proběhni překážkovou dráhu.", + "TRAINER_OBJ_GO_TO_THE_PIT": "Sleduj ukazatel úkolu a najdi cvičiště.", + "TRAINER_OBJ_EXIT_THE_PIT": "Seskup se se svým týmem nahoře.", + "TRAINER_TRY_SPRINT_AGAIN": "Jdi zpět k červenému kruhu\n a sprintuj k východu.", + "TRAINER_CLIMB_THE_LADDER": "Vylez po žebříku.", + "TRAINER_SHOOT_EACH_TARGET_WHILE": "Sestřel tři cíle s mířením.", + "TRAINER_SHOOT_EACH_TARGET_WHILE1": "Sestřel cíle střelbou od boku.", + "TRAINER_SHOOT_EACH_TARGET_AS": "Sestřel všechny cíle v co nejrychlejším čase.", + "TRAINER_EQUIP_THE_MP5_AND_PICK": "Vezmi si MP5 a 4 oslepující granáty.", + "TRAINER_CLEAR_THE_CARGOSHIP_BRIDGE": "Zneškodni nepřátele na plošině lodi.", + "TRAINER_SWITCH_TO_YOUR_RIFLE": "Vytáhni si pušku a pak zase pistoli.", + "TRAINER_PICK_UP_THE_FRAG_GRENADES": "Vezmi si tříštivé granáty.", + "TRAINER_ENTER_THE_SAFETY_PIT": "Jdi na start.", + "TRAINER_THROW_A_GRENADE_INTO": "Hoď na cíle granát", + "TRAINER_RETURN_TO_THE_SAFETY": "Vrať se na start a vezmi si granátomet.", + "TRAINER_FIRE_AT_THE_WALL_WITH": "Střílej na zeď číslo jedna.", + "TRAINER_PLANT_THE_C4_EXPLOSIVE": "Umísti C4 na označené místo.", + "TRAINER_FIRE_YOUR_GRENADE_LAUNCHER": "Granátometem střel do okna pět, šest a sedm.", + "TRAINER_SHOOT_A_TARGET_THROUGH": "Střel cíl přes dřevo.", + "TRAINER_SHOOT_THE_TARGET_THROUGH": "Střel cíl přes dřevo", + "TRAINER_SLIDE_DOWN_THE_ROPE": "Sjeď po laně.", + "TRAINER_COMPLETE_THE_DECK_MOCKUP": "Dokonči trénink.", + "TRAINER_RECOMMENDED_LABEL": "Doporučená", + "TRAINER_RECOMMENDED_LABEL2": "obtížnost:", + "TRAINER_RECOMMENDED_EASY": "Rekrut", + "TRAINER_RECOMMENDED_NORMAL": "Normální", + "TRAINER_RECOMMENDED_HARD": "Težká", + "TRAINER_RECOMMENDED_VETERAN": "Veterán", + "TRAINER_RECOMMENDED_TRY_AGAIN": "Zkus to znovu", + "TRAINER_PIT_TRY_AGAIN": "Hodně štěstí.", + "TRAINER_OBJ_COURSE": "Pokus se sestřelit co nejvíc správných terčů v nejrychlejším možném čase.", + + "LUA_MENU_ACCEPT": "Přijmout", + "LUA_MENU_ACCURACY_CAPS": "PŘESNOST", + "LUA_MENU_ACTIONS": "Akce", + "LUA_MENU_ADVANCED_VIDEO": "Pokročilá nastavení", + "LUA_MENU_ASSAULT_RIFLES_CAPS": "ÚTOČNÉ PUŠKY", + "LUA_MENU_ASSISTS": "Asistuj", + "LUA_MENU_ASSISTS_CAPS": "ASISTUJ", + "LUA_MENU_AUDIO_OPTIONS": "Zvuk", + "LUA_MENU_BACK": "Zpět\n", + "LUA_MENU_BARRACKS_CAPS": "KASÁRNA", + "LUA_MENU_CACABILITIES_NONE": "--", + "LUA_MENU_CAMPAIGN_CAPS": "KAMPAŇ", + "LUA_MENU_CANCEL": "Zrušit", + "LUA_MENU_CHALLENGES": "Výzvy", + "LUA_MENU_CHALLENGES_CAPS": "VÝZVY", + "LUA_MENU_CHECK_HOW_YOUR_SCORE": "Porovnávej svoje skóre s přáteli a celým světem.", + "LUA_MENU_CHOOSE_LANGUAGE": "Vyber jazyk", + "LUA_MENU_CLOSE": "Zavřít", + "LUA_MENU_CONTESTED": "contested", + "LUA_MENU_CONTINUE": "Pokračovat", + "LUA_MENU_CONTROLS": "Ovladání", + "LUA_MENU_CONTROL_OPTIONS": "Ovladání", + "LUA_MENU_CREATE_A_CLASS": "Vytvořit třídu", + "LUA_MENU_CREATE_A_CLASS_CAPS": "VYTVOŘIT TŘÍDU", + "LUA_MENU_CREDITS": "Titulky", + "LUA_MENU_CROSSHAIR": "Zaměřovač", + "LUA_MENU_CUSTOM": "Vlastní", + "LUA_MENU_DEATHS": "Úmrtí", + "LUA_MENU_DEATHS_CAPS": "ÚMRTÍ", + "LUA_MENU_DEFAULT": "Základní", + "LUA_MENU_DEFENDS": "Obrana", + "LUA_MENU_DEFENDS_CAPS": "OBRANA", + "LUA_MENU_DIFFICULTY": "Obtížnost", + "LUA_MENU_DIFFICULTYCOMPLETED": "Dokončeno na", + "LUA_MENU_DISABLED": "Vypnuto", + "LUA_MENU_ENABLED": "Zapnuto", + "LUA_MENU_END_GAME": "Opustit hru", + "LUA_MENU_EXIT_GAME": "Ukončit hru", + "LUA_MENU_FIVE_ONE_SPEAKERS": "5.1 reproduktorů", + "LUA_MENU_FOUR_SPEAKERS": "4 reproduktory", + "LUA_MENU_FRIENDS": "Přátelé", + "LUA_MENU_GAME_SETUP": "Nastavení hry", + "LUA_MENU_GAME_SETUP_CAPS": "NASTAVENÍ HRY", + "LUA_MENU_GENERAL_SETTINGS": "Obecná nastavení", + "LUA_MENU_GRAPHIC_OPTIONS": "Grafika", + "LUA_MENU_HDR_PREVIEW": "Náhled", + "LUA_MENU_HEADPHONE": "Sluchátka", + "LUA_MENU_HELP": "Nápověda", + "LUA_MENU_HITS_CAPS": "ZÁSAHŮ", + "LUA_MENU_INFO_CAP": "INFORMACE", + "LUA_MENU_INTEL": "CHEATY", + "LUA_MENU_KILLS": "Zabití", + "LUA_MENU_KILLS_CAPS": "ZABITÍ", + "LUA_MENU_LMGS_CAPS": "LEHKÉ KULOMETY", + "LUA_MENU_LOOK": "Pohled", + "LUA_MENU_LOSSES_CAPS": "PROHRÁVÁ", + "LUA_MENU_MAP_CAPS": "MAPA", + "LUA_MENU_MISSES_CAPS": "SCHÁZÍ", + "LUA_MENU_MISSION_SELECT": "Výběr mise", + "LUA_MENU_MODE_CAPS": "MÓD", + "LUA_MENU_MODE_FULLSCREEN": "Celá obrazovka", + "LUA_MENU_MODE_WINDOWED": "Režim okna", + "LUA_MENU_MODE_WINDOWED_NO_BORDER": "Režim okna (celá obrazovka)", + "LUA_MENU_MOVEMENT": "Pohyb", + "LUA_MENU_MUSIC": "Hudba", + "LUA_MENU_MUTE_ALL": "Ztišit vše", + "LUA_MENU_NAVIGATE": "Pohyb", + "LUA_MENU_NEW_CAPS": "NOVÉ", + "LUA_MENU_NEW_GAME": "Nová hra", + "LUA_MENU_NO": "Ne", + "LUA_MENU_NONE_CAPS": "ŽÁDNÉ", + "LUA_MENU_NOT_COMPLETED": "Nedokončeno.", + "LUA_MENU_NOT_USED": "Nepoužité", + "LUA_MENU_NUMOFPLAYERS": "Počet hráčů", + "LUA_MENU_N_KILLS": "Zabití: &&1", + "LUA_MENU_OPEN_CAPS": "OTEVŘÍT", + "LUA_MENU_OPTIONS": "Nastavení", + "LUA_MENU_OPTIONS_UPPER_CASE": "NASTAVENÍ", + "LUA_MENU_PAUSED_CAPS": "PAUZA", + "LUA_MENU_PLAYERS": "Hráčů:", + "LUA_MENU_PREVIEW": "NÁHLED", + "LUA_MENU_PRIVATE_MATCH_CAPS": "SOUKROMÝ ZÁPAS", + "LUA_MENU_PRIVATE_MATCH_LOBBY": "SOUKROMÝ ZÁPAS", + "LUA_MENU_PROGRESS": "Postup", + "LUA_MENU_PUBLIC_SERVICE_ANNOUNCEMENT_TITLE": "Varování", + "LUA_MENU_RANDOM": "Náhodný", + "LUA_MENU_RESTORE_DEFAULT_CONTROLS": "Reset ovládání", + "LUA_MENU_RESTRICTED": "Omezeno", + "LUA_MENU_RESUME_GAME": "POKRAČOVAT VE HŘE", + "LUA_MENU_RETURNS": "Vrací", + "LUA_MENU_RULES_ALWAYS_ON": "Vždy zapnuto", + "LUA_MENU_RULES_FAST": "Rychlé", + "LUA_MENU_RULES_FREE": "Volné", + "LUA_MENU_RULES_NONE": "Žádné", + "LUA_MENU_RULES_SLOW": "Pomalá", + "LUA_MENU_SELECT": "Vybrat", + "LUA_MENU_SET_DEFAULT_CONTROLS": "Obnovit výchozí", + "LUA_MENU_SHOTGUNS_CAPS": "BROKOVNICE", + "LUA_MENU_SNIPER_RIFLES_CAPS": "ODSTŘELOVAČKY", + "LUA_MENU_SORT": "Řadit", + "LUA_MENU_SORT_BY_CAPS": "ŘADIT PODLE:", + "LUA_MENU_SOUND_OPTIONS": "Zvuk", + "LUA_MENU_SPEAKER_CONFIG": "Konfigurace reproduktorů", + "LUA_MENU_SPECTATOR": "Divák", + "LUA_MENU_START_GAME": "Start hry", + "LUA_MENU_STATUS_INTEL": "Nalezené počítače: &&1/&&2", + "LUA_MENU_SUBTITLES": "Titulky", + "LUA_MENU_SUMMARY_CAPS": "SHRNUTÍ", + "LUA_MENU_SYSTEM_INFO": "Ostatní", + "LUA_MENU_SYSTEM_INFO_CAPS": "OSTATNÍ", + "LUA_MENU_TIME_PLAYED": "Doba hraní", + "LUA_MENU_TIME_PLAYED_CAPS": "DOBA HRANÍ", + "LUA_MENU_TOGGLE": "Přepnout", + "LUA_MENU_TYPE": "Typ", + "LUA_MENU_UNBIND": "Přestat", + "LUA_MENU_UNLOCKED": "Odemknuto", + "LUA_MENU_UNRESTRICTED": "Neomezeno", + "LUA_MENU_VIDEO_MODE": "Rozlišení\n", + "LUA_MENU_WINS": "Vítezí", + "LUA_MENU_WINS_CAPS": "VÍTEZÍ", + "LUA_MENU_YES": "Ano", + "LUA_MENU_Z_TO_A": "Ž-A", + "MENU_GENERAL": "Obecné", + "MENU_SKILLED_DESC_FULL": "Tvoje schopnosti v boji budou otestovány.", + "MENU_SO_DID_NOT_FINISH": "Nedokončil", + "MENU_SP_MUSEUM": "Muzeum", + "PLATFORM_LOW_AMMO_NO_RELOAD_CAPS": "MÁLO MUNICE", + "PLATFORM_PRESS_START_BUTTON": "Stiskni \u0001", + "PLATFORM_PRESS_START_PC": "Stiskni ENTER", + "PLATFORM_RELOAD": "Nabít", + "PLATFORM_RELOAD_CAPS": "NABÍT", + "PLATFORM_RELOAD_GAMEPAD_CAPS": "\u0003 NABÍT", + + "EXE_SERVERISFULL": "Server je plný.", + "EXE_KEYWAIT": "Čekám na nový klíč. Stiskni ESCAPE pro zrušení a nebo BACKSPACE pro vymazání", + "EXE_KEYCHANGE": "Stiskni ENTER nebo KLIKNI pro změnu", + "EXE_YES": "Ano", + "EXE_NO": "Ne", + "EXE_OF": "/", + "EXE_ALL": "Vše", + "EXE_WAITINGFORMASTERSERVERRESPONSE": "Čekám na odpověď hlavního serveru", + "EXE_GETTINGINFOFORSERVERS": "Získávám informace ze &&1/&&2 serverů (zrušit - ESC)", + "EXE_REFRESHTIME": "Doba obnovy: &&1", + "EXE_CDKEYVALID": "Klíč je platný.", + "EXE_CDKEYINVALID": "Klíč není platný.", + "EXE_ERR_NO_LAST_SAVE": "Poslední uložení hry bylo pravděpodobně vymazáno. Nahrej v menu jiné uložení, nebo začni novou hru.", + "EXE_FAVORITELISTFULL": "Seznam oblíbených je plný.", + "EXE_FAVORITEADDED": "Přidaný oblíbený server.", + "EXE_DOWNLOADINGUPDATE": "Stahování aktualizací: &&1", + "EXE_CONNECTINGTO": "Připojování k &&1", + "EXE_AWAITINGCONNECTION": "Čekám na spojení...&&1", + "EXE_AWAITINGCHALLENGE": "Čekám na výzvu...&&1", + "EXE_AWAITINGGAMESTATE": "Nastavování hry", + "EXE_SAYTEAM": "říct_týmu", + "EXE_SAY": "říct", + "EXE_GAMESAVED": "Hra uložena", + "EXE_PLAYERKICKED": "Hráč vykopnut.", + "EXE_ERR_BANNED_PERM": "Na tomto serveru jsi trvale zabanován.", + "EXE_ERR_BANNED_TEMP": "Na tomto serveru jsi dočasně zabanován.", + "EXE_PLAYERKICKED_INACTIVE": "vykopnut pro neaktivitu.", + "EXE_CANNOTKICKHOSTPLAYER": "Hráče hostitele nelze vykopnout.", + "EXE_SERVERKILLED": "Server padnul.", + "EXE_SERVERQUIT": "Server skončil", + "EXE_ENDOFGAME": "Konec hry", + "EXE_SERVERDIDNTHAVECD": "Server nemá CD", + "EXE_LOCAL": "Lokální", + "EXE_FAVORITES": "Oblíbené", + "EXE_NETSOURCE": "Zdroj: &&1", + "EXE_SERVERFILTER": "Filtr: &&1", + "EXE_AWAITINGCDKEYAUTH": "Čekám na autorizaci klíče", + "EXE_SERVER_DISCONNECTED": "Server odpojen", + "EXE_ERR_COULDNT_LOAD": "Nelze načíst &&1", + "EXE_ERR_CORRECT_FOLDER": "Přesvědč se že je Modern Warfare 2 ve správném adresáři.", + "EXE_ERR_BAD_WINDOWS_VER": "Tvoje verze Microsoft Windows(TM) nepodporuje Modern Warfare 2.", + "EXE_ERR_NOT_FOUND": "&&1 nenalezen.", + "EXE_ERR_WRONG_MAP_VERSION_NUM": "Mapa &&1 má špatné číslo verze.", + "EXE_ERR_BAD_GAME_FOLDER": "Neplatný adresář hry", + "EXE_ERR_COULDNT_START_PROCESS": "Nelze spustiti proces: &&1", + "EXE_ERR_COULDNT_OPEN_URL": "Nelze otevřít url: '&&1'", + "EXE_ERR_CDKEY_IN_USE": "Klíč je používán. Zkus se připojit později.", + "EXE_MONTH_ABV_JANUARY": "Led", + "EXE_MONTH_ABV_FEBRUARY": "Úno", + "EXE_MONTH_ABV_MARCH": "Bře", + "EXE_MONTH_ABV_APRIL": "Dub", + "EXE_MONTH_ABV_MAY": "Kvě", + "EXE_MONTH_ABV_JUN": "Čer", + "EXE_MONTH_ABV_JUNE": "Čer", + "EXE_MONTH_ABV_JULY": "Črc", + "EXE_MONTH_ABV_AUGUST": "Srp", + "EXE_MONTH_ABV_SEPTEMBER": "Zář", + "EXE_MONTH_ABV_OCTOBER": "Říj", + "EXE_MONTH_ABV_NOVEMBER": "Lis", + "EXE_MONTH_ABV_DECEMBER": "Pro", + "EXE_SV_INFO_SERVERNAME": "Název serveru", + "EXE_SV_INFO_ADDRESS": "IP adresa", + "EXE_SV_INFO_GAMENAME": "Název hry", + "EXE_SV_INFO_GAMETYPE": "Typ hry", + "EXE_SV_INFO_MAP": "Mapa", + "EXE_SV_INFO_VERSION": "Verze", + "EXE_SV_INFO_PROTOCOL": "Verze protokolu", + "EXE_SV_INFO_NUM": "číslo", + "EXE_SV_INFO_SCORE": "skóre", + "EXE_SV_INFO_PING": "ping", + "EXE_SV_INFO_NAME": "název", + "EXE_SV_INFO_MOD": "Mód", + "EXE_BYTES": "bytů", + "EXE_HOURS": "hod", + "EXE_MINUTES": "min", + "EXE_SECONDS": "sec", + "EXE_DOWNLOADING": "Stahování:", + "EXE_BADSERVERADDRESS": "Špatná adresa serveru.", + "EXE_ERR_BAD_CDKEY": "Špatný klíč.", + "EXE_ERR_SERVER_TIMEOUT": "Vypršel čas připojení.", + "EXE_SV_INFO_PASSWORD": "Chráněno heslem", + "EXE_CHECKPOINT_REACHED": "Dosažen checkpoint.", + "GAME_OBJECTIVESUPDATED": "Úkol aktualizován.", + "GAME_OBJECTIVECOMPLETED": "Úkol dokončen.", + "GAME_OBJECTIVEFAILED": "Úkol nesplněn.", + "GAME_MISSIONFAILED": "Mise selhala", + "GAME_CANT_GET_GRENADE_WEAP_MESSAGE": "Musíš mít vybrané granáty abys mohl sebrat jiný typ granátu.", + "GAME_CANT_GET_PISTOL_WEAP_MESSAGE": "Musíš mít vybranou pistoly abys mohl sebrat jiný typ pistole.", + "GAME_CANT_GET_SMOKER_WEAP_MESSAGE": "Musíš mít vybrané kouřové granáty abys mohl sebrat jiný typ kouřového granátu.", + "GAME_PICKUP_AMMO": "Získat &&1 munici.", + "GAME_PICKUP_CANTCARRYMOREAMMO": "&&1 munice plná.", + "GAME_DIFFICULTY_MEDIUM": "Obtížnost: Normální", + "GAME_DIFFICULTY_HARD": "Obtížnost: Těžká", + "GAME_DIFFICULTY_FU": "Obtížnost: Veterán", + "GAME_DIFFICULTY_UNKNOWN": "Obtížnost: Neznámá", + "GAME_HEALTH": "Zdraví", + "GAME_WARNING": "VAROVÁNÍ", + "GAME_GC_HOLDYOURPOSITION": "Drž svou pozici.", + "GAME_GC_HOLDTHISPOSITION": "Drž tuto pozici.", + "GAME_GC_COMEHERE": "Pojď sem.", + "GAME_GC_COVERME": "Kryj mě.", + "GAME_PICKUP_CLIPONLY_AMMO": "Získat &&1 munici", + "GAME_SPECTATOR": "Divák", + "GAME_DEAD": "Mrtev", + "GAME_DROPPEDFORINACTIVITY": "Vykopnut ze serveru kvůli neaktivitě.", + "GAME_GET_TO_COVER": "Jsi zraněn. Ukryj se!", + "GAME_SAVE_DESCRIPTION": "Modern Warfare 2 uložení hry", + "GAME_STAND_BLOCKED": "Tady se nemůžeš postavit", + "GAME_CROUCH_BLOCKED": "Tady se nemůžeš přikrčit", + "GAME_CROUCH_BLOCKED_WEAPON": "S touto zbraní se tady nemůžeš přikrčit.", + "GAME_STAND_BLOCKED_WEAPON": "S touto zbraní se tady nemůžeš postavit.", + "KEY_OR": "nebo", + "KEY_UNBOUND": "Nepřiřazeno", + "KEY_SPACE": "Mezerník", + "KEY_UPARROW": "Šipka nahoru", + "KEY_DOWNARROW": "Šipka dolů", + "KEY_LEFTARROW": "Šipka vlevo", + "KEY_RIGHTARROW": "Šipka vpravo", + "KEY_MOUSE1": "Levé tlačítko", + "KEY_MOUSE2": "Pravé tlačítko", + "KEY_MOUSE3": "Prostřední tlačítko", + "KEY_MOUSE4": "Tlačítko myši 4", + "KEY_MOUSE5": "Tlačítko myši 5", + "KEY_MWHEELUP": "Kolečko nahoru", + "KEY_MWHEELDOWN": "Kolečko dolů", + "KEY_USE": "použít", + "MESSAGEBOX_LOW_DESKTOP_COLOR_DEPTH": "Nízká barevná hloubka monitoru", + "MESSAGEBOX_IT_IS_HIGHLY_UNLIKELY": "Je velmi pravděpodobné, že s aktuálním nastavením zobrazení monitoru se nebude hra správně zobrazovat. Vyber 'OK' pokud chceš přesto pokračovat. Stiskni 'Zrušit' pokud chceš odejít.", + "MESSAGEBOX_LOW_MEMORY": "Málo paměti", + "MESSAGEBOX_IT_LOOKS_LIKE_YOU_ARE": "Vypadá to, že máš málo virtuální paměti. To může způsobit spomalení a nebo úplné zastavení hry. Je důrazně doporučeno ukončit všechny programy před spuštěním Modern Warfare 2. Chceš přesto spustit Modern Warfare 2?", + "MESSAGEBOX_RECOMMENDED_SETTINGS": "Aktualizována doporučená nastavení", + "MESSAGEBOX_THE_RECOMMENDED_SETTINGS": "Doporučená nastavení byla aktualizována během doby co jsi nehrál Modern Warfare 2. Chceš použít novou konfiguraci systémových nastavení hry? Toto je doporučeno pro většinu lidí. Změní to systémová nastavení, ale ne tvoje ovládání.", + "MESSAGEBOX_HARDWARE_CHANGE_DETECTED": "Detekována změna hardware", + "MESSAGEBOX_YOUR_COMPUTER_APPEARS": "Tvůj hardware počítače se během doby co jsi nehrál Modern Warfare 2 změnil . Chceš použít nová nastavení konfigurace hry optimalizované pro tvůj hardware? Toto je doporučeno pro většinu lidí. Změní to systémová nastavení, ale ne tvoje ovládání.", + "MESSAGEBOX_FILE_WRITE_ERROR": "Chyba zápisu", + "MESSAGEBOX_CALL_OF_DUTY_COULDNT": "Modern Warfare 2 nemůže zapisovat soubory. Hard disk je pravděpodobně plný.", + "MESSAGEBOX_IMPROPER_QUIT_DETECTED": "Detekováno nesprávné ukončení", + "MESSAGEBOX_IT_APPEARS_THAT_CALL": "Zdá se že Modern Warfare 2 naposledy nebylo ukončeno běžným způsobem. Chceš spustit hru v bezpečném módu? Toto je doporučeno pro většinu lidí. Změní to systémová nastavení, ale ne tvoje ovládání.", + "MINEFIELDS_MINEDIED": "Vstoupil jsi do minového pole a zemřel jsi.\nDávej pozor na červenobílé značky minového pole!", + "MINEFIELDS_MINEDIED_TANK": "Najel jsi do minového pole a zemřel jsi.\nDávej pozor na červenobílé značky minového pole!", + "WEAPON_MP44": "MP44", + "WEAPON_M2FRAGGRENADE": "M2 tříštivý granát", + "WEAPON_MK1_FRAG_GRENADE": "MK1 tříštivý granát", + "WEAPON_HOLDPIN": "Hold-Pin", + "WEAPON_COOKOFF": "Cook-Off", + "WEAPON_FRAGGRENADE": "Tříštivý", + "WEAPON_SMOKEGRENADE": "Kouřový", + "WEAPON_DEFAULTWEAPON": "Základní zbraň", + "WEAPON_NO_AMMO": "Žádná munice", + "WEAPON_NO_AMMO_CAPS": "ŽÁDNÁ MUNICE", + "WEAPON_NO_WEAPON_AMMO": "Žádná &&1 munice k dispozici", + "WEAPON_NO_WEAPON_AMMO_MP": "Žádné dostupné vybavení", + "WEAPON_NO_FRAG_GRENADE": "Žádné tříšť. granáty k dispozici", + "WEAPON_NO_SPECIAL_GRENADE": "Žádné spec. granáty k dispozici", + "WEAPON_FREERUNNER": "Žádná zbraň k dispozici", + "WEAPON_LOCATION_SELECTOR": "Vybrat lokaci", + "WEAPON_C4": "C4", + "WEAPON_C4_DETONATOR": "C4 Detonátor", + "WEAPON_CLAYMORE": "Claymore", + "WEAPON_CLAYMORE_DETONATOR": "Claymore Detonátor", + "WEAPON_RPG_LAUNCHER": "Odpalovač RPG", + "WEAPON_SMOKE_GRENADE": "Kouřový granát", + "WEAPON_FLASH_GRENADE": "Oslepující granát", + "WEAPON_CONCUSSION_GRENADE": "Omračující granát", + "WEAPON_THROWING_KNIFE": "Vrhací nůž", + "WEAPON_RAPPEL_KNIFE": "Nůž", + "WEAPON_RPG": "RPG-7", + "WEAPON_RPG_X2": "RPG-7 x 2", + "WEAPON_AT4": "AT4", + "WEAPON_MP5_SILENCER": "MP5KSD", + "WEAPON_MP5": "MP5K", + "WEAPON_MAC10": "Mac-10", + "WEAPON_P90": "P90", + "WEAPON_P90_SILENCER": "P90 s tlumičem", + "WEAPON_P90_ACOG": "P90 ACOG optika", + "WEAPON_P90_REDDOT": "P90 červený zaměřovač", + "WEAPON_M16": "M16A4", + "WEAPON_M203": "M203", + "WEAPON_G36C": "G36C", + "WEAPON_M14": "M14", + "WEAPON_M40A3": "M40A3", + "WEAPON_BARRETT": "Barrett .50cal", + "WEAPON_WINCHESTER1200": "W1200", + "WEAPON_M1014": "M1014", + "WEAPON_M1014_EOTECH": "M1014 holografický", + "WEAPON_M4M203": "M4A1 granátomet", + "WEAPON_M4": "M4A1", + "WEAPON_M4_SILENCER": "M4A1 Suppressed", + "WEAPON_M4M203_SILENCER": "M4A1 SOPMOD", + "WEAPON_M4M203_ACOG": "M4A1 granátomet w/ ACOG optika", + "WEAPON_M4M203_REFLEX": "M4A1 granátomet w/ červený zaměřovač", + "WEAPON_M4M203_EOTECH": "M4A1 granátomet w/ holografický", + "WEAPON_SAW": "M249 SAW", + "WEAPON_M60E4": "M60E4", + "WEAPON_M240": "M240", + "WEAPON_M240_REDDOT": "M240 červený zaměřovač", + "WEAPON_M240_SILENCER": "M240 s tlumičem", + "WEAPON_M240_EOTECH": "M240 holografický", + "WEAPON_M240_ACOG": "M240 ACOG optika", + "WEAPON_M240_THERMAL": "M240 tepelné zaměření", + "WEAPON_M240_HEARTBEAT": "M240 čidlo tepu", + "WEAPON_M240_BLING": "M240 Bling", + "WEAPON_SKORPION": "Skorpion", + "WEAPON_MINI_UZI": "Mini-Uzi", + "WEAPON_AK47": "AK-47", + "WEAPON_AK47_GP25": "AK-47 granátomet", + "WEAPON_GP25": "GP-25", + "WEAPON_G3": "G3", + "WEAPON_DRAGUNOV": "Dragunov", + "WEAPON_REMINGTON700": "R700", + "WEAPON_AW50": "AW-50", + "WEAPON_AK74U": "AK-74u", + "WEAPON_RPD": "RPD", + "WEAPON_BERETTA": "M9", + "WEAPON_DESERTEAGLE": "Desert Eagle", + "WEAPON_COLT1911": "M1911 .45", + "WEAPON_AG36": "AG36", + "WEAPON_HK79": "HK79", + "WEAPON_EGLM": "FN EGLM", + "WEAPON_SMGS": "Lehké kulomety", + "WEAPON_ASSAULTRIFLES": "Útočné pušky", + "WEAPON_SHOTGUNS": "Brokovnice", + "WEAPON_SNIPERRIFLES": "Odstřelovačky", + "WEAPON_JAVELIN": "Javelin", + "WEAPON_STINGER": "Stinger", + "WEAPON_TARGET_TOO_CLOSE": "Příliš blízko pro zaměření", + "WEAPON_LOCKON_REQUIRED": "Vyžadováno zaměření", + "WEAPON_M21_SILENCER": "M21 EBR s tlumičem", + "WEAPON_M21": "M21 EBR", + "WEAPON_TARGET_NOT_ENOUGH_CLEARANCE": "Pro výstřel není dostatek místa", + "WEAPON_DESERTEAGLEGOLD": "Zlatý Desert Eagle", + "WEAPON_NO_ATTACHMENT": "Bez doplňků", + "WEAPON_SILENCER": "Tlumič", + "WEAPON_REDDOT": "Červený zaměřovač", + "WEAPON_ACOG": "ACOG optika", + "WEAPON_GRENADE_LAUNCHER": "Granátomet", + "WEAPON_NO_CAMO": "Bez kamufláže", + "WEAPON_DESERT_CAMO": "Desert", + "WEAPON_WOODLAND_CAMO": "Woodland", + "WEAPON_DIGITAL_CAMO": "Digital", + "WEAPON_RED_TIGER_CAMO": "Red Tiger", + "WEAPON_BLUE_TIGER_CAMO": "Blue Tiger", + "WEAPON_GOLDEN_CAMO": "Zlatá", + "WEAPON_PRESTIGE_CAMO": "Prestige", + "WEAPON_BINOCULARS": "Binoculars", + "WEAPON_ANM8_SMOKE_GRENADE": "ANM8 kouřoví granát", + "WEAPON_UZI_SILENCER": "Mini-Uzi s tlumičem", + "WEAPON_GRIP": "Grip", + "WEAPON_M16A4_GRENADIER": "M16A4 granátomet", + "WEAPON_AK47_ACOG": "AK-47 ACOG optika", + "WEAPON_AK47_SILENCER": "AK-47 s tlumičem", + "WEAPON_AK47_SHOTGUN": "AK-47 w/ brokovnice", + "WEAPON_AK47_REDDOT": "AK-47 červený zaměřovač", + "WEAPON_AK47_FMJ": "AK-47 FMJ", + "WEAPON_SENTRY_GUN": "Sentry Gun", + "WEAPON_SENTRY_MINIGUN": "Sentry MiniGun", + "WEAPON_KRISS": "Vector", + "WEAPON_KRISS_ACOG": "Vector ACOG optika", + "WEAPON_KRISS_ACOG_SILENCER": "Vector s tlumičem ACOG optika", + "WEAPON_G3_ACOG": "G3 ACOG optika", + "WEAPON_G3_SILENCER": "G3 s tlumičem", + "WEAPON_G3_REDDOT": "G3 červený zaměřovač", + "WEAPON_G3_GL": "G3 granátomet", + "WEAPON_G36C_ACOG": "G36C ACOG optika", + "WEAPON_G36C_SILENCER": "G36C s tlumičem", + "WEAPON_G36C_REDDOT": "G36C červený zaměřovač", + "WEAPON_G36C_GL": "G36C granátomet", + "WEAPON_AK74U_ACOG": "AK-74u ACOG optika", + "WEAPON_AK74U_SILENCER": "AK-74u s tlumičem", + "WEAPON_AK74U_REDDOT": "AK-74u červený zaměřovač", + "WEAPON_RPD_ACOG": "RPD ACOG optika", + "WEAPON_RPD_GRIP": "RPD Foregrip", + "WEAPON_RPD_REDDOT": "RPD červený zaměřovač", + "WEAPON_REMINGTON700_ACOG": "R700 ACOG optika", + "WEAPON_AW50_ACOG": "AW-50 ACOG optika", + "WEAPON_BARRETT_ACOG": "Barrett .50cal ACOG", + "WEAPON_BERETTA_SILENCER": "M9 s tlumičem", + "WEAPON_COLT1911_SILENCER": "M1911 .45 s tlumičem", + "WEAPON_DRAGUNOV_ACOG": "Dragunov ACOG optika", + "WEAPON_BENELLI_GRIP": "M1014 Foregrip", + "WEAPON_BENELLI_REDDOT": "M1014 červený zaměřovač", + "WEAPON_M14_ACOG": "M14 ACOG optika", + "WEAPON_M14_GL": "M14 granátomet", + "WEAPON_M14_SILENCER": "M14 s tlumičem", + "WEAPON_M14_REDDOT": "M14 červený zaměřovač", + "WEAPON_M16_REDDOT": "M16A4 červený zaměřovač", + "WEAPON_M16_GL": "M16A4 granátomet", + "WEAPON_M16_SILENCER": "M16A4 s tlumičem", + "WEAPON_M16_ACOG": "M16A4 ACOG optika", + "WEAPON_M4_CARBINE_ACOG": "M4 ACOG optika", + "WEAPON_M4_CARBINE_REDDOT": "M4A1 červený zaměřovač", + "WEAPON_M4_CARBINE_SILENCER": "M4A1 s tlumičem", + "WEAPON_M4_CARBINE_GL": "M4A1 granátomet", + "WEAPON_M40A3_ACOG": "M40A3 ACOG optika", + "WEAPON_M60E4_ACOG": "M60E4 ACOG optika", + "WEAPON_M60E4_GRIP": "M60E4 Foregrip", + "WEAPON_M60E4_REDDOT": "M60E4 červený zaměřovač", + "WEAPON_MP5_ACOG": "MP5K ACOG optika", + "WEAPON_MP5_GRIP": "MP5K Foregrip", + "WEAPON_MP5_REDDOT": "MP5K červený zaměřovač", + "WEAPON_MP5_EOTECH": "MP5K holografický", + "WEAPON_MP5_SILENCED": "MP5K s tlumičem", + "WEAPON_MP5_SILENCED_REDDOT": "MP5K s tlumičem Red Dot", + "WEAPON_M21_ACOG": "M21 EBR ACOG optika", + "WEAPON_SAW_ACOG": "M249 SAW ACOG", + "WEAPON_SAW_GRIP": "M249 SAW Foregrip", + "WEAPON_SAW_REDDOT": "M249 SAW čer. zaměř.", + "WEAPON_SKORPION_ACOG": "Skorpion ACOG optika", + "WEAPON_SKORPION_REDDOT": "Skorpion červený zaměřovač", + "WEAPON_SKORPION_SILENCER": "Skorpion s tlumičem", + "WEAPON_UZI_ACOG": "Mini-Uzi ACOG optika", + "WEAPON_UZI_REDDOT": "Mini-Uzi červený zaměřovač", + "WEAPON_USP": "USP .45", + "WEAPON_USP_SILENCER": "USP .45 s tlumičem", + "WEAPON_WINCHESTER1200_GRIP": "W1200 Foregrip", + "WEAPON_WINCHESTER1200_REDDOT": "W1200 červený zaměřovač", + "WEAPON_RANGER": "Ranger", + "WEAPON_UMP45": "UMP45", + "WEAPON_UMP45_BURST": "UMP45 (Burst)", + "WEAPON_FN2000": "F2000", + "WEAPON_FN2000_REDDOT": "F2000 červený zaměřovač", + "WEAPON_FN2000_SCOPE": "F2000 Scope", + "WEAPON_FN2000_SHOTGUN": "F2000 w/ brokovnice", + "WEAPON_FN2000_ACOG": "F2000 ACOG optika", + "WEAPON_FN2000_THERMAL": "F2000 tepelné zaměření", + "WEAPON_FN2000_SILENCER": "F2000 s tlumičem", + "WEAPON_FN2000_GL": "F2000 granátomet", + "WEAPON_ANACONDA": ".44 Magnum", + "WEAPON_M79": "Thumper", + "WEAPON_BARRETT_USE": "Stiskni a podrž^3 &&1 ^7pro použití M82 .50 Caliber odstřelovací pušky", + "WEAPON_PRESS_FORWARDS_OR_BACKWARDS": "Stiskni vpřed pro přiblížení", + "WEAPON_STRIKER": "Striker", + "WEAPON_CHEYTAC": "Intervence", + "WEAPON_M4M203_MOTION_TRACKER": "M4 Carbine srdeční senzor", + "WEAPON_ANACONDA_SILENCER": ".44 Magnum s tlumičem", + "WEAPON_UMP45_ACOG": "UMP45 ACOG optika", + "WEAPON_UMP45_REDDOT": "UMP45 červený zaměřovač", + "WEAPON_UMP45_SILENCER": "UMP45 s tlumičem", + "WEAPON_KRISS_SILENCER": "Vector s tlumičem", + "WEAPON_KRISS_REDDOT": "Vector červený zaměřovač", + "WEAPON_STRIKER_GRIP": "Striker Foregrip", + "WEAPON_STRIKER_REFLEX": "Striker červený zaměřovač", + "WEAPON_STRIKER_EOTECH": "Striker holografický", + "WEAPON_CHEYTAC_ACOG": "Intervention ACOG optika", + "WEAPON_CHEYTAC_THERMAL": "Intervention tepelné zaměření", + "WEAPON_CHEYTAC_SILENCER": "Intervention s tlumičem", + "WEAPON_MASADA": "ACR", + "WEAPON_MASADA_GL_ACOG": "ACR granátomet ACOG optika", + "WEAPON_MASADA_ACOG": "ACR ACOG optika", + "WEAPON_MASADA_THERMAL": "ACR tepelné zaměření", + "WEAPON_MASADA_SILENCER": "ACR s tlumičem", + "WEAPON_MASADA_REDDOT": "ACR červený zaměřovač", + "WEAPON_MASADA_SILENCER_OFF": "Tlumené ACR s čidlem tepu", + "WEAPON_MASADA_HEARTBEAT": "ACR s čidlem tepu", + "WEAPON_ICE_AXE": "Ice Picks", + "WEAPON_AA12SP": "AA-12 Brokovnice", + "WEAPON_AA12SP_EOTECH": "AA-12 Brokovnice holografický", + "WEAPON_AA12SP_HB": "AA-12 Brokovnice w/ s čidlem tepu", + "WEAPON_AA12SP_HB_SILENCER": "AA-12 Brokovnice s čidlem tepu a tlumičem", + "WEAPON_AA12SP_REDDOT": "AA-12 Brokovnice červený zaměřovač", + "WEAPON_AA12SP_SILENCER": "AA-12 Brokovnice s tlumičem", + "WEAPON_AA12": "AA-12", + "WEAPON_CLAYMORE_PICKUP": "Stiskni a podrž &&1 pro sebrání min Claymore", + "WEAPON_CACHE_USE_HINT": "Stiskni a podrž &&1 pro doplnění munice", + "WEAPON_CACHE_USE_HINT_PRESS": "Stiskni ^3&&1^7 pro doplnění munice", + "WEAPON_FAMAS": "FAMAS", + "WEAPON_FAMAS_ACOG": "FAMAS ACOG optika", + "WEAPON_FAMAS_SILENCER": "FAMAS s tlumičem", + "WEAPON_FAMAS_REDDOT": "FAMAS červený zaměřovač", + "WEAPON_FAMAS_SHOTGUN": "FAMAS w/ brokovnice", + "WEAPON_GLOCK": "G18", + "WEAPON_SCAR": "SCAR-H", + "WEAPON_SCAR_SILENCER": "SCAR-H s tlumičem", + "WEAPON_SCAR_REFLEX_SHOTGUN": "SCAR-H červený zaměřovač w/ brokovnice", + "WEAPON_SCAR_REFLEX": "SCAR-H červený zaměřovač", + "WEAPON_SCAR_THERMAL": "SCAR-H tepelné zaměření", + "WEAPON_SCAR_THERMAL_SILENCER": "SCAR-H s tlumičem tepelné zaměření", + "WEAPON_SCAR_ACOG": "SCAR-H ACOG optika", + "WEAPON_SCAR_EOTECH": "SCAR-H holografický", + "WEAPON_SCAR_GL": "SCAR-H granátomet", + "WEAPON_SCAR_HEARTBEAT": "SCAR-H s čidlem tepu", + "WEAPON_SCAR_SHOTGUN": "SCAR-H w/ brokovnice", + "WEAPON_SCAR_BLING": "SCAR-H Bling", + "WEAPON_SCAR_ROF": "SCAR-H rychlá palba", + "WEAPON_SCAR_XMAGS": "SCAR-H Extended Mags", + "WEAPON_SCAR_FMJ": "SCAR-H FMJ", + "WEAPON_SCAR_GRIP": "SCAR-H Foregrip", + "WEAPON_FAL_ACOG": "FAL ACOG optika", + "WEAPON_FAL_REDDOT": "FAL červený zaměřovač", + "WEAPON_FAL_SHOTGUN": "FAL w/ brokovnice", + "WEAPON_SA80": "L86 LSW", + "WEAPON_SA80_SCOPE": "L86 LSW Scoped", + "WEAPON_TAVOR": "TAR-21", + "WEAPON_TAVOR_EOTECH": "TAR-21 holografický", + "WEAPON_TAVOR_ACOG": "TAR-21 ACOG optika", + "WEAPON_TAVOR_THERMAL": "TAR-21 tepelné zaměření", + "WEAPON_TMP_AKIMBO": "TMP Akimbo", + "WEAPON_PP2000": "PP2000", + "WEAPON_PP2000_SILENCER": "PP2000 s tlumičem", + "WEAPON_PP2000_REDDOT": "PP2000 červený zaměřovač", + "WEAPON_PP2000_THERMAL": "PP2000 tepelné zaměření", + "WEAPON_RIOTSHIELD": "Riot Shield", + "WEAPON_MODEL1887": "Model 1887", + "WEAPON_AIRDROP_MARKER": "Care Package Marker", + "WEAPON_FRAG_GRENADE": "Tříštivý granát", + "WEAPON_MG4": "MG4", + "WEAPON_G36_LMG": "G36 LMG", + "WEAPON_AUG_HBAR": "AUG HBAR", + "WEAPON_AUG_SCOPE": "AUG HBAR Scoped", + "WEAPON_AUG_REFLEX": "AUG HBAR červený zaměřovač", + "WEAPON_AUG_SILENCER": "AUG HBAR s tlumičem", + "WEAPON_AUG_BLING": "AUG HBAR Bling", + "WEAPON_FAMAS_THERMAL": "FAMAS tepelné zaměření", + "WEAPON_TAVOR_SILENCER": "TAR-21 s tlumičem", + "WEAPON_KRISS_GRIP": "Vector Foregrip", + "WEAPON_TMP": "TMP", + "WEAPON_TMP_REDDOT": "TMP červený zaměřovač", + "WEAPON_FAL": "FAL", + "WEAPON_M14EBR": "M14 EBR", + "WEAPON_M14EBR_SCOPED": "M14 EBR Scoped", + "WEAPON_M14EBR_THERMAL": "M14 EBR Thermal", + "WEAPON_M14EBR_SCOPED_SILENCED": "M14 EBR Scoped s tlumičem", + "WEAPON_WA2000": "WA2000", + "WEAPON_WA2000_HEARTBEAT": "WA2000 s čidlem tepu", + "WEAPON_WA2000_THERMAL": "WA2000 tepelné zaměření", + "WEAPON_SEMTEX": "SEMTEX", + "WEAPON_BERETTA393": "M93 Raffica", + "WEAPON_M4_CARBINE_FMJ": "M4A1 FMJ", + "WEAPON_M4_CARBINE_XMAGS": "M4A1 Extended Mags", + "WEAPON_M4_CARBINE_ROF": "M4A1 rychlá palba", + "WEAPON_FN2000_FMJ": "F2000 FMJ", + "WEAPON_FN2000_ROF": "F2000 rychlá palba", + "WEAPON_FN2000_XMAGS": "F2000 Extended Mags", + "WEAPON_MASADA_XMAGS": "ACR Extended Mags", + "WEAPON_MASADA_GL_EOTECH": "ACR granátomet holografický", + "WEAPON_MASADA_FMJ": "ACR FMJ", + "WEAPON_MASADA_SHOTGUN": "ACR w/ brokovnice", + "WEAPON_M16_FMJ": "M16A4 FMJ", + "WEAPON_M16_ROF": "M16A4 rychlá palba", + "WEAPON_M16_XMAGS": "M16A4 Extended Mags", + "WEAPON_TAVOR_REDDOT": "TAR-21 červený zaměřovač", + "WEAPON_TAVOR_MARS": "TAR-21 Mars Sight", + "WEAPON_TAVOR_FMJ": "TAR-21 FMJ", + "WEAPON_TAVOR_ROF": "TAR-21 rychlá palba", + "WEAPON_TAVOR_XMAGS": "TAR-21 Extended Mags", + "WEAPON_TAVOR_HEARTBEAT": "TAR-21 s čidlem tepu", + "WEAPON_FAMAS_FMJ": "FAMAS FMJ", + "WEAPON_FAMAS_ROF": "FAMAS rychlá palba", + "WEAPON_FAMAS_XMAGS": "FAMAS Extended Mags", + "WEAPON_FAL_FMJ": "FAL FMJ", + "WEAPON_FAL_ROF": "FAL rychlá palba", + "WEAPON_FAL_XMAGS": "FAL Extended Mags", + "WEAPON_SA80_ACOG": "L86 LSW ACOG optika", + "WEAPON_SA80_GRIP": "L86 LSW Foregrip", + "WEAPON_SA80_SILENCER": "L86 LSW s tlumičem", + "WEAPON_SA80_FMJ": "L86 LSW FMJ", + "WEAPON_SA80_ROF": "L86 LSW rychlá palba", + "WEAPON_SA80_XMAGS": "L86 LSW Extended Mags", + "WEAPON_RPD_FMJ": "RPD FMJ", + "WEAPON_RPD_ROF": "RPD rychlá palba", + "WEAPON_RPD_XMAGS": "RPD Extended Mags", + "WEAPON_PP2000_AKIMBO": "PP-2000 Akimbo", + "WEAPON_PP2000_FMJ": "PP2000 FMJ", + "WEAPON_PP2000_ROF": "PP2000 rychlá palba", + "WEAPON_PP2000_XMAGS": "PP2000 Extended Mags", + "WEAPON_PP2000_EOTECH": "PP2000 holografický", + "WEAPON_KRISS_FMJ": "Vector FMJ", + "WEAPON_KRISS_ROF": "Vector rychlá palba", + "WEAPON_KRISS_XMAGS": "Vector Extended Mags", + "WEAPON_MP5K_FMJ": "MP5K FMJ", + "WEAPON_MP5K_ROF": "MP5K rychlá palba", + "WEAPON_MP5K_XMAGS": "MP5K Extended Mags", + "WEAPON_P90_FMJ": "P90 FMJ", + "WEAPON_P90_ROF": "P90 rychlá palba", + "WEAPON_P90_XMAGS": "P90 Extended Mags", + "WEAPON_P90_HEARTBEAT": "P90 s čidlem tepu", + "WEAPON_TMP_SILENCER": "TMP s tlumičem", + "WEAPON_TMP_FMJ": "TMP FMJ", + "WEAPON_TMP_ROF": "TMP rychlá palba", + "WEAPON_TMP_XMAGS": "TMP Extended Mags", + "WEAPON_TMP_EOTECH": "TMP holografický", + "WEAPON_UMP45_FMJ": "UMP45 FMJ", + "WEAPON_UMP45_ROF": "UMP45 rychlá palba", + "WEAPON_UMP45_XMAGS": "UMP45 Extended Mags", + "WEAPON_UZI_FMJ": "Mini-Uzi FMJ", + "WEAPON_UZI_ROF": "Mini-Uzi rychlá palba", + "WEAPON_UZI_XMAGS": "Mini-Uzi Extended Mags", + "WEAPON_UMP45_HEARTBEAT": "UMP45 s čidlem tepu", + "WEAPON_STRIKER_SILENCER": "Striker s tlumičem", + "WEAPON_AA12_HB": "AA-12 s čidlem tepu", + "WEAPON_AA12_EOTECH": "AA-12 holografický", + "WEAPON_AA12_REDDOT": "AA-12 červený zaměřovač", + "WEAPON_AA12_GRIP": "AA-12 Foregrip", + "WEAPON_AA12_SILENCER": "AA-12 s tlumičem", + "WEAPON_BENELLI_SILENCER": "M1014 s tlumičem", + "WEAPON_MODEL1887_AKIMBO": "Model 1887 Akimbo", + "WEAPON_RANGER_AKIMBO": "Ranger Akimbo", + "WEAPON_ANACONDA_AKIMBO": ".44 Magnum Akimbo", + "WEAPON_ANACONDA_FMJ": ".44 Magnum FMJ", + "WEAPON_ANACONDA_XMAGS": ".44 Magnum Extended Mags", + "WEAPON_GLOCK_SILENCER": "G18 s tlumičem", + "WEAPON_GLOCK_FMJ": "G18 FMJ", + "WEAPON_GLOCK_XMAGS": "G18 Extended Mags", + "WEAPON_BERETTA393_SILENCER": "M93 Raffica s tlumičem", + "WEAPON_BERETTA393_FMJ": "M93 Raffica FMJ", + "WEAPON_BERETTA393_XMAGS": "M93 Raffica Extended Mags", + "WEAPON_DESERTEAGLE_AKIMBO": "Desert Eagle Akimbo", + "WEAPON_DESERTEAGLE_FMJ": "Desert Eagle FMJ", + "WEAPON_DESERTEAGLE_XMAGS": "Desert Eagle Extended Mags", + "WEAPON_RANGER_FMJ": "Ranger FMJ", + "WEAPON_STRIKER_FMJ": "Striker FMJ", + "WEAPON_BENELLI_FMJ": "M1014 FMJ", + "WEAPON_BENELLI_XMAGS": "M1014 Extended Mags", + "WEAPON_MODEL1887_FMJ": "Model 1887 FMJ", + "WEAPON_MODEL1887_XMAGS": "Model 1887 Extended Mags", + "WEAPON_AA12_FMJ": "AA-12 FMJ", + "WEAPON_AA12_XMAGS": "AA-12 Extended Mags", + "WEAPON_RPG_BOOM": "RPG-7 Sonic Boom", + "WEAPON_RPG_LOCKAIR": "RPG-7 Lock-on", + "WEAPON_STINGER_LOCKAIR": "Stinger Lock-on", + "WEAPON_STINGER_BOOM": "Stinger Sonic Boom", + "WEAPON_AT4_BOOM": "AT4 Sonic Boom", + "WEAPON_AT4_LOCKAIR": "AT4-HS", + "WEAPON_JAVELIN_BOOM": "Javelin Sonic Boom", + "WEAPON_JAVELIN_LOCKAIR": "Javelin Lock-on", + "WEAPON_M79_BOOM": "Thumper Sonic Boom", + "WEAPON_BARRETT_HEARTBEAT": "Barrett .50cal s čidlem tepu", + "WEAPON_BARRETT_FMJ": "Barrett .50cal FMJ", + "WEAPON_BARRETT_XMAGS": "Barrett .50cal Extended Mags", + "WEAPON_M21_FMJ": "M21 EBR FMJ", + "WEAPON_M21_THERMAL": "M21 EBR Thermal", + "WEAPON_M21_XMAGS": "M21 EBR Extended Mags", + "WEAPON_CHEYTAC_BLING": "Intervention Bling", + "WEAPON_M21_BLING": "M21 EBR Bling", + "WEAPON_BARRETT_BLING": "Barrett .50cal Bling", + "WEAPON_FN2000_BLING": "F2000 Bling", + "WEAPON_MASADA_BLING": "ACR Bling", + "WEAPON_AK47_BLING": "AK-47 Bling", + "WEAPON_M4_CARBINE_BLING": "M4A1 Bling", + "WEAPON_FAL_BLING": "FAL Bling", + "WEAPON_FAMAS_BLING": "FAMAS Bling", + "WEAPON_TAVOR_BLING": "TAR-21 Bling", + "WEAPON_M16_BLING": "M16A4 Bling", + "WEAPON_RPD_BLING": "RPD Bling", + "WEAPON_SA80_BLING": "L86 LSW Bling", + "WEAPON_PP2000_BLING": "PP2000 Bling", + "WEAPON_TMP_BLING": "TMP Bling", + "WEAPON_P90_BLING": "P90 Bling", + "WEAPON_UZI_BLING": "Mini-Uzi Bling", + "WEAPON_KRISS_BLING": "Vector Bling", + "WEAPON_UMP45_BLING": "UMP45 Bling", + "WEAPON_RANGER_BLING": "Ranger Bling", + "WEAPON_STRIKER_BLING": "Striker Bling", + "WEAPON_BENELLI_BLING": "M1014 Bling", + "WEAPON_MODEL1887_BLING": "Model 1887 Bling", + "WEAPON_AA12_BLING": "AA-12 Bling", + "WEAPON_ANACONDA_BLING": ".44 Magnum Bling", + "WEAPON_GLOCK_BLING": "G18 Bling", + "WEAPON_BERETTA393_BLING": "M93 Raffica Bling", + "WEAPON_DESERTEAGLE_BLING": "Desert Eagle Bling", + "WEAPON_RPG_BLING": "RPG-7 Bling", + "WEAPON_AT4_BLING": "AT4 Bling", + "WEAPON_STINGER_BLING": "Stinger Bling", + "WEAPON_JAVELIN_BLING": "Javelin Bling", + "WEAPON_M79_BLING": "Thumper Bling", + "WEAPON_MG4_GRIP": "MG4 Foregrip", + "WEAPON_MG4_REFLEX": "MG4 červený zaměřovač", + "WEAPON_MG4_ACOG": "MG4 ACOG optika", + "WEAPON_MG4_THERMAL": "MG4 tepelné zaměření", + "WEAPON_MG4_XMAGS": "MG4 Extended Mags", + "WEAPON_MG4_FMJ": "MG4 Explosive Rounds", + "WEAPON_MG4_ROF": "MG4 rychlá palba", + "WEAPON_MP5K_BLING": "MP5K Bling", + "WEAPON_AK47_XMAGS": "AK-47 Extended Mags", + "WEAPON_AK47_ROF": "AK-47 rychlá palba", + "WEAPON_ONE_MAN_ARMY": "One Man Army", + "WEAPON_AK47_EOTECH": "AK-47 holografický", + "WEAPON_AK47_THERMAL": "AK-47 tepelné zaměření", + "WEAPON_AK47_HEARTBEAT": "AK-47 s čidlem tepu", + "WEAPON_FN2000_EOTECH": "F2000 holografický", + "WEAPON_FN2000_HEARTBEAT": "F2000 s čidlem tepu", + "WEAPON_MASADA_EOTECH": "ACR holografický", + "WEAPON_MASADA_GL": "ACR granátomet", + "WEAPON_M4_CARBINE_EOTECH": "M4A1 holografický", + "WEAPON_M4_CARBINE_HEARTBEAT": "M4A1 s čidlem tepu", + "WEAPON_M4_CARBINE_SHOTGUN": "M4A1 w/ brokovnice", + "WEAPON_M4_CARBINE_THERMAL": "M4A1 tepelné zaměření", + "WEAPON_FAL_EOTECH": "FAL holografický", + "WEAPON_FAL_GL": "FAL granátomet", + "WEAPON_FAL_HEARTBEAT": "FAL s čidlem tepu", + "WEAPON_FAL_SILENCER": "FAL s tlumičem", + "WEAPON_FAL_THERMAL": "FAL tepelné zaměření", + "WEAPON_FAMAS_EOTECH": "FAMAS holografický", + "WEAPON_FAMAS_GL": "FAMAS granátomet", + "WEAPON_FAMAS_HEARTBEAT": "FAMAS s čidlem tepu", + "WEAPON_TAVOR_GL": "TAR-21 granátomet", + "WEAPON_TAVOR_SHOTGUN": "TAR-21 w/ brokovnice", + "WEAPON_M16_EOTECH": "M16A4 holografický", + "WEAPON_M16_HEARTBEAT": "M16A4 s čidlem tepu", + "WEAPON_M16_SHOTGUN": "M16A4 w/ brokovnice", + "WEAPON_M16_THERMAL": "M16A4 tepelné zaměření", + "WEAPON_P90_AKIMBO": "P90 Akimbo", + "WEAPON_P90_EOTECH": "P90 holografický", + "WEAPON_P90_THERMAL": "P90 tepelné zaměření", + "WEAPON_UZI_AKIMBO": "Mini-Uzi Akimbo", + "WEAPON_UZI_EOTECH": "Mini-Uzi holografický", + "WEAPON_UZI_THERMAL": "Mini-Uzi tepelné zaměření", + "WEAPON_MP5K_AKIMBO": "MP5K Akimbo", + "WEAPON_MP5K_THERMAL": "MP5K tepelné zaměření", + "WEAPON_KRISS_AKIMBO": "Vector Akimbo", + "WEAPON_KRISS_EOTECH": "Vector holografický", + "WEAPON_KRISS_THERMAL": "Vector tepelné zaměření", + "WEAPON_UMP45_AKIMBO": "UMP45 Akimbo", + "WEAPON_UMP45_EOTECH": "UMP45 holografický", + "WEAPON_UMP45_THERMAL": "UMP45 tepelné zaměření", + "WEAPON_SPAS12": "SPAS-12", + "WEAPON_SPAS12_BLING": "SPAS-12 Bling", + "WEAPON_SPAS12_REDDOT": "SPAS-12 červený zaměřovač", + "WEAPON_SPAS12_EOTECH": "SPAS-12 holografický", + "WEAPON_SPAS12_SILENCER": "SPAS-12 s tlumičem", + "WEAPON_SPAS12_HEARTBEAT_SENSOR": "SPAS-12 s čidlem tepu", + "WEAPON_M79_X2": "Thumper x 2", + "WEAPON_CAMO": "&&1 - Camo", + "WEAPON_UPGRADE": "&&1 - &&2", + "WEAPON_AIRDROP_SENTRY_MARKER": "Sentry Airdrop Marker", + "WEAPON_AIRDROP_MEGA_MARKER": "Emergency Airdrop Marker", + "WEAPON_WA2000_ACOG": "WA2000 ACOG optika", + "WEAPON_WA2000_FMJ": "WA2000 FMJ", + "WEAPON_WA2000_SILENCER": "WA2000 s tlumičem", + "WEAPON_WA2000_XMAGS": "WA2000 Extended Mags", + "WEAPON_AUG_EOTECH": "AUG HBAR holografický", + "WEAPON_AUG_ACOG": "AUG HBAR ACOG optika", + "WEAPON_AUG_FMJ": "AUG HBAR FMJ", + "WEAPON_AUG_GRIP": "AUG HBAR Foregrip", + "WEAPON_AUG_HEARTBEAT": "AUG HBAR s čidlem tepu", + "WEAPON_AUG_THERMAL": "AUG HBAR tepelné zaměření", + "WEAPON_AUG_XMAGS": "AUG HBAR Extended Mags", + "WEAPON_M240_FMJ": "M240 FMJ", + "WEAPON_M240_XMAGS": "M240 Extended Mags", + "WEAPON_MG4_HEARTBEAT": "MG4 s čidlem tepu", + "WEAPON_SA80_EOTECH": "L86 LSW holografický", + "WEAPON_SA80_REDDOT": "L86 LSW červený zaměřovač", + "WEAPON_SA80_THERMAL": "L86 LSW tepelné zaměření", + "WEAPON_BERETTA_AKIMBO": "M9 Akimbo", + "WEAPON_BERETTA_FMJ": "M9 FMJ", + "WEAPON_BERETTA_TACTICAL": "M9 Taktický nůž", + "WEAPON_BERETTA_XMAGS": "M9 Extended Mags", + "WEAPON_BERETTA393_AKIMBO": "M93 Raffica Akimbo", + "WEAPON_BERETTA_BLING": "M9 Bling", + "WEAPON_BERETTA393_EOTECH": "M93 Raffica holografický", + "WEAPON_BERETTA393_REDDOT": "M93 Raffica červený zaměřovač", + "WEAPON_ANACONDA_TACTICAL": ".44 Magnum Tactical Knife", + "WEAPON_DESERTEAGLE_TACTICAL": "Desert Eagle Tactical Knife", + "WEAPON_GLOCK_AKIMBO": "G18 Akimbo", + "WEAPON_GLOCK_EOTECH": "G18 holografický", + "WEAPON_GLOCK_REDDOT": "G18 červený zaměřovač", + "WEAPON_USP_AKIMBO": "USP .45 Akimbo", + "WEAPON_USP_FMJ": "USP .45 FMJ", + "WEAPON_USP_TACTICAL": "USP .45 Tactical Knife", + "WEAPON_USP_BLING": "USP .45 Bling", + "WEAPON_USP_XMAGS": "USP .45 Extended Mags", + "WEAPON_SPAS12_FMJ": "SPAS-12 FMJ", + "WEAPON_SPAS12_GRIP": "SPAS-12 Foregrip", + "WEAPON_SPAS12_XMAGS": "SPAS-12 Extended Mags", + "WEAPON_STRIKER_XMAGS": "Striker Extended Mags", + "WEAPON_BARRETT_SILENCER": "Barrett .50cal s tlumičem", + "WEAPON_CHEYTAC_HEARTBEAT": "Intervention s čidlem tepu", + "WEAPON_M21_HEARTBEAT": "M21 EBR s čidlem tepu", + "WEAPON_BARRETT_THERMAL": "Barrett .50cal tepelné zaměření", + "WEAPON_WA2000_BLING": "WA2000 Bling", + "WEAPON_CHEYTAC_FMJ": "Intervention FMJ", + "WEAPON_CHEYTAC_XMAGS": "Intervention Extended Mags", + "WEAPON_RPD_EOTECH": "RPD holografický", + "WEAPON_RPD_HEARTBEAT": "RPD s čidlem tepu", + "WEAPON_RPD_SILENCER": "RPD s tlumičem", + "WEAPON_RPD_THERMAL": "RPD tepelné zaměření", + "WEAPON_SA80_HEARTBEAT": "L86 LSW s čidlem tepu", + "WEAPON_MG4_EOTECH": "MG4 holografický", + "WEAPON_MG4_SILENCER": "MG4 s tlumičem", + "WEAPON_MG4_BLING": "MG4 Bling", + "WEAPON_M240_GRIP": "M240 Foregrip", + "WEAPON_FLARE": "Tactical Insertion", + "WEAPON_SCAVENGER_BAG": "Scavenger", + "CLAYMORE_CLAYMORE_PRESS_TO_SWITCH_TO_CLAYMORE": "(Stiskni použít pro přepnutí na claymore)", + "CLAYMORE_CLAYMORE_PRESS_TO_SWITCH_TO_DETONATOR": "(Stiskni použít pro přepnutí na Detonátor)", + "CLAYMORE_PLANTING_CLAYMORE": "Pokládání claymore...", + "CLAYMORE_CANNOT_PLANT_CLAYMORE": "Zde nejde claymore položit", + "DEADQUOTE_SO_TRY_NEW_DIFFICULTY": "NÁPOVĚDA K BOJI\nPokud jsou operace příliš težké nebo lehké, tak zkus jinou obtížnost.", + "DEADQUOTE_SO_BLED_OUT": "Spoluhráč vykrvácel. Spolupracujte jako tým a oživte se navzájem když někdo zemře.", + "DEADQUOTE_SO_TEXT_COLOR_DIFFICULTY": "Červený text při výběru mise signalizuje vyšší obtížnost než zelený text.", + "DEADQUOTE_SO_SEARCH_FOR_WEAPONS": "Sledujte pozorně speciální zbraně které vám můžou pomoci.", + "DEADQUOTE_SO_TOGGLE_TIMER": "Stiskni^3 [{+actionslot 1}] ^7pro přepnutí na stopky a statistiky mise.", + "DEADQUOTE_SO_TOGGLE_WEAP_ALT_MODE": "Stiskni^3 [{+actionslot 3}] ^7pro použití granátometu nebo spodní brokovnice.", + "DEADQUOTE_SO_CRAWL_TO_TEAMMATE": "Pokud tě dostali, zkus se plazit ke svému spoluhráči.", + "DEADQUOTE_SO_STAY_NEAR_TEAMMATE": "Drž se blízko spoluhráče a spolupracujte.", + "DEADQUOTE_SO_FRIENDLY_FIRE_HINT": "Můžeš zranit svého spoluhráče! Pozor kam střílíš.", + "DEADQUOTE_SO_RED_FIND_COVER": "Pokud všechno zčervená, je čas se nekam schovat.", + "DEADQUOTE_SO_LEFT_PLAY_AREA": "Zůstaň na zemi!\nOpustil jsi misi.", + "DEADQUOTE_SO_FIND_FRIEND_COOP": "Nikdo nebojuje sám!\nHraj s přítelem na společné obrazovce nebo ONline.", + "DEADQUOTE_SO_THROW_FLASHBANG": "Házej ^3[{+smoke}]^7 oslepující granáty pro omráčení nepřítele.", + "DEADQUOTE_SO_GRENADES_ROLL": "Buď opatrný! Granáty se kutálejí z kopce.", + "DEADQUOTE_JUGGERNAUT_FLASHBANGS": "Použij ^3[{+smoke}]^7 oslepující granáty pro zpomalení těžkooděnců.", + "DEADQUOTE_JUGGERNAUT_HIGHCALIBER_WEAPONS": "Velkorážní zbraně jako jsou Barretta .50 cal a Desert Eagle jsou mnohem efektivnější proti těžkooděncům.", + "DEADQUOTE_JUGGERNAUT_HEADSHOTS": "Pokus se o zásahy do hlavy pokud čelíš těžkooděncům.", + "DEADQUOTE_JUGGERNAUT_EXPLOSIVES": "Výbušniny jsou efektivní proti těžkooděncům.", + "DEADQUOTE_JUGGERNAUT_CORNERED": "Nenech se zahnat těžkooděnci do kouta. Drž si odstup.", + "DEADQUOTE_SO_BEAT_BEST_TIME": "Experimenuj s různými způsoby a taktikami.", + "DEADQUOTE_SO_FRIENDLY_FIRE_KILL": "Mise selhala kvůli střelbě do vlastních.", + "DEADQUOTE_RIOTSHIELD_USE_EXPLOSIVE": "Zkus použít granáty, RPG a granátomety proti nepřátelům s obrannými štíty.", + "DEADQUOTE_RIOTSHIELD_OUT_FLANK": "Obranné štíty chrání pouze ze předu! Obejdi je a zjistíš že nejsou odolnější než normální nepřítel.", + "DEADQUOTE_RIOTSHIELD_DONT_CHARGE": "Udržuj si odstup! Napadení nepřítele se štítem není dobrý nápad.", + "DEADQUOTE_SO_STAR_RANKINGS": "Dokončení operace na obtížnost těžká je za 2 hvězdy. Na veterána za 3.", + "DEADQUOTE_SO_ICON_PARTNER": "Lokalizuj svého partnera podle jeho jména. Pokud je mimo zorné pole míří k němu zelená šipka.", + "DEADQUOTE_SO_ICON_OBJ": "Bílý bod označuje umístění tvého cíle.", + "DEADQUOTE_SO_ICON_OBJ_OFFSCREEN": "Pokud tvůj cíl není v dohledu, ikona se změní.", + "DEADQUOTE_THOSE_WHO_PLOT_THE_DESTRUCTION": "Ti kdo plánují zkázu ostatních, často zahynou při útoku. - Thomas Moore", + "DEADQUOTE_IN_TAKING_REVENGE_A_MAN": "V touze po pomstě je člověk stejný jako nepřítel; ale po vykonání se cítí být lepší než on. - Francis Bacon", + "DEADQUOTE_ONE_GOOD_ACT_OF_VENGEANCE": "Každý akt pomsty si zasluhuje další. - Jon Jefferson", + "DEADQUOTE_YOU_CANNOT_GET_AHEAD": "Nemůžeš být lepší pokud jsi stejný. - Dick Armey", + "DEADQUOTE_DONT_GET_MAD_GET_EVEN": "Nebuďte naštvaní, oplaťte jim to. - Robert F. Kennedy", + "DEADQUOTE_REVENGE_IS_PROFITABLE": "Pomsta je výnosná. - Edward Gibbon", + "DEADQUOTE_AN_EYE_FOR_AN_EYE_MAKES": "Oko za oko způsobí oslepnutí světa. - Gandhi", + "DEADQUOTE_IF_AN_INJURY_HAS_TO_BE": "Pokud musíte někoho zranit, mělo by to být tak hrozné, abyste se jeho pomsty nemuseli obávat. - Machiavelli", + "DEADQUOTE_LIVE_WELL_IT_IS_THE_GREATEST": "Žijte si dobře. To je ta největší pomsta. - The Talmud", + "DEADQUOTE_REVENGE_AT_FIRST_THOUGH": "Ačkoliv je pomsta nejprve sladká, hořkost se brzy vrátí zpět. - John Milton", + "DEADQUOTE_BEFORE_YOU_EMBARK_UPON": "Ještě než se vydáš na cestu pomsty, měl bys nejprve vykopat dva hroby. - Confucius", + "DEADQUOTE_DISSENT_REBELLION_AND": "...odboj, povstání a všechno to peklo okolo zůstane vždy skutečnou povinností vlastenců. - Barbara Ehrenreich", + "DEADQUOTE_A_CITIZEN_OF_AMERICA": "Americký občan bude křižovat oceány, aby bojoval za demokracii, ale nepřejde ulici, aby šel volit... - Bill Vaughan", + "DEADQUOTE_I_WAS_BORN_AN_AMERICAN": "Narodil jsem se jako Američan; Budu žít jako Američan; Zemřu jako Američan! - Daniel Webster", + "DEADQUOTE_WE_MUST_NOT_CONFUSE_DISSENT": "Nesmíme si plést odboj se zradou. - Edward R. Murrow", + "DEADQUOTE_PATRIOTISM_IS_YOUR_CONVICTION": "Vlastenectví je vaše přesvědčení, že tato země je lepší, než všechny ostatní, protože jste se v ní narodily. - George Bernard Shaw", + "DEADQUOTE_PATRIOTISM_IS_A_ARBITRARY": "Vlastenectví je úcta k mejetku nadřazená principům. - George Jean Nathan", + "DEADQUOTE_A_MANS_FEET_MUST_BE_PLANTED": "Nohy muže musí zůstat na rodné zemi, ale jeho oči by měli shlédnout celý svět. - George Santayana", + "DEADQUOTE_PATRIOTISM_RUINS_HISTORY": "Vlastenectví ničí historii. - Goethe", + "DEADQUOTE_ASK_NOT_WHAT_YOUR_COUNTRY": "Neptejte se, co vlast může udělat pro vás, ptejte se, co vy můžete udělat pro vlast. - John F. Kennedy", + "DEADQUOTE_THE_NATION_IS_DIVIDED": "Národ je rozdělen na vlastence a zrádce a nikdo nemůže říct kdo je kdo. - Mark Twain", + "DEADQUOTE_IF_YOU_WANT_A_SYMBOLIC": "Chcete-li udělat symbolické gesto, nepalte vlajku, ale vyperte ji. - Norman Thomas", + "DEADQUOTE_I_WILL_FIGHT_FOR_MY_COUNTRY": "Budu bojovat za svoji zemi, ale nebudu pro ni lhát. - Zora Neale Hurston", + "DEADQUOTE_PATRIOTISM_IS_SUPPORTING": "Vlastenectví znamená neustále podporovat svoji zemi, ale vládu jen když si to zasloží. - Mark Twain", + "DEADQUOTE_A_NATION_REVEALS_ITSELF": "Národ představuje sám sebe nejen lidmi, které produkuje, ale i lidmi které ctí a lidmi, které si pamatuje. - John F. Kennedy", + "DEADQUOTE_I_ONLY_REGRET_THAT_I": "Lituji pouze toho, že mám jen jeden život, který můžu dát své zemi. - Nathan Hale", + "DEADQUOTE_PATRIOTISM_VARIES_FROM": "Vlastenectví se mění ze vznešené oddannosti na morální šílenství. - W.R. Inge", + "DEADQUOTE_IF_YOU_ARE_ASHAMED_TO": "Pokud se stydíte stát při své vlajce, uděláte lépe když si najdete jinou. - Anonym", + "DEADQUOTE_NATIONALISM_IS_AN_INFANTILE": "Vlastenectví je dětská nemoc. Jsou to spalničky lidstva. - Albert Einstein", + "DEADQUOTE_IF_OUR_COUNTRY_IS_WORTH": "Jestliže má cenu umírat pro naši zem v dobách války, nechte nás zvolit si zda má cenu pro ni žít i v dobách míru. - Hamilton Fish", + "DEADQUOTE_IT_IS_LAMENTABLE_THAT": "Je politováníhodné, že stát se dobrým vlastencem znamená stát se nepřítelem zbytku lidstva. - Voltaire", + "DEADQUOTE_TRADITIONAL_NATIONALISM": "Tradiční vlastenectví nemůže přežít štěpení atomu. Jeden svět nebo nic. - Stuart Chase", + "DEADQUOTE_WE_KNOW_WHERE_THEY_ARE": "My víme kde jsou. Jsou v oblasti kolem Tikritu a Bagdádu a východu, západu, jihu a severu taky. - Donald Rumsfeld", + "DEADQUOTE_I_WOULD_NOT_SAY_THAT": "Neřekl bych že budoucnost je méně předvídatelná než dříve. Myslím že minulost taky nebyla předvídatelná když začala. - Donald Rumsfeld", + "DEADQUOTE_IT_IS_EASY_TO_TAKE_LIBERTY": "Je snadné vzít někomu svobodu, když ji nikdo nikdy nevzal vám. - Dick Cheney", + "DEADQUOTE_PRINCIPLE_IS_OK_UP_TO": "Zásady jsou do jisté míry přínosné, ale nejsou k ničemu pokud prohrajete. - Dick Cheney", + "DEADQUOTE_I_LOVE_AMERICA_MORE_THAN": "Miluji Ameriku víc, než kteroukoliv jinou zemi na světě; a právě proto trvám na tom mít právo ji neustále kritizovat. - James Baldwin", + "DEADQUOTE_AS_WE_EXPRESS_OUR_GRATITUDE": "Chceme-li vyjádřit vděčnost, nesmíme zapomenout, že největším oceněním není pronášet proslovy, ale žít podle nich. - John F. Kennedy", + "DEADQUOTE_SO_RUN_OVER_BY_VEHICLE": "Byl jsi přejet.\nSleduj pozorně jedoucí nepřátelská vozidla.", + "DEADQUOTE_SO_STEALTH_LOOK_FOR_ENEMIES": "Najdi všechny nepřátele stojící poblíž tvého cíle než vystřelíš. Odstraň všechny rychle,aby ses vyhnul odhalení.", + "DEADQUOTE_SO_STEALTH_STAY_LOW": "Drž se nízko. Jsi snadno viditelný i slyšitelný pokud stojíš nebo běžíš.", + "DEADQUOTE_SO_STEALTH_USE_SILENCERS": "Používej tlumiče. Granáty a netlumené zbraně vzbuzují velkou pozornost.", + "DEADQUOTE_SO_CLAYMORE_ENEMIES_SHOOT": "Nepřátelé mohou odstřelit nastražené miny claymore. Ukrývej miny claymore za překážky.", + "DEADQUOTE_SO_CLAYMORE_POINT_ENEMY": "Pokládej miny claymore tak, aby červené paprsky mířily na nepřítele.", + "DEADQUOTE_SO_TURRET_PLACEMENT": "Chraň svoje střelecké vežičky! Umísti je na pozicích kde budou chráněny.", + "SCRIPT_MISSIONFAIL_KILLTEAM_RUSSIAN": "Jsi vlastizrádce!", + "SCRIPT_MISSIONFAIL_KILLTEAM_BRITISH": "Střelba na členy týmu nebude tolerována!", + "SCRIPT_MISSIONFAIL_CIVILIAN_KILLED": "Střelil jsi civilistu. Dávej pozor!", + "SCRIPT_SHOT_TEAMMATE": "Střelil jsi člena týmu!", + "SCRIPT_HINT_OBJECTIVEONCOMPASS": "Hvezdička na tvém kompasu značí nový úkol", + "SCRIPT_OBJ_DESTROYFLAKPANZERS": "Znič protiletadlové tanky 'Flakpanzer'.^3 &&1 remaining^7", + "SCRIPT_OBJ_FOLEYDEBRIEF": "Setkej se s kapitánem Foleym na križovatce.", + "SCRIPT_HINT_CANT_OPEN_DOORS": "Tyto dveře nejdou otevřít. Nezkoušej otevírat zamčené dveře.", + "SCRIPT_EXPLOSIVESPLANTED": "VÝBUŠNINA UMÍSTĚNA. USTUP!", + "SCRIPT_HINT_PICKUPAMMOKEY": "Náboje z jiné zbraně můžeš vzít po přiblížení se a stisknutí POUŽÍT^3 &&1^7.", + "SCRIPT_HINT_LEANINGSLOWMOVE": "Skrčený se pohybuješ pomaleji.", + "SCRIPT_HINTSTR_GRENADESFULL": "Nemůžeš už nést víc granátů.", + "SCRIPT_PICKUPSTIELHANDGRANATES": "Vzal jsi Stielgranáty.", + "SCRIPT_GLOWING_MARKER": "Podívej se po označovači na německém protiletadlovém vozidle.", + "SCRIPT_CLEARBUILDING": "Vyčisti tu budovu s kulomety.", + "SCRIPT_TAKELEFTFLANK": "Vezmi si levou stranu.", + "SCRIPT_FIRE_TO_SKIP": "Pro přeskočení stiskni STŘELBA.", + "SCRIPT_USE_THE_PANZERFAUST_ANTITANK": "Použij protitankové střely za bunkrem k tomu, abys zničil tanky.", + "SCRIPT_ARTILLERY_TOOFAR": "Jsi příliš daleko od radisty pro zavolání dělostřelectva.", + "SCRIPT_ELIMINATE_THE_FLAK_88_DONE": "Eliminuj posádku Flaku 88.", + "SCRIPT_ELIMINATE_THE_FLAK_88": "Eliminuj posádku Flaku 88.^3 &&1 remaining^7", + "SCRIPT_GRENADE_DEATH": "Byl jsi zabit granátem.\nDávej si pozor na indikátor granátu.", + "SCRIPT_GRENADE_SUICIDE_LINE1": "Držel jsi granát v ruce příliš dlouho.", + "SCRIPT_GRENADE_SUICIDE_LINE2": "Podržením ^3[{+frag}]^7 deaktivuješ spuštěné aktivní granáty.", + "SCRIPT_EXPLODING_VEHICLE_DEATH": "Byl jsi zabit explodujícím vozidlem.\nPři střelbě mohou vozidla vybuchnout.", + "SCRIPT_EXPLODING_DESTRUCTIBLE_DEATH": "Byl jsi zabit explozí.\nNěkteré hořící objekty mohou vybuchnout.", + "SCRIPT_EXPLODING_BARREL_DEATH": "Byl jsi zabit explodujícím barelem.\nČervené barely při střelbě vybuchnou.", + "SCRIPT_INTELLIGENCE_PICKUP": "Stiskni a podrž^3 &&1 ^7pro zajištění neořátelského počítače.", + "SCRIPT_INTELLIGENCE_FOUND": "Našel jsi nepřátelský počítač.", + "SCRIPT_INTELLIGENCE_OF_THIRTY": "&&1/30 nepřátelských počítačů nalezeno.", + "SCRIPT_INTELLIGENCE_OF_FOURTYFIVE": "&&1/45 nepřátelských počítačů nalezeno.", + "SCRIPT_INTELLIGENCE_OF_SIXTY": "&&1/60 nepřátelských počítačů nalezeno.", + "SCRIPT_INTELLIGENCE_PTS": "Našel jsi &&1 nepřátelských počítačů.", + "SCRIPT_INTELLIGENCE_REMAINING": "&&1 nepřátelských počítačů zbývá.", + "SCRIPT_INTELLIGENCE_ONEREMAINING": "&&1 nepřátelských počítačů zbývá.", + "SCRIPT_DEBUG_LEVEL_END": "Konec úrovně.", + "SCRIPT_C4_USE": "Pro použití C4 stiskni^3 [{+actionslot 2}]^7.", + "SCRIPT_NIGHTVISION_USE": "Pro použití nočního vidění stiskni^3 [{+actionslot 1}]^7.", + "SCRIPT_NIGHTVISION_STOP_USE": "Pro vypnutí nočního vidění stiskni^3 [{+actionslot 1}]^7.", + "SCRIPT_LEARN_GRENADE_LAUNCHER": "Pro použití granátometu M203 stiskni^3 [{+actionslot 3}]^7.", + "SCRIPT_LEARN_CHOPPER_AIR_SUPPORT1": "Letecká podpora je poblíž!", + "SCRIPT_LEARN_CHOPPER_AIR_SUPPORT1_PC": "Letecká podpora je poblíž! Stiskni ^3[{+actionslot 4}].", + "SCRIPT_ARMOR_DAMAGE": "Pancéřování může být poškozeno pouze\nC4 a raketami.", + "SCRIPT_MANTLE": "Stiskni ^3[{+gostand}]^7 pro stoupání.", + "SCRIPT_LEARN_M14_SWITCH": "Použij odstřelovací pušku M21 stisknutím ^3[{weapnext}]^7", + "SCRIPT_LEARN_JAVELIN": "Použij Javelin stisknutím ^3[{weapnext}]^7", + "SCRIPT_LEARN_CLAYMORES": "Použij claymore stisknutím ^3[{+actionslot 4}]^7.", + "SCRIPT_HOLD_TO_USE": "Pro použití podrž^3 &&1^7", + "SCRIPT_RADIATION_DEATH": "Vyhni se radiačním zónám.\nPoslouchej pípání Geigerova přístroje.", + "SCRIPT_LEARN_CLAYMORE_PLACEMENT": "Stiskni^3 [{+attack}] ^7pro položení claymore.", + "SCRIPT_TOTAL_SCORE": "CELKOVÉ SKÓRE:", + "SCRIPT_MISSION_SCORE": "SKÓRE MISE:", + "SCRIPT_TIME_REMAINING": "ZBÝVAJÍCÍ ČAS:", + "SCRIPT_EXTRA_LIFE": "EXTRA ŽIVOT X ", + "SCRIPT_CHECKPOINT": "CHECKPOINT!", + "SCRIPT_ZERO_DEATHS": "BONUS ZA NULOVÉ ÚMRTÍ x2", + "SCRIPT_DIFFICULTY_BONUS_ONEANDAHALF": "BONUS OBTÍŽNOSTI x1.5", + "SCRIPT_DIFFICULTY_BONUS_THREE": "BONUS OBTÍŽNOSTI x3", + "SCRIPT_DIFFICULTY_BONUS_FOUR": "BONUS OBTÍŽNOSTI x4", + "SCRIPT_TIME_UP": "PŘESČAS", + "SCRIPT_GAME_OVER": "KONEC HRY", + "SCRIPT_MISSION_COMPLETE": "MISE DOKONČENA", + "SCRIPT_NEW_HIGH_SCORE": "NOVÉ NYJVYŠŠÍ SKÓRE!", + "SCRIPT_HINT_THROW_C4": "Stiskni ^3[{+throw}]^7 pro hození C4.", + "SCRIPT_HINT_THROW_C4_TOGGLE": "Stiskni ^3[{+toggleads_throw}]^7 pro hození C4.", + "SCRIPT_HINT_THROW_C4_SPEED_TRIGGER": "Zatáhni ^3[{+speed_throw}]^7 pro hození C4.", + "SCRIPT_HINT_THROW_C4_SPEED": "Stiskni ^3[{+speed_throw}]^7 pro hození C4.", + "SCRIPT_X": "x", + "SCRIPT_STREAK_BONUS_LOST": "STREAK BONUS ZTRACEN", + "SCRIPT_STREAK_COMPLETE": "-STREAK DOKONČEN-", + "SCRIPT_1UP": "1UP", + "SCRIPT_COOP_REVIVE": "Podrž ^3[{+usereload}]^7 pro oživení", + "SCRIPT_COOP_REVIVING": "Being revived...", + "SCRIPT_COOP_BLEEDING_OUT": "Vykrvácel", + "SCRIPT_BREACH_TOO_MANY_ENEMIES": "Nelze vtrhnout. Vyčisti oblast od všech nepřátel", + "SCRIPT_BREACH_RELOADING": "Nelze vtrhnout při nabíjení", + "SCRIPT_BREACH_ILLEGAL_WEAPON": "Nelze vtrhnout s touto zbraní", + "SCRIPT_BREACH_NEED_PLAYER": "Oba hráči musí být blízko dveří aby mohli vtrhnout", + "SCRIPT_BREACH_NEED_FRIENDLY": "Čekám až se spoluhráči dostanou na své pozice...", + "SCRIPT_CHECKPOINT_TIME": "Checkpoint: ", + "SCRIPT_INVULERABLE_BULLETS": "Kulky nemohou poškodit toto vozidlo", + "SCRIPT_INVULERABLE_FRAGS": "Granáty nemohou poškodit toto vozidlo", + "SCRIPT_MISSIONFAIL_KILLEDHOSTAGE": "Mise nesplněna. Zabil jsi rukojmí.", + "SCRIPT_MISSIONFAIL_KILLEDHOSTAGE_THROUGH_ENEMY": "Mise nesplněna. Zabil jsi rukojmí za nepřítelem.\nNěkteré zbraně mají vysokou průraznost.", + "SCRIPT_MISSIONFAIL_HOSTAGEEXECUTED": "Mise nesplněna. Rukojmí byl popraven.", + "SCRIPT_MISSIONFAIL_HOSTAGEEXECUTED_USEMULTIDOOR": "Mise nesplněna. Rukojmí byl popraven.\nZkus se k němu dostat jinými dveřmi.", + "SCRIPT_WAYPOINT_COVER": "Kryj", + "SCRIPT_WAYPOINT_BREACH": "Vtrhni", + "SCRIPT_GRENADE_SUICIDE_COMBINED": "Zemřel jsi protože jsi držel granát příliš dlouho.\nPodržení ^3[{+frag}]^7 ti dovolí deaktivovat aktivní granáty.", + "SCRIPT_INTELLIGENCE_OF_MAX": "&&1/54 nepřátelských počítačů nalezeno.", + "SCRIPT_COOP_BLEEDING_OUT_PARTNER": "Partner zemřel", + "SCRIPT_COOP_REVIVING_PARTNER": "Oživování partnera...", + "SCRIPT_INTELLIGENCE_PREV_FOUND": "Nepřátelský počítač nalezen dříve.", + "SCRIPT_WAYPOINT_TARGETS": "Cíle", + "SCRIPT_BREACH_PARTNER_NOT_READY": "Na vtrhnutí nejsou připravení oba hráči", + "SCRIPT_BREACH_YOU_NOT_READY": "Nejsi připraven na vtrhnutí", + "SCRIPT_PLATFORM_FIRE_TO_SKIP": "Stiskni FIRE pro přeskočení.", + "SCRIPT_PLATFORM_CHEAT_USETOSLOWMO": "Použij ^3[{+melee}]^7 pro zap/vyp pomalého módu.", + "SCRIPT_PLATFORM_HINT_FLASH": "Stiskni ^3[{+smoke}]^7 pro hození flashgranátu.", + "SUBTITLE_AFCAVES_PRI_HOLDUP01": "^2Price: ^7Soape, vydrž.", + "SUBTITLE_AFCAVES_PRI_ENEMYPATROL02": "^2Price: ^7Hlídka", + "SUBTITLE_AFCAVES_PRI_THERMALSPIKE03": "^2Price: ^7Soape, zachytil jsem tepelný bod. Jeskyně musí být někde za hřebenem.", + "SUBTITLE_AFCAVES_PRI_HOOKUP04": "^2Price: ^7Jdeme na to - zahákni se.", + "SUBTITLE_AFCAVES_PRI_SOAPHOOKUP05": "^2Price: ^7Soape, zahákni se.", + "SUBTITLE_AFCAVES_PRI_WHATSTHEPROBLEM06": "^2Price: ^7Soape, v čem je problém? Zahákni se.", + "SUBTITLE_AFCAVES_PRI_HOOKUPLETSGO07": "^2Price: ^7Soape, zahákni se, pojďme.", + "SUBTITLE_AFCAVES_PRI_GO08": "^2Price: ^7Jdem na to", + "SUBTITLE_AFCAVES_PRI_2INTHECHEST09": "^2Price: ^7Máme tu dvě tanga.", + "SUBTITLE_AFCAVES_NKL_WAITFORYOU21": "^2Nikolai: ^7Počkám na tebe na určeném místě. Máš tři hodiny.", + "SUBTITLE_AFCAVES_PRI_DONTBOTHER22": "^2Price: ^7Nedělej si starosti. Tohle byla jednorázová letenka příteli.", + "SUBTITLE_AFCAVES_NKL_GOODLUCK23": "^2Nikolai: ^7Pak tedy hodně štěstí, můj příteli.", + "SUBTITLE_AFCAVES_PRI_MOVEOUT24": "^2Price: ^7Pohyb.", + "SUBTITLE_AFCAVES_PRI_DECRYPTIONCODE31": "^2Price: ^7Radši ať tenhle kód stojí za tu cenu, co jsme obětovali...", + "SUBTITLE_AFCAVES_PRI_INTELWASSOLID36": "^2Price: ^7Vypadá to že Makarovovy informace byly správné. Tohle je ono.", + "SUBTITLE_AFCAVES_PRI_HOLDUP241": "^2Price: ^7Vydrž. ", + "SUBTITLE_AFCAVES_PRI_SPLITUP43": "^2Price: ^7Nestřílej.", + "SUBTITLE_AFCAVES_PRI_GROUPONRIGHT44": "^2Price: ^7Soustřeď se na tu skupinku vpravo, přímo pod námi. Nejdřív dostaneme je.", + "SUBTITLE_AFCAVES_PRI_TWOONLEFT45": "^2Price: ^7Vezmu si ty dva vlevo.", + "SUBTITLE_AFCAVES_PRI_ONMYMARK46": "^2Price: ^7Až řeknu.", + "SUBTITLE_AFCAVES_PRI_THREE47": "^2Price: ^7Tři...", + "SUBTITLE_AFCAVES_PRI_TWO48": "^2Price: ^7Dva...", + "SUBTITLE_AFCAVES_PRI_ONE49": "^2Price: ^7Jedna...", + "SUBTITLE_AFCAVES_PRI_MARK410": "^2Price: ^7Teď.", + "SUBTITLE_AFCAVES_PRI_JUSTLIKEOLDTIMES411": "^2Price: ^7Jako za starých časů.", + "SUBTITLE_AFCAVES_PRI_DOGNEUTRALIZED412": "^2Price: ^7Jeden zneškodněn, vidím pět nepřátel.", + "SUBTITLE_AFCAVES_PRI_CLOSEENOUGH413": "^2Price: ^7Dost blízko.", + "SUBTITLE_AFCAVES_PRI_BEENSPOTTED414": "^2Price: ^7Všimli si nás - dostaň je dřív, než o nás dají vědět!", + "SUBTITLE_AFCAVES_PRI_STICKTOPLAN415": "^2Price: ^7Soape, musíme spolupracovat - příště se drž plánu.", + "SUBTITLE_AFCAVES_PRI_NOMISTAKES417": "^2Price: ^7Soape, tohle nejsou průměrné cíle. Žádné další chyby, pojďme.", + "SUBTITLE_AFCAVES_PRI_WASNTTHEPLAN418": "^2Kapitán Price: ^7To nebylo podle plánu.", + "SUBTITLE_AFCAVES_PRI_BEFORECOMEBACK51": "^2Price: ^7Dobrá, musíme se té skupinky zbavit dřív než se vrátí. Pohyb.", + "SUBTITLE_AFCAVES_PRI_DOWNHERE52": "^2Price: ^7Soape! Tady dole, pojďme!", + "SUBTITLE_AFCAVES_PRI_TAKETHEOTHERS53": "^2Price: ^7Honem, pojďme na ty další.", + "SUBTITLE_AFCAVES_PRI_GROUPSBACK54": "^2Price: ^7Pospěš si! Ta druhá skupinka se vrací!", + "SUBTITLE_AFCAVES_PRI_TAKETHESHOT55": "^2Price: ^7Jsem na místě - střílej.", + "SUBTITLE_AFCAVES_PRI_FOUNDBODIES56": "^2Price: ^7Soape, ta druhá skupinka našla těla! Dostaň je dřív než o nás dají vědět!", + "SUBTITLE_AFCAVES_PRI_REPOSITIONING57": "^2Price: ^7Soape, vracejí se - přemísťuju se mimo jejich dohled.", + "SUBTITLE_AFCAVES_PRI_READYTOSHOOT58": "^2Price: ^7Jsem na místě, připraven ke střelbě.", + "SUBTITLE_AFCAVES_SC2_SENDVINSON59": "^1Shadow Company: ^7Rozumím Oxide, pošlu Vinsona a Lamberta. Butcher Sedm přepíná.", + "SUBTITLE_AFCAVES_PRI_FINDTHEBODIES59": "^2Price: ^7Soape, najdou ty těla! Musíme je zneškodnit!", + "SUBTITLE_AFCAVES_PRI_MUCHTIME510": "^2Price: ^7Nemáme moc času než najdou ty těla. Pojďme.", + "SUBTITLE_AFCAVES_PRI_TANGOUPAHEAD61": "^2Price: ^7Nepřítel naproti. Nezasahuj.", + "SUBTITLE_AFCAVES_PRI_PATROLCOMING62": "^2Price: ^7Hlídka jde směrem k nám - doleva, honem!", + "SUBTITLE_AFCAVES_PRI_LETTHEMPASS64": "^2Price: ^7Nech je projít.", + "SUBTITLE_AFCAVES_PRI_ONTOUSGOLOUD65": "^2Price: ^7Jdou po nás - střílej.", + "SUBTITLE_AFCAVES_PRI_COMPROMISEDGOLOUD66": "^2Price: ^7Všimli si nás - střílej.", + "SUBTITLE_AFCAVES_PRI_GOTLUCKY67": "^2Price: ^7Měli jsme štěstí.", + "SUBTITLE_AFCAVES_PRI_THATWASCLOSE68": "^2Price: ^7To bylo těsný.", + "SUBTITLE_AFCAVES_PRI_HAVINGASMOKE69": "^2Price: ^7Sejmi toho strážníka s cigaretou, nebo ho nech ať projde.", + "SUBTITLE_AFCAVES_PRI_GUARDSKNOW610": "^2Price: ^7Stráž něco tuší. Zmiz z dohledu a buď potichu.", + "SUBTITLE_AFCAVES_PRI_SUPPRESSEDWEAPON611": "^2Price: ^7Ujisti se, že používáš zbraň s tlumičem, jestli ne, tak jsme mrtví.", + "SUBTITLE_AFCAVES_PRI_GETBACKHERE612": "^2Price: ^7Soape, kde jsi? Vrať se!", + "SUBTITLE_AFCAVES_PRI_AVOIDBEINGSPOTTED613": "^2Price: ^7Soape, je jich tu plno. Drž se vlevo.", + "SUBTITLE_AFCAVES_PRI_INCORRIDOR614": "^2Price: ^7Máme tu v koridoru dva vojáky - nestřílej a drž se vlevo.", + "SUBTITLE_AFCAVES_PRI_TANGOSONSIX615": "^2Price: ^7Vojáci na šesté.", + "SUBTITLE_AFCAVES_SC1_ISEEHIM615": "^1Shadow Company: ^7Vidím ho, je tady!", + "SUBTITLE_AFCAVES_PRI_EASYNOW616": "^2Price: ^7Potichu... ", + "SUBTITLE_AFCAVES_SC1_SPOTTED616": "^1Shadow Company: ^7Vidíme nepřítele!", + "SUBTITLE_AFCAVES_PRI_LETSGO617": "^2Price: ^7Pojďme.", + "SUBTITLE_AFCAVES_SC1_HOSTILEMYLOC617": "^1Shadow Company: ^7Mám tu nepřítele!", + "SUBTITLE_AFCAVES_PRI_GOODNIGHT618": "^2Price: ^7Dobrou noc.", + "SUBTITLE_AFCAVES_PRI_TANGOSWITHTACLIGHTS83": "^2Price: ^7Soape, máme tu dvě hlídky se světly, příchazející po schodech pod červeným světlem, před námi.", + "SUBTITLE_AFCAVES_PRI_TAKEONERIGHT84": "^2Price: ^7Vezmu si toho vpravo. Na můj povel.", + "SUBTITLE_AFCAVES_PRI_CLEARGO85": "^2Price: ^7Čisto. Pojďme.", + "SUBTITLE_AFCAVES_PRI_TANGOSWITHTACLIGHTS288": "^2Price: ^7Musíme je dostat, dřív než nás najdou.", + "SUBTITLE_AFCAVES_SCHQ_LOSTCONTACT91": "^1Shadow Company HQ: ^7Disciple Šest, ztratili jsme kontakt s Disciple Pět. Prověřte to, přepínám.", + "SUBTITLE_AFCAVES_SCHQ_2DEADBODIES91": "^1Shadow Company HQ: ^7Oxid Disciple Šestce, máme tu dvě těla u zadních dveří. Vyčistěte oblast.", + "SUBTITLE_AFCAVES_SC3_ONCATWALK92": "^1Disciple Šest: ^7Rozumím Oxide, jsme na můstku, jdeme do strojovny. Vydžte.", + "SUBTITLE_AFCAVES_SC3_ROGERSTANDBY92": "^1Disciple Šest: ^7Rozumím Oxide, vydržte.", + "SUBTITLE_AFCAVES_SC3_ATSTEAMROOM93": "^1Disciple Šest: ^7Oxide, Disciple Šest ve strojovně. Žádná stopa po Pětce, přepínám.", + "SUBTITLE_AFCAVES_SCHQ_GODARK94": "^1Shadow Company HQ: ^7Disciple Šest, zhasněte, vrthněte tam a vyčistěte to.", + "SUBTITLE_AFCAVES_SCHQ_FLATLINED102": "^1Shadow Company HQ: ^7Disciple Devět, ztratili jsme spojení s vaší zadní hlídkou!", + "SUBTITLE_AFCAVES_SC3_NOTPOSSIBLE103": "^1Disciple Šest: ^7Hloupost. Zrovna jsme tam byli.", + "SUBTITLE_AFCAVES_SHP_ITSPRICE104": "^1Shepherd: ^7To je Price.", + "SUBTITLE_AFCAVES_SHP_BURNTHEREST105": "^1Shepherd: ^7Zajistěte důležité předměty a ostatní spalte. Zdržte útočné týmy, dokud nebudeme moct vyjet.", + "SUBTITLE_AFCAVES_PRI_CLOCKSTICKING106": "^2Price: ^7Nezbývá moc času! Pojďme!", + "SUBTITLE_AFCAVES_SCHQ_CATWALK111": "^1Shadow Company HQ: ^7Avatare Jedna, tady Oxid, ztratili jsme kontakt s hlídkami u strojovny. Potřebuju kameru na můstku, přepínám.", + "SUBTITLE_AFCAVES_SC4_UAVONLINE112": "^1Shadow Company: ^7Rozumím Oxide, UAV je online. Vydržte.", + "SUBTITLE_AFCAVES_PRI_PICKUPRIOTSHEILD113": "^2Price: ^7Vezmi štít...potřebujeme krytí.", + "SUBTITLE_AFCAVES_PRI_TAKEPOINT2114": "^2Price: ^7Drž štít. Já se postarám o odpor.", + "SUBTITLE_AFCAVES_PRI_STAYLOW115": "^2Price: ^7Drž ten štít nízko, abych měl čistý výhled!", + "SUBTITLE_AFCAVES_PRI_KEEPLOW116": "^2Price: ^7Drž ten štít nízko!", + "SUBTITLE_AFCAVES_PRI_CROUCHDOWN117": "^2Price: ^7Sehni se s tím štítem Soape! Já se postarám o střelce.", + "SUBTITLE_AFCAVES_PRI_SWITCHTOSHEILD118": "^2Price: ^7Vezmi si štít, nejsme tu krytí!", + "SUBTITLE_AFCAVES_PRI_BRINGUP119": "^2Price: ^7Přines štít Soape!", + "SUBTITLE_AFCAVES_PRI_GIVEUSCOVER1110": "^2Price: ^7Kryj nás tím štítem Soape!", + "SUBTITLE_AFCAVES_PRI_WERECLEARMOVE1111": "^2Price: ^7Čisto. Pohyb.", + "SUBTITLE_AFCAVES_PRI_HESDOWN21113": "^2Price: ^7Je po něm.", + "SUBTITLE_AFCAVES_PRI_GOTEM1114": "^2Price: ^7Mám je. ", + "SUBTITLE_AFCAVES_PRI_GOTONE21115": "^2Price: ^7Mám ho. ", + "SUBTITLE_AFCAVES_PRI_PICKUPRIOTSHEILD21116": "^2Price: ^7Soape, vezmi štít a jdi první. Já se postarám o střelce!", + "SUBTITLE_AFCAVES_PRI_GRABASHEILD1118": "^2Price: ^7Soape, vezmi štít a jdi první.", + "SUBTITLE_AFCAVES_SC4_GETTINGTHIS1119": "^1Shadow Company: ^7Oxide, Avatar Jedna. Máme tu neoprávněné osoby na můstku. Opakuji, máme tu neoprávněné osoby na můstku - rozumíte? ", + "SUBTITLE_AFCAVES_SCHQ_FACIALRECOG1120": "^1Shadow Company HQ: ^7Avatare Jedna, srovnejte záběry z kamery s databází v Langley. Počkejte na další rozkazy.", + "SUBTITLE_AFCAVES_SHP_SHEPOUT1121": "^1Shepherd: ^7To je Price. Zajistěte důležité předměty a ostatní spalte. Zdržte hasící týmy, dokud nebudeme moct odjet. Shepherd přepíná.", + "SUBTITLE_AFCAVES_PRI_MOVEUP1123": "^2Price: ^7Pohyb.", + "SUBTITLE_AFCAVES_PRI_TAKEPOINTDRAW1124": "^2Price: ^7Vezmi si štít a odrážej střelbu. Budu tě krýt.", + "SUBTITLE_AFCAVES_SC5_50METERS121": "^1Shadow Company: ^7Oxide, Disciple Devět, máme tu nepřátele asi 50 metrů od hnízda, přepínám.", + "SUBTITLE_AFCAVES_PRI_EXPOSEDGOLOUD122": "^2Price: ^7Všimli si nás! Střílej!", + "SUBTITLE_AFCAVES_SCHQ_2ENEMIES123": "^1Shadow Company HQ: ^7Veškerému personálu - máme na můstku dva nepřátele směřující k hnízdu.", + "SUBTITLE_AFCAVES_SCHQ_PREJUDICE124": "^1Shadow Company HQ: ^7Zneškodněte je bez slitování.", + "SUBTITLE_AFCAVES_SCHQ_ESCOURTGOLDEAGLE125": "^1Shadow Company HQ: ^7Butchere Jedna-Pět, randezvous v hnízdě a připravte k eskortaci Gold Eagle.", + "SUBTITLE_AFCAVES_PRI_MUSTBESHEPHERD126": "^2Price: ^7Gold Eagle musí být Shepherd! Už nemáme moc času, pojďme!", + "SUBTITLE_AFCAVES_SC5_RAPELLINGIN131": "^1Shadow Company: ^7Disciple Tři jde dovnitř!", + "SUBTITLE_AFCAVES_SC6_SEVEREDDET132": "^1Shadow Company: ^7Oxide, Butcher Pět-Actual. Mám tu přerušené vedení - budeme potřebovat deset minut na připravení trupu a nastavení EBC, přepínám. ", + "SUBTITLE_AFCAVES_SCHQ_CHARGESHOT133": "^1Shadow Company HQ: ^7Negativní, Gold Eagle chce ty nálože připravit v méně než třech minutách. Dokončete to, přepínám.", + "SUBTITLE_AFCAVES_SCHQ_EXSAS2134": "^1Shadow Company HQ: ^7Všem útočným týmům, máme pozitivní ID. Nepřátelé jsou bývalý vojáci SAS a Task Force 141. Přistupujte s extrémní opatrností, přepínám.", + "SUBTITLE_AFCAVES_SCHQ_EXSAS135": "^1Shadow Company HQ: ^7Všem útočným týmům, Nepřátele jsou bývalý vojáci SAS a Task Force 141. Přistupujte s extrémní opatrností, přepínám.", + "SUBTITLE_AFCAVES_PRI_POPPINGSMOKE136": "^2Price: ^7Zapaluju kouř! Jdi na pravou stranu!", + "SUBTITLE_AFCAVES_PRI_DRAWFIRE137": "^2Price: ^7Kryju nás kouřem! Obejdi je!", + "SUBTITLE_AFCAVES_PRI_MOVERIGHT138": "^2Price: ^7Ženou se sem, Shepherd je blízko! Musíme se přes ně dostat!", + "SUBTITLE_AFCAVES_PRI_USINGTHERMAL139": "^2Price: ^7Používají termální vidění!", + "SUBTITLE_AFCAVES_PRI_SWITCHINGTOTHERM1310": "^2Price: ^7Přepínají na termální! Dávej pozor na strany!", + "SUBTITLE_AFCAVES_PRI_TRYTOFLANK1311": "^2Price: ^7Obklič je!", + "SUBTITLE_AFCAVES_PRI_SHEILDSUSEFLASH1312": "^2Price: ^7Používají štíty! Použij oslepující granáty!", + "SUBTITLE_AFCAVES_PRI_HITFROMSIDES1313": "^2Price: ^7Soape! Sejmi je z boku!", + "SUBTITLE_AFCAVES_PRI_SHEILDSTHROWFRAGS1314": "^2Price: ^7Používají štíty! Použij tříštivé granáty!", + "SUBTITLE_AFCAVES_PRI_FLANKANDHITSIDES1315": "^2Price: ^7Zkus je obejít že strany!", + "SUBTITLE_AFCAVES_PRI_GETFRAMECHARGE1316": "^2Price: ^7Uzavřeli kontrolní místnost. Dej na ty dveře trhavinu!", + "SUBTITLE_AFCAVES_PRI_BREACHTHEDOOR1317": "^2Price: ^7Soape! Musíme jít! Odpal ty dveře!", + "SUBTITLE_AFCAVES_PRI_BLOWTHEDOOR1318": "^2Price: ^7Odpal ty dveře! Nemůžeme nechat Shepherda utéct!", + "SUBTITLE_AFCAVES_PRI_CHARGEDOIT1319": "^2Price: ^7Dej na ty dveře výbušninu! Udělej to!", + "SUBTITLE_AFCAVES_PRI_DOOROPEN141": "^2Price: ^7Soape! Otevři ty dveře! Na panelu!", + "SUBTITLE_AFCAVES_PRI_OVERRIDECONTROL142": "^2Price: ^7Postarej se o to ovládání dveří! Pospěš si! ", + "SUBTITLE_AFCAVES_PRI_GETDOOROPEN143": "^2Price: ^7Soape! Otevři ty dveře!", + "SUBTITLE_AFCAVES_PRI_USEKEYBOARD144": "^2Price: ^7Postarej se o ty dveře! Použij klávesnici!", + "SUBTITLE_AFCAVES_PRI_COMEONCOMEON146": "^2Price: ^7No táák...no táák...", + "SUBTITLE_AFCAVES_SHP_SITECOMPROMISED147": "^1Shepherd: ^7Všem jednotkám tady Gold Eagle. Máme tu nepřátele.", + "SUBTITLE_AFCAVES_SHP_DIRECTIVE116148": "^1Shepherd: ^7Spouštím příkaz jedna-jedna-šest bravo. Jestli jste pořád uvnitř, vaše oběť nebude zapomenuta. Shepherd přepíná. ", + "SUBTITLE_AFCAVES_PRI_GONNABLOW1411": "^2Price: ^7Honem! Tohle místo vybouchne!", + "SUBTITLE_AFCAVES_PRI_STAYCLOSE161": "^2Price: ^7Pojďme! Drž se blízko mě!", + "SUBTITLE_AFCAVES_PRI_FOLLOWMELETSGO162": "^2Price: ^7Soape! Za mnou! Pojďme!", + "SUBTITLE_AFCAVES_PRI_HEADFORHUMVEE163": "^2Price: ^7Jdi k tomu humvee, kryju tě!", + "SUBTITLE_AFCAVES_PRI_TOTHEWEST164": "^2Price: ^7Na západ Soape, Běž!", + "SUBTITLE_AFCAVES_PRI_COMETOME165": "^2Price: ^7Pojď sem, kryju tě. Běž!", + "SUBTITLE_AFCAVES_PRI_TOWERAHEAD166": "^2Price: ^7Běz k té věži naproti! Budu tě krýt!", + "SUBTITLE_AFCAVES_PRI_FORWARDTOTOWER167": "^2Price: ^7Jdi k té věži!", + "SUBTITLE_AFCAVES_SCHQ_RISKYFORFLIGHTOPS171": "^1Shadow Company HQ: ^7Pane, zvedá se písečná bouře. Na let je to příliš riskantní.", + "SUBTITLE_AFCAVES_SHP_TAKEZODIACS172": "^1Shepherd: ^7Rozumím. Miřte k tunelu. Vezmeme si na to Zodiacy. ", + "SUBTITLE_AFCAVES_SCHQ_YESSIR2173": "^1Shadow Company HQ: ^7Ano pane!", + "SUBTITLE_AFCAVES_PRI_GETTINGAWAY2174": "^2Price: ^7K tunelu! Utíká!", + "SUBTITLE_AFCAVES_PRI_RIVERNEARBY175": "^2Price: ^7Shepherd zmínil Zodiacy...musí tu být někde přístup k řece - pojďme!", + "SUBTITLE_AFCAVES_PRI_TARGETSWEST184": "^2Price: ^7Cíle na západ! Sejmi je!", + "SUBTITLE_AFCAVES_PRI_SNIPERFROMTOWER186": "^2Price: ^7Odstřelovač na věži! Postarej se o to!", + "SUBTITLE_AFCAVES_SHP_DANGERCLOSE191": "^1Shepherd: ^7Excalibure, tady Gold Eagle. Úniková mise - cílový balíček Romeo - nebezpečí blízko.", + "SUBTITLE_AFCAVES_SCHQ_100METERS192": "^1Shadow Company HQ: ^7To je do sto metrů od vás pane!", + "SUBTITLE_AFCAVES_PRI_SINCEWHEN193": "^2Price: ^7Od kdy se Shepherd stará o blízké nebezpečí...", + "SUBTITLE_AFCAVES_SHP_SENDIT194": "^1Shepherd: ^7To nebyla rada! Pošlete to!", + "SUBTITLE_AFCAVES_SCHQ_FIREMISSIONCLOSE195": "^1Shadow Company HQ: ^7Rozumím, úniková mise nebezpečí blízko!", + "SUBTITLE_AFCAVES_PRI_FALLBACK196": "^2Price: ^7Soape! Pozor! Ústup, ústup!", + "SUBTITLE_AFCAVES_PRI_MOVEWESTTOWER197": "^2Price: ^7Jdi na západ ke věži! Pojď za mnou!", + "SUBTITLE_AFCAVES_PRI_DOIT198": "^2Price: ^7Udělej to.", + "SUBTITLE_AFCAVES_PRI_FALLBACK196_2": "^2Price: ^7Soape! Pozor! K zemi! K zemi!", + "SUBTITLE_AFCAVES_PRI_FALLBACK196_3": "^2Price: ^7Jdi sakra odtud! Pálí po nás!", + "SUBTITLE_AFCAVES_PRI_MEETEMHEADON201": "^2Price: ^7Vypadá to že se s nimi střetneme tváří v tvář, Soape.", + "SUBTITLE_AFCAVES_PRI_GETREADY202": "^2Price: ^7Pojďme - připrav se.", + "SUBTITLE_AFCAVES_PRI_GOLOUD204": "^2Price: ^7Střílej!", + "SUBTITLE_AFCAVES_PRI_EYESUP205": "^2Price: ^7Pozor! Obcházejí nás! ", + "SUBTITLE_AFCAVES_SC3_CHARGEPLANTED206": "^1Disciple Šest: ^7Trhavina umístěna. Jsme připraveni. ", + "SUBTITLE_AFCAVES_SCL_HITIT207": "^1Shadow Company: ^7Do toho.", + "SUBTITLE_AFCAVES_SCL_FOXTROTELEMENT208": "^1Shadow Company: ^7Foxtrot element, průzkum vlevo. ", + "SUBTITLE_AFCAVES_SCL_PATTERNECHO209": "^1Shadow Company: ^7Prohledejte schéma Echo Charlie. Běžte. ", + "SUBTITLE_AFCAVES_SC3_AREACLEAR2010": "^1Disciple Šest: ^7Místnost u dveří čistá.", + "SUBTITLE_AFCAVES_SCL_CHECKCORNERS2011": "^1Shadow Company: ^7Hlídejte si rohy.", + "SUBTITLE_AFCAVES_SCL_THEYREHERE2012": "^1Shadow Company: ^7Jsou tu! Palte!", + "SUBTITLE_AFCAVES_SCL_HUNTTHEMDOWN2013": "^1Shadow Company: ^7Zůstaňte v klidu, sejměte je!", + "SUBTITLE_AFCAVES_SC5_PAPAQUEBEC2014": "^1Shadow Company: ^7Butcher Dva slaňuje do sektoru Papa Quebec!", + "SUBTITLE_AFCAVES_SC3_BREACHING2015": "^1Disciple Šest: ^7Jdeme tam!", + "SUBTITLE_AFCAVES_PRI_SPLITTINGUP2017": "^2Price: ^7Dobrá, rozdělují se. Dostaneme je zvlášť.", + "SUBTITLE_AFCAVES_SCHQ_LOSTCONTACT22018": "^1Shadow Company HQ: ^7Butcher Sedm, Oxide. Ztratili jsme kontakt s Disciple Pět.", + "SUBTITLE_AFCAVES_SCHQ_BADTRANSMITTER22019": "^1Shadow Company HQ: ^7Zřejmě nám jen bouře blokuje signál.", + "SUBTITLE_AFCAVES_SCHQ_SENDATEAM22020": "^1Shadow Company HQ: ^7Pošlete tam tým, přepínám.", + "SUBTITLE_AFCAVES_PRI_TOPOFSTAIRS2021": "^2Price: ^7Na schodech - je můj.", + "SUBTITLE_AFCAVES_PRI_NEVERMIND2022": "^2Price: ^7Zapomeň na to. ", + "SUBTITLE_AFCAVES_PRI_IMPRESSIVE2023": "^2Price: ^7Skvěle.", + "SUBTITLE_AFCAVES_PRI_MOVE22025": "^2Price: ^7Pohyb.", + "SUBTITLE_AFCAVES_PRI_KEEPMOVING2026": "^2Price: ^7Pokračujme.", + "SUBTITLE_AFCHASE_PRI_GETTINGAWAY13": "^2Price: ^7Ujíždí!", + "SUBTITLE_AFCHASE_PRI_GOGOGO14": "^2Price: ^7Dělej! Přidej", + "SUBTITLE_AFCHASE_UAV_RPGUNITS15": "^1UAV Operátor: ^7Upozorňuji, že vysíláme RPG týmy na mosty, abychom zneškodnili Price a MacTavishe..", + "SUBTITLE_AFCHASE_UAV_ANYBOATS16": "^1UAV Operátor: ^7Všem únikovým týmům - vezměte RPG a zneškodněte člun pronásledující Gold Eagle. ", + "SUBTITLE_AFCHASE_UAV_ETA40SECS17": "^1UAV Operátor: ^7Little Birds letí k vám, cca 40 vteřin. ", + "SUBTITLE_AFCHASE_LBP_DONTHAVEVISUAL18": "^2Pilot Little Bird: ^7Gold Eagle, tady Kestrel 3-2, jsme nad přehradou...nevidíme vás, přepínám.", + "SUBTITLE_AFCHASE_SHP_STILLINCAVES19": "^1Shepherd: ^7Kestrel 3-2, pořád jsme v jeskyních, vydržte. ", + "SUBTITLE_AFCHASE_SHP_OBSERVE110": "^1Shepherd: ^7Kestrel 3-2, pořád jsou v jeskyních, zůstaňte na místě a sledujte situaci, Gold Eagle přepíná.", + "SUBTITLE_AFCHASE_PRI_CANTLET21": "^2Price: ^7Nemůžeme nechat Shepherda utéct!", + "SUBTITLE_AFCHASE_PRI_LOSINGHIM22": "^2Price: ^7Ztrácíme ho!", + "SUBTITLE_AFCHASE_PRI_DRIVINGTHEBOAT23": "^2Price: ^7Soustřeď se na řízení, já se postarám o ostatní!", + "SUBTITLE_AFCHASE_PRI_THRUCAVE31": "^2Price: ^7Skrz tu jeskyni!", + "SUBTITLE_AFCHASE_PRI_WRONGWAY32": "^2Price: ^7Jedeš špatně!", + "SUBTITLE_AFCHASE_PRI_TURNTOOBJECTIVE33": "^2Price: ^7Jeď směrem k cíli! Pojďme! Uteče! ", + "SUBTITLE_AFCHASE_PRI_FULLPOWER34": "^2Price: ^7Soape! Co to děláš!? Plný plyn, honem!", + "SUBTITLE_AFCHASE_PRI_WHEREGOING35": "^2Price: ^7Kam to jedeš?!", + "SUBTITLE_AFCHASE_PRI_DODGEHELI41": "^2Price: ^7Soape, vyhni se tomu vrtulníku! ", + "SUBTITLE_AFCHASE_PRI_EVASIVE42": "^2Price: ^7Máme vrtulník na šesté! Snaž se mu vyhýbat! ", + "SUBTITLE_AFCHASE_PRI_ENEMYSIX51": "^2Price: ^7Nepřátelé se přibližují na šesté hodině!", + "SUBTITLE_AFCHASE_PRI_ZODIACNINE52": "^2Price: ^7Nepřátelský Zodiac na deváté hodině!", + "SUBTITLE_AFCHASE_PRI_ZODIACSIX53": "^2Price: ^7Zodiac se přibližuje na šesté hodině!", + "SUBTITLE_AFCHASE_UAV_10SECONDS55": "^1UAV Operátor: ^7Rozumím, UAV podpora dostupná za 10 vteřin. ", + "SUBTITLE_AFCHASE_UAV_MISSILESONLINE56": "^1UAV Operátor: ^7Rakety vzduch-země nastaveny. Až řeknete, pane.", + "SUBTITLE_AFCHASE_SHP_DANGERCLOSE57": "^1Shepherd: ^7Střílejte, jsou blízko! ", + "SUBTITLE_AFCHASE_SHP_CLEAREDHOT58": "^1Shepherd: ^7Střílejte! ", + "SUBTITLE_AFCHASE_SHP_TAKEEM59": "^1Shepherd: ^7Sejměte je! ", + "SUBTITLE_AFCHASE_SHP_TRYAGAIN510": "^1Shepherd: ^7Avatare Jedna, zaměřte cíl a zkuste to znovu! Můžete střílet! ", + "SUBTITLE_AFCHASE_UAV_MISSILEAWAY1511": "^1UAV Operátor: ^7Rozumím. Střílím.", + "SUBTITLE_AFCHASE_UAV_MISSILEAWAY2512": "^1UAV Operátor: ^7Rozumím, střílím!", + "SUBTITLE_AFCHASE_UAV_FOXTHREE1513": "^1UAV Operátor: ^7Fox Tři. ", + "SUBTITLE_AFCHASE_UAV_FOXTHREE2514": "^1UAV Operátor: ^7Fox Tři! ", + "SUBTITLE_AFCHASE_PRI_RAPIDSAHEAD61": "^2Price: ^7Nepřátelé naproti! Bude to drsný, drž se! ", + "SUBTITLE_AFCHASE_PRI_GUNSSPINUP71": "^2Price: ^7Dostaň se za ten Little Bird, dřív než nabije!", + "SUBTITLE_AFCHASE_PRI_STEERCLEAR72": "^2Price: ^7Drž se od toho vrtulníku daleko! Jeď! Jeď! ", + "SUBTITLE_AFCHASE_PRI_BEHINDROCKS81": "^2Price: ^7Dostaň se za ty kameny! ", + "SUBTITLE_AFCHASE_PRI_MINIGUNS82": "^2Price: ^7Ty kulomety nepřestanou pálit, setřásni je! ", + "SUBTITLE_AFCHASE_PRI_SHAKEEMOFF83": "^2Price: ^7Musíme je ztratit! Setřásni je! ", + "SUBTITLE_AFCHASE_PRI_THREADTHENEEDLE84": "^2Price: ^7Proklouzni tudy! ", + "SUBTITLE_AFCHASE_PRI_ENEMYBOATS85": "^2Price: ^7Nepřátelské lodě na třech hodinách! ", + "SUBTITLE_AFCHASE_PRI_OPENAREAS86": "^2Price: ^7Drž se dál od otevřené vody! ", + "SUBTITLE_AFCHASE_PRI_DODGEDODGE87": "^2Price: ^7Stoč to, stoč to! ", + "SUBTITLE_AFCHASE_PRI_LEFTLEFT88": "^2Price: ^7Vlevo, vlevo! ", + "SUBTITLE_AFCHASE_PRI_RIGHTRIGHT89": "^2Price: ^7Vpravo, vpravo! ", + "SUBTITLE_AFCHASE_PRI_LEFT810": "^2Price: ^7Vlevo! ", + "SUBTITLE_AFCHASE_PRI_RIGHT811": "^2Price: ^7Vpravo! ", + "SUBTITLE_AFCHASE_PRI_RPGSONBRIDGE812": "^2Price: ^7RPG na tom mostě! ", + "SUBTITLE_AFCHASE_PRI_OTHERSIDE813": "^2Price: ^7Dostaneme ho na druhé straně! ", + "SUBTITLE_AFCHASE_PRI_TECHNICAL814": "^2Price: ^7Technicky! ", + "SUBTITLE_AFCHASE_SHP_SITREP91": "^1Shepherd: ^7Avatare Jedna, co se tam děje! ", + "SUBTITLE_AFCHASE_UAV_DOWNRIVER92": "^1UAV Operátor: ^7Mám tu čekající Warhorse 5-1. Pave Low čeká pod řekou. ", + "SUBTITLE_AFCHASE_SHP_COMININHOT93": "^1Shepherd: ^7Rozumím! Warhorse 5-1, řítíme se k vám pod palbou! ", + "SUBTITLE_AFCHASE_PLP_ABOVE30KNOTS94": "^1Pilot Pave Low: ^7Rozumím - otevírám dveře - držte to na třiceti uzlech a hlídejte si směr. ", + "SUBTITLE_AFCHASE_SHP_SOLIDCOPY95": "^1Shepherd: ^7Jasně, rozumím! Čekejte! ", + "SUBTITLE_AFCHASE_PRI_HOLDSTEADY101": "^2Price: ^7Soape! Drž to rovně! ", + "SUBTITLE_AFCHASE_PRI_STEADY1102": "^2Price: ^7Rovně! ", + "SUBTITLE_AFCHASE_PRI_BACKUP104": "^2Price: ^7Zpátky, zpátky!", + "SUBTITLE_AFCHASE_SHP_WAITINGFOR151": "^1Shepherd: ^7Na co čekáš MacTavishi...", + "SUBTITLE_AFCHASE_SHP_DIGTWOGRAVES152": "^1Shepherd: ^7Víš, co říkají o pomstě...radši se příprav na kopání dvou hrobů...", + "SUBTITLE_AFCHASE_SHP_GOAHEAD153": "^1Shepherd: ^7Do toho, ukonči to. Stejně to nic nezmění.", + "SUBTITLE_AFCHASE_SHP_COULDNTDOIT154": "^1Shepherd: ^7Hmm. Věděl jsem, že to nesvedeš...", + "SUBTITLE_AFCHASE_SHP_GOODWARRIOR155": "^1Shepherd: ^7Seš dobrý bojovník...", + "SUBTITLE_AFCHASE_SHP_EXTRASTEP156": "^1Shepherd: ^7...ale nikdy jsi nedokázal udělat ten krok...", + "SUBTITLE_AFCHASE_SHP_NECESSARY157": "^1Shepherd: ^7...k tomu co je nezbytné.", + "SUBTITLE_AFCHASE_PRI_DONTWORRY204": "^2Price: ^7Neboj -", + "SUBTITLE_AFCHASE_PRI_WEWONT205": "^2Price: ^7...neuděláme.", + "SUBTITLE_AFCHASE_PRI_WEKNOW207": "^2Price: ^7My víme.", + "SUBTITLE_AFCHASE_PRI_SOAP1221": "^2Price: ^7Soape!", + "SUBTITLE_AFCHASE_PRI_HOLDFORNOW251": "^2Price: ^7Ještě chvíli vydrž. Honem, vstávej!", + "SUBTITLE_AFCHASE_PRI_TOLDYOU252": "^2Price: ^7Myslím, že jsem říkal, že tohle je jednosměrný výlet!", + "SUBTITLE_AFCHASE_NKL_LOOKINGFORUS253": "^2Nikolai: ^7Vypadá to, že pořád je...budou nás hledat...", + "SUBTITLE_AFCHASE_PRI_SOAPOUTTAHERE254": "^2Price: ^7Nikolaii, musíme odtud Soapa dostat...", + "SUBTITLE_AFCHASE_NKL_KNOWAPLACE255": "^2Nikolai: ^7Da - vím o místě.", + "SUBTITLE_AFCHASE_SHP_NEEDTOASK261": "^1Shepherd: ^7Proč. Proč? Potřebuješ se na to ptát?", + "SUBTITLE_AFCHASE_SHP_BEENATWAR262": "^1Shepherd: ^7Válčíme už dlouho.", + "SUBTITLE_AFCHASE_SHP_MOUNTINGLOSS263": "^1Shepherd: ^7Bojujeme za koalici unavenou hromaděním obětí.", + "SUBTITLE_AFCHASE_SHP_DECISIVEACTION264": "^1Shepherd: ^7Přímé hrozby si žádají rázná řešení.", + "SUBTITLE_AFCHASE_SHP_NOSHORTAGE266": "^1Shepherd: ^7Zítra už nebude nedostatek dobrovolníků, nedostatek vlastenců.", + "SUBTITLE_AFCHASE_SHP_IKNOW267": "^1Shepherd: ^7Vím že mi rozumíš.", + "SUBTITLE_AFCHASE_SHP_APATRIOT268": "^1Shepherd: ^7Jsem vlastenec MacTavishi.", + "SUBTITLE_AFCHASE_SHP_ONLYDID269": "^1Shepherd: ^7Udělal jsem, jen co bylo nutné.", + "SUBTITLE_AFCHASE_SHP_NOTHINGMORE2610": "^1Shepherd: ^7Nic víc.", + "SUBTITLE_AFCHASE_SHP_WONTCHANGE2611": "^1Shepherd: ^7Moje smrt nic nezmění.", + "SUBTITLE_AFCHASE_SHP_LOSTOURWILL2612": "^1Shepherd: ^7Toho dne jsme ztratili chuť k boji. ", + "SUBTITLE_AFCHASE_SHP_FORGIVEME2613": "^1Shepherd: ^7Odpusť... ", + "SUBTITLE_AFCHASE_SHP_YOUUNDERSTAND2614": "^1Shepherd: ^7Určitě mi rozumíš.", + "SUBTITLE_AFCHASE_SHP_WILLTOFIGHTWEAK2615": "^1Shepherd: ^7Americká vůle k boji ochabla.", + "SUBTITLE_AFCHASE_SHP_FIVEYEARSAGOPG2616": "^1Shepherd: ^7Před pěti lety Zakhaev zabil během okamžiku 30,000 Mariňáků......a svět se jen díval.", + "SUBTITLE_AFCHASE_SHP_FIVEYEARSAGO_A265_2": "^1Shepherd: ^7Před pěti lety jsem já ztratil v okamžiku 30,000 mužů.", + "SUBTITLE_AFCHASE_SHP_FIVEYEARSAGO_B265_3": "^1Shepherd: ^7A svět se jen díval zatraceně.", + "SUBTITLE_AIRPORT_MKV_NORUSS12": "^1Makarov: ^7Pamatujte - nepoužívejte ruštinu.", + "SUBTITLE_AIRPORT_MKV_LETSGO13": "^1Makarov: ^7Pojďme.", + "SUBTITLE_AIRPORT_MKV_MOVEUP214": "^1Makarov: ^7Pohyb.", + "SUBTITLE_AIRPORT_MKV_UPSTAIRS15": "^1Makarov: ^7Nahoru. Jděte.", + "SUBTITLE_AIRPORT_MKV_30SECS51": "^1Makarov: ^730 vteřin. Jděte.", + "SUBTITLE_AIRPORT_MKV_LETSMOVEUP52": "^1Makarov: ^7Pojďme, pohyb!", + "SUBTITLE_AIRPORT_MKV_LETSGO253": "^1Makarov: ^7Pojďme!", + "SUBTITLE_AIRPORT_MKV_GO54": "^1Makarov: ^7Jděte.", + "SUBTITLE_AIRPORT_MKV_KEEPMOVING55": "^1Makarov: ^7Pokračujte!", + "SUBTITLE_AIRPORT_AT1_SECURITY56": "^2Kiril: ^7Bezpečáci naproti!", + "SUBTITLE_AIRPORT_MKV_CAREOFIT57": "^1Makarov: ^7Postarej se o to!", + "SUBTITLE_AIRPORT_AT1_FRAGOUT58": "^2Kiril: ^7Házím frag!", + "SUBTITLE_AIRPORT_MKV_ELEVATORS59": "^1Makarov: ^7Pohyb u výtahu!", + "SUBTITLE_AIRPORT_MKV_COPY510": "^1Makarov: ^7Rozumím.", + "SUBTITLE_AIRPORT_MKV_FIREINHOLE511": "^1Makarov: ^7Granát!", + "SUBTITLE_AIRPORT_MKV_DOUBTYOU61": "^1Makarov: ^7Zatím jsi mi sloužil dobře. Nedávej mi důvod o tobě pochybovat. ", + "SUBTITLE_AIRPORT_MKV_OPENFIRE62": "^1Makarov: ^7Střílej - to je rozkaz!", + "SUBTITLE_AIRPORT_MKV_FSB63": "^1Makarov: ^7F.S.B. - sejměte je.", + "SUBTITLE_AIRPORT_MKV_WELLDONE64": "^1Makarov: ^7Výborně. Věděl jsem, že byste mě v tom nenechali.", + "SUBTITLE_AIRPORT_MKV_YOUTRAITOR65": "^1Makarov: ^7Zrádce.", + "SUBTITLE_AIRPORT_MKV_COWARDS66": "^1Makarov: ^7Nestrpím zbabělce.", + "SUBTITLE_AIRPORT_MKV_CHECKFIRE67": "^1Makarov: ^7Pozor kam střílíš!", + "SUBTITLE_AIRPORT_MKV_RUNNER71": "^1Makarov: ^7Mám tu zběha!", + "SUBTITLE_AIRPORT_AT1_GOTMOREFSB72": "^2Kiril: ^7Další F.S.B.", + "SUBTITLE_AIRPORT_MKV_TAKECARE73": "^1Makarov: ^7Postarejte se o to.", + "SUBTITLE_AIRPORT_AT1_ROGER74": "^2Kiril: ^7Rozumím.", + "SUBTITLE_AIRPORT_MKV_FRAGOUT75": "^1Makarov: ^7Házím Frag!", + "SUBTITLE_AIRPORT_MKV_FORZAKHAEV91": "^1Makarov: ^7Za Zakhaeva.", + "SUBTITLE_AIRPORT_MKV_ONTIME92": "^1Makarov: ^7Jsou tu přesně.", + "SUBTITLE_AIRPORT_MKV_THISWAY93": "^1Makarov: ^7Tudy, pojďme.", + "SUBTITLE_AIRPORT_MKV_HOLDFIRE94": "^1Makarov: ^7Nestřílejte.", + "SUBTITLE_AIRPORT_MKV_HALLWAY95": "^1Makarov: ^7Hala čistá.", + "SUBTITLE_AIRPORT_MKV_RIGHTONTIME96": "^1Makarov: ^7Skvěle. Jsou tu na čas.", + "SUBTITLE_AIRPORT_MKV_CHECKAMMO97": "^1Makarov: ^7Zkontrolujte si zbraně.", + "SUBTITLE_AIRPORT_VKT_BEENWAITING98": "^1Viktor: ^7Na tohle jsem čekal dlouho.", + "SUBTITLE_AIRPORT_MKV_HAVENTWEALL910": "^1Makarov: ^7My všichni.", + "SUBTITLE_AIRPORT_MKV_GOGOGO101": "^1Makarov: ^7Jdi! Jdi! Jdi!", + "SUBTITLE_AIRPORT_MKV_LANDINGGEAR2272": "^1Makarov: ^7Podvozek!", + "SUBTITLE_AIRPORT_MKV_LUGGAGECART2273": "^1Makarov: ^7Za vozítkem!", + "SUBTITLE_AIRPORT_MKV_2NDFLRWNDWS2274": "^1Makarov: ^7Okno - druhé patro!", + "SUBTITLE_AIRPORT_VT_MADEIT281": "^1Anatoly: ^7Skvěle, zvládl jsi to! Nastup.", + "SUBTITLE_AIRPORT_VT_COMEON282": "^1Anatoly: ^7Honem, pojďme.", + "SUBTITLE_AIRPORT_VT_WAITINGFOR283": "^1Anatoly: ^7Na co čekáš? Nastup.", + "SUBTITLE_AIRPORT_MKV_COMEON284": "^1Makarov: ^7Pojď, honem.", + "SUBTITLE_AIRPORT_MKV_GETIN285": "^1Makarov: ^7Musíme jet, nastup.", + "SUBTITLE_AIRPORT_VT_BEENOUGH291": "^1Anatoly: ^7Tímhle útokem jsme poslali drastickou zprávu Makarove.", + "SUBTITLE_AIRPORT_MKV_NOMESSAGE292": "^1Makarov: ^7To nebyla žádná zpráva...", + "SUBTITLE_AIRPORT_MKV_THISWILL293": "^1Makarov: ^7Tohle je zpráva.", + "SUBTITLE_AIRPORT_MKV_ALLOFRUSSIA294": "^1Makarov: ^7Američani si mysleli, že nás můžou podvést. Až najdou to tělo...celé Rusko bude brečet pro válku.", + "SUBTITLE_ARCADIA_FLY_DESTROYTRIPLEA12": "^2Sgt. Foley: ^7Musíme zničit ty triple-A pozice, abychom odtud mohli dostat zbytek civilistů! Honem!", + "SUBTITLE_ARCADIA_FLY_USEDESIGNATOR13": "^2Sgt. Foley: ^7Použij označovač! Označ cíle pro Stryker!", + "SUBTITLE_ARCADIA_FLY_PAINTTARGETS14": "^2Sgt. Foley: ^7Jednotko použijte označovače! Označte cíle pro Stryker!", + "SUBTITLE_ARCADIA_STR_LASETARGET21": "^2Střelec Strykeru: ^7Všem Hunter jednotkám, tady Badger Jedna. Označte cíl, přepínám.", + "SUBTITLE_ARCADIA_STR_STANDINGBY22": "^2Střelec Strykeru: ^7Všem Hunter jednotkám, tady Badger Jedna. Čekáme na označení vašich cílů, přepínám.", + "SUBTITLE_ARCADIA_STR_PAINTTARGET23": "^2Střelec Strykeru: ^7Všem Hunter týmům, tady Badger Jedna. Označte cíl, přepínám.", + "SUBTITLE_ARCADIA_STR_WEHAVELOCK31": "^2Střelec Strykeru: ^7Rozumím, máme zaměřeno. Zahajujeme palbu.", + "SUBTITLE_ARCADIA_STR_ENGAGING32": "^2Střelec Strykeru: ^7Badger Jedna rozumí, zaměřuji cíl.", + "SUBTITLE_ARCADIA_STR_ATTACKING33": "^2Střelec Strykeru: ^7Rozumím, zahajuji palbu.", + "SUBTITLE_ARCADIA_STR_SOLIDCOPYENG34": "^2Střelec Strykeru: ^7Rozumím. Zaměřuji cíl.", + "SUBTITLE_ARCADIA_STR_HAVEALOCK35": "^2Střelec Strykeru: ^7Rozumím, máme zaměřeno. Pálím na dům.", + "SUBTITLE_ARCADIA_STR_BADGERONECOPIES36": "^2Střelec Strykeru: ^7Badger Jedna rozumí, pálím na dům.", + "SUBTITLE_ARCADIA_STR_ATTACKINGVEHICLE37": "^2Střelec Strykeru: ^7Rozumím, střílím na vůz.", + "SUBTITLE_ARCADIA_STR_ENGAGINGINFANTRY38": "^2Střelec Strykeru: ^7Rozumím. Střílím na nepřátele.", + "SUBTITLE_ARCADIA_STR_ENGAGINGVEHICLE39": "^2Střelec Strykeru: ^7Rozumím. Střílím na vůz.", + "SUBTITLE_ARCADIA_STR_APARTMENTOFFICE310": "^2Střelec Strykeru: ^7Badger Jedna rozumí, střílím na kancelář.", + "SUBTITLE_ARCADIA_STR_SECURITYSTATION311": "^2Střelec Strykeru: ^7Rozumím, útočím na cíle v bezpečnostní stanici.", + "SUBTITLE_ARCADIA_STR_CHECKPOINT312": "^2Střelec Strykeru: ^7Potvrzuji, střílím na nepřátele v kontrolním bodě.", + "SUBTITLE_ARCADIA_STR_ENGYELLOWHOUSE313": "^2Střelec Strykeru: ^7Badger Jedna střílí na žlutý dům. ", + "SUBTITLE_ARCADIA_STR_TARGGREYHOUSE314": "^2Střelec Strykeru: ^7Rozumím. Zaměřují jednotky u šedého domů. ", + "SUBTITLE_ARCADIA_STR_ENGFIRETRUCK315": "^2Střelec Strykeru: ^7Rozumím, střílím na jednotky nedaleko dodávky. ", + "SUBTITLE_ARCADIA_STR_CONFPOLICECAR316": "^2Střelec Strykeru: ^7Potvrzuji, pálím na cíle u policejního auta. ", + "SUBTITLE_ARCADIA_STR_ENGCHOPPER317": "^2Střelec Strykeru: ^7Rozumím. Střílím na vrtulník. ", + "SUBTITLE_ARCADIA_STR_TARGDESTROYED41": "^2Střelec Strykeru: ^7Badger Jedna Hunter Dvojce, cíle zničeny.", + "SUBTITLE_ARCADIA_STR_AREASUPPRESSED42": "^2Střelec Strykeru: ^7Badger Jedna Hunter Dvojce, oblast vyčištěna.", + "SUBTITLE_ARCADIA_STR_TASUPPRESSED43": "^2Střelec Strykeru: ^7Badger Jedna Hunter Dvojce, oblast vyčištěna.", + "SUBTITLE_ARCADIA_STR_UHNEGATIVE51": "^2Střelec Strykeru: ^7Uh, negativní, ten cíl je mimo dosah, přepínám.", + "SUBTITLE_ARCADIA_STR_INVALIDTARGET62": "^2Střelec Strykeru: ^7Negativní, špatně označený cíl.", + "SUBTITLE_ARCADIA_STR_OUTTARANGE63": "^2Střelec Strykeru: ^7Negativní, cíl je mimo dosah!", + "SUBTITLE_ARCADIA_STR_OUTOFRANGE64": "^2Střelec Strykeru: ^7Cíl je mimo dosah.", + "SUBTITLE_ARCADIA_STR_WEREROLLIN71": "^2Střelec Strykeru: ^7Zůstaňte stranou, jdeme na to.", + "SUBTITLE_ARCADIA_STR_STANDCLEAR72": "^2Střelec Strykeru: ^7Pokračujeme dál. Zůstaňte stranou.", + "SUBTITLE_ARCADIA_STR_OSCARMIKE73": "^2Střelec Strykeru: ^7Všem pozemním jednotkám, zůstaňte stranou. Badger Jedna je oscar mike. ", + "SUBTITLE_ARCADIA_STR_ROLLING74": "^2Střelec Strykeru: ^7Honey Badger pokračuje v jízdě. Jděte z cesty.", + "SUBTITLE_ARCADIA_STR_STEPASIDE75": "^2Střelec Strykeru: ^7Ustupte, jedem.", + "SUBTITLE_ARCADIA_FLY_GETRUNOVER76": "^2Sgt. Foley: ^7Ramirezi! Přejedou tě! Zmiz jim z cesty!", + "SUBTITLE_ARCADIA_CPD_GETOUTTA77": "^2Des. Dunn: ^7Ramirezi! Honey Badger jede za tebou! Odkliď tu svou prdel někam pryč!", + "SUBTITLE_ARCADIA_CPD_GETOUTTA77_1": "^2Des. Dunn: ^7Ramirezi! Honey Badger jede za tebou! Zmiz z cesty!", + "SUBTITLE_ARCADIA_CPD_GETOUTTA77_3": "^2Des. Dunn: ^7Ramirezi! Honey Badger jede za tebou! Zmiz sakra z cesty!", + "SUBTITLE_ARCADIA_STR_HOLDINGPOSITION81": "^2Střelec Strykeru: ^7Badger Jedna drží pozici.", + "SUBTITLE_ARCADIA_STR_RPGFIRE91": "^2Střelec Strykeru: ^7Hunter Dva-Jedna Actual, tady Badger Jedna! Náš protiraketový systém už nezvládne další palbu RPG, potřebujeme abyste nás jich zbavili, rozumíte, přepínám?", + "SUBTITLE_ARCADIA_FLY_WEREONIT92": "^2Sgt. Foley: ^7Rozumíme Badger Jedna, jdeme na to! Přepínám!", + "SUBTITLE_ARCADIA_FLY_PROTECTSTRYKER93": "^2Sgt. Foley: ^7Jednotko! Chraňte Stryker! Dávejte pozor na pěšáky s RPG!", + "SUBTITLE_ARCADIA_FLY_WATCHFORRPGS94": "^2Sgt. Foley: ^7Jednotko! Zaměřují Stryker! Dávejte pozor na RPG!", + "SUBTITLE_ARCADIA_FLY_LOSTBADGERONE105": "^2Sgt. Foley: ^7Všem Hunter jednotkám, právě jsme ztratili Badger Jedna. Stryker není dostupný, Opakují, Stryker je nedostupný. Musíte to zvládnout s tím co máte. Konec.", + "SUBTITLE_ARCADIA_FLY_EVERYONEUP111": "^2Sgt. Foley: ^7Všichni pohyb!", + "SUBTITLE_ARCADIA_FLY_MOVEUP112": "^2Sgt. Foley: ^7Pohyb!", + "SUBTITLE_ARCADIA_CPD_MOVEUP113": "^2Des. Dunn: ^7Pohyb!", + "SUBTITLE_ARCADIA_CPD_LETSGO114": "^2Des. Dunn: ^7Jdeme, jdeme!", + "SUBTITLE_ARCADIA_FLY_SENTRYGUNS121": "^2Sgt. Foley: ^7Jednotko, sejměte ty zbraně!", + "SUBTITLE_ARCADIA_FLY_TAKEOUTSGUN122": "^2Sgt. Foley: ^7Sejmi tu zbraň!", + "SUBTITLE_ARCADIA_FLY_SUPPRESSINGFIRE131": "^2Sgt. Foley: ^7Jednotko, spusťte podpůrnou palbu na ten dům!", + "SUBTITLE_ARCADIA_FLY_CONCENTRATEFIRE132": "^2Sgt. Foley: ^7Jednotko, soustřeďte palbu na ten dům!", + "SUBTITLE_ARCADIA_FLY_YELLOWHOUSE133": "^2Sgt. Foley: ^7Máme nepřátele ve žlutém domě!", + "SUBTITLE_ARCADIA_CPD_GREYHOUSE134": "^2Des. Dunn: ^7Nepřátele v šedém domě!", + "SUBTITLE_ARCADIA_FLY_GREYHOUSE135": "^2Sgt. Foley: ^7Jednotko, máme nepřátele v šedém domě! Sejměte je!", + "SUBTITLE_ARCADIA_CPD_APARTMENTS136": "^2Des. Dunn: ^7Nepřátelé u bytových jednotek!", + "SUBTITLE_ARCADIA_FLY_APARTMENTS137": "^2Sgt. Foley: ^7Rozumím, nepřátelé u bytových jednotek, sejměte je!", + "SUBTITLE_ARCADIA_FLY_OFFSTREETS138": "^2Sgt. Foley: ^7Zmizte z ulic, použijte domy ke krytí!", + "SUBTITLE_ARCADIA_FLY_FLANKTHRUHOUSES139": "^2Sgt. Foley: ^7Obejděte je přes domy! Běžte!", + "SUBTITLE_ARCADIA_FLY_MOVETHRUHOUSES1310": "^2Sgt. Foley: ^7Jednotko, pokračujte přes domy, jdeme, jdeme!", + "SUBTITLE_ARCADIA_STR_THANKS1311": "^2Střelec Strykeru: ^7Díky za pomoc Hunter Dva-Jedna. ", + "SUBTITLE_ARCADIA_STR_THANKS1312": "^2Střelec Strykeru: ^7Hezká práce Hunter Dva-Jedna. Díky za pomoc. ", + "SUBTITLE_ARCADIA_FLY_GETOFFSTREETS141": "^2Sgt. Foley: ^7Jděte z těch ulic!", + "SUBTITLE_ARCADIA_FLY_OUTTASTREETS142": "^2Sgt. Foley: ^7Zmizte z těch ulic!", + "SUBTITLE_ARCADIA_HQR_SITREP151": "^2Overlord: ^7Hunter Dva-Jedna-Actual, tady Overlord. Dejte mi hlášení, přepínám.", + "SUBTITLE_ARCADIA_FLY_INTOARCADIA152": "^2Sgt. Foley: ^7Právě jsme projeli blokádou v bodě Lima. Ted míříme do Arcadie, přepínám.", + "SUBTITLE_ARCADIA_HQR_NEWORDERS153": "^2Overlord: ^7Rozumím. Mám pro vás nové rozkazy. Jde to rovnou z velitelství, přepínám.", + "SUBTITLE_ARCADIA_FLY_SOLIDCOPY154": "^2Sgt. Foley: ^7Rozumím Overlord, pošlete to.", + "SUBTITLE_ARCADIA_HQR_DIVERTTO4677155": "^2Overlord: ^7Po zničení triple-A se odkloníte na 4677 Brookmere Road.", + "SUBTITLE_ARCADIA_FLY_DIVERTTO4677156": "^2Sgt. Foley: ^7Rozumím Overlord. Až zničíme zbraně, odkloníme se na 4677 Brookmere Road. Rozumím.", + "SUBTITLE_ARCADIA_HQR_CHECKBACK157": "^2Overlord: ^7Kontaktujte mě až dokončíte svůj úkol. Overlord přepíná.", + "SUBTITLE_ARCADIA_FLY_LASERDES161": "^2Sgt. Foley: ^7Ramirezi, použij svůj laserový označovač na ty vozy!", + "SUBTITLE_ARCADIA_FLY_CALLARTILLERY162": "^2Sgt. Foley: ^7Ramirezi, zavolej na ty vozidla artilerii! Použij označovač!", + "SUBTITLE_ARCADIA_ART_MISSIONREC163": "^2Dělostřelecká baterie: ^7Požadavek obdržen, zahajujeme palbu.", + "SUBTITLE_ARCADIA_ART_CONFIRMED164": "^2Dělostřelecká baterie: ^7Souřadnice potvrzeny. Střílim!", + "SUBTITLE_#ARCADIA_ART_INVALIDTARGET165": "^2Dělostřelecká baterie: ^7Negativní, to není platný cíl, přepínám.", + "SUBTITLE_#ARCADIA_ART_INVALIDCOORDINATES166": "^2Dělostřelecká baterie: ^7Negativní, špatně souřadnice, přepínám.", + "SUBTITLE_ARCADIA_FLY_GOLFCOURSE167": "^2Sgt. Foley: ^7Ramirezi, použij označovač na ty vozidla na golfovém hřišti!", + "SUBTITLE_ARCADIA_FLY_ONEMORETOGO168": "^2Sgt. Foley: ^7Hezká práce Ramirezi, zbývá jeden.", + "SUBTITLE_ARCADIA_FLY_HEADINGTO4677171": "^2Sgt. Foley: ^7Overlord, tady Hunter Dva-Jedna-Actual. Triple-A je zničen. Míříme na 4677 Brookmere Road. ", + "SUBTITLE_ARCADIA_FLY_LOOKINGFOR172": "^2Sgt. Foley: ^7Mám otázku - co přesně hledáme, přepínám?", + "SUBTITLE_ARCADIA_SHP_GENSHEP173": "^2Shepherd: ^7Seržante Foley, tady generál Shepherd.", + "SUBTITLE_ARCADIA_SHP_PANICROOM174": "^2Shepherd: ^7Vaším úkolem je vyzvednout velmi cennou osobu z úkrytu v druhém patře toho domu.", + "SUBTITLE_ARCADIA_FLY_YESSIR175": "^2Sgt. Foley: ^7Ano pane!", + "SUBTITLE_ARCADIA_SHP_PHOENIX176": "^2Shepherd: ^7Bude vás čekat. Znamení je „Icepick“, odpověď je „Phoenix“.", + "SUBTITLE_ARCADIA_SHP_REPORTBACK177": "^2Shepherd: ^7Dostaňte ho odtud a hlaste se Overlorde. Shepherd přepíná.", + "SUBTITLE_ARCADIA_FLY_HEARDTHEMAN178": "^2Sgt. Foley: ^7Dobrá, slyšeli jste ho - 4677 Brookmere Road. Pohyb!", + "SUBTITLE_ARCADIA_FLY_ICEPICK1181": "^2Sgt. Foley: ^7Icepick.", + "SUBTITLE_ARCADIA_FLY_ICEPICK2182": "^2Sgt. Foley: ^7Icepick!", + "SUBTITLE_ARCADIA_FLY_NOTRIGHT183": "^2Sgt. Foley: ^7Něco tu není v pořádku...Zkontroluj to tam - pohyb!", + "SUBTITLE_ARCADIA_FLY_GETTHATBRIEFCASE184": "^2Sgt. Foley: ^7Ramirezi, vezmi ten kufřík...co z něj zbylo.", + "SUBTITLE_ARCADIA_CPD_CHECKOUTTATS185": "^2Des. Dunn: ^7Seržo, podívejte na to tetování. To není obyčejný voják, hmmmm?", + "SUBTITLE_ARCADIA_FLY_PHOTOSFORG2186": "^2Sgt. Foley: ^7Hmmmm. Típni pár fotek pro G-2 a zkontroluj těla.", + "SUBTITLE_ARCADIA_CPD_HUAH187": "^2Des. Dunn: ^7Hmmmm.", + "SUBTITLE_ARCADIA_FLY_HVIISDEAD188": "^2Sgt. Foley: ^7Overlord, tohle místo je hrobka. HVI je mrtev. Vypadá to, že jsme po něm nešli jen my.", + "SUBTITLE_ARCADIA_FLY_OVERLORDHVI1814": "^2Sgt. Foley: ^7Overlord, HVI je mrtev.", + "SUBTITLE_ARCADIA_FLY_NOTGOINGTOLIKE1815": "^2Sgt. Foley: ^7To se Shepherdovi nebude líbit.", + "SUBTITLE_ARCADIA_FLY_INTELOFFBODY189": "^2Sgt. Foley: ^7Z toho těla ale máme nějaké informace. Tohle se Shepherdovi nebude líbit.", + "SUBTITLE_ARCADIA_HQR_GETINTELTOCP1810": "^2Overlord: ^7Rozumím. Dostaňte to info zpět do CP. Overlord přepíná.", + "SUBTITLE_ARCADIA_FLY_BREAKSOVER1811": "^2Sgt. Foley: ^7Dobrá, konec přestávky! Pojďme sakra odtud.", + "SUBTITLE_ARCADIA_FLY_NOSIGN1812": "^2Sgt. Foley: ^7Hmmm. Žádná známka násilí...", + "SUBTITLE_BYARD_PRI_WIPEOUTUS11": "^2Kapitán Price: ^7Soape! Shepherd se snaží dostat nás i Makarova najednou! Jdi na západ do bodu Bravo! Nikomu nevěř!", + "SUBTITLE_BYARD_PRI_BACKUPPLAN12": "^2Kapitán Price: ^7Jdi na to shromaždiště! Běž! Běž! Běž!", + "SUBTITLE_BYARD_PRI_LZISHOT14": "^2Kapitán Price: ^7Nikolaii! Tady Price! Nelze tu přistát, opakuji nelze tu přistát!", + "SUBTITLE_BYARD_NKL_ONTHEWAY16": "^2Nikolai: ^7Dobře, Kapitáne Pricei, Jsem na cestě! Zatím se to tam snažte dostat pod kontrolu, dobře?", + "SUBTITLE_BYARD_PRI_SHARPISH17": "^2Kapitán Price: ^7Cokoliv řekneš Nikolaii! Jen se sem rychle dostaň!", + "SUBTITLE_BYARD_PRI_GETTRANSPORT21": "^2Kapitán Price: ^7Soape! Seženu transport! Jdi západně k ranveji!", + "SUBTITLE_BYARD_PRI_HEADNORTH22": "^2Kapitán Price: ^7Soape! Neuvízni tam! Směřuj západně k ranveji!", + "SUBTITLE_BYARD_PRI_RADIOTRAFFIC31": "^2Kapitán Price: ^7Soape, nech Makarovovy a Shepherdovy muže pozabíjet se navzájem.", + "SUBTITLE_BYARD_PRI_CONTACTMAKAROV32": "^2Kapitán Price: ^7Můžeme použít jejich kanály a napíchnout se na jejich rádiový přenos. Zkusím kontaktovat Makarova.", + "SUBTITLE_BYARD_PRI_WARHERO41": "^2Kapitán Price: ^7Makarove, tady Price. Shepherd je teď válečný hrdina. Má na vás teď spoustu důkazů a volnou ruku.", + "SUBTITLE_BYARD_PRI_TAKECAREOFREST42": "^2Kapitán Price: ^7Dej mi co máš na Shepherda, a já se postarám o zbytek.", + "SUBTITLE_BYARD_PRI_ONTHISCHANNEL43": "^2Kapitán Price: ^7Makarove, vím že mě slyšíš.", + "SUBTITLE_BYARD_PRI_LASTAWEEK44": "^2Kapitán Price: ^7Ty i já víme že nevydržíš víc jak týden.", + "SUBTITLE_BYARD_MKV_NEITHERWILLYOU45": "^1Makarov: ^7Ani ty ne.", + "SUBTITLE_BYARD_PRI_MYFRIEND46": "^2Kapitán Price: ^7Makarove...znáš to staré přísloví...nepřítel mého nepřítele je můj přítel?", + "SUBTITLE_BYARD_PRI_MYFRIEND247": "^2Kapitán Price: ^7Makarove...znáš to staré přísloví...„nepřítel mého nepřítele je můj přítel“?", + "SUBTITLE_BYARD_MKV_CUTSBOTHWAYS48": "^1Makarov: ^7Prici, jednoho dne zjistíš že to má svůj rub i líc.", + "SUBTITLE_BYARD_MKV_HOTELBRAVO49": "^1Makarov: ^7Shepherd využívá sektor Hotel Bravo. Víš kde to je. Uvidíme se v pekle.", + "SUBTITLE_BYARD_PRI_MYREGARDS410": "^2Kapitán Price: ^7Už se na to těším. A jestli se tam dostaneš první, pozdravuj Zakhaeva.", + "SUBTITLE_BYARD_PRI_WHEREAREYOU51": "^2Kapitán Price: ^7Nikolaii, kde ksakru jsi?", + "SUBTITLE_BYARD_NKL_SANDSTORMS52": "^2Nikolai: ^7Pouštní bouře u Kandaháru kapitáne Pricei. Musím letět kolem. Nedostávám zaplaceno tolik, abych mohl zničit letadlo.", + "SUBTITLE_BYARD_NKL_UNSAFETOLAND61": "^2Nikolai: ^7Pricei, jsem u vrakoviště. Vidím, že to tam nemáte pod kontrolou. Přistát tam je nebezpečné. Vypadá to, jako když sem byl v Afghánistánu já se Sověty!", + "SUBTITLE_BYARD_PRI_LANDTHEPLANE62": "^2Kapitán Price: ^7Nikolaii! Zmlkni a přistaň sakra! Jsme na cestě!", + "SUBTITLE_BYARD_PRI_GETTOPLANE71": "^2Kapitán Price: ^7Soape! Pospěš si! Musíme se dostat do Nikolaiova letadla! Běž západně!", + "SUBTITLE_BYARD_PRI_MUCHTIME72": "^2Kapitán Price: ^7Soape! Nemáme moc času! Nikolai tady na nás nebude čekat! Pospěš si!", + "SUBTITLE_BYARD_PRI_FOUDNTRANSPORT81": "^2Kapitán Price: ^7Soape! Našel jsem transport! Běž západně! Sejdeme se po cestě!", + "SUBTITLE_BYARD_PRI_GETINJEEP91": "^2Kapitán Price: ^7Soape! Nastup!", + "SUBTITLE_BYARD_PRI_WEARELEAVING92": "^2Kapitán Price: ^7Soape! Odjíždíme! Nastup!", + "SUBTITLE_BYARD_NKL_ONEMINUTE93": "^2Nikolai: ^7Kapitáne Pricei, Za minutu vzlétám! Jestli odtud chcete, tak si pospěšte!", + "SUBTITLE_BYARD_PRI_CONTACT12101": "^2Kapitán Price: ^7Kontakt, 12. hodina!", + "SUBTITLE_BYARD_PRI_CONTACTAHEAD102": "^2Kapitán Price: ^7Kontakt, přímo před námi!", + "SUBTITLE_BYARD_PRI_BEHINDUS103": "^2Kapitán Price: ^7Za námi!", + "SUBTITLE_BYARD_PRI_ONOUR6104": "^2Kapitán Price: ^7Jsou na šesté!", + "SUBTITLE_BYARD_PRI_TOTHERIGHT105": "^2Kapitán Price: ^7Vpravo!", + "SUBTITLE_BYARD_PRI_RIGHTSIDE106": "^2Kapitán Price: ^7Napravo! Napravo!", + "SUBTITLE_BYARD_PRI_TOTHELEFT107": "^2Kapitán Price: ^7Vlevo! Vlevo!", + "SUBTITLE_BYARD_PRI_ONTHELEFT108": "^2Kapitán Price: ^7Jsou vlevo!", + "SUBTITLE_BYARD_PRI_VEHICLESAT12109": "^2Kapitán Price: ^7Vozidla na 12. hodině!", + "SUBTITLE_BYARD_PRI_VEHICLESON61010": "^2Kapitán Price: ^7Vozidla na šesté!", + "SUBTITLE_BYARD_PRI_THEDRIVERS1011": "^2Kapitán Price: ^7Sejmi toho střelce!", + "SUBTITLE_BYARD_PRI_HANGON111": "^2Kapitán Price: ^7Drž se!", + "SUBTITLE_BYARD_PRI_HOLDON112": "^2Kapitán Price: ^7Vydrž!", + "SUBTITLE_BYARD_PRI_TAKEWHEEL123": "^2Kapitán Price: ^7Soape! Je po Rookovi! Chytni volant!", + "SUBTITLE_BYARD_PRI_AIMFORRAMP124": "^2Kapitán Price: ^7Jeď k rampě!", + "SUBTITLE_CLIFF_PRI_BREAKSOVER11": "^2Kapitán MacTavish: ^7Konec přestávky, Roachi. Jdeme.", + "SUBTITLE_CLIFF_PRI_SPOTME12": "^2Kapitán MacTavish: ^7Počkej tady a dívej se. Vyraz až řeknu.", + "SUBTITLE_CLIFF_PRI_ICEISGOOD13": "^2Kapitán MacTavish: ^7Dobrá, led je dobrý. Pojď za mnou.", + "SUBTITLE_CLIFF_PRI_THEFARSIDE14": "^2Kapitán MacTavish: ^7Hodně štěstí příteli. Uvidíme se na druhém konci.", + "SUBTITLE_CLIFF_PRI_HOLDON16": "^2Kapitán MacTavish: ^7Vydrž! Nepouštěj se!", + "SUBTITLE_N/A17": "^2Kapitán MacTavish: ^7(Námaha hráče vytáhnout)", + "SUBTITLE_CLIFF_PRI_CHECKSENSOR21": "^2Kapitán MacTavish: ^7Roachi, zkontroluj si senzor tepu.", + "SUBTITLE_CLIFF_PRI_SEEME22": "^2Kapitán MacTavish: ^7Měl bys mě vidět na displeji.", + "SUBTITLE_CLIFF_PRI_BLUEDOT23": "^2Kapitán MacTavish: ^7Ta modrá tečka jsem já.", + "SUBTITLE_CLIFF_PRI_WHITEDOTS24": "^2Kapitán MacTavish: ^7Nerozpoznatelné cíle budou zobrazeny jako bílé tečky.", + "SUBTITLE_CLIFF_PRI_GETOVERHERE31": "^2Kapitán MacTavish: ^7Pojď sem.", + "SUBTITLE_CLIFF_PRI_NOIDEA32": "^2Kapitán MacTavish: ^7Roachi, ti šašci vůbec netuší že jsme tady. Sejmeme je snadno a potichu.", + "SUBTITLE_CLIFF_PRI_YOUTAKELEFT33": "^2Kapitán MacTavish: ^7Bereš si toho vlevo.", + "SUBTITLE_CLIFF_PRI_ONTHREE34": "^2Kapitán MacTavish: ^7Na tři.", + "SUBTITLE_CLIFF_PRI_ONE35": "^2Kapitán MacTavish: ^7Raz...", + "SUBTITLE_CLIFF_PRI_TWO36": "^2Kapitán MacTavish: ^7Dva...", + "SUBTITLE_CLIFF_PRI_THREE37": "^2Kapitán MacTavish: ^7Tři.", + "SUBTITLE_CLIFF_PRI_NICELYDONE38": "^2Kapitán MacTavish: ^7Hezky.", + "SUBTITLE_CLIFF_PRI_NOTSNEAKY41": "^2Kapitán MacTavish: ^7To nebylo moc chytré, Roachi", + "SUBTITLE_CLIFF_PRI_DONTALERTTHEM42": "^2Kapitán MacTavish: ^7Nemusíme na sebe zbytečně upozorňovat.", + "SUBTITLE_CLIFF_PRI_SILENCERS43": "^2Kapitán MacTavish: ^7Ty tlumiče jsme si nebrali bezdůvodně.", + "SUBTITLE_CLIFF_PRI_SOMEWORK44": "^2Kapitán MacTavish: ^7Co kdybys mi taky trochu pomohl.", + "SUBTITLE_CLIFF_PRI_DOEVERYTHING45": "^2Kapitán MacTavish: ^7To mám dělat všechno sám? ", + "SUBTITLE_CLIFF_PRI_SLOPPY46": "^2Kapitán MacTavish: ^7To bylo slabý.", + "SUBTITLE_CLIFF_PRI_ALERTEDTHEM47": "^2Kapitán MacTavish: ^7Upozornil si je.", + "SUBTITLE_CLIFF_PRI_ATTRACTATTN51": "^2Kapitán MacTavish: ^7Dávej si pozor co si bereš za zbraň, Roachi. Netlumené zbraně zbytečně přitáhnou pozornost.", + "SUBTITLE_CLIFF_PRI_SAMEPLAN52": "^2Kapitán MacTavish: ^7Stejný plán.", + "SUBTITLE_CLIFF_PRI_NICEWORK53": "^2Kapitán MacTavish: ^7Dobrá práce.", + "SUBTITLE_CLIFF_PRI_STORMSBREWING61": "^2Kapitán MacTavish: ^7Bouře zesiluje.", + "SUBTITLE_CLIFF_PRI_SPLITUP62": "^2Kapitán MacTavish: ^7Rozdělíme se. Já použiju termální vidění a dohlídnu na tebe z té vyvýšeniny.", + "SUBTITLE_CLIFF_PRI_COVEROFSTORM63": "^2Kapitán MacTavish: ^7Využij tu bouři jako krytí při cestě k základně.", + "SUBTITLE_CLIFF_PRI_LIKEAGHOST64": "^2Kapitán MacTavish: ^7Budeš jako duch v bouři, takže stráže tě nespoznají, dokud nebudeš příliš blízko.", + "SUBTITLE_CLIFF_PRI_KEEPEYEONHEART65": "^2Kapitán MacTavish: ^7Občas se podívej na senzor tepu, hodně štěstí.", + "SUBTITLE_CLIFF_PRI_KILLFIRM_PLYR71": "^2Kapitán MacTavish: ^7Pěkná trefa.", + "SUBTITLE_CLIFF_PRI_KILLFIRM_PLYR72": "^2Kapitán MacTavish: ^7Pěkně.", + "SUBTITLE_CLIFF_PRI_KILLFIRM_PLYR73": "^2Kapitán MacTavish: ^7Máš ho.", + "SUBTITLE_CLIFF_PRI_KILLFIRM_PLYR74": "^2Kapitán MacTavish: ^7Hezká trefa.", + "SUBTITLE_CLIFF_PRI_KILLFIRM_PLYR75": "^2Kapitán MacTavish: ^7Hezky.", + "SUBTITLE_CLIFF_PRI_KILLFIRM_PLYR76": "^2Kapitán MacTavish: ^7Ujde to.", + "SUBTITLE_CLIFF_PRI_TAKETHISONE81": "^2Kapitán MacTavish: ^7Tohohle si vezmu.", + "SUBTITLE_CLIFF_PRI_HESMINE82": "^2Kapitán MacTavish: ^7Je můj.", + "SUBTITLE_CLIFF_PRI_NEVERMIND83": "^2Kapitán MacTavish: ^7Zapomeň na to.", + "SUBTITLE_CLIFF_PRI_MAYBENOT84": "^2Kapitán MacTavish: ^7Nebo taky možná ne.", + "SUBTITLE_CLIFF_PRI_KILLFIRM91": "^2Kapitán MacTavish: ^7Je po něm.", + "SUBTITLE_CLIFF_PRI_KILLFIRM92": "^2Kapitán MacTavish: ^7Dobrou noc.", + "SUBTITLE_CLIFF_PRI_IVEGOTHIM93": "^2Kapitán MacTavish: ^7Mám ho.", + "SUBTITLE_CLIFF_PRI_ONESMINE94": "^2Kapitán MacTavish: ^7Tenhle je můj.", + "SUBTITLE_CLIFF_PRI_ILLTAKEHIM95": "^2Kapitán MacTavish: ^7Vezmu si ho.", + "SUBTITLE_CLIFF_PRI_KILLFIRM96": "^2Kapitán MacTavish: ^7Jednoho mám.", + "SUBTITLE_CLIFF_PRI_KILLFIRM97": "^2Kapitán MacTavish: ^7Cíl zneškodněn.", + "SUBTITLE_CLIFF_PRI_KILLFIRM98": "^2Kapitán MacTavish: ^7Je po něm.", + "SUBTITLE_CLIFF_PRI_KILLFIRM99": "^2Kapitán MacTavish: ^7Mám ho.", + "SUBTITLE_CLIFF_PRI_KEEPQUIET101": "^2Kapitán MacTavish: ^7Vypadá to, že našli tělo, ale tebe si nevšimli. Buď potichu.", + "SUBTITLE_CLIFF_PRI_STAYCALM102": "^2Kapitán MacTavish: ^7Roachi - našli tělo, ale ještě po tobě nejdou. Zůstaň v klidu.", + "SUBTITLE_CLIFF_PRI_FOUNDABODY103": "^2Kapitán MacTavish: ^7Vydrž - našli jenom tělo. Nevědí kde jsi.", + "SUBTITLE_CLIFF_PRI_SIGHTALERTEDONE111": "^2Kapitán MacTavish: ^7Zmiz jim z dohledu - jednoho si na sebe upozornil!", + "SUBTITLE_CLIFF_PRI_SIGHTBEENSPOTTED112": "^2Kapitán MacTavish: ^7Zmiz jim z dohledu - uviděli tě!", + "SUBTITLE_CLIFF_PRI_ONESEENYOU113": "^2Kapitán MacTavish: ^7Jeden z nich tě viděl, zmiz jim z očí!", + "SUBTITLE_CLIFF_PRI_HIDEALERTED114": "^2Kapitán MacTavish: ^7Skryj se! Upozornil jsi na sebe stráž.", + "SUBTITLE_CLIFF_PRI_OUTOFSIGHT115": "^2Kapitán MacTavish: ^7Zmiz jim z oči - upozornil jsi na sebe stráže.", + "SUBTITLE_CLIFF_PRI_TAKECOVER116": "^2Kapitán MacTavish: ^7Kryj se! Jdou po tobě!", + "SUBTITLE_CLIFF_PRI_BEENSPOTTED117": "^2Kapitán MacTavish: ^7Kryj se, všimli si tě!", + "SUBTITLE_CLIFF_PRI_FOUNDYOU118": "^2Kapitán MacTavish: ^7Běž odtud, našli tě!", + "SUBTITLE_CLIFF_PRI_MULTIPLEDIRECTIONS119": "^2Kapitán MacTavish: ^7Pozor! Jdou k tobě z více stran!", + "SUBTITLE_CLIFF_PRI_TANGOLEFT121": "^2Kapitán MacTavish: ^7Vlevo.", + "SUBTITLE_CLIFF_PRI_HOSTILERIGHT122": "^2Kapitán MacTavish: ^7Nepřítel vpravo.", + "SUBTITLE_CLIFF_PRI_TARGETLEFT123": "^2Kapitán MacTavish: ^7Cíl vlevo.", + "SUBTITLE_CLIFF_PRI_TARGETRIGHT124": "^2Kapitán MacTavish: ^7Cíl vpravo.", + "SUBTITLE_CLIFF_PRI_TANGOSIX125": "^2Kapitán MacTavish: ^7Cíl na šesté.", + "SUBTITLE_CLIFF_PRI_TARGETBEHINDYOU126": "^2Kapitán MacTavish: ^7Cíl za tebou.", + "SUBTITLE_CLIFF_PRI_THEYGOINGBACK131": "^2Kapitán MacTavish: ^7Vracejí se na svoje místa.", + "SUBTITLE_CLIFF_PRI_YOURECLEAR132": "^2Kapitán MacTavish: ^7Čistý vzduch, vracejí se na svoje místa.", + "SUBTITLE_CLIFF_PRI_RESTHAVEGIVENUP133": "^2Kapitán MacTavish: ^7Zbytek to vzdal a vracejí se na svoje původní místa.", + "SUBTITLE_CLIFF_PRI_PRETTYSNEAKY141": "^2Kapitán MacTavish: ^7Žádné zabití, žádný poplach, skvěle Roachi.", + "SUBTITLE_CLIFF_PRI_TAPPEDCOMMS151": "^2Kapitán MacTavish: ^7Dobrá, dostal sem se na jejich linii.", + "SUBTITLE_CLIFF_PRI_YOUREIN_2152": "^2Kapitán MacTavish: ^7Jdi jihovýchodně a umísti C4 na palivovou stanici.", + "SUBTITLE_CLIFF_PRI_YOUREIN_3153": "^2Kapitán MacTavish: ^7Jestli něco nevyjde, budeme asi muset použít 'Plán B'.", + "SUBTITLE_CLIFF_PRI_NECORNER154": "^2Kapitán MacTavish: ^7Roachi, palivová stanice je blízko severovýchodního rohu ranveje.", + "SUBTITLE_CLIFF_PRI_SEARCHNTHEAST155": "^2Kapitán MacTavish: ^7Roachi - najdi v severovýchodní části ranveje palivovou stanici.", + "SUBTITLE_CLIFF_PRI_TRUCKCOMING161": "^2Kapitán MacTavish: ^7Přijíždí dodávka! Zmiz jim z dohledu.", + "SUBTITLE_CLIFF_PRI_TRUCKBACK162": "^2Kapitán MacTavish: ^7Vrací se.", + "SUBTITLE_CLIFF_PRI_TANGOSOUT163": "^2Kapitán MacTavish: ^7Vojáci právě vylezli z dodávky.", + "SUBTITLE_CLIFF_PRI_ANOTHERTRUCK164": "^2Kapitán MacTavish: ^7Přijíždí další dodávka.", + "SUBTITLE_CLIFF_PRI_TRUCKCOMING2165": "^2Kapitán MacTavish: ^7Přijíždí dodávka.", + "SUBTITLE_CLIFF_PRI_HEADSUP166": "^2Kapitán MacTavish: ^7Pozor, právě zastavila.", + "SUBTITLE_CLIFF_PRI_TRUCKCOMINGBACK167": "^2Kapitán MacTavish: ^7Ta dodávka se vrací.", + "SUBTITLE_CLIFF_PRI_TRUCKISCOMING168": "^2Kapitán MacTavish: ^7Přijíždí dodávka.", + "SUBTITLE_CLIFF_PRI_LOOKINGAROUND169": "^2Kapitán MacTavish: ^7Právě odtud vylezly čtyři stráže a rozhlížejí se kolem.", + "SUBTITLE_CLIFF_PRI_FLAMINGWRECK1610": "^2Kapitán MacTavish: ^7Bože, zajímalo by mě, jestli si všimnou hořícího vraku uprostřed silnice....", + "SUBTITLE_CLIFF_PRI_HOLDUP171": "^2Kapitán MacTavish: ^7Počkej.", + "SUBTITLE_CLIFF_PRI_ACTIVITYONRUNWAY172": "^2Kapitán MacTavish: ^7Vidím pohyb na ranveji.", + "SUBTITLE_CLIFF_PRI_FOOTMOBILES173": "^2Kapitán MacTavish: ^7Asi dvacet vojáků míří tvým směrem.", + "SUBTITLE_CLIFF_PRI_FUELINGSTATION174": "^2Kapitán MacTavish: ^7To je ta palivová stanice.", + "SUBTITLE_CLIFF_PRI_FOUNDIT175": "^2Kapitán MacTavish: ^7Našel jsi to.", + "SUBTITLE_CLIFF_PRI_GOBACK176": "^2Kapitán MacTavish: ^7Roachi, vrať se k té palivové stanici a děj tam C4.", + "SUBTITLE_CLIFF_PRI_RADIOTRAFFIC181": "^2Kapitán MacTavish: ^7Mám tu další rádiový signál ze satelitu. Počkej.", + "SUBTITLE_CLIFF_PRI_INFARHANGAR182": "^2Kapitán MacTavish: ^7Mám to. Vypadá to, že satelit je v hangáru na druhé straně.", + "SUBTITLE_CLIFF_PRI_OSCARMIKE183": "^2Kapitán MacTavish: ^7Sejdeme se tam. Oscar Mike. Přepínám.", + "SUBTITLE_CLIFF_PRI_GETTHEREASAP184": "^2Kapitán MacTavish: ^7Mířím k hangáru. Jdi tam.", + "SUBTITLE_CLIFF_PRI_BEHINDHANGARS185": "^2Kapitán MacTavish: ^7Roachi čekám za hangáry na jihozápadním konci ranveje.", + "SUBTITLE_CLIFF_PRI_MEETME186": "^2Kapitán MacTavish: ^7Roachi, sejdeme se za hangáry na jihozápadním konci ranveje.", + "SUBTITLE_CLIFF_PRI_AVOIDAREA191": "^2Kapitán MacTavish: ^7Kolem hangáru vidím spoustu tepelných stop, možná BMP. Vyhni se jim.", + "SUBTITLE_CLIFF_PRI_GETOUTOFTHERE192": "^2Kapitán MacTavish: ^7Ty BMP mají termální vidění! Zmiz odtud sakra!", + "SUBTITLE_CLIFF_PRI_SCENICROUTE201": "^2Kapitán MacTavish: ^7Přes vyhlídkovou cestu eh?", + "SUBTITLE_CLIFF_PRI_LETSGO202": "^2Kapitán MacTavish: ^7Pojďme.", + "SUBTITLE_CLIFF_PRI_BROUGHTFRIENDS203": "^2Kapitán MacTavish: ^7Přivedl sis s sebou přátele?", + "SUBTITLE_CLIFF_PRI_WATCHMYBACK211": "^2Kapitán MacTavish: ^7Kryj mi záda.", + "SUBTITLE_CLIFF_PRI_GOUPSTAIRS212": "^2Kapitán MacTavish: ^7Jdi nahoru a podívej se po tom ACS modulu.", + "SUBTITLE_CLIFF_PRI_DOWNLOADFILES213": "^2Kapitán MacTavish: ^7Roachi, jdi nahoru a sežeň ten ACS modul.", + "SUBTITLE_CLIFF_PRI_COMPROMISED221": "^2Kapitán MacTavish: ^7Roachi, mají mě! Buď v klidu a nestřílej.", + "SUBTITLE_CLIFF_PET_THISISPETROV222": "^1Major Petrov: ^7Tady Major Petrov! Vyjděte s rukama nad hlavou!", + "SUBTITLE_CLIFF_PET_CAPTUREDCOMRADE223": "^1Major Petrov: ^7Vzkaz nepřátelům, chytili jsme jednoho z vašich!", + "SUBTITLE_CLIFF_PET_SURRENDER224": "^1Major Petrov: ^7Víme, že jste nahoře! Vzdejte se a ušetříme vašeho přítele!", + "SUBTITLE_CLIFF_PET_WILLDIE225": "^1Major Petrov: ^7Jestli se nevzdáte, vás přítel zemře.", + "SUBTITLE_CLIFF_PET_HANDSUP226": "^1Major Petrov: ^7Vyjděte s rukama nad hlavou!", + "SUBTITLE_CLIFF_PET_VERYWELL227": "^1Major Petrov: ^7Dobře - dávám vám pět vteřin, než popravím vašeho přítele!", + "SUBTITLE_CLIFF_PET_FIVESECONDS228": "^1Major Petrov: ^7Máte na to pět vteřin!", + "SUBTITLE_CLIFF_PET_COUNTFIVE229": "^1Major Petrov: ^7Pět!", + "SUBTITLE_CLIFF_PET_COUNTFOUR2210": "^1Major Petrov: ^7Čtyři!", + "SUBTITLE_CLIFF_PET_COUNTTHREE2211": "^1Major Petrov: ^7Tři!", + "SUBTITLE_CLIFF_PET_COUNTTWO2212": "^1Major Petrov: ^7Dva!", + "SUBTITLE_CLIFF_PET_COUNTONE2213": "^1Major Petrov: ^7Jedna!", + "SUBTITLE_CLIFF_PRI_GOPLANB2214": "^2Kapitán MacTavish: ^7Roachi, přejdi k plánu B.", + "SUBTITLE_CLIFF_PRI_HUGTHEWALL231": "^2Kapitán MacTavish: ^7Drž se u zdi! Použijeme ty MiGy jako krytí a přejdeme přes plochu jihovýchodně!", + "SUBTITLE_CLIFF_PRI_FOLLOWMELETSGO232": "^2Kapitán MacTavish: ^7Roachi! Pojď za mnou! Honem!", + "SUBTITLE_CLIFF_PRI_RUNFORMIGEAST233": "^2Kapitán MacTavish: ^7Roachi! Běž východně k MiGu!", + "SUBTITLE_CLIFF_PRI_EASTGO234": "^2Kapitán MacTavish: ^7Východně, Roachi! Běž!", + "SUBTITLE_CLIFF_PRI_HEADFORMIG235": "^2Kapitán MacTavish: ^7Běž k tomu MiGu, kryju tě!", + "SUBTITLE_CLIFF_PRI_RUNTONEXTMIG236": "^2Kapitán MacTavish: ^7Běžím k tomu dalšímu MiGu! Kryj mě!", + "SUBTITLE_CLIFF_PRI_SNOWMOIBLES237": "^2Kapitán MacTavish: ^7Sněžné skůtry! Sejmi je!", + "SUBTITLE_CLIFF_PRI_MOVEUP238": "^2Kapitán MacTavish: ^7Kryju tě Roachi! Pohyb! Pohyb!", + "SUBTITLE_CLIFF_PRI_ALLRIGHT239": "^2Kapitán MacTavish: ^7Dobrá, jdeme!", + "SUBTITLE_CLIFF_PRI_COMETOME2310": "^2Kapitán MacTavish: ^7Budu tě krýt! Pojď sem!", + "SUBTITLE_CLIFF_PRI_MAKINGABREAK2311": "^2Kapitán MacTavish: ^7Kryj mě, utíkám!", + "SUBTITLE_CLIFF_PRI_HEADINGFORJEEPS2312": "^2Kapitán MacTavish: ^7Mířím k těm jeepům, kryj mě! ", + "SUBTITLE_CLIFF_PRI_MAKEABREAK2313": "^2Kapitán MacTavish: ^7Roachi! Příprav se a na můj povel vyběhni!", + "SUBTITLE_CLIFF_PRI_MORETANGOS2314": "^2Kapitán MacTavish: ^7Víc vojáků na šesté! Sejmi je!", + "SUBTITLE_CLIFF_PRI_SOUTHEASTCOVERED2315": "^2Kapitán MacTavish: ^7Roachi! Běž jihovýchodně! Kryju tě!", + "SUBTITLE_CLIFF_PRI_TAKESNOWMOBILE251": "^2Kapitán MacTavish: ^7Roachi, nasedni na ten skůtr! Pojďme sakra odtud!", + "SUBTITLE_CLIFF_PRI_SNOWMOBILELETSGO252": "^2Kapitán MacTavish: ^7Roachi! Nasedni na ten skůtr!", + "SUBTITLE_CLIFF_PRI_ENROUTE253": "^2Kapitán MacTavish: ^7Kilo Šest-Jedna, výchozí bod byl kompromitován! Jsme na cestě do záložní přistávací zóny na skůtrech! Čekejte nás tam!", + "SUBTITLE_CLIFF_HP1_SEEYOUATBRAVO254": "^2Pilot vrtulníků: ^7Bravo Šest, tady Kilo Šest-Jedna, rozumím, přepínám.", + "SUBTITLE_CLIFF_PRI_OUTRUNTHEM255": "^2Kapitán MacTavish: ^7Další vojáci za námi! Jen je předjeď! Jeď!", + "SUBTITLE_CLIFF_PRI_KEEPMOVING256": "^2Kapitán MacTavish: ^7Nezpomaluj! Pokračuj nebo seš mrtvej!", + "SUBTITLE_CLIFF_PRI_GOGOGO257": "^2Kapt. MacTavish: ^7Dělej! Dělej!", + "SUBTITLE_CLIFF_PRI_COMEONCOMEON258": "^2Kapitán MacTavish: ^7No tak! No tak!", + "SUBTITLE_CLIFF_HP1_STATUS259": "^2Pilot vrtulníků: ^7Bravo Šest, už nemáme moc paliva. Jak jste na tom?", + "SUBTITLE_CLIFF_PRI_ALMOSTTHERE2510": "^2Kapitán MacTavish: ^7Kilo Šest-Jedna, jsme pod palbou, ale už jsme skoro tam! Vydržte!", + "SUBTITLE_CLIFF_PRI_GONNAMAKEIT2511": "^2Kapitán MacTavish: ^7Zvládneme to! Jen vydrž! ", + "SUBTITLE_CLIFF_PRI_PINTHROTTLE2512": "^2Kapitán MacTavish: ^7Šlápni na to! Dělej!", + "SUBTITLE_CLIFF_PRI_HANGON22513": "^2Kapitán MacTavish: ^7Vydrž!", + "SUBTITLE_CLIFF_HP1_FUMES2514": "^2Pilot vrtulníků: ^7Bravo Šest vidíme vás. Pohněte těma zadkama na palubu!", + "SUBTITLE_CLIFF_PRI_THECHOPPER2515": "^2Kapitán MacTavish: ^7Támhle je ten vrtulník! Honem!", + "SUBTITLE_CLIFF_CRC_GOTACS261": "^2Velitel jednotky: ^7Dobrá, mají ACS! Letíme pryč!", + "SUBTITLE_CONT_PRI_FOUNDROACH12": "^2Kapitán Price: ^7Rozumím Soape. Našel jsem Roache. Vypadá to, že je v pořádku.", + "SUBTITLE_CONT_PRI_HEADNW13": "^2Kapitán Price: ^7Míříme severozápadně k ponorkové základně, přepínám.", + "SUBTITLE_CONT_CMT_FAREAST14": "^2Soap: ^7Rozumím. Zbytek týmu u Ghosta, dost daleko na východ.", + "SUBTITLE_CONT_PRI_PROCEED15": "^2Kapitán Price: ^7Řekni jim ať si s tou misí pospíší, seskupíme se hned jak to půjde.", + "SUBTITLE_CONT_PRI_FOUNDTRANSPORT16": "^2Kapitán Price: ^7Našel jsi nám nějaký odvoz?", + "SUBTITLE_CONT_CMT_WORKINGONIT17": "^2Soap: ^7Pracuju na tom. Přepínám.", + "SUBTITLE_CONT_PRI_OUTOFSIGHT21": "^2Kapitán Price: ^7Roachi, pojď za mnou a potichu.", + "SUBTITLE_CONT_PRI_30METERSFRONT22": "^2Kapitán Price: ^7Máme kontakt. Hlídka 30 metrů před námi.", + "SUBTITLE_CONT_PRI_FIVEMEN23": "^2Kapitán Price: ^75 mužů, samopaly, granáty a jeden německej ovčák.", + "SUBTITLE_CONT_CMT_HATEDOGS24": "^2Soap: ^7Psi. Nesnáším psy.", + "SUBTITLE_CONT_PRI_RUSSIANDOGS26": "^2Kapitán Price: ^7Tihle ruští psi jsou v porovnání s těmi v Připjati jako kočičky.", + "SUBTITLE_CONT_CMT_HAVEYOUBACK27": "^2Soap: ^7Jsem rád že jsi zpátky staříku.", + "SUBTITLE_CONT_PRI_ROGERTHAT228": "^2Kapitán Price: ^7Rozumím.", + "SUBTITLE_CONT_PRI_PICKOFFSTRAGGLERS29": "^2Kapitán Price: ^7Pojď potichu za nimi a opozdilce zneškodni.", + "SUBTITLE_CONT_PRI_DONTGETCLOSE31": "^2Kapitán Price: ^7Nechoď tak blízko.", + "SUBTITLE_CONT_PRI_PATIENCE32": "^2Kapitán Price: ^7Trpělivost...neudělej žádnou hloupost.", + "SUBTITLE_CONT_PRI_SAMETIME33": "^2Kapitán Price: ^7Musíme je dostat najednou.", + "SUBTITLE_CONT_PRI_WAITPOSITION34": "^2Kapitán Price: ^7Počkej až budu na místě.", + "SUBTITLE_CONT_PRI_WAITFORME35": "^2Kapitán Price: ^7Čekej na mě.", + "SUBTITLE_CONT_PRI_WHENYOUREREADY36": "^2Kapitán Price: ^7Jsem na místě - až budeš připraven, vystřel.", + "SUBTITLE_CONT_PRI_MOVEUP37": "^2Kapitán Price: ^7Pohyb.", + "SUBTITLE_CONT_PRI_MOVE38": "^2Kapitán Price: ^7Pojď. ", + "SUBTITLE_CONT_PRI_HIDEINWOODS41": "^2Kapitán Price: ^7Rychle! Schovej se mezi stromy! Upozornil si na nás!", + "SUBTITLE_CONT_PRI_GETINTOWOODS42": "^2Kapitán Price: ^7Mezi stromy! Kryj se!", + "SUBTITLE_CONT_PRI_THEYREALERTED43": "^2Kapitán Price: ^7Vědí o nás! Mezi stromy! Honem! ", + "SUBTITLE_CONT_PRI_ONTOUS51": "^2Kapitán Price: ^7Jdou po nás! Střílej!", + "SUBTITLE_CONT_PRI_WERESPOTTED52": "^2Kapitán Price: ^7Uviděli nás! Sejmi je!", + "SUBTITLE_CONT_PRI_GETUSKILLED53": "^2Kapitán Price: ^7Co to sakra bylo? Snažíš se nás zabít? ", + "SUBTITLE_CONT_PRI_THEWORDSTEALTH54": "^2Kapitán Price: ^7Znamená pro tebe něco slovo potichu? ", + "SUBTITLE_CONT_PRI_GIVEAWAYPOSITION55": "^2Kapitán Price: ^7Roachi neprozraď naši pozici. Bude to jenom těžší. ", + "SUBTITLE_CONT_PRI_LOWPROFILE56": "^2Kapitán Price: ^7Roachi, nemůžeme si dovolit prozradit jim naši pozici. Snaž se být potichu!", + "SUBTITLE_CONT_PRI_ARENTLOOKING61": "^2Kapitán Price: ^7Zneškodni ho, až se ostatní nebudou dívat.", + "SUBTITLE_CONT_PRI_YOURCHANCE62": "^2Kapitán Price: ^7Teď máš šanci. Sejmi jednoho z nich.", + "SUBTITLE_CONT_PRI_SPLITTINGUP63": "^2Kapitán Price: ^7Rozdělují se. Zneškodní ho. ", + "SUBTITLE_CONT_PRI_FORASMOKE64": "^2Kapitán Price: ^7Dva si šli zapálit. Vezmi si jednoho a já toho druhého.", + "SUBTITLE_CONT_PRI_TWOINWOODS65": "^2Kapitán Price: ^7Zneškodni ty dva v lese na druhé straně mostu.", + "SUBTITLE_CONT_PRI_IMREADY66": "^2Kapitán Price: ^7Jsem připraven. Dostaneme je všechny najednou.", + "SUBTITLE_CONT_PRI_BEAUTIFUL71": "^2Kapitán Price: ^7Pěkné.", + "SUBTITLE_CONT_PRI_GOODSHOT72": "^2Kapitán Price: ^7Dobrá trefa.", + "SUBTITLE_CONT_PRI_GOTONE73": "^2Kapitán Price: ^7Jednoho mám.", + "SUBTITLE_CONT_PRI_HESDOWN274": "^2Kapitán Price: ^7Je po něm.", + "SUBTITLE_CONT_PRI_TANGODOWN75": "^2Kapitán Price: ^7Nepřítel zasažen.", + "SUBTITLE_CONT_PRI_GOODNIGHT76": "^2Kapitán Price: ^7Dobrou noc.", + "SUBTITLE_CONT_PRI_TARGETELIMINATED77": "^2Kapitán Price: ^7Cíl zneškodněn.", + "SUBTITLE_CONT_PRI_TARGETDOWN78": "^2Kapitán Price: ^7Cíl zasažen.", + "SUBTITLE_CONT_PRI_NICELYDONE79": "^2Kapitán Price: ^7Pěkné.", + "SUBTITLE_CONT_PRI_WELLDONE710": "^2Kapitán Price: ^7Výborně.", + "SUBTITLE_CONT_PRI_GOOD711": "^2Kapitán Price: ^7Dobře", + "SUBTITLE_CONT_PRI_SEENBETTER712": "^2Kapitán Price: ^7Šlo to, ale viděl jsem lepší.", + "SUBTITLE_CONT_PRI_GOODWORK713": "^2Kapitán Price: ^7Dobrá práce.", + "SUBTITLE_CONT_PRI_IMPRESSIVE714": "^2Kapitán Price: ^7Skvěle.", + "SUBTITLE_CONT_PRI_YOURPARACHUTE81": "^2Kapitán Price: ^7Vypadá to, že tě viděli. Pojďme.", + "SUBTITLE_CONT_PRI_KEEPMOVING82": "^2Kapitán Price: ^7Pokračujme.", + "SUBTITLE_CONT_PRI_GETDOWN91": "^2Kapitán Price: ^7Přilétají vrtulníky! K zemi!", + "SUBTITLE_CONT_PRI_HUGTHEWALLS92": "^2Kapitán Price: ^7Ke zdi!", + "SUBTITLE_CONT_PRI_THATWASCLOSE101": "^2Kapitán Price: ^7To bylo těsně. Pojďme dál.", + "SUBTITLE_CONT_PRI_HENOTICED111": "^2Kapitán Price: ^7Všiml si toho! Skryj se!", + "SUBTITLE_CONT_PRI_GETOUTOFSIGHT112": "^2Kapitán Price: ^7Zmiz jim z dohledu! Ten jeden jde přímo sem! ", + "SUBTITLE_CONT_PRI_HIDEBEENALERTED113": "^2Kapitán Price: ^7Skryj se! Jeden si nás všiml!", + "SUBTITLE_CONT_PRI_HESALERTED114": "^2Kapitán Price: ^7Ví o nás! Skryj se!", + "SUBTITLE_CONT_PRI_FOUNDABODY121": "^2Kapitán Price: ^7Vypadá to, že našli tělo.", + "SUBTITLE_CONT_PRI_FOUNDABODY2122": "^2Kapitán Price: ^7Našli tělo.", + "SUBTITLE_CONT_PRI_DOGPATROL131": "^2Kapitán Price: ^7Psi.", + "SUBTITLE_CONT_PRI_3MANPATROL132": "^2Kapitán Price: ^7Tři hlídky před námi.", + "SUBTITLE_CONT_PRI_ALERTENEMIES133": "^2Kapitán Price: ^7Roachi, střelba bez tlumiče na nás ještě víc upozorní. ", + "SUBTITLE_CONT_PRI_LARGEPATROL12134": "^2Kapitán Price: ^7Větší skupinka na 12. hodině.", + "SUBTITLE_CONT_PRI_ANOTHERDOGPATROL136": "^2Kapitán Price: ^7Další psi.", + "SUBTITLE_CONT_PRI_ANOTHERPATROL137": "^2Kapitán Price: ^7Další hlídka před námi.", + "SUBTITLE_CONT_PRI_YOURCALL141": "^2Kapitán Price: ^7Vystřel nebo je nech být. Tvoje volba.", + "SUBTITLE_CONT_PRI_CANTSLIPBY142": "^2Kapitán Price: ^7Použij zbraň s tlumičem. Budeme muset vystřelit najednou.", + "SUBTITLE_CONT_PRI_OUTORAROUND143": "^2Kapitán Price: ^7Zneškodni je nebo je obejdi.", + "SUBTITLE_CONT_PRI_LETPASS144": "^2Kapitán Price: ^7Nech je projít.", + "SUBTITLE_CONT_PRI_TWOONRIGHT145": "^2Kapitán Price: ^7Vezmi si ty dva vpravo.", + "SUBTITLE_CONT_PRI_TWOONLEFT145": "^2Kapitán Price: ^7Ty si vezmeš toho hlídače se psem.", + "SUBTITLE_CONT_PRI_SLIPPAST146": "^2Kapitán Price: ^7Zneškodni je nebo se pokus proklouznout. Je to na tobě.", + "SUBTITLE_CONT_CMT_ROGERTHAT147": "^2Soap: ^7Rozumím.", + "SUBTITLE_CONT_PRI_CONVOYCOMING151": "^2Kapitán Price: ^7Přijíždí konvoj, zmiz jim z dohledu.", + "SUBTITLE_CONT_PRI_LETTHEMPASS152": "^2Kapitán Price: ^7Nech je projít nebo je zneškodni... tvoje volba.", + "SUBTITLE_CONT_PRI_INTELWASOFF153": "^2Kapitán Price: ^7Soape, měli jsme špatně informace. Rusové mají mobilní SAM.", + "SUBTITLE_CONT_PRI_GOLOUD155": "^2Kapitán Price: ^7Všimli si nás! Střílej! Sejmi je!", + "SUBTITLE_CONT_PRI_INCOMING161": "^2Kapitán Price: ^7Střílejí! Pozor! ", + "SUBTITLE_CONT_PRI_INTOTHEWOODS163": "^2Kapitán Price: ^7Mezi stromy! Honem, honem!", + "SUBTITLE_CONT_PRI_FOLLOWME164": "^2Kapitán Price: ^7Pojď za mnou!", + "SUBTITLE_CONT_PRI_SLOWDOWN171": "^2Kapitán Price: ^7Zpomal. Jejich vozidla nemůžou za námi až sem.", + "SUBTITLE_CONT_PRI_SEARCHINGFORUS172": "^2Kapitán Price: ^7Vypadá to, že nás hledají.", + "SUBTITLE_CONT_PRI_HATEDOGS172": "^2Kapitán Price: ^7Psi. Nesnáším psy. Jdeš první. ", + "SUBTITLE_CONT_PRI_GOTM173": "^2Kapitán Price: ^7Mám ho.", + "SUBTITLE_CONT_PRI_HESDOWN174": "^2Kapitán Price: ^7Je po něm.", + "SUBTITLE_CONT_PRI_DOWNBOY175": "^2Kapitán Price: ^7K zemi .", + "SUBTITLE_CONT_PRI_NAPTIME176": "^2Kapitán Price: ^7Čas si zdřímnout.", + "SUBTITLE_CONT_PRI_AIRSUPPORT181": "^2Kapitán Price: ^7Soape, jak jsme na tom s leteckou podporou, přepínám? ", + "SUBTITLE_CONT_CMT_ALMOSTINPOS182": "^2MacTavish: ^7UAV nabito AGM je na cestě k vám.", + "SUBTITLE_CONT_PRI_RIDGEISPERFECT184": "^2Kapitán Price: ^7Tahle vyvýšenina je perfektní.", + "SUBTITLE_CONT_PRI_CONTROLUAV185": "^2Kapitán Price: ^7Roachi použij Predátor.", + "SUBTITLE_CONT_PRI_TAKECONTROL185": "^2Kapitán Price: ^7Roachi ujmi se řízení UAV.", + "SUBTITLE_CONT_PRI_BOLLOCKS186": "^2Kapitán Price: ^7Do háje!", + "SUBTITLE_CONT_CMT_WHATHAPPENED187": "^2Soap: ^7Co to bylo?", + "SUBTITLE_CONT_PRI_MOBILESAMINVILLAGE188": "^2Kapitán Price: ^7Mají ve vesnici mobilní SAM. Právě to dostalo Predátora.", + "SUBTITLE_CONT_PRI_SAMSITEINVILLAGE188": "^2Kapitán Price: ^7Ve vesnici je mobilní SAM. Právě to dostalo naše UAV.", + "SUBTITLE_CONT_PRI_UAVSHARPISH1810": "^2Kapitán Price: ^7Soape, potřebujeme další Predátor!", + "SUBTITLE_CONT_PRI_ROACHLETSGO1811": "^2Kapitán Price: ^7Roachi - pojďme.", + "SUBTITLE_CONT_CMT_2NDUAV1812": "^2Soap: ^7Rozumím. Druhý Predátor je skoro na místě. A dávejte na to pozor, tyhle věci nerostou na stromech.", + "SUBTITLE_CONT_CMT_GROWONTREES1813": "^2MacTavish: ^7Rozumím. Druhé UAV je skoro na místě. A dávejte na to pozor, tyhle věcí nerostou na stromech.", + "SUBTITLE_CONT_RST_CHECKFIRE191": "^2Ghost: ^7Nestřílejte! Nestřílejte! Naše jednotka na 12.!", + "SUBTITLE_CONT_RST_STANDBACK192": "^2Ghost: ^7Ustupte!", + "SUBTITLE_CONT_RST_GETBACK193": "^2Ghost: ^7Zpátky!", + "SUBTITLE_CONT_PRI_RASTAANDBRICKTOP194": "^2Kapitán Price: ^7Soape, seskupili jsme se s Ghostem a zbytkem týmu.", + "SUBTITLE_CONT_PRI_NICEWORK195": "^2Kapitán Price: ^7Pěkná práce s tou SAM.", + "SUBTITLE_CONT_RST_GETMOVING196": "^2Ghost: ^7Díky, ale radši si pospěšme - ty exploze jistě vzbudí hodně pozornosti.", + "SUBTITLE_CONT_PRI_GRABWEAPON197": "^2Kapitán Price: ^7Roachi, ví že jsme tu. Možná by sis raději měl vzít jinou zbraň.", + "SUBTITLE_CONT_RST_HEADSUP198": "^2Ghost: ^7Pozor, dvě dodávky a na severovýchod přes deset chlapů!", + "SUBTITLE_CONT_PRI_BELOWCRANE199": "^2Kapitán Price: ^7Támhle je ta ponorka! Přímo pod jeřábem!", + "SUBTITLE_CONT_PRI_SOFTENDEFENSES1911": "^2Kapitán Price: ^7Roachi, trochu oslab jejich obranu s Predátorem! ", + "SUBTITLE_CONT_PRI_STROBES1911_1": "^2Kapitán Price: ^7Pozor na ty světýlka. To jsme my.", + "SUBTITLE_CONT_CMT_GOTATTENTION201": "^2Soap: ^7To upoutalo jejich pozornost!", + "SUBTITLE_CONT_CMT_BASEONALERT202": "^2Soap: ^7Celá základna bije na poplach!", + "SUBTITLE_CONT_CMT_BETTERHURRY203": "^2Soap: ^7Radši si pospěšte. Máte jen pár minut, než ta ponorka odpluje. ", + "SUBTITLE_CONT_PRI_WEREMOVING204": "^2Kapitán Price: ^7Jdeme!", + "SUBTITLE_CONT_PRI_ARMOREDVEHICLE205": "^2Kapitán Price: ^7Znič ten obrněný vůz!", + "SUBTITLE_CONT_PRI_USEHELLFIRE207": "^2Kapitán Price: ^7Použij Predátor na tu dodávku!", + "SUBTITLE_CONT_PRI_TAKEOUTHELI208": "^2Kapitán Price: ^7Sejmi ten vrtulník!", + "SUBTITLE_CONT_PRI_GOINGFORSUB209": "^2Kapitán Price: ^7Jdu do ponorky!", + "SUBTITLE_CONT_CMT_HALWAYTHERE2010": "^2Soap: ^7Jste na půl cesty!", + "SUBTITLE_CONT_PRI_COVERME2011": "^2Kapitán Price: ^7Kryjte mě z té hlídací budovy u západní brány!", + "SUBTITLE_CONT_CMT_90SECS2012": "^2Soap: ^790 vteřin!", + "SUBTITLE_CONT_GST_ROGERTHAT2013": "^2Ghost: ^7Rozumím!", + "SUBTITLE_CONT_CMT_60SECS2014": "^2Soap: ^760 vteřin!", + "SUBTITLE_CONT_GST_GUARDHOUSE2015": "^2Ghost: ^7Roachi, musíme se dostat do té hlídací budovy u západní brány a krýt Price! Za mnou!", + "SUBTITLE_CONT_CMT_30SECS2016": "^2Soap: ^730 vteřin! Honem!", + "SUBTITLE_CONT_PRI_INSIDESUB2017": "^2Kapitán Price: ^7Dobrá, Jsem v ponorce! Kryjte mě, potřebuju pár minut!", + "SUBTITLE_CONT_PRI_SUBWONTWAIT2018": "^2Kapitán Price: ^7Musíme si pospíšit! Ta ponorka na nás nepočká!", + "SUBTITLE_CONT_PRI_GOGOGO2019": "^2Kapitán Price: ^7Běž! Běž! ", + "SUBTITLE_CONT_GST_TWOTRUCKSEAST2020": "^2Ghost: ^7Nepřátelé! Dvě dodávky na východ!", + "SUBTITLE_CONT_PRI_GETTOSUB2021": "^2Kapitán Price: ^7Do ponorky! Honem!", + "SUBTITLE_CONT_GST_MOREVEHICLESEAST2023": "^2Ghost: ^7Další vozidla na východě! Použij UAV! ", + "SUBTITLE_CONT_PRI_REACHEDSUB2024": "^2Kapitán Price: ^7Soape, jsme u ponorky!", + "SUBTITLE_CONT_GST_NEXTTOSUB2025": "^2Ghost: ^7Kontakt na severu, v doku u ponorky!", + "SUBTITLE_CONT_GST_YOUTHERE211": "^2Ghost: ^7Pricei, jsi tam? Silo ponorky se otevírá, opakuji, silo ponorky se otevírá!", + "SUBTITLE_CONT_CMT_ROGERTHAT2212": "^2Soap: ^7Rozumím!", + "SUBTITLE_CONT_GST_COMEIN213": "^2Ghost: ^7Pricei, hlas se! Otevírají silo ponorky! Honem!", + "SUBTITLE_CONT_GST_DOYOUCOPY214": "^2Ghost: ^7Pricei, seš tam? Silo je otevřeno, opakují, silo je otevřeno!", + "SUBTITLE_CONT_CMT_AGMREADY262": "^2Soap: ^7AGM raketa je připravena.", + "SUBTITLE_CONT_CMT_AGMONLINE264": "^2Soap: ^7AGM raketa k dispozici.", + "SUBTITLE_CONT_CMT_REPEATONLINE266": "^2Soap: ^7AGM raketa je k dispozici. Opakuji, je k dispozici.", + "SUBTITLE_CONT_CMT_AGMOFFLINE268": "^2Soap: ^7AGM jsou vypnuty.", + "SUBTITLE_CONT_CMT_REARMHELLFIRES2610": "^2Soap: ^7Nabíjím AGM. Vydržte.", + "SUBTITLE_CONT_CMT_UAVDOWN2612": "^2Soap: ^7UAV je mimo provoz.", + "SUBTITLE_CONT_CMT_PREDATORDOWN2613": "^2Soap: ^7Predátor je mimo provoz.", + "SUBTITLE_CONT_CMT_PREDATOROFFLINE2614": "^2Soap: ^7Predátor je vypnutý.", + "SUBTITLE_CONT_CMT_UAVOFFLINE2615": "^2Soap: ^7UAV je vypnuto.", + "SUBTITLE_CONT_CMT_PREDATOROFFLINE22616": "^2Soap: ^7Predátor je vypnutý.", + "SUBTITLE_CONT_CMT_UAVOFFLINE22617": "^2Soap: ^7UAV je vypnuto.", + "SUBTITLE_CONT_CMT_DIRECTHITSHELO2618": "^2Soap: ^7Výborná trefa. Hezky Roachi.", + "SUBTITLE_CONT_CMT_BTRDESTROYED2619": "^2Soap: ^7Skvělá trefa do cíle. BTR zničeno.", + "SUBTITLE_CONT_CMT_DIRECTHITJEEP2620": "^2Soap: ^7Přímý zásah jeepu.", + "SUBTITLE_CONT_CMT_GOODKILLTRUCK2621": "^2Soap: ^7Hezky. Dodávka zničena.", + "SUBTITLE_CONT_CMT_GOODHITVEHICLES2622": "^2Soap: ^7Skvělý zásah. Zničeno vícero vozidel.", + "SUBTITLE_CONT_CMT_GOODEFFECTKIA2623": "^2Soap: ^7Skvělý zásah do cíle. Zasaženo vícero vozidel.", + "SUBTITLE_CONT_CMT_FIVEPLUSKIAS2624": "^2Soap: ^7Přes pět mrtvých. Dobrá trefa. Dobrá trefa.", + "SUBTITLE_CONT_CMT_MUTLIPLECONFIRMED2625": "^2Soap: ^7Potvrzeno vícero mrtvých. Pěkná práce.", + "SUBTITLE_CONT_CMT_3KILLS2626": "^2Soap: ^7Skvělý zásah. Vypadá to aspoň na tři mrtvé.", + "SUBTITLE_CONT_CMT_THEYREDOWN2627": "^2Soap: ^7Je po nich.", + "SUBTITLE_CONT_CMT_DIRECTHIT2628": "^2Soap: ^7Přímý zásah.", + "SUBTITLE_CONT_CMT_HESDOWN2629": "^2Soap: ^7Je po něm.", + "SUBTITLE_DCEMP_AR2_LETSGO1321": "^2Ranger: ^7Pojďme! Pojďme!", + "SUBTITLE_DCEMP_AR3_HUSTLEUP1322": "^2Ranger: ^7Pohyb! Dostaňte se do Whiskey Hotelu! Pohyb!", + "SUBTITLE_DCEMP_AR3_THISWAY1323": "^2Ranger: ^7No tak, jdeme lidi! Tudy!", + "SUBTITLE_DCEMP_AR3_MOVEMOVE1324": "^2Ranger: ^7Pohyb! Pohyb! Jděte do Whiskey Hotelu!", + "SUBTITLE_DCEMP_CPD_PARTYSTARTED141": "^2Des. Dunn: ^7Vypadá to, že párty už začala.", + "SUBTITLE_DCEMP_FLY_ROGERSTAYFROSTY142": "^2Sgt. Foley: ^7Rozumím. Zůstaňte v klidu.", + "SUBTITLE_DCEMP_AR2_REPORTTOMARSHALL143": "^2Ranger: ^7Jsem rád že jste to zvládli! Hlaste se Colonelu Marshallovi nahoře! Běžte! ", + "SUBTITLE_DCEMP_CML_MOREMEN151": "^2Plukovník Marshall: ^7Střílejte po nich těmi Bravo Dva-a-čtyřicítkami! Dostaňte víc mužů do levého křídla!", + "SUBTITLE_DCEMP_FLY_SITUATIONHERE152": "^2Sgt. Foley: ^7Pane, jak to tam vypadá?", + "SUBTITLE_DCEMP_CML_HIGHGROUND153": "^2Plukovník Marshall: ^7Seržante díváte se na 'vyšší patro'! Bílý dům je pořád pod proudem!", + "SUBTITLE_DCEMP_CML_RETAKEIT154": "^2Plukovník Marshall: ^7To znamená, že jestli se ho zmocníme, tak se můžeme spojit s vrchním velením!", + "SUBTITLE_DCEMP_CML_GETYOURSQUAD155": "^2Plukovník Marshall: ^7Dostaňte se s jednotkou do levého křídla! Běžte!", + "SUBTITLE_DCEMP_FLY_SQUADOSCARMIKE156": "^2Sgt. Foley: ^7Rozumím! Jednotko! Jdeme! Jsme na cestě!", + "SUBTITLE_DCEMP_FLY_WORKYOURWAYLEFT161": "^2Sgt. Foley: ^7Dostaňte se vlevo!", + "SUBTITLE_DCEMP_FLY_RAMIREZGO162": "^2Sgt. Foley: ^7Ramirezi, jdeme!", + "SUBTITLE_DCEMP_FLY_TAKELEFTFLANK163": "^2Sgt. Foley: ^7Pohyb! Musíme se dostat do levého křídla!", + "SUBTITLE_DCEMP_FLY_PUNCHTHROUGH171": "^2Sgt. Foley: ^7Musíme se dostat dovnitř tudy!", + "SUBTITLE_DCEMP_FLY_MACHINEGUNS172": "^2Sgt. Foley: ^7Sejměte ty kulomety!", + "SUBTITLE_DCWHITE_FLY_DUNNGETDOOR173": "^2Sgt. Foley: ^7Dunne, ty dveře!", + "SUBTITLE_DCWHITE_FLY_DUNN174": "^2Sgt. Foley: ^7Dunne!", + "SUBTITLE_DCWHITE_CPD_READINGTHIS175": "^2Des. Dunn: ^7Seržo slyšíte to?!", + "SUBTITLE_DCWHITE_FLY_THATSWHY176": "^2Sgt. Foley: ^7Proto musíme jít! Teď ty dveře!", + "SUBTITLE_DCEMP_CPD_TALKINGABOUT1811": "^2Des. Dunn: ^7Dvě minuty? O čem to sakra mluví?", + "SUBTITLE_DCEMP_FLY_FLATTENTHECITY1812": "^2Sgt. Foley: ^7Máme necelé dvě minuty, než celé město srovnají se zemí! Musíme se dostat na střechu a zastavit je!", + "SUBTITLE_DCEMP_FLY_LESSTHANTWOMINS1813": "^2Sgt. Foley: ^7Máme míň jak dvě minuty, jdeme! ", + "SUBTITLE_DCEMP_FLY_90SECONDS192": "^2Sgt. Foley: ^790 vteřin! Musíme se přes ně dostat!", + "SUBTITLE_DCEMP_FLY_60SECONDS194": "^2Sgt. Foley: ^7Jedna minuta! Běžte!", + "SUBTITLE_DCEMP_FLY_30SECONDS196": "^2Sgt. Foley: ^730 vteřin! Musíme se dostat na střechu! Běžte! ", + "SUBTITLE_DCEMP_FLY_POPTHEFLARES197": "^2Sgt. Foley: ^7Zapalte světlice!", + "SUBTITLE_DCEMP_AR1_LETSGO198": "^2Ranger: ^7Nahoře čisto! Jdeme!", + "SUBTITLE_DCEMP_FLY_GETTOROOF199": "^2Sgt. Foley: ^7Na střechu! Pohyb!", + "SUBTITLE_DCEMP_FLY_USEYOURFLARES1910": "^2Sgt. Foley: ^7Zapalte světlice!", + "SUBTITLE_DCEMP_CPD_HAPPENSNOW211": "^2Des. Dunn: ^7A co teď?", + "SUBTITLE_DCEMP_FLY_WARAINTOVER212": "^2Sgt. Foley: ^7Poručíku, ještě není konec...jen jsme zarovnali hřiště.", + "SUBTITLE_DCEMP_FLY_BACKDOWNSTAIRS213": "^2Sgt. Foley: ^7Všichni po schodech dolů. Zkusíme na tom rádiu opravit anténu.", + "SUBTITLE_DCEMP_AR1_MOSCOW214": "^2Ranger: ^7Takže kdy letíme do Moskvy?", + "SUBTITLE_DCWHITE_CPD_BURNITDOWN215": "^2Des. Dunn: ^7Ne brzy chlape. Ale vím že až se tam dostaneme, srovnáme to tam se zemí.", + "SUBTITLE_DCEMP_FLY_TIMEISRIGHT217": "^2Sgt. Foley: ^7Až přijde čas, poručíku. Až přijde čas.", + "SUBTITLE_DCBURN_MCY_OSCARMIKE92": "^2Sgt. Foley: ^7Rozumím...Dva-Jednička je na cestě.", + "SUBTITLE_DCBURN_GR1_ONYOURFEET95": "^2Ranger: ^7Na nohy - vyrážíme!", + "SUBTITLE_DCBURN_MCY_TWOONEOUT96": "^2Sgt. Foley: ^7Rozumím, Dva-Jedna Actual přepíná.", + "SUBTITLE_DCBURN_MCY_BUYTIME297": "^2Sgt. Foley: ^7Poslouchejte! Tahle evakuační zóna dostává jednu ránu za druhou, potřebujeme jim získat trochu času! Hmmmm?", + "SUBTITLE_DCBURN_GM1_TAKECOVER111": "^2Ranger: ^7Střílejí! Kryjte se!", + "SUBTITLE_DCBURN_GM2_JAVELINS12112": "^2Ranger: ^7Javeliny! 12.hodina!", + "SUBTITLE_DCBURN_GM2_INCOMING113": "^2Ranger: ^7Jsme pod palbou!", + "SUBTITLE_DCBURN_CPD_STAYINTRENCH114": "^2Des. Dunn: ^7Ramirezi! Zůstaň v zákopu nebo ti někdo odpálí prdel!", + "SUBTITLE_DCBURN_CPD_STAYLOW115": "^2Des. Dunn: ^7Drž se nízko! Zůstaň v zákopech!", + "SUBTITLE_DCBURN_CPD_BACKINTRENCH116": "^2Des. Dunn: ^7Hejbni tím zadkem zpátky do zákopu!", + "SUBTITLE_DCBURN_CPD_WHEREGOING117": "^2Des. Dunn: ^7Ramirezi, co to děláš? Zůstaň v zákopech!", + "SUBTITLE_DCBURN_MCY_MOVEUPGOGO118": "^2Sgt. Foley: ^7Pohyb! Běž! Běž!", + "SUBTITLE_DCBURN_MCY_MOVEIN119": "^2Sgt. Foley: ^7Pohyb!", + "SUBTITLE_DCBURN_MCY_PUSHFORWARD1110": "^2Sgt. Foley: ^7Kupředu! Pohyb!", + "SUBTITLE_DCBURN_MCY_MOVEFORWARD1111": "^2Sgt. Foley: ^7Kupředu!", + "SUBTITLE_DCBURN_MCY_MOVEUP21112": "^2Sgt. Foley: ^7Pohyb! Pohyb!", + "SUBTITLE_DCBURN_MCY_REQAIRSTRIKE121": "^2Sgt. Foley: ^7Overlorde, tady Hunter Dva-Jedna Actual. Potřebuju leteckou podporu, přepínám!", + "SUBTITLE_DCBURN_HQR_ALONGPOTOMAC122": "^2Overlord: ^7Uh, negativní Dva-Jedna Actual, všechny dostupné jednotky mají na starosti evakuaci podél Potomacu. Dostaňte se do cílové budovy západně a poskytněte podporu, přepínám.", + "SUBTITLE_DCBURN_MCY_BUYTIME123": "^2Sgt. Foley: ^7Všichni pohyb, jděte z dostřelu! Musíme dát čas těm evakuačním letounům!", + "SUBTITLE_DCBURN_MCY_GRENADELAUNCH124": "^2Sgt. Foley: ^7Použijte granátomety!", + "SUBTITLE_DCBURN_MCY_HAULINGPASTUS131": "^2Sgt. Foley: ^7Overlord, tady Dva-Jedna Actual! Míříme západně bez jakékoliv podpory a naši lidé z BCT Jedna si ty zadky vlečou za námi, přepínám!", + "SUBTITLE_DCBURN_HQR_HUMVEE132": "^2Overlord: ^7Rozumím. Brigádě Combat Team Jedna už dostal LAV, aby vám poskytl podporu, přepínám.", + "SUBTITLE_DCBURN_MCY_COPYTHAT133": "^2Sgt. Foley: ^7Rozumím!", + "SUBTITLE_DCBURN_MCY_FIRELOW134": "^2Sgt. Foley: ^7Nestřílejte...připojují se tu k nám naše jednotky.", + "SUBTITLE_DCBURN_CPD_FOOTMOBILES135": "^2Des. Dunn: ^7Vidím vojáky...12. hodina, 100 metrů!", + "SUBTITLE_DCBURN_MCY_HUMVEESUPP141": "^2Sgt. Foley: ^7Dobrá! LAV BCT Jedničky se o ně postaraj! Na znamení pohyb!", + "SUBTITLE_DCBURN_MCY_READY142": "^2Sgt. Foley: ^7Připravit....!", + "SUBTITLE_DCBURN_MCY_GOMOVEUP143": "^2Sgt. Foley: ^7Běž! Běž! Pohyb! Pohyb!", + "SUBTITLE_DCBURN_MCY_LINEOFFIRE144": "^2Sgt. Foley: ^7Ramirezi! Pospěš si a zůstaň mimo dostřel LAV!", + "SUBTITLE_DCBURN_MCY_MOVEMOVE145": "^2Sgt. Foley: ^7Pohyb! Pohyb!", + "SUBTITLE_DCBURN_MCY_50CALSUPP146": "^2Sgt. Foley: ^7Ramirezi! LAV zneškodnila odpor! Pohyb! Pohyb!", + "SUBTITLE_DCBURN_MCY_SITTINGDUCKS147": "^2Sgt. Foley: ^7Tlačte je! Jsme tu lehký cíl!", + "SUBTITLE_DCBURN_MCY_BLOWNOFF148": "^2Sgt. Foley: ^7Ramirezi! Jdi mimo palebnou zónu! Pohyb!", + "SUBTITLE_DCBURN_MCY_MOVEUP149": "^2Sgt. Foley: ^7Ramirezi! Pohyb, jdi mimo palebnou zónu!", + "SUBTITLE_DCBURN_MCY_INTOTARGBUILDING1410": "^2Sgt. Foley: ^7Ramirezi! Dostaň ten svůj zadek do tý budovy, hned! ", + "SUBTITLE_DCBURN_HQR_LINKUP151": "^2Overlord: ^7Hunter Dva-Jedna, tady Overlord. Týmy SEAL směřují na severozápadní roh cílové budovy. Seskupte se s nimi v nejvyšším patře a zneškodněte nepřátele, přepínám.", + "SUBTITLE_DCBURN_MCY_SOLIDCOPYONALL152": "^2Sgt. Foley: ^7Rozumím, provedu.", + "SUBTITLE_DCBURN_MCY_DROPONTHEM153": "^2Sgt. Foley: ^7Pojďme jim trochu zakouřit...Ramirezi, zapni svůj senzor tepu.", + "SUBTITLE_DCBURN_MCY_HITEMFAST154": "^2Sgt. Foley: ^7Dávej pozor na svůj senzor tepu Ramirezi. Chci je dostat rychle a tvrdě.", + "SUBTITLE_DCBURN_MCY_UPPERFLOORS161": "^2Sgt. Foley: ^7Overlord, tady Dva-Jedna Actual, jsme uvnitř a směřujeme do nejvyššího patra.", + "SUBTITLE_DCBURN_HQR_COPIESALL162": "^2Overlord: ^7Overlord rozumí. ", + "SUBTITLE_DCBURN_MCY_WHATSEEING_R171": "^2Sgt. Foley: ^7Outlaw Dva-Tři tady Dva-Jedna-Actual. Otázka - co od vás vidíte, přepínám? ", + "SUBTITLE_DCBURN_GM5_LZHEAVYFIRE172": "^2Ranger: ^7Přistávací zóna je pod silnou palbou z cílové budovy, počkat - Vidím RPG týmy ve vyšších patrech, a střelbu ze středního kalibru z jihovýchodního cípu, přepínám.", + "SUBTITLE_DCBURN_MCY_SOLIDCOPY173": "^2Sgt. Foley: ^7Rozumím, Dva-Jedna konec", + "SUBTITLE_DCBURN_MCY_WATCHSECTORS175": "^2Sgt. Foley: ^7Hlídej si mušku.", + "SUBTITLE_DCBURN_MCY_CHECKCORNERS176": "^2Sgt. Foley: ^7Zkontroluj rohy.", + "SUBTITLE_DCBURN_MCY_FIVEALPHA177": "^2Sgt. Foley: ^7RPG tým eliminován, sekce pět-alpha.", + "SUBTITLE_DCBURN_MCY_FIVEBRAVO179": "^2Sgt. Foley: ^7Nepřátelská palba potlačena, sekce pět-bravo.", + "SUBTITLE_DCBURN_MCY_FIVECHARLIE1710": "^2Sgt. Foley: ^7Nepřátele zneškodněni, sekce pět-charlie.", + "SUBTITLE_DCBURN_MCY_FIVEECHO1711": "^2Sgt. Foley: ^7Nepřátelský RPG tým zneškodněn, sekce pět-echo.", + "SUBTITLE_DCBURN_MCY_FIVEINDIA1712": "^2Sgt. Foley: ^7Nepřátele zneškodněni, sekce pět-india.", + "SUBTITLE_DCBURN_HQR_ROGERTHAT1713": "^2Overlord: ^7Rozumím, Dva-Jedničko. ", + "SUBTITLE_DCBURN_HQR_COPYTHAT1714": "^2Overlord: ^7Rozumím, Dva-Jedničko.", + "SUBTITLE_DCBURN_HQR_SOLIDCOPY1715": "^2Overlord: ^7Rozumím, Dva-Jedna.", + "SUBTITLE_DCBURN_HQR_PROCEEDSWCORNER1716": "^2Overlord: ^7Rozumím. Dva-Jedničko, dostaňte se na jihozápadní cíp. Přepínám.", + "SUBTITLE_DCBURN_MCY_FIRETEAMSUPP191": "^2Sgt. Foley: ^7Nepřátele zneškodněni v sekci Jedna-Alpha.", + "SUBTITLE_DCBURN_MCY_MEZZANINE192": "^2Sgt. Foley: ^7Overlord, tady Hunter Dva-Jedna Actual. Pokračujeme do mezipatra. Řekněte LAV z BCT Jedničky aby nestříleli, přepínám.", + "SUBTITLE_DCBURN_HQR_GOODHUNTING193": "^2Overlord: ^7Rozumím, Dva Jedničko, dobrý lov.", + "SUBTITLE_DCBURN_MCY_HOSTSUPP194": "^2Sgt. Foley: ^7Nepřátele potlačeni v sekci Dva-Echo. ", + "SUBTITLE_DCBURN_HQR_SWCORN5TH196": "^2Overlord: ^7Hunter Dva-Jedna, nepřátele na jihovýchodním cípu v pátém patře pálí po evakuační zóně, přepínám. ", + "SUBTITLE_DCBURN_MCY_OMTO5TH197": "^2Sgt. Foley: ^7Rozumím Overlorde. Jdeme do pátého patra.", + "SUBTITLE_DCBURN_MCY_FIRETEAMELIM198": "^2Sgt. Foley: ^7Nepřátelský tým zneškodněn v sekci Čtyři-Charlie.", + "SUBTITLE_DCBURN_MCY_SWCORNER199": "^2Sgt. Foley: ^7Overlord, jsme v pátém patře, jdeme do jihozápadního cípu.", + "SUBTITLE_DCBURN_CPD_GOTMVMNT1911": "^2Des. Dunn: ^7Mám tu pohyb.", + "SUBTITLE_DCBURN_MCY_STANDBYENG1912": "^2Sgt. Foley: ^7Počkejte.", + "SUBTITLE_DCBURN_MCY_CLAYMORES1913": "^2Sgt. Foley: ^7Claymore...pozor kam šlapete.", + "SUBTITLE_DCBURN_MCY_VISCROWSNEST211": "^2Sgt. Foley: ^7Všem Hunter jednotkám, vidím nepřátelské hnízdo na jihozápadním cípu. Jděte tam a vyčistěte to.", + "SUBTITLE_DCBURN_MCY_SECCROWSNEST212": "^2Sgt. Foley: ^7Overlord, tady Hunter Dva-Jedna Actual. Zajistili jsme jihozápadní cíp.", + "SUBTITLE_DCBURN_HQR_STILLVULN213": "^2Overlord: ^7Rozumím. Evakuační zóna u Washingtonského Monumentu hlásí pár transportů pryč, ale pořád jsou zranitelní. Mohli byste jim z vaší pozice poskytnout podporu, přepínám?", + "SUBTITLE_DCBURN_MCY_STOCKPILE214": "^2Sgt. Foley: ^7Rozumím! Sedíme tu na tunách nepřátelské munice! Trochu si zastřílíme! Přepínám!", + "SUBTITLE_DCBURN_MCY_SNIPERRIFLE221": "^2Sgt. Foley: ^7Ramirezi, použij tu odstřelovačku! Hledej cíle na jih od Monumentu!", + "SUBTITLE_DCBURN_MCY_COVEROURBACKS222": "^2Sgt. Foley: ^7Ostatní, jestli máte claymore, dejte je před dveře...potřebujeme si krýt záda!", + "SUBTITLE_DCBURN_MCY_SCANFORTARGETS223": "^2Sgt. Foley: ^7Ramirezi, najdi nepřátele na jih od Washingtonského Monumentu!", + "SUBTITLE_DCBURN_CPD_PLANTINGCLAYMORES224": "^2Des. Dunn: ^7Umisťuju claymore!", + "SUBTITLE_DCBURN_EVC_ALLCALLSIGNS225": "^2Evakuační zóna: ^7Všem jednotkám, jsme pod těžkou palbou ze západu. Nepřátelská pěchota a artilerie potvrzena na západ od nás.", + "SUBTITLE_DCBURN_MCY_WW2MEM226": "^2Sgt. Foley: ^7Máme tu vojáky střílející z Javelinů na evakuační zónu! Ramirezi, jdi k Barrettě a sejmi je!", + "SUBTITLE_DCBURN_MCY_GETONBARRETT227": "^2Sgt. Foley: ^7Evakuační zóna u Monumentu je pořád pod palbou. Použij Barrettu a sejmi je!", + "SUBTITLE_DCBURN_MCY_GETONRIFLE228": "^2Sgt. Foley: ^7Ramirezi - pohni tím zadkem k té odstřelovačce. Pohyb!", + "SUBTITLE_DCBURN_MCY_TARGETENEMY229": "^2Sgt. Foley: ^7Evakuační zóna je pořád pod těžkou palbou! Ramirezi - dostaň všechny nepřátele s raketami Javelin!", + "SUBTITLE_DCBURN_MCY_TARGETINFANTRY2210": "^2Sgt. Foley: ^7Ramirezi! Zneškodni tu nepřátelskou pěchotu! Sejmi je!", + "SUBTITLE_DCBURN_MCY_BEFOREOVERRUN2211": "^2Sgt. Foley: ^7Ramirezi, pojď zpátky! Musíme jim poskytnout podporu dřív, než je obklíčí!", + "SUBTITLE_DCBURN_MCY_COVEREVACSITE2212": "^2Sgt. Foley: ^7Kam to sakra jdeš? Potřebujeme krýt evakuační zónu u Washingtonského Monumentu!", + "SUBTITLE_DCBURN_MCY_RETURNTOPOST2213": "^2Sgt. Foley: ^7Ramirezi, vrať se na svoji pozici! Musíme je krýt!", + "SUBTITLE_DCBURN_EVC_GLASSEDENEMIESWEST2214": "^2Evakuační zóna: ^7Všem jednotkám, tady evakuační zóna u Washingtonského Monumentu! Zatím se držíme, ale máme tu silný útok ze západní strany!", + "SUBTITLE_DCBURN_EVC_ENGAGEALLTARGETSWEST2215": "^2Evakuační zóna: ^7Žádáme o zneškodnění všech útočníků západně od Monumentu! Opakuji - žádáme o zneškodnění všech útočníků západně od monumentu, přepínám!", + "SUBTITLE_DCBURN_EVC_ALLSNIPERS2216": "^2Evakuační zóna: ^7Všem odstřelovačům, nepřátelská střelba nám překáží v evakuaci civilistů! Žádáme o dodatečnou podoru odstřelovačů na západ od Monumentu, přepínám!", + "SUBTITLE_DCBURN_EVC_80PERCENTEFFECTIVE2217": "^2Evakuační zóna: ^7Střílejí po nás u Washingtonského Monument! Jsme bojeschopní na 80%! Žádáme o rychlý zákrok odstřelovačů západně od Monumentu, přepínám!", + "SUBTITLE_DCBURN_EVC_ENEMYAIRCRAFT2218": "^2Evakuační zóna: ^7Tady evakuační zóna u Washingtonského Monumentu! Jsme pod těžkou palbou od nepřátelských obrněných vozidel a vrtulníků! Jsme bojeschopní na 80%!", + "SUBTITLE_DCBURN_EVC_FORCEINDETAIL2219": "^2Evakuační zóna: ^7Všem jednotkám na této frekvenci, nepřátelé zahájili útok na evakuační zónu u Washingtonského Monumentu!", + "SUBTITLE_DCBURN_EVC_ANYUNITS2220": "^2Evakuační zóna: ^7Nepřátelské jednotky útočí na evakuační zónu u Monumentu! Žádáme o jakoukoliv podporu v této oblasti, přepínám!", + "SUBTITLE_DCBURN_EVC_MAJORCASUALTIES2221": "^2Evakuační zóna: ^7Máme tu spoustu vojenských a civilních obětí! Žádáme o zásah na západ od Monumentu! Přepínám!", + "SUBTITLE_DCBURN_EVC_60PERCENTEFFECTVIE2222": "^2Evakuační zóna: ^7Všem jednotkám, v evakuační zóně jsme pod silným útokem a přicházíme o vozidla a zbraně! Máme tu 60% bojeschopnost! Ověřte!", + "SUBTITLE_DCBURN_EVC_CANTTAKEMUCHMORE2223": "^2Evakuační zóna: ^7Evakuační zóna u Washingtonského Monumentu všem jednotkám! Nepřátelská palba ze západu ohrožuje naše pozice! Už dlouho nevydržíme!", + "SUBTITLE_DCBURN_EVC_DESTROYPOSITION2224": "^2Evakuační zóna: ^7Evakuační zóna u Washingtonského Monumentu všem jednotkám! Nepřátelská palba ohrožuje naše pozice! Už dlouho nevydržíme!", + "SUBTITLE_DCBURN_EVC_50PERCENTEFFECTIVE2225": "^2Evakuační zóna: ^7Evakuační zóna u Washingtonského Monumentu je pod těžkou palbou! Jsme na 50% bojeschopnosti! Bez podpory už dlouho nevydržíme! Ověřte!", + "SUBTITLE_DCBURN_EVC_AIRCRAFT502226": "^2Evakuační zóna: ^7Evakuační zóna u Washingtonského Monumentu je pod těžkou palbou vrtulníků a obrněných vozů! Jsme na 50% bojeschopnosti!", + "SUBTITLE_DCBURN_EVC_CIVVIESOUTTAHERE2227": "^2Evakuační zóna: ^7Všem jednotkám, tady evakuační zóna u Washingtonského Monumentu! Naše situace je kritická! Už dlouho nevydržíme! Potřebujeme víc času, abychom odtud dostali civilisty!", + "SUBTITLE_DCBURN_EVC_STATUSISCRIT2228": "^2Evakuační zóna: ^7Všem jednotkám, tady evakuační zóna u Washingtonského Monumentu! Máme tu kritickou situaci, jsme pořád pod palbou, prosím o asistenci!", + "SUBTITLE_DCBURN_EVC_30PERCENTEFFECTIVE2229": "^2Evakuační zóna: ^7Máme tu spoustu obětí! Bojeschopnost na 30%! Už nevydržíme další palbu!", + "SUBTITLE_DCBURN_EVC_VERGEOFOVERRUN2230": "^2Evakuační zóna: ^7Všem jednotkám, máme tu ozbrojené civilisty bránící evakuační zónu, ale nejsou vycvičení! Za chvíli nás obklíčí! Potřebujeme ihned pomoc!", + "SUBTITLE_DCBURN_EVC_10PERCENTEFFECTIVE2231": "^2Evakuační zóna: ^7Tady je evakuační zóna Whiskey Mike! Jsme téměř bez vojenské posádky! Jsme na 10% bojeschopnosti! Žádáme podporu, přepínám!", + "SUBTITLE_DCBURN_EVC_BYATHREAD2232": "^2Evakuační zóna: ^7Evakuační zóna Whiskey Mike všem jednotkám! Nepřátelé nás napadají na našich pozicích! Už se dlouho neudržíme, přepínám!", + "SUBTITLE_DCBURN_EVC_COMBATINEFFECTIVE2233": "^2Evakuační zóna: ^7Všem jednotkám! Evakuační zóna Whiskey Mike je vojenský neschopná! Jsme úplně obklíčení, budou tu každou vteřinou!", + "SUBTITLE_DCBURN_EVC_LOSTCIVVIES2234": "^2Evakuační zóna: ^7Nepřátelské jednotky jsou v evakuační zóně! Opakuji, nepřátelské jednotky jsou v evakuační zóně! Ztrácíme civilisty! Né!", + "SUBTITLE_DCBURN_HQR_STAYFROSTY231": "^2Overlord: ^7Hunter Dva-Jedna, nepřátelské jednotky se soustřeďují u vašich pozic...zůstaňte v klidu.", + "SUBTITLE_DCBURN_CPD_INPERIMETER232": "^2Des. Dunn: ^7Nepřátelé v perimetru! Střílejte! Střílejte!", + "SUBTITLE_DCBURN_CPD_HOSTATSIX233": "^2Des. Dunn: ^7Pozor! Nepřátelé na šesté!", + "SUBTITLE_DCBURN_CPD_TAKINGFIRE234": "^2Des. Dunn: ^7Jsme pod palbou! Nepřátelé v perimetru!", + "SUBTITLE_DCBURN_HQR_CLEAROUT241": "^2Overlord: ^7Hunter Dva-Jedna, doporučuji vám odtud vypadnout...vidím spoustu nepřátel, soustřeďujících se u vašich pozic...", + "SUBTITLE_DCBURN_MCY_NEGATIVE242": "^2Sgt. Foley: ^7Negativní! Máme tu výhled na nepřátelská vozidla a vrtulníky směřující k evakuační zóně z jihu a jihozápadu!", + "SUBTITLE_DCBURN_MCY_WHATWECAN243": "^2Sgt. Foley: ^7Uděláme co můžeme, abychom jim získali víc času! Přepínám!", + "SUBTITLE_DCBURN_MCY_LISTENUP251": "^2Sgt. Foley: ^7Jednotko, poslouchejte! Nenecháme, opakuju - nenecháme tam ty civilisty, hmmmm?", + "SUBTITLE_DCBURN_HOH_2252": "^2Rangers: ^7Hooah!", + "SUBTITLE_DCBURN_MCY_HEAVYORD255": "^2Sgt. Foley: ^7Ramirezi! Najdi těžkou palebnou sílu a postarej se o ty vozidla a vrtulníky...potřebujeme jim dát víc času.", + "SUBTITLE_DCBURN_MCY_HEAVYWEAP256": "^2Sgt. Foley: ^7Ramirezi! Najdi nějakou těžkou palebnou sílu a postarej se o vozidla a vrtulníky. Honem!", + "SUBTITLE_DCBURN_MCY_WHATEVERYOUFIND257": "^2Sgt. Foley: ^7Použij jakoukoli těžkou palebnou sílu na nepřátelské vozidla a vrtulníky. Pohyb!", + "SUBTITLE_DCBURN_MCY_USEORDNANCE258": "^2Sgt. Foley: ^7Ramirezi, použij něco z arzenálu na nepřátelské jednotky! Honem!", + "SUBTITLE_DCBURN_MCY_GRABAJAVELIN259": "^2Sgt. Foley: ^7Vezmi Javelin a znič ty vozidla!", + "SUBTITLE_DCBURN_MCY_TAKEOUTVEH261": "^2Sgt. Foley: ^7Obkličují evakuační zónu! Znič nepřátelská vozidla!", + "SUBTITLE_DCBURN_MCY_HEAVYFIRE262": "^2Sgt. Foley: ^7Ramirezi! Znič ta vozidla! Evakuační zóna je pod těžkou palbou!", + "SUBTITLE_DCBURN_MCY_CLOSINGIN263": "^2Sgt. Foley: ^7Blíží se nepřátelská vozidla! Znič je!", + "SUBTITLE_DCBURN_HQR_ROOFASAP271": "^2Overlord: ^7Hunter Dva-Jedna, zařídili jste evakuační zóně dost času! Výborně! Teď honem hněte zadky na střechu...chtějí vás obklíčit!", + "SUBTITLE_DCBURN_MCY_ROOFTOP272": "^2Sgt. Foley: ^7Rozumím, míříme na střechu! Všichni, pohyb!", + "SUBTITLE_DCBURN_MCY_CRAWLIN273": "^2Sgt. Foley: ^7Pohyb! Za chvíli tu bude plno nepřátel! Musíme hned jít!", + "SUBTITLE_DCBURN_MCY_NOTIME274": "^2Sgt. Foley: ^7Už nemáme čas! Jdeme!", + "SUBTITLE_DCBURN_MCY_KEEPMOVING275": "^2Sgt. Foley: ^7Musíme pokračovat! Běž!", + "SUBTITLE_DCBURN_MCY_OVERRUN276": "^2Sgt. Foley: ^7Obkličují nás! Pohyb!", + "SUBTITLE_DCBURN_MCY_OUTOFTIMEGO277": "^2Sgt. Foley: ^7Už nemáme čas! Běž!", + "SUBTITLE_DCBURN_MCY_RVWITHSEALS278": "^2Sgt. Foley: ^7Běžte na střechu, musíme se seskupit se SEAL týmem! Honem! Pohyb!", + "SUBTITLE_DCBURN_MCY_OUTNUMBERED279": "^2Sgt. Foley: ^7Jsou v přesile - musíme honem na střechu! Běž!", + "SUBTITLE_DCBURN_MCY_GETTOROOFNOW2710": "^2Sgt. Foley: ^7Ramirezi! Pohni zadkem! Musíme na střechu, hned!", + "SUBTITLE_DCBURN_MCY_OVERRUNNINGPOS2711": "^2Sgt. Foley: ^7Ramirezi, jdeme! Nepřátelé nás obkličují!", + "SUBTITLE_DCBURN_MCY_LETSMOVEOUT2712": "^2Sgt. Foley: ^7Ramirezi! Musíme jít!", + "SUBTITLE_DCBURN_MCY_UPTHESTAIRSGO2713": "^2Sgt. Foley: ^7Ramirezi! Nahoru! Jdeme!", + "SUBTITLE_DCBURN_MCY_WAITALLDAY2714": "^2Sgt. Foley: ^7Ramirezi! Honem po schodech nahoru...evakuační vrtulníky tam na nás nebudou čekat věčně!", + "SUBTITLE_DCBURN_MCY_GETTINGOVERRUN2715": "^2Sgt. Foley: ^7Obkličují nás! Všichni na střechu! Hned!", + "SUBTITLE_DCBURN_BHP_WHATSYOURSTATUS2716": "^2Dagger Dva-Jedna: ^7Hunter, tady Dagger Dva-Jedna. Přistáli jsme na střeše, jak jste na tom?", + "SUBTITLE_DCBURN_MCY_HOSTILESCLOSE2717": "^2Sgt. Foley: ^7Jsme na cestě! Nepřátelé blízko za námi!", + "SUBTITLE_DCBURN_MCY_GETINCHOPPER2718": "^2Sgt. Foley: ^7Ramirezi! Do vrtulníku!", + "SUBTITLE_DCBURN_MCY_WAYOUTNUMBERED2719": "^2Sgt. Foley: ^7Ramirezi! Jsou v přesile! Nastup! Pohyb!", + "SUBTITLE_DCBURN_MCY_FORGETABOUTIT2720": "^2Sgt. Foley: ^7Ramirezi! Zapomeň na to! Na palubě máme kulomet! Do vrtulníku! Honem!", + "SUBTITLE_DCBURN_MCY_BRASSONTITANIC2721": "^2Sgt. Foley: ^7Ramirezi! Leštíš snad plechy na Titaniku! Vole. Jdi ke kulometu, dělej!", + "SUBTITLE_DCBURN_MCY_SPINHERUP2722": "^2Sgt. Foley: ^7Ramirezi, začni střílet!", + "SUBTITLE_DCBURN_MCY_BUNKEREVAC281": "^2Sgt. Foley: ^7Overlord, seskupili jsme se se SEAL týmem na střeše a odlétáme. Byla ta zóna u Washintonskeho Monumentu evakuována, přepínám?", + "SUBTITLE_DCBURN_HQR_STILLPINNED282": "^2Overlord: ^7Negativní Dva-Jedničko, pořád jsou obklíčení jednotkami a lehkými obrněnými vozidly u památníku 2.světové války. Odtud to nevypadá dobře, přepínám!", + "SUBTITLE_DCBURN_MCY_FROMTHEAIR283": "^2Sgt. Foley: ^7Rozumím Overlord, uděláme co můžeme ze vzduchu, přepínám.", + "SUBTITLE_DCBURN_CPD_CLOSINGIN284": "^2Des. Dunn: ^7Blížící se nepřátele!", + "SUBTITLE_DCBURN_MCY_GETONMINIGUN285": "^2Sgt. Foley: ^7Ramirezi, použij ten kulomet!", + "SUBTITLE_DCBURN_MCY_MOVEMINIGUN286": "^2Sgt. Foley: ^7Musíme jít! Ramirezi, ke kulometu!", + "SUBTITLE_DCBURN_MCY_HITGOINGDOWN287": "^2Sgt. Foley: ^7Overlord, Dagger Dva-Dva je zasažen a letí k zemí!", + "SUBTITLE_DCBURN_MCY_PERMISSION291": "^2Sgt. Foley: ^7Tady Hunter Dva-Jedna Actual! Máme tu spoustu nepřátelských jednotek....žádám o povolení ke střelbě, přepínám!", + "SUBTITLE_DCBURN_HQR_CLEAREDHOT292": "^2Overlord: ^7Vaše volba, Dva-Jedničko. Outlaw je obklíčen u bunkru. Máte povolení ke střelbě u MSR, přepínám.", + "SUBTITLE_DCBURN_MCY_ONEWAYTRIP293": "^2Sgt. Foley: ^7Jednotko, střílejte po všech nepřátelích, musíme dát hochům z Outlaw trochu času, aby se odtud dostali! Možná to bude jen cesta tam! Hooah?", + "SUBTITLE_DCBURN_CPD_LEADTHEWAY294": "^2Des. Dunn: ^7Hooah. Rangers vedou směr!", + "SUBTITLE_DCBURN_MCY_ALLTHEWAY295": "^2Sgt. Foley: ^7Vždy a všude. ", + "SUBTITLE_DCBURN_SLL_WITHYOU296": "^2Velitel SEAL: ^7Jsme s vámi, Dva-Jedničko. Jdeme na to.", + "SUBTITLE_DCBURN_LBP1_CLEAREDHOT301": "^2Dagger Dva-Jedna: ^7Ramirezi, máme tam lehká vozidla a vojáky. Střelba povolena. ", + "SUBTITLE_DCBURN_LBP1_GUNSHIPLIFTINGOFF302": "^2Dagger Dva-Jedna: ^7Nepřátelská helikoptéra odlétá na 12. hodině.", + "SUBTITLE_DCBURN_LBP1_ARMORROLLINGIN303": "^2Dagger Dva-Jedna: ^7Lehké obrněné jednotky. ", + "SUBTITLE_DCBURN_LBP1_FOOTMOBILES304": "^2Dagger Dva-Jedna: ^7Pěší jednotky... dostaňte je.", + "SUBTITLE_DCBURN_BHP_DONTGETUP305": "^2Dagger Dva-Jedna: ^7RPG týmy na památníku druhé světové války...sejměte je než se vzpamatují.", + "SUBTITLE_DCBURN_EVC_MAINROAD306": "^2Evakuační zóna: ^7Dagger Dva, Washingtonský památník je pod palbou z hlavní silnice! ", + "SUBTITLE_DCBURN_LBP1_WEREONIT307": "^2Dagger Dva-Jedna: ^7Rozumím, jdeme na to. ", + "SUBTITLE_DCBURN_LBP1_TAKENHEATOFF308": "^2Dagger Dva-Jedna: ^7Overlorde, tady Dagger Dva-Jedna. Trochu jsme to vyčistili v evakuační zóně. ", + "SUBTITLE_DCBURN_LBP1_BREAKLEFTBREAKLEFT309": "^2Dagger Dva-Jedna: ^7Dagger Dva, SAM! Úhyb vlevo!", + "SUBTITLE_DCBURN_BHP_INCOMING3010": "^2Dagger Dva-Jedna: ^7Raketa! Raketa!", + "SUBTITLE_DCBURN_LBP1_22AND23AREDOWN3011": "^2Dagger Dva-Jedna: ^7Overlorde, Dagger Dva-dva a Dva-tři jsou sestřeleny. Opakuji, Dagger Dva-Dva a Dva-Tři jsou sestřeleny, přepínám. ", + "SUBTITLE_DCBURN_MCY_STILLINTHEAIR3012": "^2Sgt. Foley: ^7Overlorde, jsme zasaženi, ale pořád ve vzduchu. Máme tu masivní střelbu ze SAM na Ministerstvu spravedlnosti...letíme přes ně!", + "SUBTITLE_DCBURN_BHP_RPGTEAMS3013": "^2Dagger Dva-Jedna: ^7RPG týmy! 12. hodina!", + "SUBTITLE_DCBURN_BHP_ATTITUDECONTROL3014": "^2Dagger Dva-Jedna: ^7Přicházíme o ovládání!", + "SUBTITLE_DCBURN_MCY_TAKEUSUP3015": "^2Sgt. Foley: ^7Výš! Jestli končíme, tak vezmeme ty SAM sebou!", + "SUBTITLE_DCBURN_BHP_FIRETEAMS3016": "^2Dagger Dva-Jedna: ^7Vidím nepřátelské jednotky!", + "SUBTITLE_DCBURN_LBP1_SAMLAUNCH3017": "^2Dagger Dva-Jedna: ^7SAM! Držte se!", + "SUBTITLE_DCBURN_LBP1_MAYDAYMAYDAY3018": "^2Dagger Dva-Jedna: ^7Jsme zasaženi! Mayday mayday, tady Dagger Dva-Jedna. Řítíme se dolů do zóny Papa Bravo, 2...", + "SUBTITLE_DCBURN_LBP1_BRACEFORIMPACT3019": "^2Dagger Dva-Jedna: ^7Připravte se na náraz! ", + "SUBTITLE_DCBURN_GR1_HANGON341": "^2Voj. Wade: ^7Vezmi si tohle a kryj se!", + "SUBTITLE_DCBURN_MCY_LASTONE343": "^2Sgt. Foley: ^7Ramirezi! Poslední zásobník! Využij ho!", + "SUBTITLE_DCBURN_CPD_LASTMAG344": "^2Des. Dunn: ^7Foley, poslední zásobník!", + "SUBTITLE_DCBURN_CPD_IMOUT345": "^2Des. Dunn: ^7Jsem bez nábojů!", + "SUBTITLE_DCBURN_CPD_TOOMANY346": "^2Des. Dunn: ^7Je jich příliš moc!", + "SUBTITLE_DCBURN_MCY_DEFENDTHISPOS347": "^2Sgt. Foley: ^7Držte pozice!", + "SUBTITLE_DCBURN_MCY_GETDOWN348": "^2Sgt. Foley: ^7K zemi!", + "SUBTITLE_DCEMP_ISS_REQUESTFEED01": "^2Kontrolní centrum ISS: ^7Hlaste se Sat1. Tady kontrolní stanice ISS. Houston žádá o záznam z kamery na tvé přilbě, přepínám.", + "SUBTITLE_DCEMP_ISS_THEYWANTYOU02": "^2Kontrolní centrum ISS: ^7Uh... chtějí, aby ses podíval na tmavou stranu Země. Mělo by to být na obzoru asi tak 15 stupňů východně od PV.", + "SUBTITLE_DCEMP_ISS_ROTATEVIEW03": "^2Kontrolní centrum ISS: ^7Sat1, mohl by ses podívat trochu víc doprava?", + "SUBTITLE_DCEMP_ISS_THEREITIS04": "^2Kontrolní centrum ISS: ^7Támhle to je, vidíme cíl Sat1. Houstone jste tam, vidíte to?", + "SUBTITLE_DCEMP_HSC_COPYTHAT05": "^2Velení Houston: ^7Potvrzují ISS, máme tu záznam ze Sat1.", + "SUBTITLE_DCEMP_HSC_KEEPTRACKING06": "^2Velení Houston: ^7Sat1, sledujte ten objekt. Zjišťujeme o co se jedná, vydržte.", + "SUBTITLE_DCEMP_ISS_NOTSCHEDULED07": "^2Kontrolní centrum ISS: ^7Houstone, dnes přece nemáme v plánu žádné vypuštění satelitu?", + "SUBTITLE_DCEMP_HSC_STANDBY08": "^2Velení Houston: ^7ISS, Houston. Vydržte. Možná tu máme problém.", + "SUBTITLE_DCEMP_ISS_ANYWORD012": "^2Kontrolní centrum ISS: ^7Houstone, tady kontrolní centrum ISS, uh....", + "SUBTITLE_DCEMP_CPD_WHATSGOINON11": "^2Dunn: ^7Co se sakra děje?", + "SUBTITLE_DCEMP_FLY_SEEKSHELTER12": "^2Sgt. Foley: ^7Zmizte z těch ulic! Běžte! ", + "SUBTITLE_DCEMP_CPD_NOTGOOD13": "^2Dunn: ^7Člověče tohle není dobrý! ", + "SUBTITLE_DCEMP_FLY_GOGOGO14": "^2Sgt. Foley: ^7Běžte!", + "SUBTITLE_DCEMP_FLY_DONTSTOP15": "^2Sgt. Foley: ^7Nezastavuj se! Běž!", + "SUBTITLE_DCEMP_CPD_WHOA16": "^2Dunn: ^7Whoa! ", + "SUBTITLE_DCEMP_CPD_EMP17": "^2Dunn: ^7EMP!", + "SUBTITLE_DCEMP_CPD_HOLY17": "^2Dunn: ^7Zatraceně! ", + "SUBTITLE_DCEMP_FLY_GOGO19": "^2Sgt. Foley: ^7Běž! Běž!", + "SUBTITLE_DCEMP_AR1_WHATSGOINON110": "^2Ranger: ^7Co se sakra děje?! ", + "SUBTITLE_DCEMP_FLY_JUSTKEEPMOVIN111": "^2Sgt. Foley: ^7Pokračujte!", + "SUBTITLE_DCEMP_CPD_LOOKOUT112": "^2Dunn: ^7Pozor!", + "SUBTITLE_DCEMP_CPD_WEARETOTALLY21": "^2Dunn: ^7Člověče co teď sakra budem dělat? Rusové jsou v převaze, sračky padaj z nebe. Jsme v hájí chlape! Jsme úplně -", + "SUBTITLE_DCEMP_FLY_GETAGRIP22": "^2Sgt. Foley: ^7Buďte zticha poručíku! Ovládejte se! Zbraně fungují, takže pořád můžeme někomu nakopat prdel.", + "SUBTITLE_DCEMP_AR1_HUAH24": "^2Ranger: ^7Hooah.", + "SUBTITLE_DCWHITE_AR1_HUAH": "^2Ranger: ^7Hooah.", + "SUBTITLE_DCEMP_AR1_WHATWASTHAT31": "^2Ranger: ^7Co to sakra bylo?!", + "SUBTITLE_DCEMP_FLY_STAYHERE32": "^2Sgt. Foley: ^7Zůstaňte tady.", + "SUBTITLE_DCEMP_CPD_YOUNUTS33": "^2Dunn: ^7Vy jdete ven? Jste šílenej?", + "SUBTITLE_DCEMP_FLY_WARTOFIGHT34": "^2Sgt. Foley: ^7Už to skončilo! Honem, pořád tu máme válku.", + "SUBTITLE_DCEMP_AR1_THISISWEIRD41": "^2Ranger: ^7Co se tu sakra stalo?", + "SUBTITLE_DCEMP_CPD_SOQUIET42": "^2Dunn: ^7Oh, člověče je tu ticho.", + "SUBTITLE_DCEMP_CPD_HEYWHATTHE43": "^2Dunn: ^7Hele, funguje tvůj zaměřovač? Můj ne.", + "SUBTITLE_DCEMP_AR1_MINEDOWNTOO44": "^2Ranger: ^7Můj taky ne. Tohle je divný brácho. ", + "SUBTITLE_DCEMP_FLY_EMPBLAST45": "^2Sgt. Foley: ^7Vypadá to, že optika je mimo...komunikace taky. Nemáme tu ani pouliční osvětlení.", + "SUBTITLE_DCEMP_CPD_SAVEDOURBUTTS46": "^2Dunn: ^7Jo, možná že jeden z těch nahoře má přece jen koule. No zachránil nám zadky, to je jistý.", + "SUBTITLE_DCEMP_CPD_CHECKITOUT47": "^2Dunn: ^7Wow...podívej na to člověče", + "SUBTITLE_DCEMP_CPD_FINDIRONSITE48": "^2Dunn: ^7Musím si najít pušky s obyčejným mířidlem. Tyhle zaměřovače jsou k ničemu. ", + "SUBTITLE_DCEMP_AR1_FINDIRONSITE49": "^2Ranger: ^7Nevěřil bych, že to někdy řeknu, ale přál bych si mít nějakou pušku s obyčejným mířidlem. Tyhle zaměřovače jsou teď k ničemu. ", + "SUBTITLE_DCEMP_FLY_DAMMIT51": "^2Sgt. Foley: ^7Sakra.", + "SUBTITLE_DCEMP_FLY_REGROUP52": "^2Sgt. Foley: ^7Dobrá. Musíme se seskupit s kýmkoliv koho uvidíme. Poručíku Dunne, ujměte se toho. ", + "SUBTITLE_DCEMP_CPD_STAR61": "^2Dunn: ^7Hvězda!", + "SUBTITLE_DCEMP_CPD_WILLFIRE62": "^2Dunn: ^7Hvězda nebo začneme střílet!", + "SUBTITLE_DCEMP_AR3_DONTSHOOT63": "^2Ranger: ^7Nepamatuju si to zatracený znamení, dobře? Jen nesu zprávu! Nestřílejte!", + "SUBTITLE_DCEMP_FLY_PROPERRESPONSE64": "^2Sgt. Foley: ^7Správná odpověď je 'Texas', vojáků. Co se tam děje?", + "SUBTITLE_DCEMP_AR3_WHISKEYHOTEL65": "^2Ranger: ^7Plukovník Marshall dává dohromady jednotku u Whiskey Hotelu. Potřebujete jít kousek severně.", + "SUBTITLE_DCEMP_CPD_WHEREGOIN66": "^2Dunn: ^7No a kam jdeš teda ty?", + "SUBTITLE_DCEMP_AR3_EVERYONEELSE67": "^2Ranger: ^7Říct to ostatním! Dostaňte se do Whiskey Hotelu! Běžte!", + "SUBTITLE_DCEMP_FLY_HEARDTHEMAN68": "^2Sgt. Foley: ^7Slyšeli jste ho, jdeme. ", + "SUBTITLE_DCEMP_FLY_DUNNYOUREUP71": "^2Sgt. Foley: ^7Dunne, jdi.", + "SUBTITLE_DCEMP_CPD_CLEAR72": "^2Dunn: ^7Čistý.", + "SUBTITLE_DCEMP_AR2_GOTOURSIX73": "^2Ranger: ^7Kryju nám záda.", + "SUBTITLE_DCEMP_FLY_COPYTHAT74": "^2Sgt. Foley: ^7Rozumím.", + "SUBTITLE_DCEMP_AR3_STAR75": "^2Ranger: ^7Hvězda!", + "SUBTITLE_DCEMP_CPD_SONOFA76": "^2Dunn: ^7Zkurvy....", + "SUBTITLE_DCEMP_FLY_CONTACT77": "^2Sgt. Foley: ^7Kontakt! ", + "SUBTITLE_DCEMP_CPD_CONACT78": "^2Dunn: ^7Kontakt! ", + "SUBTITLE_DCEMP_FLY_FLASHBANGOUT79": "^2Sgt. Foley: ^7Házím granát!", + "SUBTITLE_DCEMP_CPD_HUAAH710": "^2Dunn: ^7Je po nich, ne?!", + "SUBTITLE_DCEMP_AR2_CLEAR711": "^2Ranger: ^7Čistý! ", + "SUBTITLE_DCEMP_FLY_ROOMCLEAR712": "^2Sgt. Foley: ^7Místnost vyčištěna! Jdeme!", + "SUBTITLE_DCEMP_FLY_OLDEXECBUILDING81": "^2Sgt. Foley: ^7Támhle je ta Eisenhowerova budova. Whiskey Hotel je na druhé straně.", + "SUBTITLE_DCEMP_CPD_GOTTAGOOUT82": "^2Dunn: ^7Eh chlape, musíme tam jít...", + "SUBTITLE_DCEMP_FLY_CHECKVITALS91": "^2Sgt. Foley: ^7Dunne. Podívej se po zdravích, budem tě krýt.", + "SUBTITLE_DCEMP_CPD_GONNER92": "^2Dunn: ^7Je po něm.", + "SUBTITLE_DCEMP_FLY_KEEPQUIET101": "^2Sgt. Foley: ^7Potichu...", + "SUBTITLE_DCEMP_AR2_GOTAVISUAL1015": "^2Ranger: ^7Vidím tři nepřátele. ", + "SUBTITLE_DCEMP_FLY_MOVEINTOPOS1016": "^2Sgt. Foley: ^7Drž se při zemi, jdi na pozici.", + "SUBTITLE_DCEMP_AR2_CLEARSHOT1017": "^2Ranger: ^7Čistá trefa.", + "SUBTITLE_DCEMP_FLY_SMOKEEM1018": "^2Sgt. Foley: ^7Zakuř jim.", + "SUBTITLE_DCEMP_FLY_MOVEUP111": "^2Sgt. Foley: ^7Pohyb.", + "SUBTITLE_DCEMP_CPD_WHATABOUT112": "^2Dunn: ^7A co ti chlapci uvnitř?", + "SUBTITLE_DCEMP_FLY_WHATABOUTEM113": "^2Sgt. Foley: ^7Co s nima?", + "SUBTITLE_DCEMP_AR2_GOTOURSIXGO114": "^2Ranger: ^7Kryju nám záda, běž.", + "SUBTITLE_DCEMP_CPD_ITSCLEAR115": "^2Dunn: ^7Čistý.", + "SUBTITLE_DCEMP_CPD_FREEZINGMONSOON121": "^2Dunn: ^7Tak nevím co je horší - jestli uhýbání padajícím vrtulníkům nebo mrznutí zadku tady v monzunu.", + "SUBTITLE_DCEMP_FLY_QUIETSEESOMETHING123": "^2Sgt. Foley: ^7Ticho - myslím, že něco vidím.", + "SUBTITLE_DCEMP_FLY_HOLDYOURFIRE124": "^2Sgt. Foley: ^7Nestřílejte.", + "SUBTITLE_DCEMP_CPD_ARETHEYFRIENDLY125": "^2Dunn: ^7Jsou to naši?", + "SUBTITLE_DCEMP_FLY_DONTKNOWSTAR126": "^2Sgt. Foley: ^7Nevím...Hvězda!", + "SUBTITLE_DCEMP_FLY_COVERME127": "^2Sgt. Foley: ^7Kryjte mě.", + "SUBTITLE_DCEMP_FLY_STAAAR128": "^2Sgt. Foley: ^7Hvězda!", + "SUBTITLE_DCEMP_CPD_SAYTEXAS129": "^2Dunn: ^7Řekni Texas, sakra...řekni to.", + "SUBTITLE_DCEMP_AR2_STREETCLEAR1210": "^2Ranger: ^7Ulice čistá! ", + "SUBTITLE_DCEMP_FLY_OSCARMIKE1211": "^2Sgt. Foley: ^7Vyražíme. Jdeme!", + "SUBTITLE_DCEMP_FLY_WATCHMOVEMENT1212": "^2Sgt. Foley: ^7Pozor na pohyb.", + "SUBTITLE_DCEMP_AR1_FEETDRY1315": "^2Ranger: ^7Sucho.", + "SUBTITLE_DCEMP_FLY_CUTCHATTER1317": "^2Sgt. Foley: ^7Přeruš jim to povídání Ramirezi, jdeš první", + "SUBTITLE_DCEMP_CPD_WESTWING1318": "^2Dunn: ^7Zkontroluj zámek na těch dveřích. Myslel jsem, že prezidentův bunkr je pod západním křídlem", + "SUBTITLE_DCEMP_FLY_FORTOURISTS1319": "^2Sgt. Foley: ^7Ne, ten je jen pro turisty. Tohle musí být ono. Otevři to", + "SUBTITLE_DCEMP_CPD_PLACEISHISTORY1320": "^2Dunn: ^7Skutečný nebo ne člověče, tohle místo je minulost. Doufám, že se odtud dostali včas", + "SUBTITLE_EST_GST_LETSGOLETSGO15": "^2Ghost: ^7Jdeme, jdeme!", + "SUBTITLE_EST_GST_AMBUSH21": "^2Ghost: ^7Past!", + "SUBTITLE_EST_GST_TARGETSLEFTSIDE24": "^2Ghost: ^7Cíle! Vlevo! Vlevo!", + "SUBTITLE_EST_GST_MOREONRIGHT25": "^2Ghost: ^7Další vpravo!", + "SUBTITLE_EST_SCR_PRESIGHTED26": "^2Scarecrow: ^7Vyhlédli si tohle místo pro minomet!", + "SUBTITLE_EST_GST_COUNTERATTACK27": "^2Ghost: ^7Protiútok do kouře! Tlač je!", + "SUBTITLE_EST_GST_LOSEEMINSMOKE28": "^2Ghost: ^7Roachi! Dostanou tě minometem! Setřásni je v kouři! Běž!", + "SUBTITLE_EST_GST_HOSTCHOPPER31": "^2Ghost: ^7Nepřátelský vrtulník jižně!", + "SUBTITLE_EST_SNP1_TRUCKSLEAVING32": "^2Archer: ^7Dvě dodávky opouštějí cílovou budovu!", + "SUBTITLE_EST_GST_TRUCKSGETAWAY33": "^2Ghost: ^7Nenech je ujet!", + "SUBTITLE_EST_GST_BULLETPROOFED34": "^2Ghost: ^7Zatraceně, ty dodávky jsou neprůstřelný!", + "SUBTITLE_EST_GST_UPARMORED35": "^2Ghost: ^7Zatraceně, ty dodávky jsou obrněný!", + "SUBTITLE_EST_SNP1_FIRINGJAVELIN36": "^2Archer: ^7Rozumím! Používám Javelin, pozor!", + "SUBTITLE_EST_GST_DANGERCLOSE37": "^2Ghost: ^7Javelin, pozor! Běž od té cesty!", + "SUBTITLE_EST_SNP1_TWOAWAY38": "^2Archer: ^7Hotovo!", + "SUBTITLE_EST_SNP1_NEUTRALIZED39": "^2Archer: ^7Vozidla byla zničena.", + "SUBTITLE_EST_SNP1_DECOYS41": "^2Archer: ^7Nebyl tam, opakuji, neviděli jsme tam Makarova, a nikdo jiný neopustil dům. Ty dodávky mohly být návnady. Přepínám.", + "SUBTITLE_EST_GST_ADVANCINGONHOUSE42": "^2Ghost: ^7Rozumím, teď pokračujeme k domu!", + "SUBTITLE_EST_GST_CLEARPERIMIETER43": "^2Ghost: ^7Vyčisti perimetr!", + "SUBTITLE_EST_GST_BREACHNCLEAR44": "^2Ghost: ^7Těma dveřma do domu! Běž!", + "SUBTITLE_EST_SCR_MAINFLOOR51": "^2Scarecrow: ^7Hlavní hala, čisto!", + "SUBTITLE_EST_GST_MAINFLOOR52": "^2Ghost: ^7Rozumím, čisto!", + "SUBTITLE_EST_SCR_BASEMENT53": "^2Scarecrow: ^7Sklep, čisto!", + "SUBTITLE_EST_GST_BASEMENT54": "^2Ghost: ^7Rozumím, čisto!", + "SUBTITLE_EST_SCR_TOPFLOOR55": "^2Scarecrow: ^7Druhé patro, čisto!", + "SUBTITLE_EST_GST_TOPFLOOR56": "^2Ghost: ^7Rozumím, čisto!", + "SUBTITLE_EST_GST_OFFICECLEAR57": "^2Ghost: ^7Kancelář, čisto!", + "SUBTITLE_EST_GST_DININGROOMCLR58": "^2Ghost: ^7Jídelna, čisto!", + "SUBTITLE_EST_GST_CLEAR59": "^2Ghost: ^7Čisto!", + "SUBTITLE_EST_GST_LOCKEDROOMS511": "^2Ghost: ^7Roachi, jdi po schodech nahoru a zkontroluj zamčené dveře.", + "SUBTITLE_EST_SCR_GETUPSTAIRS512": "^2Scarecrow: ^7Mám to tu pod kontrolou Roachi. Jdi nahoru a zkontroluj zamčené pokoje.", + "SUBTITLE_EST_GST_SITREP513": "^2Ghost: ^7Scarecrowe, jak jsi na tom.", + "SUBTITLE_EST_SCR_NOONESLEAVING514": "^2Scarecrow: ^7Nikdo neodchází předními dveřmi sklepů.", + "SUBTITLE_EST_GST_CHECKBASEMENT515": "^2Ghost: ^7Roachi jdi se Scarecrowem a zkontrolujte sklep. Běž.", + "SUBTITLE_EST_GST_THRUKITCHEN516": "^2Ghost: ^7Ozone, zařiď, aby nikdo neodešel kuchyní.", + "SUBTITLE_EST_OZN_ROGERTHAT517": "^2Ozone: ^7Rozumím.", + "SUBTITLE_EST_SCR_GOTYOURBACK518": "^2Scarecrow: ^7Roachi, kryju ti záda.", + "SUBTITLE_EST_GST_REGROUP61": "^2Ghost: ^7Čisto. Jednotko, seskupit u mě.", + "SUBTITLE_EST_GST_PHOTOS62": "^2Ghost: ^7Scarecrowe, fotografie.", + "SUBTITLE_EST_SCR_ROGERTHAT63": "^2Scarecrow: ^7Rozumím.", + "SUBTITLE_EST_GST_NO": "^2Ghost: ^7Ne!", + "SUBTITLE_EST_TF1_AMBUSH": "^2Scarecrow: ^7Záloha!", + "SUBTITLE_EST_TF2_AMBUSH": "^2Ozone: ^7Záloha!", + "SUBTITLE_EST_GST_NOSIGN64": "^2Ghost: ^7Shepherde, tady Ghost. Žádná stopa po Makarovovi, opakují, žádná stopa po Makarovovi. Kapitáne Pricei, máte v Afghánistánu víc štěstí?", + "SUBTITLE_EST_PRI_ATLEAST5066": "^2Kapitán Price: ^7Dost...aspoň padesát ozbrojenců, ale žádná stopa po Makarovovi. Náš zdroj nám asi dál špatné informace.", + "SUBTITLE_EST_GST_GOLDMINE67": "^2Ghost: ^7No kvalita informačních zdrojů se brzy změní. Zatraceně, tohle je zlatý důl.", + "SUBTITLE_EST_SHP_EVERYTHING68": "^2Shepherd: ^7Rozumím. Ghoste, s týmem najděte všechno, co se nám může hodit. Jména, kontakty, místa, všechno.", + "SUBTITLE_EST_GST_ALREADYONIT69": "^2Ghost: ^7Pane, už na tom pracujeme. Makarov nebude mít kam utéct.", + "SUBTITLE_EST_SHP_ETA5MINS610": "^2Shepherd: ^7To je právě ono. Zajišťuju vám extrakci, cca. pět minut. Dostaňte ty informace. Shepherd přepíná.", + "SUBTITLE_EST_GST_STARTTRANSFER611": "^2Ghost: ^7Roachi, dostaň se na Makarovův počítač a začni s přenosem.", + "SUBTITLE_EST_GST_TAPINTONETWORK612": "^2Ghost: ^7Roachi, dostaň se na Makarovovu síť a začni s přenosem.", + "SUBTITLE_EST_GST_FILESOFF613": "^2Ghost: ^7Roachi - přípoj to DSM k Makarovově počítači.", + "SUBTITLE_EST_GST_CONNECTTONETWORK614": "^2Ghost: ^7Roachi - přípoj to DSM k Makarově síti.", + "SUBTITLE_EST_GST_REARSECURITY615": "^2Ghost: ^7Ozone, máš na starosti zadní část budovy. Já přední. Běž.", + "SUBTITLE_EST_OZN_ONMYWAY616": "^2Ozone: ^7Jdu na to.", + "SUBTITLE_EST_GST_STARTDOWNLOAD617": "^2Ghost: ^7Roachi, bez těch souborů neodcházíme. Začni s přenosem.", + "SUBTITLE_EST_SCR_VERYFUNNY618": "^2Scarecrow: ^7Vážně vtipný Roachi.", + "SUBTITLE_EST_PRI_SEARCHING619": "^2Kapitán Price: ^7Task Force, tady Price. Další Makarovovy muži se právě objevili na vrakovišti...", + "SUBTITLE_EST_PRI_GETTINGCLOSER620": "^2Kapitán Price: ^7Soape, kryj mě. Vyřídím toho chlapa támhle a použiju jeho rádio, abych se dostal do jejich komunikačního kanálu.", + "SUBTITLE_EST_PRI_GOINGSILENT621": "^2Kapitán Price: ^7Ghoste, budeme pár minut mimo. Hodně štěstí tam v Rusku. Price přepíná.", + "SUBTITLE_EST_SNP1_MAINROAD71": "^2Archer: ^7Odstřelovači Tým Jedna útočnému týmu, nepřátelé se blíží ze severozápadu a jihovýchodu.", + "SUBTITLE_EST_SNP1_60SECONDS72": "^2Archer: ^7Nejvíc 60 vteřin, přepínám.", + "SUBTITLE_EST_GST_WITHINTEL73": "^2Ghost: ^7Makarovi muži udělají cokoliv, jen abychom s těmi informacemi neodešli. Nesmí nám zničit DSM dokud neskončí přenos.", + "SUBTITLE_EST_GST_WEAPONSCACHE74": "^2Ghost: ^7Použij ty zásoby zbraní a použij claymore, jestli ti nějaké zůstaly. Obranné pozice, jdeme!", + "SUBTITLE_EST_SNP1_15SECONDS75": "^2Archer: ^7Nepřátelské vrtulníky do 15 vteřin.", + "SUBTITLE_EST_GST_15SECONDS76": "^2Ghost: ^7Rozumím, 15 vteřin!", + "SUBTITLE_EST_SCR_INPOSITION77": "^2Scarecrow: ^7Jsem na místě!", + "SUBTITLE_EST_OZN_READYENGAGE78": "^2Ozone: ^7Připraven!", + "SUBTITLE_EST_OZN_STOCKUP81": "^2Ozone: ^7Roachi, ve sklepě jsou nějaké zbraně. Radši si něco vezmi, dokud můžeš.", + "SUBTITLE_EST_SNP1_FASTATTACK92": "^2Archer: ^7Nepřátelské útočné vrtulníky k nám míří že severozápadu.", + "SUBTITLE_EST_GST_HELOSNW93": "^2Ghost: ^7Rozumím. Nepřátelské vrtulníky ze severozápadu.", + "SUBTITLE_EST_SCR_FRONTLAWN94": "^2Scarecrow: ^7Musíme krýt tu oblast vepředu!", + "SUBTITLE_EST_OZN_MAINWINDOWS95": "^2Ozone: ^7Jdu k oknům, potřebuju, aby někdo zaminoval a kryl příjezdovou cestu.", + "SUBTITLE_EST_GST_USECLAYMORES96": "^2Ghost: ^7Roachi, použij claymore na tu příjezdovou cestu a pak se vrať zpět do domu!", + "SUBTITLE_EST_SNP1_MOVING109": "^2Archer: ^7Přemisťuju se. Odstřelovací podpora nebude dostupná 45 vteřin, vydržte.", + "SUBTITLE_EST_SNP1_DISPLACING1010": "^2Archer: ^7Měním pozici. Budete 30 vteřin bez odstřelovací podpory, vydržte.", + "SUBTITLE_EST_SNP1_ADDITIONALHOSTILE111": "^2Archer: ^7Vidím další nepřátelské jednotky směřující k vaší pozici. Jdou k vám kolem solárních panelů na východní straně domu.", + "SUBTITLE_EST_GST_SOLARPANELSEAST112": "^2Ghost: ^7Jdou k nám kolem solárních panelů východně od domu!", + "SUBTITLE_EST_SCR_COMETHRUTREES113": "^2Scarecrow: ^7Rozumím, pokusím se je odříznout mezi těmi stromy.", + "SUBTITLE_EST_GST_EASTTRAIL114": "^2Ghost: ^7Jestli máš Claymore, tak je použij. Umísti je kolem cesty východně od domu.", + "SUBTITLE_EST_SNP1_TROOPSWEST121": "^2Archer: ^7Další jednotky západně od domu!", + "SUBTITLE_EST_GST_BOATHOUSE122": "^2Ghost: ^7Musí být u toho domku! Kryj východní přístupovou cestu!", + "SUBTITLE_EST_OZN_249SANDRPGS123": "^2Ozone: ^7Máme tu 240ky a RPG u okna v jídelně, k tomu ještě kulomety L86.", + "SUBTITLE_EST_GST_CUTEMDOWN124": "^2Ghost: ^7Rozumím, odřízni je až vyjdou z toho lesa!", + "SUBTITLE_EST_SNP1_BOATHOUSEWEST125": "^2Archer: ^7Nepřátelé jdou k vám od domku na západě, přepínám.", + "SUBTITLE_EST_GST_WESTSIDEOFHOUSE126": "^2Ghost: ^7Rozumím, nepřátele jdou k nám západní stranou!", + "SUBTITLE_EST_SNP1_RPGTEAMNORTH141": "^2Archer: ^7RPG tým severně!", + "SUBTITLE_EST_GST_RPGTEAMNORTH142": "^2Ghost: ^7Rozumím, RPG tým severně!", + "SUBTITLE_EST_SNP1_RPGTEAMNE143": "^2Archer: ^7RPG tým ze severovýchodu!", + "SUBTITLE_EST_SCR_RPGTEAMNE144": "^2Scarecrow: ^7Jednotko! RPG tým ze severovýchodu!", + "SUBTITLE_EST_SNP1_RPGTEAMEAST145": "^2Archer: ^7Blíží se RPG tým z východu!", + "SUBTITLE_EST_OZN_RPGTEAMEAST146": "^2Ozone: ^7Rozumím, RPG tým z východu!", + "SUBTITLE_EST_SNP1_RPGTEAMSE147": "^2Archer: ^7RPG tým jihovýchodně!", + "SUBTITLE_EST_GST_RPGTEAMSE148": "^2Ghost: ^7Rozumím, RPG tým jihovýchodně!", + "SUBTITLE_EST_SNP1_RPGTEAMSOUTH149": "^2Archer: ^7RPG tým z jihu!", + "SUBTITLE_EST_SCR_RPGTEAMSOUTH1410": "^2Scarecrow: ^7Rozumím, blíží se RPG tým z jihu!", + "SUBTITLE_EST_SNP1_RPGTEAMSW1411": "^2Archer: ^7Blíží se RPG tým z jihozápadu!", + "SUBTITLE_EST_OZN_RPGTEAMSW1412": "^2Ozone: ^7Rozumím! RPG tým z jihozápadu!", + "SUBTITLE_EST_SNP1_RPGTEAMWEST1413": "^2Archer: ^7RPG tým ze západu!", + "SUBTITLE_EST_GST_RPGTEAMWEST1414": "^2Ghost: ^7Rozumím! Blíží se RPG tým ze západu!", + "SUBTITLE_EST_SNP1_RPGTEAMNW1415": "^2Archer: ^7RPG tým, severozápadně!", + "SUBTITLE_EST_GST_RPGTEAMNW1416": "^2Ghost: ^7Jednotko! Máme tu RPG tým severozápadně!", + "SUBTITLE_EST_GST_STAYCLOSE151": "^2Ghost: ^7Roachi! Drž se poblíž!", + "SUBTITLE_EST_GST_DONTSTRAY152": "^2Ghost: ^7Roachi! Nechoď tak daleko! Musíme pohlídat ten přenos!", + "SUBTITLE_EST_GST_FALLBACK153": "^2Ghost: ^7Roachi, kde sakra jsi?! Zpět do domu! Honem!", + "SUBTITLE_EST_GST_TRYINGTOSTOP154": "^2Ghost: ^7Roachi, stáhni se do úkrytu! Snaží se zastavit přenos!", + "SUBTITLE_EST_GST_LOSTTHEDSM155": "^2Ghost: ^7Je jich tu moc! Roachi! Ztratili jsme DSM, opakuji, ztratili jsme -", + "SUBTITLE_EST_GST_DESTROYEDTHEDSM156": "^2Ghost: ^7Roachi! Zničili DSM! Zničili -", + "SUBTITLE_EST_SCR_WHATWASTHAT161": "^2Scarecrow: ^7Co to sakra bylo?", + "SUBTITLE_EST_SNP1_HOSTILESSE162": "^2Archer: ^7Pozor, blíží se k vám spousta nepřátel z jihovýchodu, právě vešli do vašeho perimetru!", + "SUBTITLE_EST_SNP1_THINEMOUT163": "^2Archer: ^7Pokusím se jich dostat co nejvíc, než se k vám dostanou moc blízko. Doporučuju použít zbraně s přiblížením, přepínám.", + "SUBTITLE_EST_GST_FIELDTOSE164": "^2Ghost: ^7Rozumím! Všichni kryjte tu oblast severovýchodně! Honem!", + "SUBTITLE_EST_OZN_EYESON165": "^2Ozone: ^7Vidím je! Tady jsou! Jsou v oblasti severovýchodně!", + "SUBTITLE_EST_OZN_IMHIT171": "^2Ozone: ^7Trefili mě!", + "SUBTITLE_EST_SNP1_OZONEISDOWN172": "^2Archer: ^7Ozone je postřelen!", + "SUBTITLE_EST_SCR_IMHIT173": "^2Scarecrow: ^7Dostal jsem to!", + "SUBTITLE_EST_SNP1_SCARECROWDOWN174": "^2Archer: ^7Scarecrow to dostal, opakuju - Scarecrow je postřelen!", + "SUBTITLE_EST_SCR_INSIDETHEHOUSE181": "^2Scarecrow: ^7Jsou uvnitř domu! Potřebuju asistenci!", + "SUBTITLE_EST_SCR_NEEDSOMEHELP182": "^2Scarecrow: ^7Jsou v domě! Potřebuju tu pomoc!", + "SUBTITLE_EST_SNP1_FIFTYMETERS183": "^2Archer: ^7Nepřátelé jsou v okruhu padesáti metrů od domu! Jsou uvnitř!", + "SUBTITLE_EST_GST_PROTECTTHEDSM184": "^2Ghost: ^7Rozumím! Všichni se stáhněte a kryjte to DSM!", + "SUBTITLE_EST_SNP1_CLEARFORNOW185": "^2Archer: ^7Máte tam na chvíli čisto, nevidím nikoho blížit se k domu, přepínám.", + "SUBTITLE_EST_SCR_ONTHEWAY191": "^2Scarecrow: ^7Na cestě!", + "SUBTITLE_EST_SCR_OSCARMIKE192": "^2Scarecrow: ^7Rozumím, na cestě!", + "SUBTITLE_EST_OZN_MOVING193": "^2Ozone: ^7Pohyb!", + "SUBTITLE_EST_OZN_IMONIT194": "^2Ozone: ^7Mám to!", + "SUBTITLE_EST_SCR_ROGERTHAT2195": "^2Scarecrow: ^7Rozumím!", + "SUBTITLE_EST_SCR_YOUGOTIT196": "^2Scarecrow: ^7Jdu na to!", + "SUBTITLE_EST_OZN_CONSIDERITDONE197": "^2Ozone: ^7Hned.", + "SUBTITLE_EST_SNP1_ENEMYSIGHTED201": "^2Archer: ^7Vidím nepřátelské jednotky, jdou lesem severně od domu.", + "SUBTITLE_EST_GST_ONTHEDRIVEWAY202": "^2Ghost: ^7Rozumím. Roachi, umísti pár min claymore u přístupové cesty! Běž! ", + "SUBTITLE_EST_GST_DSMCOMPLETE221": "^2Ghost: ^7Roachi, přenos je dokončen! Budu krýt přístupovou cestu, vezmi to DSM! Honem!", + "SUBTITLE_EST_GST_GETOUTTAHERE222": "^2Ghost: ^7Roachi! Kryju přední část domu! Vezmi DSM! Musíme odtud!", + "SUBTITLE_EST_SHP_ALMOSTATLZ223": "^2Shepherd: ^7Tady je Shepherd. Už jsme téměř u přistávací zóny. Jak jste na tom, přepínám?", + "SUBTITLE_EST_GST_ONOURWAY224": "^2Ghost: ^7Jsme na cestě k přistávací zóně! Roachi, jdeme!", + "SUBTITLE_EST_GST_KEEPMOVING234": "^2Ghost: ^7Dostaň se k přistávací zóně! Pohyb!", + "SUBTITLE_EST_GST_GOGO235": "^2Ghost: ^7Běž! Běž!", + "SUBTITLE_EST_GST_ILLCOVERYOU236": "^2Ghost: ^7Budu tě krýt! Pohyb!", + "SUBTITLE_EST_GST_GETTOTHELZ241": "^2Ghost: ^7Musíme se dostat k přistávací zóně! Roachi, no tak!", + "SUBTITLE_EST_GST_BRACKETING251": "^2Ghost: ^7Střílejí na naše pozice minomety, pokračuj, ale dávej si pozor! ", + "SUBTITLE_EST_GST_GOTYOUCOVERED252": "^2Ghost: ^7Roachi, kryju tě! Běž! Běž!", + "SUBTITLE_EST_GST_REDSMOKE261": "^2Ghost: ^7Thunder Dva-Jedna, Vyznačil jsem červeným kouřem oblast mezi stromy! Zasáhněte na moje znamení!", + "SUBTITLE_EST_GST_GOTYOUROACH263": "^2Ghost: ^7Mám tě Roachi, vydrž!", + "SUBTITLE_EST_GST_HANGINTHERE264": "^2Ghost: ^7Roachi, vydrž!", + "SUBTITLE_EST_GST_CLEAREDHOT265": "^2Ghost: ^7Thunder Dva-Jedna, jsme pod palbou!", + "SUBTITLE_EST_GST_COMEONGETUP271": "^2Ghost: ^7No tak, vstávej!", + "SUBTITLE_EST_GST_GETUPGETUP272": "^2Ghost: ^7Vstávej! Vstávej! Už jsme skoro tam! ", + "SUBTITLE_EST_SHP_HAVETHEDSM291": "^2Shepherd: ^7Máte to DSM?", + "SUBTITLE_EST_GST_WEGOTIT292": "^2Ghost: ^7Máme to, pane! ", + "SUBTITLE_EST_SHP_WELLDONE293": "^2Shepherd: ^7Výborně, vojáku. ", + "SUBTITLE_EST_SHP_LOOSEEND294": "^2Shepherd: ^7Skvělé. O problém míň.", + "SUBTITLE_EST_MCT_SPLITUP304": "^2Soap: ^7Pricei! Musíme se rozdělit nebo je po nás!", + "SUBTITLE_FAVELA_CMT_ROGERTHAT13": "^2Kapitán MacTavish: ^7Negativní. Už se zastavili dvakrát - není po něm stopy.", + "SUBTITLE_FAVELA_CMT_INPOSITION14": "^2Kapitán MacTavish: ^7Počkat, zase se zastavili. Vydrž.", + "SUBTITLE_FAVELA_CMT_INSIGHT15": "^2Kapitán MacTavish: ^7Mám tu pozitivní ID! Kdokoliv ti hoši jsou, nejsou rádi, že ho vidí...", + "SUBTITLE_FAVELA_CMT_NEEDHIMALIVE16": "^2Kapitán MacTavish: ^7Ghoste, máme tu problém!", + "SUBTITLE_FAVELA_CMT_GETDOWN17": "^2Kapitán MacTavish: ^7K zemi!", + "SUBTITLE_FAVELA_CMT_GETTINGAWAY21": "^2Kapitán MacTavish: ^7Utíká! Roachi jdeme!", + "SUBTITLE_FAVELA_CMT_DRIVERSDEAD22": "^2Kapitán MacTavish: ^7Ghoste, náš řidič je mrtvý! Jdeme po svých! Jdi k Hotelu Rio a odřízni ho, jestli můžeš!", + "SUBTITLE_FAVELA_GST_ONMYWAY23": "^2Ghost: ^7Rozumím, jdu na to!", + "SUBTITLE_FAVELA_GST_HESFAST31": "^2Ghost: ^7Běží do uličky!", + "SUBTITLE_FAVELA_CMT_NONLETHAL32": "^2Kapitán MacTavish: ^7Nezabij ho! Potřebujem ho živého!", + "SUBTITLE_FAVELA_CMT_TAKESHOT33": "^2Kapitán MacTavish: ^7Roachi - vystřel! Tref ho do nohy!", + "SUBTITLE_FAVELA_CMT_HESDOWN34": "^2Kapitán MacTavish: ^7Je na zemi.", + "SUBTITLE_FAVELA_CMT_HIDINGINFAV41": "^2Kapitán MacTavish: ^7Roachi, tohle nám chvíli potrvá. Jdi s Meatem a Roycem a zkuste najít ve favele nějakou stopu po Rojasovi - tam měl tenhle chlápek namířeno.", + "SUBTITLE_FAVELA_RYC_LETSGO42": "^2Royce: ^7Jdeme.", + "SUBTITLE_FAVELA_RYC_WATCHYOURBG51": "^2Royce: ^7A pamatuj si - ve favele je spousta civilistů. Dávej si tam pozor kam střílíš.", + "SUBTITLE_FAVELA_RYC_WARNING54": "^2Royce: ^7Meate, dostaň odtud ty civilisty.", + "SUBTITLE_FAVELA_MET_ROGERTHAT55": "^2Meat: ^7Rozumím.", + "SUBTITLE_FAVELA_CMT_FULLBATTALION57": "^2Royce: ^7Bravo Šest, zaútočili jsme na nepřátelské jednotky v té vesnici níž!", + "SUBTITLE_FAVELA_RYC_WITHYOU58": "^2Royce: ^7Roachi! Jdu s tebou! Pozor na střechy! Běž!", + "SUBTITLE_FAVELA_CMT_DOINGOK510": "^2Kapitán MacTavish: ^7Royci, hlas mi situaci, přepínám!", + "SUBTITLE_FAVELA_RYC_NOSIGN511": "^2Royce: ^7Spousta vojáků ale žádná stopa po Rojasovi, přepínám!", + "SUBTITLE_FAVELA_CMT_KEEPSEARCHING512": "^2Kapitán MacTavish: ^7Rozumím! Hledej dál! Dej mi vědět, až ho uvidíš! Přepínám!", + "SUBTITLE_FAVELA_RYC_MOVEUP513": "^2Royce: ^7Roachi! Pohyb! Jdeme!", + "SUBTITLE_FAVELA_RYC_MEATISDOWN515": "^2Royce: ^7Postřelili Meata! Opakuji, postřelili Meata!", + "SUBTITLE_FAVELA_CMT_CANTAFFORD516": "^2Kapitán MacTavish: ^7Rozumím! Pokračujte, nemůžeme si dovolit ztratit Rojase!", + "SUBTITLE_FAVELA_RYC_IMDOWN518": "^2Royce: ^7Roachi, dostal jsem to!", + "SUBTITLE_FAVELA_RYC_ROACHISDOWN519": "^2Royce: ^7Bravo Šest, dostali Roache. Budu to muset dokončit sám!", + "SUBTITLE_FAVELA_MET_ROACHISDOWN520": "^2Meat: ^7Dostali Roache! Dostali Roache! Jsme tu jen ty a já Royci!", + "SUBTITLE_FAVELA_CMT_DOYOUCOPY521": "^2Kapitán MacTavish: ^7Roachi, hlas se! Roachi, jsi tam?! Roachi!", + "SUBTITLE_FAVELA_CMT_ROACHISDOWN521": "^2Kapitán MacTavish: ^7Ghoste, dostali Roache! Ztratili jsme ho!", + "SUBTITLE_FAVELA_CMT_LOSTROACH521": "^2Kapitán MacTavish: ^7Ztratili jsme Roache! Rojas nám uteče!", + "SUBTITLE_FAVELA_CMT_CUTHIMOFF61": "^2Kapitán MacTavish: ^7Roachi - máme Rojasovu pozici! Zamířil západně podél vyšší části favely.", + "SUBTITLE_FAVELA_CMT_KEEPGOING62": "^2Kapitán MacTavish: ^7Budeme hlídat aby to neotočil zpátky - ty pokračuj dál a nahoře ho odřízni!", + "SUBTITLE_FAVELA_CMT_NOTIME63": "^2Kapitán MacTavish: ^7Není čas na posily. Budeš to muset zvládnout sám. Hodně štěstí. Přepínám.", + "SUBTITLE_FAVELA_CMT_WATCHROOFTOPS71": "^2Kapitán MacTavish: ^7Roachi, pozor na střechy! Už jsme párkrát unikli jen o vlásek RPG a kulometům unístěným nahoře!", + "SUBTITLE_FAVELA_CMT_THEIRTERRITORY72": "^2Kapitán MacTavish: ^7Roachi - tohle je jejich teritorium a vědí to moc dobře! Dávej si pozor, ať tě nenalákají do pasti a pozor na rohy!", + "SUBTITLE_FAVELA_CMT_STILLTRACKING73": "^2Kapitán MacTavish: ^7Roachi, jsme tu pod těžkou palbou od milice, ale pořád jdeme po Rojasovi! Vešel do budovy! Ghoste, vidíš ho?", + "SUBTITLE_FAVELA_GST_DUFFELBAG74": "^2Ghost: ^7Rozumím, snaží se dostat na střechu a nese ssebou černý pytel!", + "SUBTITLE_FAVELA_CMT_INTERCEPT75": "^2Kapitán MacTavish: ^7Dobrá, tohle by ho mělo zpomalit! Roachi, budeme ho hlídat, aby to neotočil! Ty pokračuj a dostaň ho! Běž!", + "SUBTITLE_FAVELA_GST_CUTTINGTHRU76": "^2Ghost: ^7Vidím Rojase! Běží přes trh!", + "SUBTITLE_FAVELA_CMT_HEADFORROOFTOPS77": "^2Kapitán MacTavish: ^7Rozumím! Poběžím ke střechám a zkusím ho odříznout vpravo! Nebude mít jinou možnost, než zahnout na západ!", + "SUBTITLE_FAVELA_GST_WAYAROUND78": "^2Ghost: ^7Jsem pod silnou palbou od milicí, vypadá to, že ho přes ten trh nedostanu! Musím si najít nějakou cestu kolem!", + "SUBTITLE_FAVELA_CMT_ANOTHERFENCE79": "^2Kapitán MacTavish: ^7Roachi! Přeskočil další plot a pořád míří na tvoji stranu favely! Pokračuj! Běž!", + "SUBTITLE_FAVELA_GST_HALFKLICK710": "^2Ghost: ^7Jsem kousek východně od trhu, vidím Rojase běžet přes střechy po mé pravé straně!", + "SUBTITLE_FAVELA_GST_LEGSHOT712": "^2Ghost: ^7Pane, mám zamířeno na Rojase! Můžu ho trefit do nohy! Můžeme ho už dostat!", + "SUBTITLE_FAVELA_CMT_DONOTENGAGE713": "^2Kapitán MacTavish: ^7Negativní! Nemůžeme riskovat! Nezasahuj!", + "SUBTITLE_FAVELA_GST_ROGERTHAT2714": "^2Ghost: ^7Do háje! Rozumím!", + "SUBTITLE_FAVELA_CMT_YOURSIDE715": "^2Kapitán MacTavish: ^7Pokračuj! Rojas pořád míří na tvoji stranu favely!", + "SUBTITLE_FAVELA_GST_PINYOUDOWN716": "^2Ghost: ^7Roachi! Nezdržuj se s milicemi příliš dlouho! Použij na ně oslepující granáty!", + "SUBTITLE_FAVELA_CMT_LOSTSIGHTAGAIN717": "^2Kapitán MacTavish: ^7Zase jsem ho ztratil! Ghoste, ozvi se!", + "SUBTITLE_FAVELA_GST_ALLEYSBELOW718": "^2Ghost: ^7Jdu po něm! Snaží se to otočit těma uličkama dole!", + "SUBTITLE_FAVELA_CMT_STAYONHIM719": "^2Kapitán MacTavish: ^7Rozumím! Neztrácej ho!", + "SUBTITLE_FAVELA_CMT_NOWHERETOGO720": "^2Kapitán MacTavish: ^7Roachi! Pokračuj nahoru! Odřízl jsem ho! Může teď už jít jen západně na střechy přímo k tobě!", + "SUBTITLE_FAVELA_CMT_TRAPHIMUPHERE721": "^2Kapitán MacTavish: ^7Roachi! Zná to tady dobře, ale tam ho můžeme dostat! Nezastavuj se! Běž!", + "SUBTITLE_FAVELA_GST_JUMPEDFENCE722": "^2Ghost: ^7Přeskočil plot! Jdu po něm!", + "SUBTITLE_FAVELA_CMT_GOINGLEFT723": "^2Kapitán MacTavish: ^7Rozumím! Jdu vlevo kolem!", + "SUBTITLE_FAVELA_GST_WHEREISHE724": "^2Ghost: ^7Kde je?", + "SUBTITLE_FAVELA_CMT_SLIDINGROOFTOPS725": "^2Kapitán MacTavish: ^7Vidím ho! Je támhle, sjíždí po těch střechách!", + "SUBTITLE_FAVELA_GST_ANOTHERLEGSHOT726": "^2Ghost: ^7Zase mám na mušce jeho nohu!", + "SUBTITLE_FAVELA_CMT_CARRYHIMBACK727": "^2Kapitán MacTavish: ^7Negativní! Jestli ho nechceš nést zpátky s milicemi v zádech! Potřebuju ho nezraněného!", + "SUBTITLE_FAVELA_CMT_EYEOPEN728": "^2Kapitán MacTavish: ^7Rozumím! Roachi! Tlačíme ho blíž k tvé straně kopce! Měl bys Rojase každou chvíli vidět! Pořád běží po střechách!", + "SUBTITLE_FAVELA_CMT_SPOTTEDFAUST91": "^2Kapitán MacTavish: ^7Roachi! Právě jsem viděl Rojase, pořád se snaží utéct! Míří k tobě!", + "SUBTITLE_FAVELA_CMT_UNHARMED92": "^2Kapitán MacTavish: ^7A nezastřel ho! Potřebujeme ho nezraněného!", + "SUBTITLE_FAVELA_CMT_CUTOFF93": "^2Kapitán MacTavish: ^7Roachi, odřízneme ho na vrcholku, vytlač ho výš! Běž!", + "SUBTITLE_FAVELA_CMT_CORRALING94": "^2Kapitán MacTavish: ^7Vytlač ho dál na kopec! Nahoře ho odřízneme!", + "SUBTITLE_FAVELA_CMT_CLOSERTOYOURPART95": "^2Kapitán MacTavish: ^7Roachi! Míří k tvojí straně favely! Pokračuj! Běž! Běž!", + "SUBTITLE_FAVELA_CMT_MOTORCYCLE96": "^2Kapitán MacTavish: ^7Ghoste, jde si pro tu motorku!", + "SUBTITLE_FAVELA_CMT_DONTSHOOTHIM99": "^2Kapitán MacTavish: ^7Fajn! Zkouší zas jít doprava! Roach, jestli ho vidíš, nezastřel ho! Potřebuju ho živého!", + "SUBTITLE_FAVELA_CMT_ONTHEMOVE910": "^2Kapitán MacTavish: ^7Roachi! Míří k tobě! Běž!", + "SUBTITLE_FAVELA_CMT_BACKTOWARDS911": "^2Kapitán MacTavish: ^7Vidíme Rojase - počkat! Sakra! Míří zpátky k tobě!", + "SUBTITLE_FAVELA_CMT_DOUBLEBACK912": "^2Kapitán MacTavish: ^7Roachi, vytlač ho dál nahoru! Nenech ho otočit se! ", + "SUBTITLE_FAVELA_CMT_FARRIGHT101": "^2Kapitán MacTavish: ^7Ghoste, jdu vpravo!", + "SUBTITLE_FAVELA_GST_ROGERTHAT102": "^2Ghost: ^7Rozumím.", + "SUBTITLE_FAVELA_GST_GETAWAY103": "^2Ghost: ^7Uteče!", + "SUBTITLE_FAVELA_CMT_NOHESNOT104": "^2Kapitán MacTavish: ^7Ne, neuteče.", + "SUBTITLE_FAVELA_CMT_GOTPACKAGE105": "^2Kapitán MacTavish: ^7Frontrunner, tady Bravo Šest. Máme balíček. Opakuji, máme balíček.", + "SUBTITLE_FAVELA_GST_SENDCHOPPER111": "^2Ghost: ^7Velení, jsme připraveni k odletu. Pošlete vrtulník. Údaje jsou -", + "SUBTITLE_FAVELA_GST_SKIESARECLEAR112": "^2Ghost: ^7Do háje! Nic nepřiletělo. Hned pošlete vrtulník.", + "SUBTITLE_FAVELA_GST_ONOUROWN113": "^2Ghost: ^7Velení má hlavu zapíchnutou ve svým zadku. Jsme na to sami.", + "SUBTITLE_FAVESC_CMT_SURROUNDED16": "^2Kapitán MacTavish: ^7Nikolaii! Jsme na vrcholu favely obklíčení milicemi! Přileť vrtulníkem k trhům, rozumíš, přepínám!", + "SUBTITLE_FAVESC_NKL_ONTHEWAY17": "^2Nikolai: ^7Dobrá příteli, jsem na cestě!", + "SUBTITLE_FAVESC_CMT_LOCKANDLOAD18": "^2Kapitán MacTavish: ^7Všichni se připravte! Nabít!", + "SUBTITLE_FAVESC_GST_LETSDOTHIS19": "^2Ghost: ^7Pojďme na to!", + "SUBTITLE_FAVESC_GST_SHACKONLEFT23": "^2Ghost: ^7Milice přicházejí z té boudy vlevo!", + "SUBTITLE_FAVESC_CMT_THRUTHATGATE24": "^2Kapitán MacTavish: ^7Tou branou! Běžte dál k evakuačnímu bodu!", + "SUBTITLE_FAVESC_GST_ONROOFTOPS25": "^2Ghost: ^7Kontakt! Milice na střechách, blížící se rychle z jihu!", + "SUBTITLE_FAVESC_GST_DEADAHEAD26": "^2Ghost: ^7Nepřátelé na zemi přímo před námi!", + "SUBTITLE_FAVESC_GST_SKINNIES27": "^2Ghost: ^7Další svině na střechách přímo před námi!", + "SUBTITLE_FAVESC_GST_LEFTFLANK28": "^2Ghost: ^7Jsou po naší levé straně!", + "SUBTITLE_FAVESC_CMT_SHIFTFIRE29": "^2Kapitán MacTavish: ^7Střechy vlevo! Opětujte palbu!", + "SUBTITLE_FAVESC_GST_LEFTLEFTLEFT210": "^2Ghost: ^7Vlevo! V těch dřevěných boudách!", + "SUBTITLE_FAVESC_CMT_RPGSEAST211": "^2Kapitán MacTavish: ^7RPG na východě!", + "SUBTITLE_FAVESC_GST_TOTHESOUTH212": "^2Ghost: ^7RPG na střechách jižně!", + "SUBTITLE_FAVESC_CMT_LOWFROMSE213": "^2Kapitán MacTavish: ^7Nepřátelé z jihozápadu!", + "SUBTITLE_FAVESC_GST_ALOTOFEM214": "^2Ghost: ^7Zatraceně, jsou jich tu spousty!", + "SUBTITLE_FAVESC_GST_TECHNICAL41": "^2Ghost: ^7Technické jednotky z jihu!", + "SUBTITLE_FAVESC_CMT_TECHNICAL42": "^2Kapitán MacTavish: ^7Máme tu další technické jednotky! Palte! ", + "SUBTITLE_FAVESC_CMT_THRUGATE51": "^2Kapitán MacTavish: ^7Musíme se dostat do vrtulníku - běžte branou k trhu! Pohyb!", + "SUBTITLE_FAVESC_GST_GOGOGO52": "^2Ghost: ^7Běž! Běž!", + "SUBTITLE_FAVESC_GST_CHOPPERINBOUND61": "^2Ghost: ^7Vrtulník!", + "SUBTITLE_FAVESC_NKL_MANYMILITIA62": "^2Nikolai: ^7Trh není daleko od vás, ale vidím k vám mířit spoustu milicí.", + "SUBTITLE_FAVESC_CMT_PUSHTHRUSTREETS71": "^2Kapitán MacTavish: ^7Jdeme, jdeme! Musíme se těmi ulicemi dostat na trh!", + "SUBTITLE_FAVESC_CMT_FLANKINGROUTES72": "^2Kapitán MacTavish: ^7Pozor na boční uličky!", + "SUBTITLE_FAVESC_CMT_LAYDOWNFIRE73": "^2Kapitán MacTavish: ^7Roachi! Křižovatka, střílej!", + "SUBTITLE_FAVESC_CMT_ALLEYONLEFT74": "^2Kapitán MacTavish: ^7Pozor! Ulička vlevo!", + "SUBTITLE_FAVESC_CMT_ALMOSTATMARKET75": "^2Kapitán MacTavish: ^7Pokračuj! Už jsme skoro u trhu!", + "SUBTITLE_FAVESC_CMT_SPLITUP77": "^2Kapitán MacTavish: ^7Jednotko! Rozdělte se a dostaňte se přes ten trh! Pohyb!", + "SUBTITLE_FAVESC_GST_FIRINGBLIND78": "^2Ghost: ^7Kontakt nad námi na 11. hodině, střelba naslepo!", + "SUBTITLE_FAVESC_CMT_SHACKONRIGHT79": "^2Kapitán MacTavish: ^7Nepřátelé vycházejí z té boudy vpravo!", + "SUBTITLE_710": "^2Kapitán MacTavish: ^7Roachi! Zkus najít cestu tím obchodem se zmrzlinou a obejdi je!", + "SUBTITLE_711": "^2Kapitán MacTavish: ^7Roachi! Jdi přes ty žluté domy vlevo a obejdi tu křižovatku!", + "SUBTITLE_FAVESC_CMT_THERESPAVELOW91": "^2Kapitán MacTavish: ^7Támhle je Nikolaiův vrtulník! Jdeme!", + "SUBTITLE_FAVESC_CMT_IMMEDIATEDUSTOFF92": "^2Kapitán MacTavish: ^7Nikolaii! Asi 20 vteřin! Připrav se na okamžitý odlet!", + "SUBTITLE_FAVESC_NKL_NOTFASTENOUGH93": "^2Nikolai: ^7To možná nebude dost rychle! Od tržiště se k vám blíží další milice!", + "SUBTITLE_FAVESC_CMT_PICKUPPACE94": "^2Kapitán MacTavish: ^7Pohněte si! Jdeme!", + "SUBTITLE_FAVESC_NKL_TOOHOT95": "^2Nikolai: ^7Moc těžká palba! Nepřežijeme přistání!", + "SUBTITLE_FAVESC_CMT_WAVEOFF96": "^2Kapitán MacTavish: ^7Nikolaii, vzlétni! Radši se s tebou setkáme na druhé přistávací zóně! Jdi!", + "SUBTITLE_FAVESC_NKL_MEETYOUTHERE97": "^2Nikolai: ^7Výborně, budu tam! Hodně štěstí!", + "SUBTITLE_FAVESC_CMT_GETTOROOFTOPS101": "^2Kapitán MacTavish: ^7No tak! Musíme se dostat na střechy, tudy!", + "SUBTITLE_FAVESC_CMT_GETUPHERE102": "^2Kapitán MacTavish: ^7Roachi! Běž sem na střechy, jdeme!", + "SUBTITLE_FAVESC_CMT_CLIMBUP103": "^2Kapitán MacTavish: ^7Roachi! Vylez sem na střechu!", + "SUBTITLE_FAVESC_CMT_CLIMBUPHERE104": "^2Kapitán MacTavish: ^7Roachi! Tady můžeš vylézt!", + "SUBTITLE_FAVESC_CMT_LETSGOLETSGO111": "^2Kapitán MacTavish: ^7Jdeme, jdeme!", + "SUBTITLE_FAVESC_NKL_WHOLEVILLAGE112": "^2Nikolai: ^7Můj příteli, odtud to vypadá, že se vás snaží zastřelit celá vesnice!", + "SUBTITLE_FAVESC_CMT_PICKUSUP113": "^2Kapitán MacTavish: ^7Řekni mi něco co nevím! Jen se příprav dostat nás odtud!", + "SUBTITLE_FAVESC_NKL_KEEPGOING114": "^2Nikolai: ^7Dobře, vyzvednu vás brzo, pokračujte!", + "SUBTITLE_FAVESC_GST_RUNOUTOFROOF115": "^2Ghost: ^7Už nemáme kam běžet!", + "SUBTITLE_FAVESC_CMT_MAKEITGOGO116": "^2Kapitán MacTavish: ^7Dokážem to! Běž!", + "SUBTITLE_FAVESC_CMT_WAKEUP122": "^2Kapitán MacTavish: ^7Roachi! Roachi! Vstávej!", + "SUBTITLE_FAVESC_GST_COMINGFORYOU123": "^2Ghost: ^7Roachi! Vidíme je z vrtulníku! Jdou si pro tebe, desítky!", + "SUBTITLE_FAVESC_CMT_CIRCLINGAREA123": "^2Kapitán MacTavish: ^7Roachi, letíme tu dokola ale nevidím tě! Musíš se dostat na střechy!", + "SUBTITLE_FAVESC_CMT_TOOMANY124": "^2Kapitán MacTavish: ^7Pohyb!", + "SUBTITLE_FAVESC_CMT_LOWONFUEL125": "^2Kapitán MacTavish: ^7Roachi, už nemáme moc paliva! Kde sakra jsi?!", + "SUBTITLE_FAVESC_CMT_RUNFORIT126": "^2Kapitán MacTavish: ^7Běž! Dostaň se na střechy!", + "SUBTITLE_FAVESC_CMT_GETOUTTA127": "^2MacTavish: ^7No tak Roachi, jsme u vrtulníku!", + "SUBTITLE_FAVESC_CMT_GETTOCHOPPER128": "^2MacTavish: ^7Roachi, kde to vázne, jdeme!", + "SUBTITLE_FAVESC_CMT_WHATSHOLDUP129": "^2MacTavish: ^7Musíme odtud Roachi, no tak!", + "SUBTITLE_FAVESC_CMT_MEETUSSOUTH131": "^2Kapitán MacTavish: ^7Roachi! Vidím tě! Seskoč na střechy a běž k nám na jih! Běž!", + "SUBTITLE_FAVESC_CMT_HEADTORIGHT132": "^2Kapitán MacTavish: ^7Zahni doprava!", + "SUBTITLE_FAVESC_CMT_KEEPMOVING133": "^2Kapitán MacTavish: ^7Pokračuj dál! Neotáčej se! Zpomalíš a je po tobě!", + "SUBTITLE_FAVESC_NKL_VERYLOW133": "^2Nikolai: ^7Už nemáme palivo! Musíme odletět do třiceti vteřin!", + "SUBTITLE_FAVESC_CMT_ONFUMES134": "^2Kapitán MacTavish: ^7Roachi! Už nemáme palivo! Máš třicet vteřin! Běž!", + "SUBTITLE_FAVESC_CMT_LEFTTURNLEFT135": "^2Kapitán MacTavish: ^7Vlevo! Zahni vlevo a skoč!", + "SUBTITLE_FAVESC_CMT_COMEON136": "^2Kapitán MacTavish: ^7No tak!", + "SUBTITLE_FAVESC_CMT_JUMP137": "^2Kapitán MacTavish: ^7Skoč!", + "SUBTITLE_FAVESC_CMT_GOTHIM138": "^2Kapitán MacTavish: ^7Nikolaii! Máme ho! Dostaň nás odtud!", + "SUBTITLE_FAVESC_NKL_WHERETO139": "^2Nikolai: ^7Kam, můj příteli?", + "SUBTITLE_GULAG_RPT_30SEC11": "^2Kapitán MacTavish: ^730 vteřin.", + "SUBTITLE_GULAG_RPT_STBYENGAGE210": "^2Kapitán MacTavish: ^7Všem odstřelovačům, tady MacTavish, nestřílejte.", + "SUBTITLE_GULAG_RPT_STABILIZE238": "^2Kapitán MacTavish: ^7Zamiřte", + "SUBTITLE_GULAG_RPT_STABILIZE31": "^2Kapitán MacTavish: ^7Zamiřte", + "SUBTITLE_GULAG_RPT_STABILIZE3314": "^2Kapitán MacTavish: ^7Zamiřte", + "SUBTITLE_GULAG_LBP1_ROGER232": "^2Sršeň DvaJedna: ^7Rozumím", + "SUBTITLE_GULAG_TCO_ONTARGET2317": "^2Ghost: ^7Zamířeno", + "SUBTITLE_GULAG_TCO_ONTARGET33": "^2Ghost: ^7Zamířeno", + "SUBTITLE_GULAG_RPT_CLEAREDENGAGE34": "^2Kapitán MacTavish: ^7Odstřelovači - můžete zasáhnout. ", + "SUBTITLE_GULAG_RPT_SHIFTRIGHT2312": "^2Kapitán MacTavish: ^7Vpravo.", + "SUBTITLE_GULAG_RPT_SHIFTRIGHT36": "^2Kapitán MacTavish: ^7Vpravo.", + "SUBTITLE_GULAG_LBP1_SHIFTING37": "^2Sršeň DvaJedna: ^7Zaměřuji", + "SUBTITLE_GULAG_LBP1_READY2315": "^2Sršeň DvaJedna: ^7Připraven", + "SUBTITLE_GULAG_LBP1_READY39": "^2Sršeň DvaJedna: ^7Připraven", + "SUBTITLE_GULAG_WRM_ONTARGET310": "^2Worm: ^7Zamířeno", + "SUBTITLE_GULAG_RPT_TAKEEMOUT318": "^2Kapitán MacTavish: ^7Sejmi je.", + "SUBTITLE_GULAG_CMT_SEEHOSTILES41": "^2Kapitán MacTavish: ^7Vidím čtyři nepřátele na té další věži!", + "SUBTITLE_GULAG_LBP1_HANGON42": "^2Sršeň DvaJedna: ^7Vydržte!", + "SUBTITLE_GULAG_RPT_TOOCLOSE43": "^2Kapitán MacTavish: ^7Shepherde! Ať ti stíhači hned přestanou střílet! To bylo moc blízko!", + "SUBTITLE_GULAG_HQR_MORETIME44": "^2Shepherd: ^7Pokusím se vám zařídit víc času. Jeden muž ve vězení pro námořnictvo moc neznamená. ", + "SUBTITLE_GULAG_GST_YANKS145": "^2Ghost: ^7Zatraceně...Myslel jsem, že to jsou dobrý hoši!", + "SUBTITLE_GULAG_GST_YANKS246": "^2Ghost: ^7Zatraceně...na čí straně jsou?! ", + "SUBTITLE_GULAG_RPT_CUTCHATTER47": "^2Kapitán MacTavish: ^7Ghoste, nekecej. Zůstaň v klidu.", + "SUBTITLE_GULAG_LBP1_GUNRUN63": "^2Sršeň DvaJedna: ^7Dva-Jedna je připraven ke střelbě.", + "SUBTITLE_GULAG_CMT_LASINGTARGET65": "^2Kapitán MacTavish: ^7Rozumím Dva-Jedna, zaměřuji cíl ve druhém patře! ", + "SUBTITLE_GULAG_LBP1_GOTATALLY66": "^2Sršeň DvaJedna: ^7Dva-Jedna rozumí, máme označených šest nepřátel, střílíme. ", + "SUBTITLE_GULAG_CMT_USEM20367": "^2Kapitán MacTavish: ^7Roachi! Nepřátelé ve třetím patře, použij M203! ", + "SUBTITLE_GULAG_CMT_UPAHEAD68": "^2Kapitán MacTavish: ^7Vchod je přímo naproti, pohyb! ", + "SUBTITLE_GULAG_CMT_GETOUT69": "^2Kapitán MacTavish: ^7Takhle to bude! Jdeme dovnitř, vezmeme vězně 627 a rychle odsud! ", + "SUBTITLE_GULAG_CMT_CHECKCORNERS610": "^2Kapitán MacTavish: ^7Kontroluj rohy! Jdeme! ", + "SUBTITLE_GULAG_GST_CONTROLROOM71": "^2Ghost: ^7Naproti je řidící místnost! Můžu v ní najít toho vězně!", + "SUBTITLE_GULAG_CMT_TAPINTO72": "^2Ghost: ^7Dostanu se do jejich systému a podívám se po tom vězni! Chvíli to potrvá!", + "SUBTITLE_GULAG_CMT_CELLDUTY73": "^2Kapitán MacTavish: ^7Rozumím! Roachi, zkontrolujeme to celý! Za mnou! ", + "SUBTITLE_GULAG_GST_PATCHEDIN75": "^2Ghost: ^7Dobrá, jsem tam. Vidím kam jdete přes bezpečnostní kamery.", + "SUBTITLE_GULAG_CMT_LOCATION77": "^2Kapitán MacTavish: ^7Rozumím! Máš už polohu vězně 627?", + "SUBTITLE_GULAG_GST_JOBEASIER78": "^2Ghost: ^7Negativní, ale vidím nepřátele na vašem patře. To by vám to mělo usnadnit.", + "SUBTITLE_GULAG_CMT_STAYSHARP79": "^2Kapitán MacTavish: ^7Rozumím! Buď ve střehu! Vězeň může být v jedné z těch cel!", + "SUBTITLE_GULAG_CMT_SECDOOR717": "^2Kapitán MacTavish: ^7Ghoste, zamčené dveře, otevři je!", + "SUBTITLE_GULAG_CMT_ANCIENT718": "^2Ghost: ^7Pracuju na tom...ten hardware je z pravěku!", + "SUBTITLE_GULAG_CMT_WRONGDOOR719": "^2Kapitán MacTavish: ^7Ghoste, otevřel jsi špatné dveře!", + "SUBTITLE_GULAG_GST_STANDBY720": "^2Ghost: ^7Rozumím, vydržte...", + "SUBTITLE_GULAG_CMT_THATSBETTER721": "^2Kapitán MacTavish: ^7To je lepší, jdeme!", + "SUBTITLE_GULAG_GST_THREETWO723": "^2Ghost: ^7Další dveře za tři, dva -", + "SUBTITLE_GULAG_CMT_TALKTOME725": "^2Kapitán MacTavish: ^7Mluv se mnou Ghoste...cely jsou prázdné!", + "SUBTITLE_GULAG_GST_EASTWING726": "^2Ghost: ^7Mám to! Vězeň 627 byl přemístěn do východního křídla! Jděte přes zbrojnici uprostřed - to je ta nejrychlejší cesta.", + "SUBTITLE_GULAG_CMT_ARMORYDOWNTHERE727": "^2Kapitán MacTavish: ^7Rozumím! Jednotko, ke zbrojnici tudy! Pohyb!", + "SUBTITLE_GULAG_CMT_SEEANYTHING728": "^2Kapitán MacTavish: ^7Máš něco?", + "SUBTITLE_GULAG_GST_BADNEWS729": "^2Ghost: ^7Špatné zprávy příteli. Vidím tři, ne, čtyři jednotky směřující k vám!", + "SUBTITLE_GULAG_CMT_HEARCOMING730": "^2Kapitán MacTavish: ^7Slyším je...jdeme! Jsme odhaleni!", + "SUBTITLE_GULAG_CMT_OPENDOOR731": "^2Kapitán MacTavish: ^7Ghoste! Otevři dveře!", + "SUBTITLE_GULAG_GST_RUNABYPASS732": "^2Ghost: ^7Zatraceně, zamkli to na pevné lince. Budu to muset obejít.", + "SUBTITLE_GULAG_CMT_TOOLATE733": "^2Kapitán MacTavish: ^7Pozdě! Už jsou tady!", + "SUBTITLE_GULAG_GST_GOTMORETANGOS734": "^2Ghost: ^7Pozor - další nepřátelé míří vaším směrem. ", + "SUBTITLE_GULAG_CMT_MORECOVER735": "^2Kapitán MacTavish: ^7Budeme potřebovat lepší krytí - vezmi štít!", + "SUBTITLE_GULAG_CMT_PICKUPONE736": "^2Kapitán MacTavish: ^7Roachi, vezmi jeden z těch štítů! ", + "SUBTITLE_GULAG_CMT_OPENTHEDOOR737": "^2Kapitán MacTavish: ^7Otevři dveře!", + "SUBTITLE_GULAG_GST_GOTIT738": "^2Ghost: ^7Jsme skoro tam! Nabourávám pomocný okruh... ", + "SUBTITLE_GULAG_CMT_GOTCOMPANY739": "^2Kapitán MacTavish: ^7Máme společnost! ", + "SUBTITLE_GULAG_CMT_RIOTSHIELD740": "^2Kapitán MacTavish: ^7Vezmi si štít!", + "SUBTITLE_GULAG_GST_ALMOSTTHERE742": "^2Ghost: ^7Pracuju na tom... Hlavní okruh je mimo! Vydržte!", + "SUBTITLE_GULAG_CMT_USESHEILD743": "^2Kapitán MacTavish: ^7Odraž jejich střelbu štítem!", + "SUBTITLE_GULAG_CMT_ILLDRAWFIRE744": "^2Kapitán MacTavish: ^7Odrážím jejich střelbu štítem, ty je sejmi!", + "SUBTITLE_GULAG_GST_BYPASSFLOORS745": "^2Ghost: ^7Tady Ghost. Doporučuju obejít nižší patra spuštěním se z toho okna.", + "SUBTITLE_GULAG_CMT_ROACHFOLLOW746": "^2Kapitán MacTavish: ^7Rozumím! Roachi, za mnou!", + "SUBTITLE_GULAG_GST_GOTIT2738_2": "^2Ghost: ^7Mám to!", + "SUBTITLE_GULAG_TF1_LASTFLOOR81": "^2Voják TF-141: ^7Patro čisté. Seskupíme se uprostřed.", + "SUBTITLE_GULAG_TF1_CAPTAINLASTFLOOR82": "^2Voják TF-141: ^7Kapitáne MacTavishi, patro čisté. Seskupíme se uprostřed.", + "SUBTITLE_GULAG_GST_FEEDISDEAD83": "^2Ghost: ^7Kamera na samotce je mimo. Ta oblast je zřejmě mimo proud.", + "SUBTITLE_GULAG_CMT_SWITCHNV84": "^2Kapitán MacTavish: ^7Rozumím. Jednotko, zapněte si noční vidění.", + "SUBTITLE_GULAG_CMT_STRAGGLERS85": "^2Kapitán MacTavish: ^7Zkontrolujte cely.", + "SUBTITLE_GULAG_CMT_CALLOFF86": "^2Kapitán MacTavish: ^7Shepherde, co to sakra bylo? Ať přestanou střílet!", + "SUBTITLE_GULAG_HQR_WORKING87": "^2Shepherd: ^7Námořnictvo nemá zrovna náladu mluvit. Vydržte. ", + "SUBTITLE_GULAG_HQR_LOOSECANNON88": "^2Shepherd: ^7Bravo Šest - souhlasili se zastavením palby. Jděte dál, dám vám vědět. Přepínám.", + "SUBTITLE_GULAG_GST_JUNCTIONA1291": "^2Ghost: ^7Zapnuto záložní vedení. Otevíráme bránu na uzlu A-12 – jděte dolů schody do provozních tunelů.", + "SUBTITLE_GULAG_CMT_GOGOGO192": "^2Kapitán MacTavish: ^7Běž! Běž! ", + "SUBTITLE_GULAG_GST_ONCAMERAS93": "^2Ghost: ^7Dobrá, vidím vás na kameře.", + "SUBTITLE_GULAG_GST_30FTONLEFT94": "^2Ghost: ^7Stará umývárna je třicet stop po vaší levé straně. Budete muset prorazit zeď.", + "SUBTITLE_GULAG_CMT_PLANTBREACH95": "^2Kapitán MacTavish: ^7Roachi - umísti na zeď výbušninu, půjdeme zkratkou.", + "SUBTITLE_GULAG_CMT_HURRYUP96": "^2Kapitán MacTavish: ^7Roachi - ne dveře! Umísti výbušninu tam na zeď!", + "SUBTITLE_GULAG_CMT_FORGETTHATDOOR97": "^2Kapitán MacTavish: ^7Roachi - zapomeň na dveře! Umísti výbušninu na zeď, jdeme zkratkou!", + "SUBTITLE_GULAG_CMT_SPREADOUT101": "^2Kapitán MacTavish: ^7Rozptýlit!", + "SUBTITLE_GULAG_CMT_HOSTILES2NDFLOOR102": "^2Kapitán MacTavish: ^7Nepřátelé ve druhém patře! Dostaň je!", + "SUBTITLE_GULAG_CMT_KEEPMOVING103": "^2Kapitán MacTavish: ^7Pokračujte!", + "SUBTITLE_GULAG_CMT_USELOCKERS104": "^2Kapitán MacTavish: ^7Kryj se za těmi skříňkami!", + "SUBTITLE_GULAG_CMT_HITFROMSIDE105": "^2Kapitán MacTavish: ^7Spousta jednotek naproti! Nestřílej na ně zepředu! Běž a dostaň je ze strany!", + "SUBTITLE_GULAG_CMT_COOKGRENADES106": "^2Kapitán MacTavish: ^7Hoď za ně granáty!", + "SUBTITLE_GULAG_CMT_HOLEINFLOOR111": "^2Kapitán MacTavish: ^7Mířím k díře v zemi na té straně dál od sprch! Za mnou! Jdeme!", + "SUBTITLE_GULAG_CMT_WHICHWAY112": "^2Kapitán MacTavish: ^7Ghoste, jsme ve starých tunelech vedoucích jižně-jihozápadně.", + "SUBTITLE_GULAG_GST_50METERS113": "^2Ghost: ^7Dobrá. Pokračujte tím tunelem.", + "SUBTITLE_GULAG_CMT_STARTFIRING114": "^2Kapitán MacTavish: ^7Mluv se mnou Ghoste...Nechci být tady dole až ty lodě zase začnou pálit.", + "SUBTITLE_GULAG_GST_CISTERN115": "^2Ghost: ^7Dál, už jste skoro tam.", + "SUBTITLE_GULAG_GST_8TANGOS116": "^2Ghost: ^7Vidím tu dvě tepelné stopy - jedna by měla být vězeň 627.", + "SUBTITLE_GULAG_GST_8TANGOS2117": "^2Ghost: ^7Umísti výbušninu na severozápadní zeď, po výbuchu bys měl mít dost času zneškodnit stráže.", + "SUBTITLE_GULAG_CMT_HESWITHUS121": "^2Kapitán MacTavish: ^7Pusť to!", + "SUBTITLE_GULAG_PRI_SOAP122": "^2Kapitán Price: ^7Soape?", + "SUBTITLE_GULAG_WRM_WHOSOAP123": "^2Worm: ^7Kdo je Soap?", + "SUBTITLE_GULAG_WRM_WHOSOAP2126": "^2Worm: ^7Kdo je Soap?", + "SUBTITLE_GULAG_CMT_GETOUTTAHEREMOVE125": "^2Kapitán MacTavish: ^7No tak, musíme se odtud dostat! Pohyb!", + "SUBTITLE_GULAG_CMT_WEGOTCOMPANY127": "^2Kapitán MacTavish: ^7Máme společnost!", + "SUBTITLE_GULAG_CMT_NEEDMORETIME128": "^2Kapitán MacTavish: ^7Shepherde! Máme vězně ale nejsme pryč! Potřebujeme víc času!", + "SUBTITLE_GULAG_HQR_NOCANDO129": "^2Shepherd: ^7Námořnictvo říká 'nezájem'. Rychle odtud. ", + "SUBTITLE_GULAG_CMT_LETSGO1210": "^2Kapitán MacTavish: ^7Jdeme! jdeme!", + "SUBTITLE_GULAG_CMT_READY2JUMP1211": "^2Kapitán MacTavish: ^7Támhle je ten vrtulník! Připravte se skočit!", + "SUBTITLE_GULAG_CMT_ANOTHERWAY1212": "^2Kapitán MacTavish: ^7Zpátky! Zkusíme jinou cestu!", + "SUBTITLE_GULAG_WRM_THISWAY1213": "^2Kapitán MacTavish: ^7Tudy!", + "SUBTITLE_GULAG_WRM_DEADEND1214": "^2Worm: ^7Slepá ulička!", + "SUBTITLE_GULAG_CMT_PRICE131": "^2Kapitán MacTavish: ^7Price?", + "SUBTITLE_GULAG_CMT_THISBELONGS132": "^2Kapitán MacTavish: ^7Tohle patří vám, pane.", + "SUBTITLE_GULAG_CMT_WHEREAREYOU134": "^2Kapitán MacTavish: ^7Šest-Čtyrko, kde sakra jste, přepínám?!", + "SUBTITLE_GULAG_PLP_CANTSEE135": "^2Pilot Pave Low: ^7Bravo Šest, je tam moc kouře, nevidím vás.", + "SUBTITLE_136": "^2Kapitán MacTavish: ^7Roach je postřelen!", + "SUBTITLE_137": "^2Kapitán MacTavish: ^7Roachi! ", + "SUBTITLE_GULAG_PRI_DOITFAST138": "^2Kapitán Price: ^7Ať se chystáš udělat cokoliv Soape, udělej to rychle!", + "SUBTITLE_GULAG_PLP_SEEFLARE139": "^2Pilot Pave Low: ^7Bravo Šest, vidím vaši světlici. SPIE kotva na cestě.", + "SUBTITLE_GULAG_PRI_LETSGO1310": "^2Kapitán Price: ^7Jdeme! jdeme!", + "SUBTITLE_GULAG_CMT_HOOKUP21311": "^2Kapitán MacTavish: ^7Zahákni se!", + "SUBTITLE_GULAG_CMT_GOGO1312": "^2Kapitán MacTavish: ^7Běž! ", + "SUBTITLE_INV_SIX_GOTBMP21": "^2Sgt. Foley: ^7Máme tu BTR! Pryč, pryč!", + "SUBTITLE_INV_SIX_TEAMTHISWAY22": "^2Sgt. Foley: ^7Týme, tudy! Jdeme!", + "SUBTITLE_INV_SIX_300MEAST23": "^2Sgt. Foley: ^7Mám opravu na Raptoru! 300 metrů na východ!", + "SUBTITLE_INV_SIX_PARATROOPER24": "^2Sgt. Foley: ^7Nepřátelský parašutista na střeše!", + "SUBTITLE_INV_SIX_ENEMYPTROOP25": "^2Sgt. Foley: ^7Parašutista na 12.!", + "SUBTITLE_INV_SIX_RUSPTROOP26": "^2Sgt. Foley: ^7Ruský parašutista k nám míří na 12. hodině!", + "SUBTITLE_INV_SIX_REQAIRSUPPORT27": "^2Sgt. Foley: ^7Overlord, tady Hunter 2-1, žádáme o leteckou podporu, přepínám!", + "SUBTITLE_INV_HQR_ENGAGED28": "^2Overlord: ^7Hunter 2-1, veškerá letecká podpora už je na místě.", + "SUBTITLE_INV_HQR_ENGAGED229": "^2Overlord: ^7Dodatečná pozemní podpora je na cestě k vám, ale střetla se se značným odporem, přepínám.", + "SUBTITLE_INV_SIX_ONFOOT210": "^2Sgt. Foley: ^7Rozumím Overlorde.", + "SUBTITLE_INV_SIX_ONFOOT2211": "^2Sgt. Foley: ^7Narazili jsme na nepřátelská vozidla a pokračujeme pěšky, přepínám.", + "SUBTITLE_INV_HQR_GOODLUCK212": "^2Overlord: ^7Tady Overlord, rozumím. Hodně štěstí. Přepínám.", + "SUBTITLE_INV_TCO_FOURSELVES213": "^2Des. Dunn: ^7Seržo, to se nám teď vedení pokouší říct, že máme jít do háje?", + "SUBTITLE_INV_SIX_PRETTYMUCH214": "^2Sgt. Foley: ^7Tak nějak, desátníku!", + "SUBTITLE_INV_SIX_HANGRIGHT31": "^2Sgt. Foley: ^7Nestřílejte! Nestřílejte na to BTR - ještě nám nedali rozkaz!", + "SUBTITLE_INV_SIX_STAYBEHIND32": "^2Sgt. Foley: ^7Zahněte doprava a zůstaňte za ním!", + "SUBTITLE_INV_SIX_GRABRPG33": "^2Sgt. Foley: ^7Všimli si nás! Ramirezi - použij kouřové granáty! Dunne, Morgane - kryjte ho!", + "SUBTITLE_INV_SIX_RPGSUPPLYDROP34": "^2Sgt. Foley: ^7Ramirezi - v té bedně se zásobami jsou kouřové granáty! Pohyb!", + "SUBTITLE_INV_SIX_THROWSEMTEX35": "^2Sgt. Foley: ^7Hoď k tomu BTR kouřový granát!", + "SUBTITLE_INV_SIX_PICKUP36": "^2Sgt. Foley: ^7Vezmi si z bedny se zásobami kouřový granát!", + "SUBTITLE_INV_SIX_GETSEMTEX37": "^2Sgt. Foley: ^7Týme, hoďte k tomu BTR kouřový granát! Honem!", + "SUBTITLE_INV_SIX_GETMORE38": "^2Sgt. Foley: ^7Ramirezi, sežeň víc kouřových granátů z těch beden se zásobami!", + "SUBTITLE_INV_SIX_DESTROY39": "^2Sgt. Foley: ^7Hoď kouřový granát k BTR!", + "SUBTITLE_INV_SIX_NICEONE310": "^2Sgt. Foley: ^7Dobře. Teď všichni do uličky vpravo.", + "SUBTITLE_INV_SIX_COVEROFSMOKE311": "^2Sgt. Foley: ^7Použij krytí kouřovým granátem, abys proběhl kolem toho BTR do uličky!", + "SUBTITLE_INV_SIX_COMETOALLEY312": "^2Sgt. Foley: ^7Ramirezi! Do uličky!", + "SUBTITLE_INV_SIX_VISCRASHSITE41": "^2Sgt. Foley: ^7Vidím kouř z místa havárie. Tam se ten Raptor zřítil!", + "SUBTITLE_INV_SIX_OUROBJECTIVE42": "^2Sgt. Foley: ^7Jednotko, zřícený vrtulník na 12. hodině je náš cíl.", + "SUBTITLE_INV_SIX_TAKEPOINT43": "^2Sgt. Foley: ^7Ramirezi, jdeme - zahýbáme doprava.", + "SUBTITLE_INV_SIX_TRUCK1251": "^2Sgt. Foley: ^7Přijíždí dodávka na 12. hodině!", + "SUBTITLE_INV_SIX_DONTENGAGEAPC61": "^2Sgt. Foley: ^7Týme, nechte to BTR - náš cíl je místo havárie.", + "SUBTITLE_INV_SIX_GETBACKFROMAPC62": "^2Sgt. Foley: ^7Ramirezi! Jdi zpět od toho BTR!", + "SUBTITLE_INV_SIX_STAYWITHUS63": "^2Sgt. Foley: ^7Zůstaň s námi Ramirezi!", + "SUBTITLE_INV_SIX_ONME64": "^2Sgt. Foley: ^7Za mnou!", + "SUBTITLE_INV_SIX_GETOVERHERE65": "^2Sgt. Foley: ^7Sem!", + "SUBTITLE_INV_SIX_GOGOGO66": "^2Sgt. Foley: ^7Běž!", + "SUBTITLE_INV_SIX_CLOSEAIRSUPPORT67": "^2Sgt. Foley: ^7Všem Hunter jednotkám, nepřítel má leteckou podporu operující v naší AO.", + "SUBTITLE_INV_SIX_PURPLEBUILDING68": "^2Sgt. Foley: ^7Nestřílejte! Naše jednotky na 1. hodině v té vyčnívající hnědé budově.", + "SUBTITLE_INV_SIX_CRASHSITE69": "^2Sgt. Foley: ^7Ramirezi, jsme na místě nehody! Pojď sem!", + "SUBTITLE_INV_SIX_NORTHOFNATES610": "^2Sgt. Foley: ^7Místo nehody je na severní straně Nateovy restaurace.", + "SUBTITLE_INV_SIX_GIMMESITREP71": "^2Sgt. Foley: ^7Vojíne! Hlaste se! Kde je Raptor?", + "SUBTITLE_INV_SGW_MEATLOCKER72": "^2Voj. Wells: ^7Přemístili jsme ho do chladícího boxu, je prakticky neprůstřelný!", + "SUBTITLE_INV_SIX_STATUS73": "^2Sgt. Foley: ^7Jak je na tom?", + "SUBTITLE_INV_SGW_UNCONSCIOUS74": "^2Voj. Wells: ^7Pořád mimo smysly, máte lékaře?", + "SUBTITLE_INV_SIX_WHATELSE75": "^2Sgt. Foley: ^7Desátníku Dunne, prověřte to! Ještě něco?", + "SUBTITLE_INV_SGW_SUPPLYDROP76": "^2Voj. Wells: ^7Máme schozené zásoby na střeše spolu s M-5!", + "SUBTITLE_INV_SIX_SENTRYGUNSOUTH77": "^2Sgt. Foley: ^7Ramirezi - dostaň se na střechu a zkontroluj ty zásoby!", + "SUBTITLE_INV_SIX_ANTITANK78": "^2Sgt. Foley: ^7A co protitankové zbraně, letecká podpora?", + "SUBTITLE_INV_SGW_ALLOUT79": "^2Voj. Wells: ^7Už nic nemáme!", + "SUBTITLE_INV_SIX_ROGERTHAT710": "^2Sgt. Foley: ^7Rozumím!", + "SUBTITLE_INV_SIX_LADDERINKITCHEN81": "^2Sgt. Foley: ^7Ramirezi, použij žebřík v kuchyni a dostaň se na střechu.", + "SUBTITLE_INV_SIX_GETTOROOF82": "^2Sgt. Foley: ^7Ramirezi tady Foley. Dostaň se na střechu, v kuchyni je pracovní žebřík.", + "SUBTITLE_INV_SIX_ONROOFYET83": "^2Sgt. Foley: ^7Ramirezi, už jsi na střeše? Zapni ten kulomet a namiř ho jižně.", + "SUBTITLE_INV_SIX_HEADSUPLADIES91": "^2Sgt. Foley: ^7Hlavy vzhůru dámy, dodávky jižně.", + "SUBTITLE_INV_SIX_2DOZEN92": "^2Sgt. Foley: ^7Přijíždějí z jihu! Přes dvacet nepřátel!", + "SUBTITLE_INV_TCO_USINGSMOKE93": "^2Des. Dunn: ^7Používají kouřové krytí!", + "SUBTITLE_INV_SIX_THERMALOPTICS94": "^2Sgt. Foley: ^7Jednotko, tady Hunter 2-1 Actual. Zapněte si termální vidění, jestli máte.", + "SUBTITLE_INV_TCO_INCOMINGNORTH95": "^2Des. Dunn: ^7Blíží se ze severu!", + "SUBTITLE_INV_TCO_CONTACTNORTH96": "^2Des. Dunn: ^7Kontakt na severu!", + "SUBTITLE_INV_TCO_INCOMINGSOUTH97": "^2Des. Dunn: ^7Blíží se z jihu!", + "SUBTITLE_INV_TCO_CONTACTSOUTH98": "^2Des. Dunn: ^7Kontakt z jihu!", + "SUBTITLE_INV_TCO_CONTACTNW99": "^2Des. Dunn: ^7Kontakt severozpadně!", + "SUBTITLE_INV_TCO_CONTACTSE910": "^2Des. Dunn: ^7Jihovýchod!", + "SUBTITLE_INV_TCO_INCOMINGHELO911": "^2Des. Dunn: ^7Vrtulník!", + "SUBTITLE_INV_SIX_SHIFTFIREN912": "^2Sgt. Foley: ^7Týme, střílejte na sever.", + "SUBTITLE_INV_SIX_CONTACTSN913": "^2Sgt. Foley: ^7Týme, nepřátelé severně.", + "SUBTITLE_INV_SIX_SHIFTFIREW914": "^2Sgt. Foley: ^7Týme, střílejte na západ.", + "SUBTITLE_INV_SIX_CONTACTSW915": "^2Sgt. Foley: ^7Týme, nepřátelé západně.", + "SUBTITLE_INV_TCO_SMOKESCRNTH916": "^2Des. Dunn: ^7Používají kouřové krytí na severu.", + "SUBTITLE_INV_TCO_SMOKESCRWEST917": "^2Des. Dunn: ^7Používají kouřové krytí na západě.", + "SUBTITLE_INV_SIX_SWITCHTHERMAL918": "^2Sgt. Foley: ^7Rozumím. Přepněte si na termální vidění, jestli máte.", + "SUBTITLE_INV_SIX_ROOFBEHIND919": "^2Sgt. Foley: ^7Nepřátelé na střeše za námi!", + "SUBTITLE_INV_SIX_ENEMIESONROOF920": "^2Sgt. Foley: ^7Jsou v našem perimetru! Nepřátelé na střeše!", + "SUBTITLE_INV_SIX_INSIDEPERIM921": "^2Sgt. Foley: ^7Kontakt! Nepřátelé na střeše! V našem perimetru!", + "SUBTITLE_INV_SIX_TURNAROUND922": "^2Sgt. Foley: ^7Jednotko! Nepřátelé na střeše! Otočte se!", + "SUBTITLE_INV_SIX_HADENOUGH923": "^2Sgt. Foley: ^7Vypadá to, že Ivan má dost.", + "SUBTITLE_INV_SIX_SITREPONRAPTOR924": "^2Sgt. Foley: ^7Desátníku Dunne, jak je na tom Raptor, přepínám.", + "SUBTITLE_INV_TCO_SECUREANDSTABLE925": "^2Des. Dunn: ^7Raptor je zabezpečen.", + "SUBTITLE_INV_SIX_CHECKAMMO927": "^2Sgt. Foley: ^7Rozumím. Všichni si zkontrolujte zbraně. Vrátí se.", + "SUBTITLE_INV_SIX_REGROUP928": "^2Sgt. Foley: ^7Pěkná práce týme. Seskupte se tady.", + "SUBTITLE_INV_SIX_REGROUPINREST929": "^2Sgt. Foley: ^7Ramirezi, seskupte se v restauraci.", + "SUBTITLE_INV_WRM_WHATWASTHAT101": "^2Des. Dunn: ^7Co to sakra bylo?!", + "SUBTITLE_INV_SIX_GETOFFROOF102": "^2Sgt. Foley: ^7Jednotko! Jděte ze střechy!", + "SUBTITLE_INV_SIX_OFFTHEROOF103": "^2Sgt. Foley: ^7Ramirezi! Jdi sakra ... ze střechy!", + "SUBTITLE_INV_SIX_GETOFFROOF2104": "^2Sgt. Foley: ^7Jdi ze střechy!", + "SUBTITLE_INV_SIX_GETOFFROOFNOW105": "^2Sgt. Foley: ^7Jdi hned ze střechy!", + "SUBTITLE_INV_TCO_HOWCOPY111": "^2Des. Dunn: ^7Sgt. Foley, tady Hunter 2-1-Delta - slyšíte mě?", + "SUBTITLE_INV_SIX_SOLIDCOPY112": "^2Sgt. Foley: ^7Slyším Dva-Jedna-Delta, mluvte!", + "SUBTITLE_INV_TCO_UAVOP113": "^2Des. Dunn: ^7Vidím nepřátelského UAV operátora, ovládajícího ty rakety!", + "SUBTITLE_INV_TCO_UAVOP2114": "^2Des. Dunn: ^7Je v té jídelně na západ, přepínám!", + "SUBTITLE_INV_SIX_KILLTHATSOB115": "^2Sgt. Foley: ^7Ramirezi! Dostaň se tam a zabij ho!", + "SUBTITLE_INV_SIX_KILLTHATSOB2116": "^2Sgt. Foley: ^7Posílám na pomoc část jednotky! Běž!", + "SUBTITLE_INV_TCO_COPIESALL117": "^2Des. Dunn: ^7Dva-Jedna-Delta rozumí. Ramirezi, pojď se mnou, jdeme.", + "SUBTITLE_INV_SIX_BMPSFROMNORTH118": "^2Sgt. Foley: ^7Dva-Jedna-Delta, dvě BTR se blíží ze severu.", + "SUBTITLE_INV_TCO_ROGERTHAT119": "^2Des. Dunn: ^7Rozumím.", + "SUBTITLE_INV_SIX_BMPSPOTTEDYOU1110": "^2Sgt. Foley: ^7Kryj se! Vidí tě BTR!", + "SUBTITLE_INV_SIX_BMPHASAVISUAL1111": "^2Sgt. Foley: ^7K zemi! Jedno z těch BTR tě vidí!", + "SUBTITLE_INV_SIX_BEHINDSOLID1112": "^2Sgt. Foley: ^7Schov se za něco pevného! To BTR tě má na dohled", + "SUBTITLE_INV_SIX_BMPLOSTYOU1113": "^2Sgt. Foley: ^7To BTR tě ztratilo! Běž!", + "SUBTITLE_INV_SIX_BMPLOSTYOUMOVE1114": "^2Sgt. Foley: ^7To BTR tě ztratilo! Pohyb!", + "SUBTITLE_INV_SIX_BMPLOSTYOUGO1115": "^2Sgt. Foley: ^7Dobrá, to BTR tě ztratilo! Běž!", + "SUBTITLE_INV_TCO_CONTROLRIG121": "^2Des. Dunn: ^7Ramirezi - dostaň to ovládání od UAV!", + "SUBTITLE_INV_TCO_PICKUPCONTROLRIG122": "^2Des. Dunn: ^7Ramirezi - kryju tě! Vezmi to ovládání!", + "SUBTITLE_INV_TCO_INCOMING123": "^2Des. Dunn: ^7Jdou sem!", + "SUBTITLE_INV_TCO_BACKDOOR124": "^2Des. Dunn: ^7Zadní dveře!", + "SUBTITLE_INV_SIX_WASTEBMPSNOW125": "^2Sgt. Foley: ^7Ramirezi! Sejmi ty BTR! Teď!", + "SUBTITLE_INV_SIX_NEUTRALIZEARMOR126": "^2Sgt. Foley: ^7Ramirezi, znič ta nepřátelská vozidla.", + "SUBTITLE_INV_SIX_DESTROYAPCS127": "^2Sgt. Foley: ^7Znič ty BTR!", + "SUBTITLE_INV_SIX_STILLONEBMP128": "^2Sgt. Foley: ^7Pořád tam jedno BTR zůstalo!", + "SUBTITLE_INV_SIX_WASTETHATBMPNOW129": "^2Sgt. Foley: ^7Dostaň to BTR, teď!", + "SUBTITLE_INV_SIX_ONEMORE1210": "^2Sgt. Foley: ^7Výborný zásah. Cíl zasažen. Zbývá ještě jeden.", + "SUBTITLE_INV_SIX_FASTMOVERS131": "^2Sgt. Foley: ^7Nepřátelé! Kryj se!", + "SUBTITLE_INV_TCO_STILLTHERE132": "^2Des. Dunn: ^7Dva-Jedna-Actual, pořád jste tam?", + "SUBTITLE_INV_SIX_NEWPLAN133": "^2Sgt. Foley: ^7Rozumím. Všichni poslouchejte - nový plán.", + "SUBTITLE_INV_SIX_SECUREBURGERTOWN134": "^2Sgt. Foley: ^7Ramirezi! Vezmi tvůj tým a zabeztečte Burger Town! Přemístíme tam Raptor! Tahle lokace byla odhalena!", + "SUBTITLE_INV_SIX_OVERWATCH135": "^2Sgt. Foley: ^7Desátníku Dunne, dostaňte se na střechu Burger Town a dohlédněte na ně! Ramirezi, za mnou! Musíme přemístit VIP!", + "SUBTITLE_INV_TCO_REGROUPSQUAD136": "^2Des. Dunn: ^7Rozumím, jsem na cestě! Ramirezi - seskup se s jednotkou, běž!", + "SUBTITLE_INV_SIX_RAMIREZONME137": "^2Sgt. Foley: ^7Ramirezi, za mnou! Seskup se!", + "SUBTITLE_INV_SIX_BACKHERE138": "^2Sgt. Foley: ^7Ramirezi! Desátník Dunn kryje střechu! Potřebujeme tě tady! Pohyb!", + "SUBTITLE_INV_SIX_LISTENUP139": "^2Sgt. Foley: ^7Ostatní poslouchejte! Přesouváme co nejdřív Raptor! Seřaďte se u jižního vchodu Nateovy restaurace!", + "SUBTITLE_INV_SIX_ANOTHERPASS1310": "^2Sgt. Foley: ^7Potřebujeme se z týhle zatracený budovy dostat dřív než si sem najdou další cestu.", + "SUBTITLE_INV_SIX_HOSTILESINBT1311": "^2Sgt. Foley: ^7Ramirezi! Pořád máme nepřátele u Burger Town, musíme jít!", + "SUBTITLE_INV_SIX_WHATSHOLDUP1312": "^2Sgt. Foley: ^7Ramirezi, potřebujeme přesunout Raptor! Vyčisti tu restauraci!", + "SUBTITLE_INV_SIX_NEEDTOMOVE1313": "^2Sgt. Foley: ^7Ramirezi, musíme hned přemístit VIP! Vyčisti tu restauraci!", + "SUBTITLE_INV_SIX_LOCKANDLOAD141": "^2Sgt. Foley: ^7Jednotko, přesouváme Raptor z Nateovy restaurace do Burger Town jako tým!", + "SUBTITLE_INV_SIX_ONTHREE142": "^2Sgt. Foley: ^7Na tři!", + "SUBTITLE_INV_TCO_HESDOWN143": "^2Des. Dunn: ^7Cíl zneškodněn.", + "SUBTITLE_INV_SIX_KEEPOFFME143": "^2Sgt. Foley: ^7Drž ty chlapy ode mě!", + "SUBTITLE_INV_SIX_ONE144": "^2Sgt. Foley: ^7Raz!", + "SUBTITLE_INV_SIX_TWO145": "^2Sgt. Foley: ^7Dva!", + "SUBTITLE_INV_SIX_GOTTHEPRESIDENT146": "^2Sgt. Foley: ^7Jednotko, jsem v chladícím boxu v Burger Town. Raptor je v bezpečí a uvnitř.", + "SUBTITLE_INV_SIX_THREE147": "^2Sgt. Foley: ^7Tři!", + "SUBTITLE_INV_SIX_GOTTHEPRESIDENT2148": "^2Sgt. Foley: ^7Dveře jsou zavřený - udržte odtud Ivana dál. ", + "SUBTITLE_INV_SIX_THEINFANTRY152": "^2Sgt. Foley: ^7Ramirezi, nepřátelé! Použij ovládání Predátoru a ochraň Raptor!", + "SUBTITLE_INV_SIX_THEINFANTRY2154": "^2Sgt. Foley: ^7Ramirezi, použij dálkově ovládané rakety Predátor! Blíží se k nám nepřátelé! Drž je od Burgertown!", + "SUBTITLE_INV_SIX_THATARMOR156": "^2Sgt. Foley: ^7Ramirezi, použij dálkové ovládání a raketami Predátor znič nepřátelská vozidla!", + "SUBTITLE_INV_HQR_BANKTONORTH161": "^2Overlord: ^7Hunter 2-1, nepřátelská hlídka u banky severně od vás, přepínám.", + "SUBTITLE_INV_HQR_FOOTMOBILES162": "^2Overlord: ^7Hunter 2-1, přes patnáct nepřátel se k vám blíží ze severu, přepínám.", + "SUBTITLE_INV_HQR_SOUTHEAST163": "^2Overlord: ^7Hunter 2-1, tady Overlord. Odhadem dvacet nepřátel se k vám blíží z jihovýchodu, přepínám.", + "SUBTITLE_INV_HQR_VISUALSE164": "^2Overlord: ^7Hunter 2-1, Goliath Jedna vidí nepřátelskou hlídku blížící se z jihovýchodu, přepínám.", + "SUBTITLE_INV_HQR_TACOJOINT165": "^2Overlord: ^7Hunter 2-1, vícero nepřátelských vojáků bylo spatřeno nedaleko taco bodu, přepínám.", + "SUBTITLE_INV_HQR_ENEMYNORTH166": "^2Overlord: ^7Hunter 2-1 tady Overlord Actual, vidíme velkou skupinu nepřátelských vojáků severně od vás, přepínám.", + "SUBTITLE_INV_HQR_NOVAGASSTATION167": "^2Overlord: ^7Hunter 2-1, Hunter Čtyři vidí nepřátelskou jednotku nedaleko palivové stanice Nova, přepínám.", + "SUBTITLE_INV_HQR_DINERWEST168": "^2Overlord: ^7Hunter 2-1, přes dvacet nepřátel se blíží k restauraci západně, přepínám.", + "SUBTITLE_INV_HQR_ENEMYWEST169": "^2Overlord: ^7Hunter 2-1, zpráva od Goliath Dva, nepřátelé se blíží ze západu, přepínám.", + "SUBTITLE_INV_HQR_HELLFIREONLINE1611": "^2Overlord: ^7Hunter 2-1 AGM raketa je připojena.", + "SUBTITLE_INV_HQR_HELLFIREONLINE21613": "^2Overlord: ^7AGM raketa je připravena.", + "SUBTITLE_INV_HQR_HELLFIREONLINE31615": "^2Overlord: ^7AGM je připravena. Opakují, AGM je připravena.", + "SUBTITLE_INV_HQR_HELLFIREOFFLINE1617": "^2Overlord: ^7AGM jsou vypnutý.", + "SUBTITLE_INV_HQR_HELLFIREDOWN1619": "^2Overlord: ^7AGM jsou vypnutý Hunter 2-1.", + "SUBTITLE_INV_HQR_PREDATOROFFLINE1620": "^2Overlord: ^7Predátor je odpojen.", + "SUBTITLE_INV_HQR_PREDATOROFFLINE1621": "^2Overlord: ^7UAV bylo odpojeno.", + "SUBTITLE_INV_HQR_PREDATOROFFLINE21622": "^2Overlord: ^7Predátor je odpojen.", + "SUBTITLE_INV_HQR_PREDATOROFFLINE21623": "^2Overlord: ^7UAV bylo odpojeno.", + "SUBTITLE_INV_HQR_FIVENOTENKILLS1624": "^2Overlord: ^7To vypadá na pět, ne, deset zásahů Hunter Dva-Jedna. Pokračujte.", + "SUBTITLE_INV_HQR_TENMORECONFIRMS1625": "^2Overlord: ^7Oh člověče. To je alespoň přes deset zásahů Hunter Dva-Jedna. Dobrá trefa.", + "SUBTITLE_INV_HQR_TENPLUSKIA1626": "^2Overlord: ^7Přes 10 zásahů. Dobrá trefa.", + "SUBTITLE_INV_HQR_FIVEPLUS1627": "^2Overlord: ^7Přes pět zásahů. Dobrá práce Hunter 2-1.", + "SUBTITLE_INV_HQR_ANOTHER5PLUS1628": "^2Overlord: ^7Hunter 2-1, to je přes dalších pět.", + "SUBTITLE_INV_HQR_MORETHANFIVE1629": "^2Overlord: ^7Dobrá trefa. Přes pět zásahů.", + "SUBTITLE_INV_HQR_YOUGOTEM1630": "^2Overlord: ^7Máš je. Dobrá trefa.", + "SUBTITLE_INV_HQR_GOODKILLS1631": "^2Overlord: ^7Dobrá trefa Dva-Jedničko. Dobrý zásah.", + "SUBTITLE_INV_HQR_DIRECTHIT1632": "^2Overlord: ^7To je přímý zásah Hunter 2-1, pokračuj.", + "SUBTITLE_INV_HQR_HESDOWN1633": "^2Overlord: ^7Je po něm.", + "SUBTITLE_INV_TCO_FIREDMISSILE172": "^2Ranger: ^7Někdo právě zničil Predátora!", + "SUBTITLE_INV_TCO_UAVOFFLINE174": "^2Ranger: ^7Predátor je zičen, opakuji, Predátor je zničen!", + "SUBTITLE_INV_HQR_ENEMYHELO181": "^2Overlord: ^7Hunter 2-1, tady Overlord. Vidíme pár nepřátelských vrtulníků, míří k vám, přepínám.", + "SUBTITLE_INV_HQR_RELAYGOL1182": "^2Overlord: ^7Hunter 2-1, zpráva od Goliath Jedna: nepřátelská helikoptéra míří k vám, přepínám.", + "SUBTITLE_INV_TCO_EYESUP183": "^2Des. Dunn: ^7Pozor! Nepřátelský vrtulník!", + "SUBTITLE_INV_SIX_CONCENTRATEFIRE184": "^2Sgt. Foley: ^7Jednotko, palte z RPG! Sestřelte to!", + "SUBTITLE_INV_SIX_KEEPFIRING185": "^2Sgt. Foley: ^7Jednotko, jestli máte RPG, palte! Musíme ho dostat k zemi!", + "SUBTITLE_INV_SIX_TAKEGUNSHIP186": "^2Sgt. Foley: ^7Jednotko! Zničte ten vrtulník, dřív než přijede konvoj! Do toho!", + "SUBTITLE_INV_SIX_ANTIAIRCRAFT187": "^2Sgt. Foley: ^7Týme, najděte protiletadlovou zbraň a sestřelte ten vrtulník!", + "SUBTITLE_INV_SIX_ANOTHERHELO188": "^2Sgt. Foley: ^7Právě přiletěl ten druhý vrtulník! Sestřelte ho!", + "SUBTITLE_INV_SIX_TAKEDOWN189": "^2Sgt. Foley: ^7Rozumím Overlord. Týme! Sestřelte ten vrtulník! Do toho!", + "SUBTITLE_INV_HQR_CAPUNAVAIL1810": "^2Overlord: ^7Hunter 2-1, blíží se k vám nepřátelský vrtulník. CAP je právě nedostupný, hodně štěstí, přepínám.", + "SUBTITLE_INV_SIX_BEFORECONVOY1811": "^2Sgt. Foley: ^7Všem, zničte ten vrtulník dříve, než přijede konvoj! Pohyb!", + "SUBTITLE_INV_TCO_ROOFOFNATES1812": "^2Des. Dunn: ^7Ramirezi! Vidím pár Stingerů na střeše Nateovy restaurace!", + "SUBTITLE_INV_TCO_ROOFOFNATES21813": "^2Des. Dunn: ^7Použij je a sestřel toho hajzla! Běž!", + "SUBTITLE_INV_TCO_KILLTHATHELO1814": "^2Des. Dunn: ^7Ramirezi! Na střeše Nateovy restaurace jsou rakety Stinger!", + "SUBTITLE_INV_TCO_KILLTHATHELO21815": "^2Des. Dunn: ^7Použij je a sestřel ten vrtulník! Běž!", + "SUBTITLE_INV_SIX_CHECKTHEROOF1816": "^2Des. Dunn: ^7Ramirezi! Zkontroluj střechu Nateovy restaurace! Viděl jsem tam Stingery!", + "SUBTITLE_INV_SIX_SUPPLYDROPONROOF1817": "^2Des. Dunn: ^7Ramirezi! Na střeše Nateovy restaurace jsou mezi zásobami rakety Stinger!", + "SUBTITLE_INV_TCO_DISPATCHCHOPPER1818": "^2Des. Dunn: ^7Ramirezi! V té restauraci na západ jsou rakety Stinger!", + "SUBTITLE_INV_TCO_DISPATCHCHOPPER21819": "^2Des. Dunn: ^7Použij je a sestřel ten vrtulník! Kryju tě! Běž!", + "SUBTITLE_INV_TCO_INSIDEDINER1820": "^2Des. Dunn: ^7V zásobách západně jsou rakety Stinger!", + "SUBTITLE_INV_TCO_INSIDEDINER21821": "^2Des. Dunn: ^7Jsou uvnitř restaurace! Kryju tě! Pohyb!", + "SUBTITLE_INV_TCO_NEXTTOSTATION1822": "^2Des. Dunn: ^7Nedaleko čerpací stanice západně je restaurace! Podívej se tam po raketách Stinger!", + "SUBTITLE_INV_TCO_DINERUAV1823": "^2Des. Dunn: ^7V té restauraci, kde máme UAV,jsou rakety Stinger!", + "SUBTITLE_INV_TCO_ROOFOFNATES1824": "^2Sgt. Foley: ^7Týme! Na střeše Nateovy restaurace jsou rakety Stinger!", + "SUBTITLE_INV_TCO_ROOFOFNATES21825": "^2Sgt. Foley: ^7Použijte je a sejměte toho hajzla! Do toho!", + "SUBTITLE_INV_TCO_KILLTHATHELO1826": "^2Sgt. Foley: ^7Na střeše Nateovy restaurace jsou rakety Stinger!", + "SUBTITLE_INV_TCO_KILLTHATHELO21827": "^2Sgt. Foley: ^7Sejmi ten vrtulník! Běž!", + "SUBTITLE_INV_SIX_CHECKTHEROOF1828": "^2Sgt. Foley: ^7Podívej se na střechu Nateovy restaurace! Jsou tam rakety Stinger!", + "SUBTITLE_INV_SIX_SUPPLYDROPONROOF1829": "^2Sgt. Foley: ^7Jednotko! V bednách se zásobami na té střeše, jsou rakety Stinger!", + "SUBTITLE_INV_TCO_DISPATCHCHOPPER1830": "^2Sgt. Foley: ^7Týme! v té restauraci západně jsou rakety Stinger!", + "SUBTITLE_INV_TCO_DISPATCHCHOPPER21831": "^2Sgt. Foley: ^7Použijte je a zničte ten vrtulník! Kryju vás! Běžte!", + "SUBTITLE_INV_TCO_INSIDEDINER1832": "^2Sgt. Foley: ^7V zásobách západně jsou rakety Stinger!", + "SUBTITLE_INV_TCO_INSIDEDINER21833": "^2Sgt. Foley: ^7Jsou v restauraci! Kryju tě! Pohyb!", + "SUBTITLE_INV_TCO_NEXTTOSTATION1834": "^2Sgt. Foley: ^7Přímo vedle čerpací stanice je restaurace! Podívej se tam po raketách Stinger!", + "SUBTITLE_INV_TCO_DINERUAV1835": "^2Sgt. Foley: ^7Viděl jsem pár raket Stinger v restauraci, kde máme ovládací rozhraní Predátora!", + "SUBTITLE_INV_SIX_CONVOYSHERE191": "^2Sgt. Foley: ^7Konvoj je tady! Všichni za mnou! Mizíme sakra odtud! Jdeme, jdeme!", + "SUBTITLE_INV_SIX_SOUTHOFBTOWN192": "^2Sgt. Foley: ^7Ramirezi! Konvoj je kousek jižně od Burger Town, pohni sem s tou svou prdelí! Pohyb!", + "SUBTITLE_INV_TCO_BACKTOCONVOY193": "^2Des. Dunn: ^7Ramirezi! Musíme se dostat zpátky ke konvoji! Jdeme!", + "SUBTITLE_INV_SIX_FRIEDLYCONVOY194": "^2Sgt. Foley: ^7Náš konvoj je na cestě.", + "SUBTITLE_INV_HQR_SITREP195": "^2Overlord: ^7Hunter 2-1, tady Overlord, hlaste se, přepínám.", + "SUBTITLE_INV_SIX_CARGOSECURE196": "^2Sgt. Foley: ^7Overlorde, tady Hunter 2-1. Křehká zásilka je v bezpečí, opakuji, křehká zásilka je v bezpečí. Jsme na cestě. ", + "SUBTITLE_INV_HQR_GOODJOB197": "^2Overlord: ^7Overlord rozumí. Dobrá práce. Přepínám.", + "SUBTITLE_INV_FLY_2KCIVVIES198": "^2Sgt. Foley: ^7Jednotko, pořád máme 2,000 civlistů v Arkádii! Jestli tam máte rodinu, tak je dnes vás šťastný den - jdeme jim zachránit životy!", + "SUBTITLE_INV_SIX_NICEONETEAM201": "^2Sgt. Foley: ^7Dobrá práce! Je po něm.", + "SUBTITLE_INV_SIX_NICEONEHELI202": "^2Sgt. Foley: ^7Výborně týme!", + "SUBTITLE_OILRIG_NSL_OUTTOGETHER41": "^2Kapitán MacTavish: ^7Jsem na místě. Dostaneme je najednou. Ty první.", + "SUBTITLE_OILRIG_NSL_SAMETIME42": "^2Kapitán MacTavish: ^7Sundáme je zaráz...začni první.", + "SUBTITLE_OILRIG_NSL_BOTHOUT43": "^2Kapitán MacTavish: ^7Sejmeme je oba...začni první.", + "SUBTITLE_OILRIG_NSL_INPOSITION44": "^2Kapitán MacTavish: ^7Na místě...začni první.", + "SUBTITLE_OILRIG_NSL_SECT1ALPHA51": "^2Kapitán MacTavish: ^7Dva hlídači odstraněni v sekci Jedna-Alpha. Jdeme do sekce Dva. ", + "SUBTITLE_OILRIG_SBC_ROGERHTLSIX52": "^2Velitel mise: ^7Rozumím, Hotel Šest. ", + "SUBTITLE_OILRIG_NSL_READYWEAPONS53": "^2Kapitán MacTavish: ^7Připravte si zbraně.", + "SUBTITLE_OILRIG_NSL_MOVEUP254": "^2Kapitán MacTavish: ^7Pohyb. ", + "SUBTITLE_OILRIG_NSL_KEEPITTIGHT55": "^2Kapitán MacTavish: ^7Soustřeďte se lidi.", + "SUBTITLE_OILRIG_NSL_EYESOPEN56": "^2Kapitán MacTavish: ^7Mějte oči otevřené. Hlídejte si sekce.", + "SUBTITLE_OILRIG_NSL_GETREADY57": "^2Kapitán MacTavish: ^7Připravte se.", + "SUBTITLE_OILRIG_NS1_VISBYRAILING61": "^2Ghost: ^7Jsou za tím zábradlím.", + "SUBTITLE_OILRIG_NSL_SUPPWEAPONS62": "^2Kapitán MacTavish: ^7Můžete pálit. Jenom zbraně s tlumičem.", + "SUBTITLE_OILRIG_SBC_CIVILHOSTAGES63": "^2Velitel mise: ^7Civilní rukojmí na vaší pozici, dávejte pozor.", + "SUBTITLE_OILRIG_NSL_TM1TOBREACH64": "^2Kapitán MacTavish: ^7Rozumím. Tým Jedna jde ke dveřím.", + "SUBTITLE_OILRIG_NSL_FRAMECHARGE65": "^2Kapitán MacTavish: ^7Dej na ty dveře trhavinu. Zasáhneme z obou stran.", + "SUBTITLE_OILRIG_NSL_CHARGEONDOOR66": "^2Kapitán MacTavish: ^7Dej na dveře trhavinu. Zasáhneme z obou stran.", + "SUBTITLE_OILRIG_NSL_BLOWDOORS67": "^2Kapitán MacTavish: ^7Odpal ty dveře. Zasáhneme je z obou stran. ", + "SUBTITLE_OILRIG_NSL_INTOPOSTION68": "^2Kapitán MacTavish: ^7Na mistě. ", + "SUBTITLE_OILRIG_NS1_INPOSITION69": "^2Ghost: ^7Na místě. ", + "SUBTITLE_OILRIG_NS1_READYBREACH611": "^2Ghost: ^7Připraven. ", + "SUBTITLE_OILRIG_NS1_INPOSBREACH613": "^2Ghost: ^7Na místě.", + "SUBTITLE_OILRIG_NS1_BREACHING615": "^2Ghost: ^7Jdeme na to. ", + "SUBTITLE_OILRIG_NS1_PLANTINGCHARGE617": "^2Ghost: ^7Umísťuju trhavinu.", + "SUBTITLE_OILRIG_NS1_PLANTFRMCHARGE619": "^2Ghost: ^7Umísťuju výbušninu.", + "SUBTITLE_OILRIG_NS1_WATCHFIELDFIRE621": "^2Ghost: ^7Hlídej si, kam střílíš. ", + "SUBTITLE_OILRIG_NS2_CHECKTARGETS622": "^2Ghost: ^7Kontroluj si cíle. Máme tu civilisty.", + "SUBTITLE_OILRIG_NS1_ONMARKGO623": "^2Ghost: ^7Na moje znamení...běž!", + "SUBTITLE_OILRIG_NS1_ONMYMARK624": "^2Ghost: ^7Na moje znamení..", + "SUBTITLE_OILRIG_NS1_GO625": "^2Ghost: ^7Běž!", + "SUBTITLE_OILRIG_NS1_BREACHWATCHFIRE629": "^2Ghost: ^7Jdeme na to. Střílej opatrně", + "SUBTITLE_OILRIG_NS2_BREACHCHECKTARG630": "^2Ghost: ^7Jdeme na to. Střílej opatrně. ", + "SUBTITLE_OILRIG_NS1_WERECLEAR631": "^2Ghost: ^7Máme čisto.", + "SUBTITLE_OILRIG_NSL_WERECLEAR631": "^2Kapitán MacTavish: ^7Čistý. ", + "SUBTITLE_OILRIG_NS1_ROOMCLEAR632": "^2Ghost: ^7Čisto.", + "SUBTITLE_OILRIG_NSL_ROOMCLEAR632": "^2Kapitán MacTavish: ^7Čisto.", + "SUBTITLE_OILRIG_NS1_CLEAR633": "^2Ghost: ^7Čisto.", + "SUBTITLE_OILRIG_NSL_CLEAR633": "^2Kapitán MacTavish: ^7Čisto.", + "SUBTITLE_OILRIG_NSL_PRECIOUSCARGO637": "^2Kapitán MacTavish: ^7Křehká zásilka zabezpečena v sekci Dva-Echo.", + "SUBTITLE_OILRIG_NSL_HOSTSEC638": "^2Kapitán MacTavish: ^7Rukojmí zabezpečení v sekci Dva-Echo.", + "SUBTITLE_OILRIG_NSL_PACKSEC639": "^2Kapitán MacTavish: ^7Balíčky zabezpečeny v sekci Dva-Echo.", + "SUBTITLE_OILRIG_SBC_SECANDEVAC71": "^2Velitel mise: ^7Rozumím Hotel Šest, Tým 2 zabezpečí evekauaci, pokračujte v hledání nahoře.", + "SUBTITLE_OILRIG_SBC_SECANDEVAC72": "^2Velitel mise: ^7Rozumím Hotel Šest, Tým 2 zabezpečí evakuaci, jděte nahoru a zabezpečte zbývající civilisty.", + "SUBTITLE_OILRIG_NS2_GETTOPSIDE73": "^2Voják TF-141: ^7Jděte nahoru, máme to tu pod kontrolou.", + "SUBTITLE_OILRIG_NS2_GETMOVING74": "^2Voják TF-141: ^7Roachi, jdi nahoru, tahle místnost je zabezpečena.", + "SUBTITLE_OILRIG_NS2_REGROUPTOPSIDE75": "^2Voják TF-141: ^7Máme tři civilisty. Seskup se se zbytkem týmu nahoře.", + "SUBTITLE_OILRIG_NS2_MOVEUP76": "^2Voják TF-141: ^7Máme to tu pod kontrolou. Jdi se svým týmem nahoru. ", + "SUBTITLE_OILRIG_NSL_ALLTEAMSMOVE77": "^2Kapitán MacTavish: ^7Všem týmům, jdeme. ", + "SUBTITLE_OILRIG_NSL_OSCARMDECK278": "^2Kapitán MacTavish: ^7Jdeme. Jsme na cestě - jdeme do 2. podlaží.", + "SUBTITLE_OILRIG_NSL_WATCHSECTORS79": "^2Kapitán MacTavish: ^7Jdi do 2. podlaží a hlídej svoje sektory.", + "SUBTITLE_OILRIG_NSL_DECK2710": "^2Kapitán MacTavish: ^7Jdeme do 2. podlaží.", + "SUBTITLE_OILRIG_NSL_MOVEUPSTAIRS711": "^2Kapitán MacTavish: ^7Dobrá, jděte nahoru. Velení - jdeme do 2. podlaží.", + "SUBTITLE_OILRIG_NSL_LETSMOVE712": "^2Kapitán MacTavish: ^7Jdeme - ve vyšších patrech jsou civilisté.", + "SUBTITLE_OILRIG_NSL_SPLITUP713": "^2Kapitán MacTavish: ^7Rozdělte se. Můžeme je obejít touto cestou.", + "SUBTITLE_OILRIG_SBC_LOWPROFILE81": "^2Velitel mise: ^7Nepřátelský vrtulník střeží perimetr. Držte se u země, Hotel Šest. ", + "SUBTITLE_OILRIG_NSL_ROGERTHAT82": "^2Kapitán MacTavish: ^7Rozumím.", + "SUBTITLE_OILRIG_NS1_HELOAPPROACH83": "^2Ghost: ^7Blíží se vrtulník. K zemi.", + "SUBTITLE_OILRIG_NS2_HELOGETDOWN84": "^2Ghost: ^7Vrtulník. K zemi.", + "SUBTITLE_OILRIG_NS1_CHOPPERINBOUND85": "^2Ghost: ^7Blíží se vrtulník, kryjte se.", + "SUBTITLE_OILRIG_NSL_GETOUTTASIGHT86": "^2Kapitán MacTavish: ^7Nepřátelský vrtulník, zmizte z dohledu.", + "SUBTITLE_OILRIG_NSL_OKMOVE87": "^2Kapitán MacTavish: ^7Pohyb.", + "SUBTITLE_OILRIG_NSL_MOVE88": "^2Kapitán MacTavish: ^7Jdi. ", + "SUBTITLE_OILRIG_NSL_ALLCLEARMOVE89": "^2Kapitán MacTavish: ^7Čisto, pohyb.", + "SUBTITLE_OILRIG_NSL_BEENSPOTTED810": "^2Kapitán MacTavish: ^7Všimli si nás.", + "SUBTITLE_OILRIG_NSL_COMPROMISED811": "^2Kapitán MacTavish: ^7Odhalili nás.", + "SUBTITLE_OILRIG_NSL_DETECTED812": "^2Kapitán MacTavish: ^7Všimli si nás.", + "SUBTITLE_OILRIG_SBC_HOSTATPOSITION91": "^2Velitel mise: ^7Hotel Šest, další rukojmí na vaší pozici.", + "SUBTITLE_OILRIG_NSL_COPYTHAT92": "^2Kapitán MacTavish: ^7Rozumím.", + "SUBTITLE_OILRIG_NSL_STRONGHOLDSEC93": "^2Kapitán MacTavish: ^7Velení - rukojmí v 2. patře zabezpečeni.", + "SUBTITLE_OILRIG_NS1_HAVECOMPANY94": "^2Ghost: ^7Nepřátelský přenos....Myslím, že tu budeme mít společnost pane...", + "SUBTITLE_OILRIG_NSL_GOINGLOUD97": "^2Kapitán MacTavish: ^7Připravte plán B. Dejte na ty těla C4, honem.", + "SUBTITLE_OILRIG_NSL_PLANTC498": "^2Kapitán MacTavish: ^7Umísti C4 na mrtvoly. Hlídka tu bude každou chvíli.", + "SUBTITLE_OILRIG_NSL_DONTHAVETIME99": "^2Kapitán MacTavish: ^7Hned dej na ty těla C4. Nemáme moc času.", + "SUBTITLE_OILRIG_NS1_FORASURPRISE910": "^2Ghost: ^7Výbušniny umístěny. Až najdou tyhle těla, budou překvapení. ", + "SUBTITLE_OILRIG_NS2_C4PLACED911": "^2Ghost: ^7C4 umístěny, pane. ", + "SUBTITLE_OILRIG_NSL_AMBUSHTHEM912": "^2Kapitán MacTavish: ^7Běž na vyvýšené místo. Překvapíme je, až najdou ty těla.", + "SUBTITLE_OILRIG_NSL_INVESTIGATE913": "^2Kapitán MacTavish: ^7Dostaň se na vyvýšené místo. Až sem přijdou, překvapíme je.", + "SUBTITLE_OILRIG_NSL_ELEVATEDPOSWAIT914": "^2Kapitán MacTavish: ^7Musíme nastražit past. Jdi na vyvýšené místo a čekej.", + "SUBTITLE_OILRIG_NSL_HOLDFIRE915": "^2Kapitán MacTavish: ^7Tam je ta hlídka. Nestřílej, dokud nebudou blíž.", + "SUBTITLE_OILRIG_NSL_STANDBY1916": "^2Kapitán MacTavish: ^7Vydržte....", + "SUBTITLE_OILRIG_NSL_DOIT919": "^2Kapitán MacTavish: ^7Plán B. Odpal to.", + "SUBTITLE_OILRIG_NSL_COVERBLOWN101": "^2Kapitán MacTavish: ^7Velení, tady Hotel Šest. Naše krytí je prozrazeno.", + "SUBTITLE_OILRIG_SBC_POSSIBLEEXPL102": "^2Velitel mise: ^7Rozumím, máme informace, že v nejvyšším podlaží jsou další civilisté a výbušniny. ", + "SUBTITLE_OILRIG_SBC_SECTHATLOC103": "^2Velitel mise: ^7Váš tým musí to místo zabezpečit, pak dorazí posily, které se postarají o SAM, přepínám.", + "SUBTITLE_OILRIG_NSL_COPYTHAT2104": "^2Kapitán MacTavish: ^7Rozumím, pracujeme na tom. Přepínám.", + "SUBTITLE_OILRIG_NSL_TAKEOUTBIRD4111": "^2Kapitán MacTavish: ^7Ten vrtulník nás má na mušce. Najdi RPG nebo rakety a sestřel ho.", + "SUBTITLE_OILRIG_NSL_TAKEOUTBIRD5112": "^2Kapitán MacTavish: ^7Musíme se zbavit toho vrtulníku. Podívej se po nějaké zbrani a sestřel ho.", + "SUBTITLE_OILRIG_NSL_TAKEOUTBIRD6113": "^2Kapitán MacTavish: ^7Sestřel ten vrtulník, má nás v pasti!", + "SUBTITLE_OILRIG_NS3_LBNEUTRALIZED114": "^2Ghost: ^7Nepřátelský vrtulník byl zneškodněn.", + "SUBTITLE_OILRIG_NS1_GETDOWN115": "^2Ghost: ^7Nepřátelský vrtulník! K zemi!", + "SUBTITLE_OILRIG_NS2_ENEMYHELO116": "^2Ghost: ^7Vrtulník! Kryjte se!", + "SUBTITLE_OILRIG_NS1_ATTACKHELI117": "^2Ghost: ^7Vrtulník na 12. hodině, kryjte se!", + "SUBTITLE_OILRIG_NSL_TAKEOUTBIRD1119": "^2Kapitán MacTavish: ^7Najdi nějaký rakety nebo RPG a sestřel ten vrtulník.", + "SUBTITLE_OILRIG_NSL_TAKEOUTBIRD21111": "^2Kapitán MacTavish: ^7Zneškodni ten vrtulník. Zkus najít nějaké rakety.", + "SUBTITLE_OILRIG_NSL_TAKEOUTBIRD31112": "^2Kapitán MacTavish: ^7Ten vrtulník nás má v pasti. Sejmi ho raketami.", + "SUBTITLE_OILRIG_NS2_FIREAT41113": "^2Ghost: ^7Střílím AT4.", + "SUBTITLE_OILRIG_NS3_FIREMISSILE1114": "^2Ghost: ^7Střílím raketu.", + "SUBTITLE_OILRIG_NS2_CLEARSHOT1115": "^2Ghost: ^7Nemůžu zamířit.", + "SUBTITLE_OILRIG_NSL_TAKEOUTBIRD71116": "^2Kapitán MacTavish: ^7Sejmi ten vrtulník, použij rakety.", + "SUBTITLE_OILRIG_NSL_TAKEOUTBIRD81117": "^2Kapitán MacTavish: ^7Ten vrtulník nás má v hrsti, sejmi ho.", + "SUBTITLE_OILRIG_NSL_TAKEOUTBIRD91118": "^2Kapitán MacTavish: ^7Začněte pálit po tom vrtulníku.", + "SUBTITLE_OILRIG_NS3_NICESHOT121": "^2Ghost: ^7Je po vrtulníku. Pěkná trefa.", + "SUBTITLE_OILRIG_NS2_NICEWORK122": "^2Ghost: ^7Dobrá práce.", + "SUBTITLE_OILRIG_NS2_GOODSHOT123": "^2Ghost: ^7Vrtulník zasažen. Dobrá trefa.", + "SUBTITLE_OILRIG_NS2_TACOMAN124": "^2Ghost: ^7Dobrá trefa Roachi.", + "SUBTITLE_OILRIG_NS3_TACOMAN125": "^2Ghost: ^7Dobrá trefa Roachi.", + "SUBTITLE_OILRIG_SBC_GETTOLZ131": "^2Velitel mise: ^7Hotel Šest, rukojmí z nižších podlaží jsou odváženi Týmem 2. Dostaňte se nahoru a zabezpečte zbytek, přepínám.", + "SUBTITLE_OILRIG_NSL_CALLFOREXFIL132": "^2Kapitán MacTavish: ^7Rozumím. Zavoláme pro extrakci v bodu Bravo.", + "SUBTITLE_OILRIG_NSL_CENTCOM133": "^2Kapitán MacTavish: ^7Velení nás potřebuje úplně nahoře, aby mohli poslat Mariňáky. Pohyb.", + "SUBTITLE_OILRIG_NSL_CLOCKSTICKING134": "^2Kapitán MacTavish: ^7Čas utíká. Potřebujeme se dostat nahoru a zabezpečit zbývající rukojmí, než zavoláme Mariňáky.", + "SUBTITLE_OILRIG_NSL_RESCUETHEMSELVES135": "^2Kapitán MacTavish: ^7Pojďme! Ti rukojmí se nezachrání sami.", + "SUBTITLE_OILRIG_NSL_OUTFLANK141": "^2Kapitán MacTavish: ^7Obejdi je.", + "SUBTITLE_OILRIG_NS3_AIMFUELTANKS151": "^2Ghost: ^7Zamiř na nádrž.", + "SUBTITLE_OILRIG_NS2_SHOOTTANKS152": "^2Ghost: ^7Střílej na nádrže.", + "SUBTITLE_OILRIG_NS3_AIMFUELSTORAGE153": "^2Ghost: ^7Zamiř na nádrže s palivem.", + "SUBTITLE_OILRIG_NSL_FIREFUELSTORAGE154": "^2Kapitán MacTavish: ^7Střílej na ty nádrže s palivem.", + "SUBTITLE_OILRIG_NS2_POPSMOKE161": "^2Ghost: ^7Kryjí se kouřem.", + "SUBTITLE_OILRIG_NS2_SMOKESCREEN162": "^2Ghost: ^7Termální vidění.", + "SUBTITLE_OILRIG_NSL_SEETHRUSMOKE163": "^2Kapitán MacTavish: ^7Všem týmům: ti chlapi mají výhodu - používají termální vidění.", + "SUBTITLE_OILRIG_NS3_ENEMPOP164": "^2Ghost: ^7Nepřítel se kryje kouřem.", + "SUBTITLE_OILRIG_NSL_GETTARGET165": "^2Kapitán MacTavish: ^7Ti chlapi mají termální vidění. Zůstaňte mimo kouř.", + "SUBTITLE_OILRIG_NS3_SMOKESCREEN166": "^2Ghost: ^7Hází kouřové granáty.", + "SUBTITLE_OILRIG_NS2_HOSTPOPSMOKE167": "^2Ghost: ^7Nepřátele se kryjí kouřem.", + "SUBTITLE_OILRIG_NSL_PICKOFF171": "^2Kapitán MacTavish: ^7Jestli máš termální vidění, teď je vhodný čas!", + "SUBTITLE_OILRIG_NS3_SWITCHING172": "^2Ghost: ^7Nepřátelé používají termální vidění...přepínám na termální vidění...", + "SUBTITLE_OILRIG_SBC_HOSTCONFIRMED181": "^2Velitel mise: ^7Hotel Šest, rukojmí byli potvrzení na vaší pozici s možnými výbušninami, přepínám.", + "SUBTITLE_OILRIG_NSL_BEHINDDOORS182": "^2Kapitán MacTavish: ^7Rozumím. Všem týmům pozor - nevíme co je za těmi dveřmi.", + "SUBTITLE_OILRIG_NSL_ALLHOSTSEC191": "^2Kapitán MacTavish: ^7Velení, všichni rukojmí byli zabezpečení. Opakuji - všichni rukojmí zabezpečení. Přemísťujeme se do bodu Bravo, přepínám.", + "SUBTITLE_OILRIG_SBC_PHASE2192": "^2Velitel mise: ^7Dobrá práce, Hotel Šest. Mariňáci jsou na cestě, kvůli těm SAM sítím. Připravte svůj tým na fázi dvě. Přepínám.", + "SUBTITLE_ROADKILL_SHP_ONTHELINE11": "^2Shepherd: ^7Vstaňte vojíne Allene!", + "SUBTITLE_ROADKILL_SHP_ONTHELINE11_2": "^2Shepherd: ^7Braňte cestu vojáku! Pohyb!", + "SUBTITLE_ROADKILL_FLY_WERESWIMMING12": "^2Sgt. Foley: ^7Hunter 2! Nepřestávejte tlačit na ty RPG týmy! Jestli to ten most nevydrží, tak jsme v háji, hmm? ", + "SUBTITLE_ROADKILL_FLY_YOURM20313": "^2Sgt. Foley: ^7Allene! Použij M203!", + "SUBTITLE_ROADKILL_FLY_ACROSSRIVER14": "^2Sgt. Foley: ^7Trochu je za tou řekou pokropte!", + "SUBTITLE_ROADKILL_FLY_10OCLOCKHIGH15": "^2Sgt. Foley: ^7Na mostu, 10. hodina nahoře! Víc cílů, střílejte!", + "SUBTITLE_ROADKILL_FLY_ONTHEBRIDGE16": "^2Sgt. Foley: ^7Támhle na mostě!", + "SUBTITLE_ROADKILL_CPD_FARSIDE17": "^2Des. Dunn: ^7Na opačné straně mostu!", + "SUBTITLE_ROADKILL_CPD_BRIDGELAYER18": "^2Des. Dunn: ^7Jdou k mostu!", + "SUBTITLE_ROADKILL_AR1_10OCLOCK19": "^2Ranger: ^7Jsou na mostě, 10. hodina nahoře!", + "SUBTITLE_ROADKILL_FLY_MAKINGAPUSH111": "^2Sgt. Foley: ^7Nahoře! Snaží se dostat k tomu mostu! Zažeňte je zpátky!", + "SUBTITLE_ROADKILL_FLY_KEEPHITTING112": "^2Sgt. Foley: ^7Stahují se, nepřestávejte střílet!", + "SUBTITLE_ROADKILL_FLY_BRIDGECOMPLETE113": "^2Sgt. Foley: ^7Hunter 2! Most dokončen, jsme na cestě! Pohyb!", + "SUBTITLE_ROADKILL_FLY_KNOCKITOFF222": "^2Sgt. Foley: ^7Jedeme! Hunter 2, jsme na cestě! Pohyb!", + "SUBTITLE_ROADKILL_SHP_TAKETOWN223": "^2Shepherd: ^7Allene - dobrá práce s tou střelbou na nepřátelská vozidla. Ted pojď sem k tomu kulometu.", + "SUBTITLE_ROADKILL_CPD_MOVINOUT31": "^2Des. Dunn: ^7Vyrážíme!", + "SUBTITLE_ROADKILL_AR3_BACKINVEHICLE33": "^2Ranger: ^7Jdeme, jdeme! Šoupni ten svůj zadek zpátky do vozu.", + "SUBTITLE_ROADKILL_FLY_MOVINGOUT38": "^2Sgt. Foley: ^7Vyrážíme!", + "SUBTITLE_ROADKILL_FLY_MOUNTUP39": "^2Sgt. Foley: ^7Ke zbrani!", + "SUBTITLE_ROADKILL_FLY_COMEONGETIN310": "^2Ranger: ^7Allene, nastup!", + "SUBTITLE_ROADKILL_FLY_HOLDINGUPLINE311": "^2Ranger: ^7Allene, nastup do humvee, zdržuješ to tu!", + "SUBTITLE_ROADKILL_FLY_HURRYUP312": "^2Ranger: ^7Vojíne, pospěš si!", + "SUBTITLE_ROADKILL_FLY_MOVELETSGO313": "^2Sgt. Foley: ^7Allene, pohni zadkem, jedeme!", + "SUBTITLE_ROADKILL_AR1_10SECONDS48": "^2Ranger: ^710 vteřin!", + "SUBTITLE_ROADKILL_AR3_DANGERCLOSE415": "^2Ranger: ^7Hele, není tohle příliš blízko pro letecký útok?", + "SUBTITLE_ROADKILL_CPD_SINCEWHEN416": "^2Des. Dunn: ^7No tak, odkdy se Shepherd stará, kdy je to nebezpečné?", + "SUBTITLE_ROADKILL_CPD_OSCARMIKE427": "^2Des. Dunn: ^7Dobrá, jsme na cestě!", + "SUBTITLE_ROADKILL_AR3_ONTHEMOVE428": "^2Ranger: ^7Jsme na cestě!", + "SUBTITLE_ROADKILL_FLY_EYEOUTFORCIV53": "^2Sgt. Foley: ^7Všem jednotkám Hunter 2, dávejte pozor na civlisty, nejsme oprávnění zasáhnout, musí začít střílet oni.", + "SUBTITLE_ROADKILL_FLY_SCANROOFTOPS54": "^2Sgt. Foley: ^7Dávej pozor na střechy. Zůstaň v klidu.", + "SUBTITLE_ROADKILL_CPD_SEEANYTHING55": "^2Ranger: ^7Vidíš něco?", + "SUBTITLE_ROADKILL_CPD_PLACEISDEAD56": "^2Des. Dunn: ^7Člověče, nevidím vůbec nic. Je tu mrtvo.", + "SUBTITLE_ROADKILL_FLY_CROSSSTREETELIZ58": "^2Sgt. Foley: ^7Overlord, tady Hunter 2-1. Projíždíme tunelem Harvey, přes ulici Elizabeth.", + "SUBTITLE_ROADKILL_HQR_CAUTION59": "^2Overlord: ^7Rozumím Hunter 2-1, pokračujte opatrně.", + "SUBTITLE_ROADKILL_CPD_WILDWEST510": "^2Des. Dunn: ^7Dobrá, chlapi zůstaňte v klidu, tohle je jak divokej západ. ", + "SUBTITLE_ROADKILL_AR3_ROGERTHAT511": "^2Ranger: ^7Rozumím.", + "SUBTITLE_ROADKILL_FLY_WATCHALLEYS512": "^2Des. Dunn: ^7Pozor na ty civilisty.", + "SUBTITLE_ROADKILL_AR3_COVERING513": "^2Ranger: ^7Kryju to.", + "SUBTITLE_ROADKILL_AR1_PROBABLEMILITIA514": "^2Hunter 2-3: ^7Tři vojáci, balkón na 12., zřejmě milice.", + "SUBTITLE_ROADKILL_FLY_ARETHEYARMED515": "^2Sgt. Foley: ^7Jsou ozbrojení?", + "SUBTITLE_ROADKILL_AR1_WATCHINGUS516": "^2Hunter 2-3: ^7Negativní, jen se na nás dívají.", + "SUBTITLE_ROADKILL_CPD_SCOUTINGUS517": "^2Des. Dunn: ^7Vsadím se, že špehujou.", + "SUBTITLE_ROADKILL_FLY_DOESNTMEAN518": "^2Ranger: ^7No, to ale neznamená, že je můžem zastřelit.", + "SUBTITLE_ROADKILL_FLY_NOTHINGTHERE519": "^2Des. Dunn: ^7Allene, na co střílíš, nic tu není! Přestaň s tím!", + "SUBTITLE_ROADKILL_FLY_CEASEFIRE520": "^2Des. Dunn: ^7Allene! Přestaň střílet!", + "SUBTITLE_ROADKILL_AR2_SEEEM71": "^2Ranger: ^7Vidíš je? Vidíš je?", + "SUBTITLE_ROADKILL_CPD_DONTSEEJACK72": "^2Des. Dunn: ^7Nic nevidím!", + "SUBTITLE_ROADKILL_FLY_PREPENG73": "^2Sgt. Foley: ^7Všem jednotkám Hunter, tady seržant Foley. Připravte se zasáhnout, střílí po nás odstřelovači.", + "SUBTITLE_ROADKILL_CPD_GOININ74": "^2Des. Dunn: ^7Připravte se! Jdeme na to!", + "SUBTITLE_ROADKILL_AR1_SPINEMUP75": "^2Ranger: ^7Je to tady! Pokropte je!", + "SUBTITLE_ROADKILL_CPD_WATCHMVMNT78": "^2Des. Dunn: ^7Pozor na pohyb!", + "SUBTITLE_ROADKILL_CPD_LIGHTEMUP713": "^2Des. Dunn: ^7Tady jsou, pokropte je!", + "SUBTITLE_ROADKILL_CPD_BACKUP714": "^2Des. Dunn: ^7Je jich tu moc! Stáhněte se!", + "SUBTITLE_ROADKILL_CPD_OUTTAHERE715": "^2Des. Dunn: ^7Dostaň nás odtud! Jeď!", + "SUBTITLE_ROADKILL_FLY_STRUNGOUT83": "^2Sgt. Foley: ^7Zpomal, trháme se!", + "SUBTITLE_ROADKILL_CPD_KEEPMOVING84": "^2Des. Dunn: ^7Jeď dál!", + "SUBTITLE_ROADKILL_AR2_SHOTUP85": "^2Hunter 2-3: ^7Hunter 2-1, tady Hunter 2-3, Haggerty je ošklivě zraněn a střílí po nás, kde jste?", + "SUBTITLE_ROADKILL_FLY_HANGTIGHT86": "^2Sgt. Foley: ^7Rozumím Hunter 2-3! Vydržte! Vracíme se k vám, přepínám!", + "SUBTITLE_ROADKILL_AR2_SOLIDCOPY87": "^2Hunter 2-3: ^7Hunter 2-3 rozumí!", + "SUBTITLE_ROADKILL_AR3_GOINGON88": "^2Overlord: ^7Hunter 2-1, tady Overlord. Co se tam děje, přepínám?", + "SUBTITLE_ROADKILL_FLY_TOOKFIRE89": "^2Sgt. Foley: ^7Overlorde, jsme pod palbou a odříznutí od Hunter 2-3! Pracujeme na cestě zpět, přepínám!", + "SUBTITLE_ROADKILL_AR3_SOLIDCOPY810": "^2Overlord: ^7Rozumím 2-1. Overlord přepíná.", + "SUBTITLE_ROADKILL_CPD_CUTOFF811": "^2Des. Dunn: ^7Jsme odříznutí!", + "SUBTITLE_ROADKILL_FLY_PUSHTHROUGH812": "^2Sgt. Foley: ^7Jeď přes ně!", + "SUBTITLE_ROADKILL_FLY_RPGTOPFLOOR813": "^2Sgt. Foley: ^7RPG! Nahoře! Před námi!", + "SUBTITLE_ROADKILL_FLY_GETOFFSTREET91": "^2Sgt. Foley: ^7Musíme se z té ulice dostat!", + "SUBTITLE_ROADKILL_FLY_EVERYBODYOK92": "^2Sgt. Foley: ^7Jsou všichni v pořádku?", + "SUBTITLE_ROADKILL_CPD_MOVINAROUNDUP96": "^2Des. Dunn: ^7Pohybují se nahoře!", + "SUBTITLE_ROADKILL_FLY_EYESONSCHOOL97": "^2Sgt. Foley: ^7Hunter 2-1 Hunter 2-3, Vidím tu školu, přepínám!", + "SUBTITLE_ROADKILL_FLY_SECURETOPFLOOR97": "^2Sgt. Foley: ^7Zmizte sakra od těch oken a zabezpečte vrchní patro! Pohyb!", + "SUBTITLE_ROADKILL_AR3_INEFFECTIVE98": "^2Hunter 2-3: ^72-1, nemůžeme tu střílet! Jsme pod těžkou palbou ze školy, můžete nám pomoct, přepínám?!", + "SUBTITLE_ROADKILL_FLY_KEEPITTOGETHER99": "^2Sgt. Foley: ^7Držte se spolu 2-3! Jsme na cestě! 2-1 přepíná!", + "SUBTITLE_ROADKILL_FLY_PRESSUREOFF910": "^2Sgt. Foley: ^7Pokračujte! Musíme strhnout pozornost od Hunter 2-3!", + "SUBTITLE_ROADKILL_FLY_GETFLASHBANG911": "^2Sgt. Foley: ^7Hod tam flashgranát!", + "SUBTITLE_ROADKILL_CPD_FRONTOFSCHOOL912": "^2Des. Dunn: ^7Cíle, před školou! Sejmi je!", + "SUBTITLE_ROADKILL_FLY_FOLLOWME913": "^2Sgt. Foley: ^7Jednotko za mnou, jdeme!", + "SUBTITLE_ROADKILL_FLY_FALLINGBACK913": "^2Sgt. Foley: ^7Stahují se zpátky do školy!", + "SUBTITLE_ROADKILL_CPD_CLASSONRIGHT914": "^2Des. Dunn: ^7Hej, dávej pozor! Někteří z nich se stáhli do té třídy vpravo!", + "SUBTITLE_ROADKILL_CPD_CLEAR915": "^2Des. Dunn: ^7Čisto!", + "SUBTITLE_ROADKILL_CPD_2COMINOUT916": "^2Des. Dunn: ^7Dva vycházejí!", + "SUBTITLE_ROADKILL_CPD_3COMINOUT917": "^2Des. Dunn: ^7Tři vycházejí!", + "SUBTITLE_ROADKILL_FLY_INTHESCHOOL918": "^2Sgt. Foley: ^7Hunter 2-3, Hunter 2-1, jsme ve škole. Silný odpor.", + "SUBTITLE_ROADKILL_SHP_COPYTHAT21919": "^2Hunter 2-3: ^7Rozumím Hunter 2-1.", + "SUBTITLE_ROADKILL_CPD_HISTORYCLASS920": "^2Des. Dunn: ^7Jo, teď se prodírám učebnou dějepisu.", + "SUBTITLE_ROADKILL_FLY_ROGERTHAT921": "^2Sgt. Foley: ^7Rozumím.", + "SUBTITLE_ROADKILL_FLY_SAWONE922": "^2Sgt. Foley: ^7Myslím, že jeden vběhl do té třídy.", + "SUBTITLE_ROADKILL_SHP_THANKSFORASSIST101": "^2Hunter 2-3: ^7Hunter 2-1, tady Hunter 2-3, díky za asistenci! Odjíždíme na humvee Hunter Tři, přepínám!", + "SUBTITLE_ROADKILL_FLY_ALLTHEWAYSIR102": "^2Sgt. Foley: ^7Rozumím 2-3.", + "SUBTITLE_ROADKILL_SHP_ALLTHEWAY103": "^2Hunter 2-3: ^7Uvidíme se na opačné straně Hunter 2-1, 2-3 přepíná.", + "SUBTITLE_ROADKILL_FLY_TOGOLIATH111": "^2Sgt. Foley: ^7Hunter 2-1 Actual Overlord.", + "SUBTITLE_ROADKILL_AR3_SENDTRAFFIC112": "^2Overlord (HQ Rádio): ^7Hunter 2-1 Actual, tady Overlord, podejte hlášení.", + "SUBTITLE_ROADKILL_FLY_SCHOOLSECURE113": "^2Sgt. Foley: ^7Škola je zabezpečená a nepřátelské jednotky ustupují ze zóny. Teď zrovna čistíme.", + "SUBTITLE_ROADKILL_AR3_RALLYPOINT114": "^2Overlord (HQ Rádio): ^7Rozumím Hunter 2-1 Actual, opatrně pokračujte na shromaždiště. EPW pořád mohou být v zóně. Přepínám.", + "SUBTITLE_ROADKILL_FLY_THANKSFORTIP115": "^2Sgt. Foley: ^7Rozumím Overlorde, díky. Končím.", + "SUBTITLE_ROADKILL_FLY_WATCHSTRAGGLERS116": "^2Sgt. Foley: ^7Jednotko, pozor na nepřátelské opozdilce! Honem na shromaždiště! ", + "SUBTITLE_ROADKILL_FLY_LASTOFEM117": "^2Sgt. Foley: ^7Čisto!", + "SUBTITLE_ROADKILL_SHP_SHOCKTRAUMA121": "^2Shepherd: ^7Dostaňte zraněné na traumatologii! Použijte můj vrtulník!", + "SUBTITLE_ROADKILL_SHP_GOODWORK122": "^2Shepherd: ^7Pánové, dobrá práce při obsazení toho města.", + "SUBTITLE_ROADKILL_SHP_SPECIALOP123": "^2Shepherd: ^7Vojíne Allene, odteď budete přijímat rozkazy ode mě. Ostatní vám řeknu ve vrtulníku. Jdeme.", + "SUBTITLE_SO_CHOP_INV_HP1_LZ2HOT11": "^2Gangster Jedna: ^7Gangster Jedna pozemním jednotkám, v zóně přistání je moc horko! Máme tady poblíž víc než deset nepřátel a nemůžeme přistát, přepínám!", + "SUBTITLE_SO_CHOP_INV_HP1_ENGHOST12": "^2Gangster Jedna: ^7Gangster Jedna pozemním jednotkám, přesouváme se na náhradní extrakční bod. Směřujte na střechu Nateova sportbaru na východě. ", + "SUBTITLE_SO_CHOP_INV_HP1_GUNNER12": "^2Gangster Jedna: ^7Střelče, máš povolení zneškodnit nepřátele. Dávej pozor na naše jednotky na zemi, přepínám.", + "SUBTITLE_SO_CHOP_INV_HP1_FINDCOVER13": "^2Gangster Jedna: ^7Gangster Jedna pozemním jednotkám, kryjte se! Vidíme velkou skupinu nepřátel za barikádou na konci ulice, přepínám!", + "SUBTITLE_SO_CHOP_INV_HP1_BY_BARRICADE14": "^2Gangster Jedna: ^7Hrozí blízké nebezpečí našim pěšákům, jdeme do toho! Střelče, máš povolení zneškodnit nepřátele za barikádou. ", + "SUBTITLE_SO_CHOP_INV_HP1_GOODEFFECT15": "^2Gangster Jedna: ^7Tomu říkám muška střelče - whoa, jen do nich!", + "SUBTITLE_SO_CHOP_INV_HP1_RPGS16": "^2Gangster Jedna: ^7Pozemní síly upozorňují na RPG v dané oblasti, přepínám. Vrátíme se a trochu je tam pokropíme.", + "SUBTITLE_SO_CHOP_INV_HP1_LIGHTEMUP17": "^2Gangster Jedna: ^7Gangster Jedna pozemním jednotkám, spouštíme palbu, končím. Střelče, nandej jim to.", + "SUBTITLE_SO_CHOP_INV_HP1_GUNS18": "^2Gangster Jedna: ^7Rozumím, je to čistý.", + "SUBTITLE_SO_CHOP_INV_HP1_REPOSITION19": "^2Gangster Jedna: ^7Gangster Jedna pozemním jednotkám, můžete pokračovat, přepínám. ", + "SUBTITLE_SO_CHOP_INV_HP1_BA_TRUCKS110": "^2Gangster Jedna: ^7Gangster Jedna pozemním jednotkám, vidíme konvoj nepřátelských náklaďáků přijíždějící z jihovýchodu, doporučuju aby jste to nechali na nás, přepínám. ", + "SUBTITLE_SO_CHOP_INV_HP1_WESEEYOU111": "^2Gangster Jedna: ^7Gangster Jedna pozemním jednotkám, vidíme vás! Držte svoji pozici, jsme na cestě!", + "SUBTITLE_SO_CHOP_INV_HP1_LETSGO112": "^2Gangster Jedna: ^7Pozemním jednotkám, pojďte, pojďte! Jsme na střeše a připraveni vás vyzvednout!", + "SUBTITLE_SO_CHOP_INV_HP1_PACE113": "^2Gangster Jedna: ^7Pozemním jednotkám, pohněte sebou, jsme tady moc snadný cíl!", + "SUBTITLE_SO_CHOP_INV_HP1_LINKUP114": "^2Gangster Jedna: ^7Pozemním jednotkám, rychle na střechu Nateova sportbaru! ", + "SUBTITLE_SO_CHOP_INV_HP1_MEETUS115": "^2Gangster Jedna: ^7Gangster Jedna pozemním jednotkám, sraz na střeše Nateova sportbaru!", + "SUBTITLE_SO_CHOP_INV_HP1_GETTOROOF116": "^2Gangster Jedna: ^7Pozemním jednotkám, dostaňte se na střechu sportbaru! ", + "SUBTITLE_SO_CHOP_INV_HP1_FRIENDLY_01117": "^2Gangster Jedna: ^7Střelče, pozor kam střílíš - to jsou kámoši! ", + "SUBTITLE_SO_CHOP_INV_HP1_FRIENDLY_02120": "^2Gangster Jedna: ^7Střílíš do našich střelče! Miř pořádně!", + "SUBTITLE_SO_CHOP_INV_HP1_FRIENDLY_03121": "^2Gangster Jedna: ^7Střelče, to jsou naši tam dole! Dávej bacha!", + "SUBTITLE_SO_CHOP_INV_HP1_INTOCHOPPER_01122": "^2Gangster Jedna: ^7Rychle do vrtulníku, nepřátelé nablízku!", + "SUBTITLE_SO_CHOP_INV_HP1_INTOCHOPPER_02123": "^2Gangster Jedna: ^7Do vrtulníku, nasedat! ", + "SUBTITLE_SO_CHOP_INV_HP1_INTOCHOPPER_03124": "^2Gangster Jedna: ^7Jsme tu snadný cíl, rychle dovnitř, nasedat!", + "SUBTITLE_SO_DEF_INV_BMPSPOTTEDYOU11": "^2Overlord: ^7Spozorovalo vás nepřátelské BTR, Hunter Dva-Jedna, kryjte se, přepínám.", + "SUBTITLE_SO_DEF_INV_BMPSPOTTEDYOU12": "^2Overlord: ^7Hunter Dva-Jedna, upozorňuji že BTR vás zaměřuje, přepínám. ", + "SUBTITLE_SO_DEF_INV_NICEONE13": "^2Overlord: ^7Pěkně, přepínám", + "SUBTITLE_SO_DEF_INV_THERMALOPTICS14": "^2Overlord: ^7Hunter Dva-Jedna, Overlord. Doporučuji termální vidění, přepínám. ", + "SUBTITLE_SO_DEF_INV_STINGERDINER15": "^2Overlord: ^7Upozornění Hunter Dva-Jedna, rakety AT4 jsou v jídelně na západ, přepínám.", + "SUBTITLE_SO_DEF_INV_STINGERDINER16": "^2Overlord: ^7Hunter Dva-Jedna, skenery signalizují zásobu raket AT4 na západě, přepínám. ", + "SUBTITLE_SO_DEF_INV_STINGERNATES17": "^2Overlord: ^7Tady Overlord Actual, rakety AT4 jsou v zásobovací bedně na střeše Nateovy restaurace, přepínám", + "SUBTITLE_SO_DEF_INV_STINGERNATES18": "^2Overlord: ^7Hunter Dva-Jedna, rakety AT4 jsou na střeše Nateovy restaurace, přepínám. ", + "SUBTITLE_SO_DEF_INV_MOBILESOUTH19": "^2Overlord: ^7Pozor Hunter Dva-Jedna, máte nepřátelské pěšáky u Burger Town na jižní straně, přepínám.", + "SUBTITLE_SO_DEF_INV_ATTACKSOUTH110": "^2Overlord: ^7Hunter Dva-Jedna, Overlord, upozorňuji na potencionální útok z jihu, přepínám.", + "SUBTITLE_SO_DEF_INV_HOSTILESOUTH111": "^2Overlord: ^7Hunter Dva-Jedna, Hunter Čtyři identifikoval velkou skupinu nepřátel u Burger Town, přepínám. ", + "SUBTITLE_SO_DEF_INV_DRONESPOTTED112": "^2Overlord: ^7Hunter Dva-Jedna, nepřátelský Predátor vás zeměřuje, kryjte se, přepínám.", + "SUBTITLE_SO_DEF_INV_DRONENOTICE113": "^2Overlord: ^7Hunter Dva-Jedna, zaměřují vás jejich rakety, přepínám.", + "SUBTITLE_SO_DEF_INV_DRONETARGET114": "^2Overlord: ^7Hunter Dva-Jedna, zaměřují vás rakety, kryjte se, přepínám.", + "SUBTITLE_SO_DEF_INV_DRONEDIRECT115": "^2Overlord: ^7Nepřátelské rakety letí na vaši pozici Hunter Dva-Jedna, přepínám.", + "SUBTITLE_INV_HQR_ENEMYNORTH116": "^2Overlord: ^7Hunter Dva-Jedna tady Overlord Actual, vidíme velký počet nepřátelských posil na severu, přepínám.", + "SUBTITLE_INV_HQR_BANKTONORTH117": "^2Overlord: ^7Pozor Hunter Dva-Jedna, máte skupinu nepřátel u banky na severu, přepínám.", + "SUBTITLE_INV_HQR_FOOTMOBILES118": "^2Overlord: ^7Pozor Hunter Dva-Jedna, více než patnáct nepřátelských pěšáků se blíží ze severní strany, přepínám. ", + "SUBTITLE_INV_HQR_NOVAGASSTATION119": "^2Overlord: ^7Hunter Dva-Jedna, Hunter Čtyři vidí skupinu nepřátel poblíž benzinové pumpy Nova, přepínám. ", + "SUBTITLE_INV_HQR_ENEMYWEST120": "^2Overlord: ^7Hunter Dva-Jedna, zpráva od Goliath Dva, nepřátelské posily se blíží od západu, přepínám.", + "SUBTITLE_INV_HQR_DINERWEST121": "^2Overlord: ^7Hunter Dva-Jedna, přes patnáct útočníků se blíží od jídelny na západě, přepínám. ", + "SUBTITLE_INV_HQR_SOUTHEAST122": "^2Overlord: ^7Hunter Dva-Jedna, Overlord. Přibližně dvacet protivníků se k vám blíží z jihovýchodu, přepínám.", + "SUBTITLE_INV_HQR_VISUALSE123": "^2Overlord: ^7Hunter Dva-Jedna, Goliath Jedna vidí nepřátele přicházející z jihovýchodu, přepínám.", + "SUBTITLE_INV_HQR_TACOJOINT124": "^2Overlord: ^7Pozor Hunter Dva-Jedna, větší počet nepřátelských pěšáků byl spatřen blízko bodu taco, přepínám.", + "SUBTITLE_INV_HQR_RELAYGOL1125": "^2Overlord: ^7Hunter Dva-Jedna, zpráva od Goliath Jedna: máme tu bojovou helikoptéru, blížící se k vaší pozici, přepínám.", + "SUBTITLE_SO_DWNLD_STK_EXPLICITAUTH11": "^2Střelec Strykeru: ^7Všem Hunter jednotkám, Badger Jedna nemůže střílet na vámi neoznačené cíle.", + "SUBTITLE_SO_DWNLD_STK_DESIGNATED12": "^2Střelec Strykeru: ^7Hunter Dva-Jedna, opakuji, Badger Jedna není oprávněn ničit cíle bez vašeho určení polohy cíle.", + "SUBTITLE_SO_DWNLD_STK_CANTFIRE13": "^2Střelec Strykeru: ^7Hunter Dva-Jedna nemůžeme střílet na nepřátele bez vašeho ověření!", + "SUBTITLE_SO_DWNLD_HQR_LAPTOPS21": "^2Overlord: ^7V tvojí oblasti se nachází několik počítačů, které obsahují velmi cenné informace. ", + "SUBTITLE_SO_DWNLD_HQR_DOWNLOADDATA22": "^2Overlord: ^7Stáhni data z každého z nich a pak se vrať ke Strykerovi pro ukončení operace.", + "SUBTITLE_SO_DWNLD_STK_TENFOOTMOBILES31": "^2Střelec Strykeru: ^7Hunter Dva-Jedna, více než deset pěšáků se blíží z východu!", + "SUBTITLE_SO_DWNLD_STK_BROWNMANSION32": "^2Střelec Strykeru: ^7Máme tu aktivitu na západě, vycházejí z toho světlě hnědého baráku!", + "SUBTITLE_SO_DWNLD_STK_ACROSSSTREET33": "^2Střelec Strykeru: ^7Nepřítel spatřen naproti přes ulici, míří k tobě!", + "SUBTITLE_SO_DWNLD_STK_GOTMOVEMENT34": "^2Střelec Strykeru: ^7Hunter Dva-Jedna, máte nepřátele poblíž vaší pozice!", + "SUBTITLE_SO_DWNLD_HQR_WIRELESSLYDISRUPT41": "^2Střelec Strykeru: ^7Hunter Dva-Jedna, nepřátelé v oblasti můžou přerušit bezdrátový přenos.", + "SUBTITLE_SO_DWNLD_HQR_RESTARTMANUALLY42": "^2Overlord: ^7Hunter Dva-Jedna, stahování bylo přerušeno! Budete muset znovu ručně aktivovat přenos dat.", + "SUBTITLE_SO_DWNLD_HQR_GETBACKRESTART43": "^2Overlord: ^7Hunter Dva-Jedna, nepřátelé přerušili stahování! Vraťte se tam a ručně opět spusťte přenos dat!", + "SUBTITLE_SO_DWNLD_HQR_GOFINDTHEM51": "^2Overlord: ^7Dobrá práce Hunter Dva-Jedna. Naše skenery signalizují ještě další počítače v oblasti - najděte je a získejte jejich data.", + "SUBTITLE_SO_DWNLD_HQR_ONELAPTOP52": "^2Overlord: ^7Hunter Dva-Jedna, zbývá ještě jeden, nepolevujte.", + "SUBTITLE_SO_DWNLD_HQR_PULLINGYOUOUT53": "^2Overlord: ^7Skvělá práce, Hunter Dva-Jedna. Nyní se vraťte ke Strykeru, dostaneme vás odsud.", + "SUBTITLE_SO_DWNLD_HQR_EXTRACTION54": "^2Overlord: ^7Hunter Dva-Jedna, vraťte se ke Strykeru - odjíždíme!", + "SUBTITLE_SO_DWNLD_HQR_COMPLETEMISSION55": "^2Overlord: ^7Hunter Dva-Jedna, vraťte se ke Strykeru pro dokončení mise!", + "SUBTITLE_SO_ESC_AIR_AMBUSH_WARNING": "^2Ghost: ^7Nepřátelé tady chystají past... takže buď opatrný.", + "SUBTITLE_SO_HID_GHIL_GOODNIGHT11": "^2Ghost: ^7Dobrou", + "SUBTITLE_SO_HID_GHIL_BEAUTIFUL12": "^2Ghost: ^7Perfektní", + "SUBTITLE_SO_HID_GHIL_PERFECT13": "^2Ghost: ^7Skvělý ", + "SUBTITLE_SO_HID_GHIL_TANGO_DOWN14": "^2Ghost: ^7Je po něm ", + "SUBTITLE_SO_HID_GHIL_HESDOWN15": "^2Ghost: ^7Je po něm", + "SUBTITLE_SO_HID_GHIL_NEUTRALIZED16": "^2Ghost: ^7Cíl zneškodněn", + "SUBTITLE_SO_HID_GHIL_SLOPPY17": "^2Ghost: ^7Zlá práce ", + "SUBTITLE_SO_HID_GHIL_NOISY18": "^2Ghost: ^7Moc hluku", + "SUBTITLE_SO_HID_GHIL_DO_BETTER19": "^2Ghost: ^7Dokážeš to líp", + "SUBTITLE_SO_HID_GHIL_RAD_WARNING110": "^2Ghost: ^7Opatrně. Sleduj značky upozorňující na radioaktivitu. Pokud toho schytáš moc ...zemřeš.", + "SUBTITLE_SO_HID_GHIL_SNIPER_HINT111": "^2Ghost: ^7Pokud máš pocit že jsi viděl odstřelovače, sleduj oblast a počkej až udělá chybu. ", + "SUBTITLE_SO_HID_GHIL_PATROL_HINT112": "^2Ghost: ^7Buď trpělivý. Sleduj nepřátelské hlídky. Najdi si vhodný čas a odstraň je rychle a tiše.", + "SUBTITLE_SO_HID_GHIL_DOUBLE_KILL": "^2Ghost: ^7Dvojitý zásah... skvělý. ", + "SUBTITLE_SO_HID_GHIL_TRIPLE_KILL": "^2Ghost: ^7Trojitý zásah... vynikající!", + "SUBTITLE_SO_ROOF_CONT_PRED_DRONE12": "^2Kapitán MacTavish: ^7Vem si ovládání raket Predátor.", + "SUBTITLE_SO_ROOF_CONT_PRED_DRONE13": "^2Kapitán MacTavish: ^7Seber ovládání raket Predátor.", + "SUBTITLE_SO_TRAINER_MISSEDTARGET11": "^2Ranger 1: ^7Minul jsi cíl, vrať se a sundej ho.", + "SUBTITLE_SO_TRAINER_GOBACK12": "^2Ranger 1: ^7Minul jsi cíl, vrať se než skočíš dolů!", + "SUBTITLE_SO_TRAINER_LASTAREA13": "^2Ranger 1: ^7Nechal jsi pár cílů v poslední oblasti, dostaň je. ", + "SUBTITLE_SO_TRAINER_TRYITAGAIN14": "^2Ranger 1: ^7Minus jsi cíl, zkus to znovu.", + "SUBTITLE_SO_TRAINER_TOOMANYCIV15": "^2Ranger 1: ^7Střelil jsi moc civilistů, zkus to znovu.", + "SUBTITLE_SO_TF_1_PLYR_PREP11": "^2Ghost: ^7Tak do toho. ", + "SUBTITLE_SO_TF_1_PLYR_PREP12": "^2Ghost: ^7Připravit", + "SUBTITLE_SO_TF_1_TIME_GENERIC13": "^2Ghost: ^7Nestihneme to včas!", + "SUBTITLE_SO_TF_1_TIME_GENERIC14": "^2Ghost: ^7Čas běží...", + "SUBTITLE_SO_TF_1_TIME_GENERIC15": "^2Ghost: ^7Nezbývá moc času! ", + "SUBTITLE_SO_TF_1_TIME_HURRY16": "^2Ghost: ^7Utíká nám čas! Běž! Běž! Běž! ", + "SUBTITLE_SO_TF_1_TIME_HURRY17": "^2Ghost: ^7Jsme strašně pozadu! Pohyb! Pohyb! ", + "SUBTITLE_SO_TF_1_TIME_HURRY18": "^2Ghost: ^7Čas témeř vypršel! To bude těsný!", + "SUBTITLE_SO_TF_1_FAIL_GENERIC19": "^2Ghost: ^7Mise selhala. Dostaneme je příště.", + "SUBTITLE_SO_TF_1_FAIL_GENERIC110": "^2Ghost: ^7Tak to byla pohroma! Zkusíme to znovu.", + "SUBTITLE_SO_TF_1_FAIL_GENERIC111": "^2Ghost: ^7Zatraceně, dostali jsme pěkně na prdel.", + "SUBTITLE_SO_TF_1_FAIL_GENERIC112": "^2Ghost: ^7Potřebujeme promyslet strategii. Sjedeme to znova. ", + "SUBTITLE_SO_TF_1_FAIL_TIME113": "^2Ghost: ^7Trvá nám to dlouho. Dávejte pozor na čas.", + "SUBTITLE_SO_TF_1_FAIL_TIME114": "^2Ghost: ^7Příliš pomalu. Příště koukejte na čas jasný? ", + "SUBTITLE_SO_TF_1_FAIL_BLEEDOUT115": "^2Ghost: ^7Vyhrajeme jako tým, prohrajeme jako tým. Co?", + "SUBTITLE_SO_TF_1_FAIL_BLEEDOUT116": "^2Ghost: ^7Podívej - pracujeme jako tým. Nikdo nebude pozadu!", + "SUBTITLE_SO_TF_1_SUCCESS_GENERIC117": "^2Ghost: ^7Tak se to má dělat.", + "SUBTITLE_SO_TF_1_SUCCESS_JERK118": "^2Ghost: ^7Bobrý, ale viděl jsem lepší. ", + "SUBTITLE_SO_TF_1_SUCCESS_GENERIC119": "^2Ghost: ^7Dobrá práce. ", + "SUBTITLE_SO_TF_1_SUCCESS_GENERIC120": "^2Ghost: ^7Mise dokončena.", + "SUBTITLE_SO_TF_1_TIME_STATUS_LATE121": "^2Ghost: ^7Zaber, potřebuješ nabrat rychlost.", + "SUBTITLE_SO_TF_1_TIME_STATUS_LATE122": "^2Ghost: ^7Jsi pozadu, pospěš si nebo to nezvládneš.", + "SUBTITLE_SO_TF_1_TIME_STATUS_LATE123": "^2Ghost: ^7Dávej pozor na čas, postupuješ příliš pomalu.", + "SUBTITLE_SO_TF_1_TIME_STATUS_GOOD124": "^2Ghost: ^7Dosáhl jsi doposud nejlepšího času. ", + "SUBTITLE_SO_TF_1_TIME_STATUS_GOOD125": "^2Ghost: ^7Máš naději na nejlepší čas, běž běž běž. ", + "SUBTITLE_SO_TF_1_TIME_STATUS_GOOD126": "^2Ghost: ^7Pokračuj jako doposud a bude to nový rekord.", + "SUBTITLE_SO_TF_1_PROGRESS_HALF127": "^2Ghost: ^7Jsi v půlce. ", + "SUBTITLE_SO_TF_1_PROGRESS_HALF128": "^2Ghost: ^7Jsi v polovině.", + "SUBTITLE_SO_TF_1_PROGRESS_HALF129": "^2Ghost: ^7Jsi za půlkou... ", + "SUBTITLE_SO_TF_1_PROGRESS_QUARTER130": "^2Ghost: ^7Už jsi blízko, nezastavuj.", + "SUBTITLE_SO_TF_1_PROGRESS_QUARTER131": "^2Ghost: ^7Skoro hotovo, soustřeď se.", + "SUBTITLE_SO_TF_1_PROGRESS_QUARTER132": "^2Ghost: ^7Jen jsi trochu zaváhal, pokračuj. ", + "SUBTITLE_SO_TF_1_PROGRESS_5MORE133": "^2Ghost: ^7Ještě 5", + "SUBTITLE_SO_TF_1_PROGRESS_5MORE134": "^2Ghost: ^7Zbývá 5", + "SUBTITLE_SO_TF_1_PROGRESS_5MORE135": "^2Ghost: ^75 dalších ", + "SUBTITLE_SO_TF_1_PROGRESS_4MORE136": "^2Ghost: ^7Ještě 4", + "SUBTITLE_SO_TF_1_PROGRESS_4MORE137": "^2Ghost: ^7Další 4", + "SUBTITLE_SO_TF_1_PROGRESS_4MORE138": "^2Ghost: ^7Zbývají 4 ", + "SUBTITLE_SO_TF_1_PROGRESS_3MORE139": "^2Ghost: ^7Ještě 3", + "SUBTITLE_SO_TF_1_PROGRESS_3MORE140": "^2Ghost: ^7Další 3", + "SUBTITLE_SO_TF_1_PROGRESS_3MORE141": "^2Ghost: ^7Zbývají 3 ", + "SUBTITLE_SO_TF_1_PROGRESS_2MORE142": "^2Ghost: ^7Ještě 2", + "SUBTITLE_SO_TF_1_PROGRESS_2MORE143": "^2Ghost: ^7Další 2", + "SUBTITLE_SO_TF_1_PROGRESS_2MORE144": "^2Ghost: ^7Zbývyjí 2 ", + "SUBTITLE_SO_TF_1_PROGRESS_1MORE145": "^2Ghost: ^7Ještě 1", + "SUBTITLE_SO_TF_1_PROGRESS_1MORE146": "^2Ghost: ^71 zbývá", + "SUBTITLE_SO_TF_1_PROGRESS_1MORE147": "^2Ghost: ^7Poslední 1 ", + "SUBTITLE_SO_TF_1_CIV_KILL_WARNING148": "^2Ghost: ^7Dávej pozor na civilisty!", + "SUBTITLE_SO_TF_1_CIV_KILL_WARNING149": "^2Ghost: ^7Civilní oběti nejsou tolerovány!", + "SUBTITLE_SO_TF_1_CIV_KILL_WARNING150": "^2Ghost: ^7Opatrně, zabíjíš nevinné civilisty!", + "SUBTITLE_SO_TF_1_SUCCESS_BEST151": "^2Ghost: ^7To bylo skvělý, překonal jsi svůj rekord.", + "SUBTITLE_SO_TF_1_SUCCESS_BEST152": "^2Ghost: ^7Nový osobní rekord, dobrá práce. ", + "SUBTITLE_SO_TF_1_SUCCESS_BEST153": "^2Ghost: ^7Výborně, překonal jsi předchozí rekord. ", + "SUBTITLE_SO_TF_1_SUCCESS_BEST154": "^2Ghost: ^7Perfektní, nový osobní rekord.", + "SUBTITLE_SO_TF_1_SUCCESS_JERK155": "^2Ghost: ^7Dobrý, ale umíš to i líp.", + "SUBTITLE_SO_TF_1_SUCCESS_JERK156": "^2Ghost: ^7Není to nej, ale zvládls to. ", + "SUBTITLE_SO_TF_1_PROGRESS_3QUARTER157": "^2Ghost: ^7Čtrtinu máš za sebou.", + "SUBTITLE_SO_TF_1_PROGRESS_3QUARTER158": "^2Ghost: ^7Čtvrtina cesty, nepolevuj.", + "SUBTITLE_SO_TF_1_PROGRESS_3QUARTER159": "^2Ghost: ^7Pokračuješ dobře, drž se. ", + "SUBTITLE_SO_TF_1_UNSUPPRESS_WARNING160": "^2Ghost: ^7Dávej pozor při braní nepřátelských zbraní. Střelba bez tlumiče přivolá velkou pozornost.", + "SUBTITLE_SO_TF_1_TIME_STATUS_HALF129_1": "^2Ghost: ^7Uběhla už polovina času - soustřeď se.", + "SUBTITLE_SO_TF_1_TIME_STATUS_HALF129_2": "^2Ghost: ^7Utekla ti už polovina času - buď ve střehu.", + "SUBTITLE_SO_TF_1_TIME_STATUS_HALF129_3": "^2Ghost: ^7Uběhla sotva polovina času - drž se.", + "SUBTITLE_SO_TF_1_PLYR_PREP_TIMED129_5": "^2Ghost: ^7Sleduj čas. Tahle mise je na čas.", + "SUBTITLE_SO_TF_1_PLYR_PREP_TIMED129_6": "^2Ghost: ^7V této misi je časový limit - hodně štěstí.", + "SUBTITLE_AC130_FCO_BACKONTHOSE21": "^2AC-130 FCO: ^7Nandejte to těm chlapům", + "SUBTITLE_AC130_FCO_CLEAREDTOENGAGE22": "^2AC-130 FCO: ^7Nepřátelský personál odstraněn.", + "SUBTITLE_AC130_FCO_CONFIRMED23": "^2AC-130 FCO: ^7Potvrzuji, vozidlo zničeno.", + "SUBTITLE_AC130_FCO_CROSSINGFIELD24": "^2AC-130 FCO: ^7Nepřátelé přecházejí pole. ", + "SUBTITLE_AC130_FCO_DIRECTHIT25": "^2AC-130 FCO: ^7Přímý zásah", + "SUBTITLE_AC130_FCO_DIRECTHITS26": "^2AC-130 FCO: ^7Jo, dobrej zásah přímo tam.", + "SUBTITLE_AC130_FCO_DOVEONGROUND27": "^2AC-130 FCO: ^7Jo, jsou jako holoubci na zemi. ", + "SUBTITLE_AC130_FCO_DOWNSTILLMOVING28": "^2AC-130 FCO: ^7Ti chlapi dole se stále pohybují.", + "SUBTITLE_AC130_FCO_ENEMYONROAD29": "^2AC-130 FCO: ^7Nepřátelské osoby na cestě. ", + "SUBTITLE_AC130_FCO_FULLTANK210": "^2AC-130 FCO: ^7Kurva, musel mít plnou nádrž benzínu. ", + "SUBTITLE_AC130_FCO_GETPERSON211": "^2AC-130 FCO: ^7Sundej tamtoho. ", + "SUBTITLE_AC130_FCO_GETTHATGUY212": "^2AC-130 FCO: ^7Sundej ho.", + "SUBTITLE_AC130_FCO_GETTINBACKUP213": "^2AC-130 FCO: ^7Dostává na frak.", + "SUBTITLE_AC130_FCO_GETVEHICLE214": "^2AC-130 FCO: ^7Posádko, sundejte to vozidlo.", + "SUBTITLE_AC130_FCO_GONNAGETHIM215": "^2AC-130 FCO: ^7Chystáš se ho sundat? ", + "SUBTITLE_AC130_FCO_GOODKILL216": "^2AC-130 FCO: ^7Dobrý zásah, dobrý. ", + "SUBTITLE_AC130_FCO_GOTARUNNER217": "^2AC-130 FCO: ^7Uh, máme tady bežce.", + "SUBTITLE_AC130_FCO_GUYBYCAR218": "^2AC-130 FCO: ^7Je tam chlápek za autem. ", + "SUBTITLE_AC130_FCO_GUYBYTRUCK219": "^2AC-130 FCO: ^7Je tam jeden za náklaďákem", + "SUBTITLE_AC130_FCO_GUYMOVIN220": "^2AC-130 FCO: ^7Rozumím, ten běžec", + "SUBTITLE_AC130_FCO_GUYRUNNIN221": "^2AC-130 FCO: ^7Dostali jsme bežce. ", + "SUBTITLE_AC130_FCO_HEADINFORDITCH222": "^2AC-130 FCO: ^7Jo, už se válí pěkně ve škarpě. ", + "SUBTITLE_AC130_FCO_HOTDAMN1223": "^2AC-130 TV Operátor: ^7Ty bláho!", + "SUBTITLE_AC130_FCO_HOTDAMN2224": "^2AC-130 TV Operátor: ^7Ooh, zatraceně!", + "SUBTITLE_AC130_FCO_ISEEPIECES226": "^2AC-130 FCO: ^7Jo, dobrý zásah. Vidím tam dole spoustu malých kousků.", + "SUBTITLE_AC130_FCO_KABOOM227": "^2AC-130 FCO: ^7Bum bum.", + "SUBTITLE_AC130_FCO_KNOCKEDWIND228": "^2AC-130 FCO: ^7Pravděpodobně ho zasáhla jen tlaková vlna.", + "SUBTITLE_AC130_FCO_LIGHTEMUP229": "^2AC-130 FCO: ^7Sundejte ho, hoši.", + "SUBTITLE_AC130_FCO_MOREENEMY230": "^2AC-130 FCO: ^7Další nepřátelé.", + "SUBTITLE_AC130_FCO_MOVINGAGAIN231": "^2AC-130 FCO: ^7Ok, zase se pohybuje.", + "SUBTITLE_AC130_FCO_MOVINGVEHICLE232": "^2AC-130 FCO: ^7Máme tady vozidlo v pohybu. ", + "SUBTITLE_AC130_FCO_NAILBYBUILDING1233": "^2AC-130 FCO: ^7Sundejte ty chlapy u budovy.", + "SUBTITLE_AC130_FCO_NAILTHOSEGUYS234": "^2AC-130 FCO: ^7Zabte ty chlapy.", + "SUBTITLE_AC130_FCO_NICE235": "^2AC-130 FCO: ^7Fajn.", + "SUBTITLE_AC130_FCO_OKYOUGOTHIM236": "^2AC-130 FCO: ^7Ok, dostali jste ho. Teď zpátky k ostatním. ", + "SUBTITLE_AC130_FCO_OOPSIEDAISY237": "^2AC-130 FCO: ^7Whoops.", + "SUBTITLE_AC130_FCO_OUTOFCHURCH238": "^2AC-130 FCO: ^7Jsou tam ozbrojené osoby vybíhající z kostela.", + "SUBTITLE_AC130_FCO_PERSONNELTHERE239": "^2AC-130 FCO: ^7Osoby přímo tam.", + "SUBTITLE_AC130_FCO_RIGHTONTARGET240": "^2AC-130 FCO: ^7Jo, to bylo přímo na cíl.", + "SUBTITLE_AC130_FCO_RIGHTTHERE241": "^2AC-130 FCO: ^7Přímo tam - sleduju to.", + "SUBTITLE_AC130_FCO_STILLMOVING242": "^2AC-130 FCO: ^7Stále se pohybuje.", + "SUBTITLE_AC130_FCO_TAKEHIMOUT243": "^2AC-130 FCO: ^7Jo dostaňte ho.", + "SUBTITLE_AC130_FCO_THATSAHIT244": "^2AC-130 FCO: ^7To byla rána.", + "SUBTITLE_AC130_FCO_TRACKING245": "^2AC-130 FCO: ^7Sleduju. ", + "SUBTITLE_AC130_FCO_VEHICLEONMOVE246": "^2AC-130 FCO: ^7Máme tady dole pohybující se vůz. ", + "SUBTITLE_AC130_FCO_WITHIN2FEET247": "^2AC-130 FCO: ^7Dobrá, dostali jsme ho. To bylo možná tak dvě stopy vedle něj.", + "SUBTITLE_AC130_FCO_YEPSTILLMOVING248": "^2AC-130 FCO: ^7Yep, ten chlap se pořád hýbe.", + "SUBTITLE_AC130_FCO_YOUGOTHIM249": "^2AC-130 FCO: ^7Sundejte ho.", + "SUBTITLE_AC130_FCO_YOUGOTHIM2250": "^2AC-130 FCO: ^7Sundejte ho!", + "SUBTITLE_AC130_GNR_GUNREADY1251": "^2AC-130 Gunner: ^7Připraven!", + "SUBTITLE_AC130_GNR_SHOT1252": "^2AC-130 Gunner: ^7Pal! ", + "SUBTITLE_AC130__SECONDARIES1253": "^2Navigátor AC-130: ^7Znovu.", + "SUBTITLE_AC130_PLT_AZIMUTHSWEEP254": "^2Pilot AC-130: ^7Rekalibruji úhel závleku. Nastavuji výšku skenování.", + "SUBTITLE_AC130_PLT_CLEANUP255": "^2Pilot AC-130: ^7Vyčisti ten signál. ", + "SUBTITLE_AC130_PLT_CLEAREDTOENGAGE256": "^2Pilot AC-130: ^7Máte povolení to tady vyčistit.", + "SUBTITLE_AC130_PLT_CLEARTOENGAGE257": "^2Pilot AC-130: ^7Opakuji. Máte povolení zasáhnout pohybující se vozidla a všechny osoby co uvidíte.", + "SUBTITLE_AC130_PLT_COPYSMOKE258": "^2Pilot AC-130: ^7Jasný, do nich.", + "SUBTITLE_AC130_PLT_ENGVEHICLE259": "^2Pilot AC-130: ^7Máte povolení zničit pohybující se vozidla. ", + "SUBTITLE_AC130_PLT_GOTTAHURT260": "^2Pilot AC-130: ^7Ooo, to muselo bolet. ", + "SUBTITLE_AC130_PLT_ROLLININ261": "^2Pilot AC-130: ^7Rollin' in.", + "SUBTITLE_AC130_PLT_SCANRANGE262": "^2Pilot AC-130: ^7Nastavit sken. ", + "SUBTITLE_AC130_PLT_TARGETRESET263": "^2Pilot AC-130: ^7Reset cíle. ", + "SUBTITLE_AC130_PLT_YEAHCLEARED264": "^2Pilot AC-130: ^7Yeah, můžem střílet.", + "SUBTITLE_AC130__COVERBYWALL1265": "^2AC-130 TV Operátor: ^7Kryjí se za tou zdí.", + "SUBTITLE_AC130__DIRECTSECONDARY1266": "^2AC-130 TV Operátor: ^7Znovu zamířit.", + "SUBTITLE_AC130__DIRECTSECONDARY2267": "^2AC-130 TV Operátor: ^7Znovu.", + "SUBTITLE_AC130__WHOA1268": "^2AC-130 TV Operátor: ^7Woah!", + "SUBTITLE_AC130_FCO_FIRINGTOCLOSE271": "^2AC-130 FCO: ^7Střílejte opatrně, střílíte na naše kluky - sledujte blikající impulzy IR - to jsou naši chlapci! ", + "SUBTITLE_AC130_FCO_FIRINGTOCLOSE272": "^2AC-130 FCO: ^7Uh, střílíte přílíš blízko našich lidí, opakuji, střílíte přílíš blízko našich lidí. Sledujte impulsy IR.", + "SUBTITLE_AC130_FCO_FIRINGTOCLOSE273": "^2AC-130 FCO: ^7Buďte opatrní! Málem jste zabili naše kluky!", + "SUBTITLE_TRAIN_FLY_DEMONSTRATION13": "^2Sgt. Foley: ^7Vojín Allen teď provede malou demonstraci zbraní, aby vám místním ukázal, jak se to dělá.", + "SUBTITLE_TRAIN_FLY_NOOFFENSE15": "^2Sgt. Foley: ^7Nechci rýpat, ale vidím, že vy chlapi střílíte jen tak bez míření a kulky lítají všude kolem.", + "SUBTITLE_TRAIN_FLY_MAKESYOULOOK17": "^2Sgt. Foley: ^7Netrefíte vůbec nic a vypadáte pak jako idioti.", + "SUBTITLE_TRAIN_FLY_SHOWEM19": "^2Sgt. Foley: ^7Vojíne Allene, ukaž jim o čem mluvím.", + "SUBTITLE_TRAIN_FLY_FIREATTARGETS111": "^2Sgt. Foley: ^7Vezmi tu zbraň ze stolu a střílej na cíle za sebou.", + "SUBTITLE_TRAIN_FLY_TURNAROUND112": "^2Sgt. Foley: ^7Otoč se a střílej na cíle.", + "SUBTITLE_TRAIN_FLY_GRABTHATWEAPON114": "^2Sgt. Foley: ^7Vojíne Allene, vezmi tu zbraň ze stolu a střílej po cílech za sebou.", + "SUBTITLE_TRAIN_FLY_COMEONALLEN115": "^2Sgt. Foley: ^7No tak Allene. Pokračuj podle plánu. Vezmi zbraň a střílej na cíle za sebou", + "SUBTITLE_TRAIN_FLY_DONTAIMDOWN116": "^2Sgt. Foley: ^7Ještě nepoužívej míření. Snažím se tu něco vysvětlit. Střílej jen od boku.", + "SUBTITLE_TRAIN_FLY_TRYAFEW117": "^2Sgt. Foley: ^7Zkusme ještě víc.", + "SUBTITLE_TRAIN_FLY_FIREFROMTHEHIP118": "^2Sgt. Foley: ^7Od boku vojíne. Přesně tak, jako ve filmech.", + "SUBTITLE_TRAIN_FLY_PAYATTENTION121": "^2Sgt. Foley: ^7Všichni dávejte pozor. Pamatujte, že až vám dojdou náboje, musíte si nabít.", + "SUBTITLE_TRAIN_FLY_RELOAD122": "^2Sgt. Foley: ^7Nabij svou zbraň, vojíne.", + "SUBTITLE_TRAIN_FLY_WAITINGFOR123": "^2Sgt. Foley: ^7Na co čekáš? Nabij svoji zbraň.", + "SUBTITLE_TRAIN_FLY_SPRAYEDBULLETS31": "^2Sgt. Foley: ^7Vidíte, co tím myslím? Kulky jsou všude kolem zatraceně.", + "SUBTITLE_TRAIN_FLY_PICKYOURTARGETS33": "^2Sgt. Foley: ^7Musíš si vybrat cíl a střílet rozvážně zamířením z pevné pozice.", + "SUBTITLE_TRAIN_FLY_HOWTHERANGERS35": "^2Sgt. Foley: ^7Vojíne Allene, ukaž tady našim přátelům, jak Rangeři sestřelují cíle.", + "SUBTITLE_TRAIN_FLY_CROUCHFIRST37": "^2Sgt. Foley: ^7Nejdřív se skrč a pak zamiř na cíle.", + "SUBTITLE_TRAIN_FLY_BEFOREENGAGING39": "^2Sgt. Foley: ^7Vojíne Allene, před zásahem zamiř na cíl.", + "SUBTITLE_TRAIN_FLY_DONTFORGET310": "^2Sgt. Foley: ^7Nezapomeň zamířit na cíl, vojíne.", + "SUBTITLE_TRAIN_FLY_CROUCHINGSTANCE311": "^2Sgt. Foley: ^7Allene, skrč se a zamiř.", + "SUBTITLE_TRAIN_FLY_CROUCHED312": "^2Sgt. Foley: ^7Potřebuju, abys střílel skrčený, vojíne.", + "SUBTITLE_TRAIN_FLY_GOTTAAIM313": "^2Sgt. Foley: ^7To je asi tak všechno. Chceš trefit cíle? Pak musíš nejdřív zamířit.", + "SUBTITLE_TRAIN_FLY_ACCURACY41": "^2Sgt. Foley: ^7Tvoje přesnost se zvýší, při skrčení, nebo pokud ležíš na zemi.", + "SUBTITLE_TRAIN_FLY_WILLDEMONSTRATE43": "^2Sgt. Foley: ^7Vojín Allen předvede o čem mluvím.", + "SUBTITLE_TRAIN_FLY_GOPRONE45": "^2Sgt. Foley: ^7Vojíne Allene, skrč se a sestřel ještě pár cílů.", + "SUBTITLE_TRAIN_FLY_FIREFROMPRONE47": "^2Sgt. Foley: ^7Střílej skrčený, vojíne.", + "SUBTITLE_TRAIN_FLY_NEEDYOUTOFIRE48": "^2Sgt. Foley: ^7Vojíne, potřebuju, abys střílel skrčený.", + "SUBTITLE_TRAIN_FLY_SWITCHING51": "^2Sgt. Foley: ^7Zamíření taky funguje jako rychlá změna cílů.", + "SUBTITLE_TRAIN_FLY_POPINANDOUT53": "^2Sgt. Foley: ^7Pro rychlou změnu cílů zamiř, a pak rychle znovu.", + "SUBTITLE_TRAIN_FLY_SHOWEMPRIVATE55": "^2Sgt. Foley: ^7Vojíne, předveď to.", + "SUBTITLE_TRAIN_FLY_IFTARGETCLOSE56": "^2Sgt. Foley: ^7Jestli je cíl blízko místa kam míříš, můžeš dalším rychlím zamířením přejít na něj.", + "SUBTITLE_TRAIN_FLY_TOOSLOW58": "^2Sgt. Foley: ^7To bylo příliš pomalu. Musíš zamířit a oddálit rychle, abys přešel na jiné cíle", + "SUBTITLE_TRAIN_FLY_SPEEDITUP59": "^2Sgt. Foley: ^7Udělej to znovu. Na nový cíl můžeš rychle přejít rychlím zamířením a oddálením.", + "SUBTITLE_TRAIN_FLY_ACQUIRENEW510": "^2Sgt. Foley: ^7Příliš pomalu. Vojíne Allene, pro zamíření nových cílů rychle zamiř a oddal.", + "SUBTITLE_TRAIN_FLY_POPPINGINANDOUT511": "^2Sgt. Foley: ^7Udělej to znovu a rychleji. Ukaž těm mužům, jak rychle přejít k dalším cílům rychlým zamířením a oddálením.", + "SUBTITLE_TRAIN_FLY_NOTSNAPPING512": "^2Sgt. Foley: ^7Vojíne Allene, nezamiřuješ na další cíle. Abys přešel k dalším cílům, musíš rychle zamířit a oddálit.", + "SUBTITLE_TRAIN_FLY_AIMTOSNAP513": "^2Sgt. Foley: ^7Vojíne Allene, zamířením přejdi k dalšímu cíli.", + "SUBTITLE_TRAIN_FLY_FORGETTOAIM514": "^2Sgt. Foley: ^7Nezapomeň mířit.", + "SUBTITLE_TRAIN_FLY_FROMTHEHIP515": "^2Sgt. Foley: ^7Střílíš od boku, vojíne. Zamířením přejdi k dalšímu cíli.", + "SUBTITLE_TRAIN_FLY_NOTAIMINGPROP516": "^2Sgt. Foley: ^7Nezamiřuješ správně, vojíne. Přejdi k dalšímu cíli zamířením.", + "SUBTITLE_TRAIN_FLY_DOINGITWRONG517": "^2Sgt. Foley: ^7Vojíne Allene, děláš to špatně. Abys přešel k dalším cílům, rychle zamiř a oddal.", + "SUBTITLE_TRAIN_FLY_HOWYOUDOIT518": "^2Sgt. Foley: ^7Takže teď, jak na to. Chcete své cíle zneškodnit chytře a rychle.", + "SUBTITLE_TRAIN_FLY_LIGHTCOVER61": "^2Sgt. Foley: ^7Jestli se váš cíl pohybuje za lehkým krytím, nezapomeňte, že některé zbraně můžou lehké materiály prostřelit.", + "SUBTITLE_TRAIN_FLY_THEPRIVATEHERE63": "^2Sgt. Foley: ^7Vojín tady vám to ukáže.", + "SUBTITLE_TRAIN_FLY_WOODPANEL65": "^2Sgt. Foley: ^7Vojíne, zasáhni cíl přes desku ze dřeva.", + "SUBTITLE_TRAIN_FLY_ALLENWOODPANEL66": "^2Sgt. Foley: ^7Vojíne Allene, zasáhni cíl přes dřevěnou desku.", + "SUBTITLE_TRAIN_FLY_TOSSAFRAG71": "^2Sgt. Foley: ^7A poslední a nejdůležitější, je vědět, jak hodit tříštivý granát.", + "SUBTITLE_TRAIN_FLY_PICKUPFRAG73": "^2Sgt. Foley: ^7Vojíne Allene, vezmi si ze stolu pár tříštivých granátů. ", + "SUBTITLE_TRAIN_FLY_GRENADEDOWNRANGE74": "^2Sgt. Foley: ^7Hodem granátu můžete zasáhnout více nepřátel najednou.", + "SUBTITLE_TRAIN_FLY_THROWAGRENADE76": "^2Sgt. Foley: ^7Vojíne, hoď granát a zneškodni ty cíle.", + "SUBTITLE_TRAIN_FLY_LETSGOTHROW77": "^2Sgt. Foley: ^7Vojíne, jdeme. Hod k těm cílům granát!", + "SUBTITLE_TRAIN_FLY_NOTGOODENOUGH78": "^2Sgt. Foley: ^7To nestačí, vojíne. Musíš ten granát hodit blíž k cílům.", + "SUBTITLE_TRAIN_FLY_YOUREARANGER79": "^2Sgt. Foley: ^7Jsi Ranger, vojíne. Vím, že ten granát dokážeš hodit blíž, hooah?", + "SUBTITLE_TRAIN_FLY_GOOD710": "^2Sgt. Foley: ^7Dobře.", + "SUBTITLE_TRAIN_FLY_FRAGSTENDTOROLL711": "^2Sgt. Foley: ^7Všimněte si, že na nerovném povrchu se granáty kutálejí. Takže zapřemýšlejte, než hodíte granát do kopce.", + "SUBTITLE_TRAIN_FLY_LETSGOPICKUP713": "^2Sgt. Foley: ^7Jdeme, vojíne. Vezmi si ze stolu pár třištivých granátů. ", + "SUBTITLE_TRAIN_FLY_GRABFRAGS714": "^2Sgt. Foley: ^7Vezmi se ze stolu pár tříštivých granátů, vojíne.", + "SUBTITLE_TRAIN_FLY_NEEDTOPICKUP715": "^2Sgt. Foley: ^7Vojíne Allene, abys dokončil tuhle demonstraci, musíš si vzít pár tříštivých granátů. ", + "SUBTITLE_TRAIN_FLY_THANKSFORHELP81": "^2Sgt. Foley: ^7Dobrá, díky za pomoc, vojíne Allene. Teď jdi na cvičiště...generál Shepherd chce, abys prošel kurzem.", + "SUBTITLE_TRAIN_FLY_GOFIRST82": "^2Sgt. Foley: ^7Dobrá, kdo chce jít první? Ukažte mi, co jste se naučili.", + "SUBTITLE_TRAIN_CPD_WELCOMEBACK91": "^2Des. Dunn: ^7Hej vojíne. Vítej zpátky na cvičišti.", + "SUBTITLE_TRAIN_CPD_SPECIALOP92": "^2Des. Dunn: ^7Slyšel jsem, že generál Shepherd chce střelce z naší jednotky pro nějaké speciální operace. V každém případě se dívá támhle nahoře.", + "SUBTITLE_TRAIN_CPD_GRABAPISTOL93": "^2Des. Dunn: ^7Vezmi si pistoli.", + "SUBTITLE_TRAIN_CPD_ALREADYHAVE94": "^2Des. Dunn: ^7Dobře. Takže už máš druhou zbraň.", + "SUBTITLE_TRAIN_CPD_TRYSWITCHING95": "^2Des. Dunn: ^7Udělej mi laskavost a vezmi si druhou zbraň.", + "SUBTITLE_TRAIN_CPD_SWITCHTORIFLE96": "^2Des. Dunn: ^7Tak a teď si vezmi hlavní zbraň.", + "SUBTITLE_TRAIN_CPD_SWITCHTOSIDEARM97": "^2Des. Dunn: ^7Dobře. Teď si zase vezmi druhou.", + "SUBTITLE_TRAIN_CPD_ALWAYSFASTER98": "^2Des. Dunn: ^7Vidíš, jak to šlo rychle? Zapamatuj si... vzít si pistoli je vždy rychlejší, než nabíjet.", + "SUBTITLE_TRAIN_CPD_TIMERSTARTS99": "^2Des. Dunn: ^7Ok, pokračuj dál. Čas se začne počítat, až se ti objeví první cíl.", + "SUBTITLE_TRAIN_CPD_ANYWEAPON910": "^2Des. Dunn: ^7Ok, vezmi si jakoukoliv zbraň a jdi dál. Čas se začne počítat, až se ti objeví první cíl.", + "SUBTITLE_TRAIN_CPD_SMILEFORCAMERAS911": "^2Des. Dunn: ^7Takže, nezapomeň na úsměv a tref se...Shepherd se bude dívat. Nejlepší střelec se připojí k jednotce primadona...jestli bys chtěl.", + "SUBTITLE_TRAIN_CPD_DONTMISS912": "^2Des. Dunn: ^7Usměj se na kamery a tref se...Shepherd a zbytek smetánky hledá střelce pro nějaké speciální operace.", + "SUBTITLE_TRAIN_CPD_DONTHAVEALLDAY917": "^2Des. Dunn: ^7Ok, vojíne Allene, nemáme na to celý den. Pojď na cvičiště.", + "SUBTITLE_TRAIN_CPD_BOTHINTROUBLE918": "^2Des. Dunn: ^7Člověče, dostaneš nás oba do problémů s generálem. Jdi na cvičiště, chlape.", + "SUBTITLE_TRAIN_CPD_WATCHOUT101": "^2Des. Dunn: ^7Pozor na civilisty.", + "SUBTITLE_TRAIN_CPD_WATCHOUT101_1": "^2Des. Dunn: ^7Hej, pozor na civilisty.", + "SUBTITLE_TRAIN_CPD_AWWKILLED102": "^2Des. Dunn: ^7Hmm zabil jsi civilistu. No tak, Allene!", + "SUBTITLE_TRAIN_CPD_AWWKILLED102_2": "^2Des. Dunn: ^7No tak, zabil jsi civilistu. Jdeme, Allene!", + "SUBTITLE_TRAIN_CPD_ACIVILIAN103": "^2Des. Dunn: ^7To byl civilista, vojíne.", + "SUBTITLE_TRAIN_CPD_MELEE104": "^2Des. Dunn: ^7Zaútoč nožem!", + "SUBTITLE_TRAIN_CPD_CROUCH105": "^2Des. Dunn: ^7Skrč se pod překážkou a pokračuj!", + "SUBTITLE_TRAIN_CPD_CLEARTHEAREA106": "^2Des. Dunn: ^7Vyčisti oblast!", + "SUBTITLE_TRAIN_CPD_TOPFLOOR107": "^2Des. Dunn: ^7Nepřátele v oknech nahoře!", + "SUBTITLE_TRAIN_CPD_JUMPDOWN108": "^2Des. Dunn: ^7Čisto! Seskoč dolů!", + "SUBTITLE_TRAIN_CPD_SPRINT109": "^2Des. Dunn: ^7Sprintuj k východu! Čas běží!", + "SUBTITLE_TRAIN_CPD_CLEARFIRSTGOGOGO1010": "^2Des. Dunn: ^7Vyčisti první zónu. Běž!", + "SUBTITLE_TRAIN_CPD_AREACLEARED1011": "^2Des. Dunn: ^7Zóna čistá! Pokračuj do budovy!", + "SUBTITLE_TRAIN_CPD_MISSEDSOME1012": "^2Des. Dunn: ^7Pár cílů jsi netrefil, pokračuj.", + "SUBTITLE_TRAIN_CPD_LEFTTARGETS1013": "^2Des. Dunn: ^7V poslední zóně jsi nechal pár cílů, pokračuj.", + "SUBTITLE_TRAIN_CPD_TIMEDCOURSE1014": "^2Des. Dunn: ^7Pohyb! Tohle je na čas!", + "SUBTITLE_TRAIN_CPD_UPTHESTAIRS1015": "^2Des. Dunn: ^7Nahoru po schodech!", + "SUBTITLE_TRAIN_CPD_LASTAREAMOVE1016": "^2Des. Dunn: ^7Poslední zóna! Pohyb!", + "SUBTITLE_TRAIN_CPD_NEEDTOUSEKNIFE1017": "^2Des. Dunn: ^7Musíš použít svůj nůž, Allene.", + "SUBTITLE_TRAIN_CPD_NOBULLETS1018": "^2Des. Dunn: ^7Žádné kulky, vojíne, na ten cíl použij svůj nůž.", + "SUBTITLE_TRAIN_CPD_MELEETHATTARGET1019": "^2Des. Dunn: ^7Zasáhni ho zblízka, vojíne.", + "SUBTITLE_TRAIN_CPD_USEYOURKNIFE1020": "^2Des. Dunn: ^7Použij nůž!", + "SUBTITLE_TRAIN_CPD_STOPFIRINGFROMHIP1021": "^2Des. Dunn: ^7Přestaň střílet od boku! Zamiř si!", + "SUBTITLE_TRAIN_CPD_AIMSIGHTSPRIVATE1022": "^2Des. Dunn: ^7Zamiř si, Vojíne!", + "SUBTITLE_TRAIN_CPD_NEEDTOAIM1024": "^2Des. Dunn: ^7Musíš si zamířit, Allene!", + "SUBTITLE_TRAIN_CPD_NEEDTOSPRINT1025": "^2Des. Dunn: ^7Test musíš dokončit sprintem. Vrať se na červený kruh a zkus to znovu.", + "SUBTITLE_TRAIN_CPD_DIDNTSPRINT1026": "^2Des. Dunn: ^7Nesprintoval jsi, vojíne. Vrať se na červený kruh a zasprintuj k východu.", + "SUBTITLE_TRAIN_CPD_GOBACKANDSPRINT1027": "^2Des. Dunn: ^7Musíš sprintovat, vojíne. Vrať se na červený kruh a zasprintuj k východu.", + "SUBTITLE_TRAIN_CPD_CANTFINISHSPRINT1028": "^2Des. Dunn: ^7Dokud nezasprintuješ, nemůžeš to dokončit, Allene. Vrať se na červený kruh a zasprintuj k východu.", + "SUBTITLE_TRAIN_CPD_MOVINGFORWARDGO1029": "^2Des. Dunn: ^7Pokračuj dál! Běž! Běž!", + "SUBTITLE_TRAIN_CPD_RUNNINGOUTOFTIME1030": "^2Des. Dunn: ^7Pohyb! Už ti nezbývá moc času!", + "SUBTITLE_TRAIN_CPD_TIMEDCOURSE21031": "^2Des. Dunn: ^7Jdeme! Pohyb! Vojíne, je to na čas.", + "SUBTITLE_TRAIN_CPD_SPRINTTOEXIT1032": "^2Des. Dunn: ^7Běž! Sprintuj k východu!", + "SUBTITLE_TRAIN_CPD_MOVESPRINT1033": "^2Des. Dunn: ^7Pohyb! Sprintuj vojíne!", + "SUBTITLE_TRAIN_CPD_SPRINTALLENGOGOGO1034": "^2Des. Dunn: ^7Sprinuj Allene! Běž!", + "SUBTITLE_TRAIN_CPD_NOWSPRINT1035": "^2Des. Dunn: ^7Sprintuj k východu! Pohyb! Pohyb!", + "SUBTITLE_TRAIN_CPD_MOVINGFORWARD1113": "^2Des. Dunn: ^7Pokračuj dál!", + "SUBTITLE_TRAIN_CPD_LONGANDCIVILIANS121": "^2Des. Dunn: ^7To nestačí, Allene. Trvalo ti to dlouho a zabil jsi moc civlistů. Zkus to znovu.", + "SUBTITLE_TRAIN_CPD_LONGANDCIVILIANS121_1": "^2Des. Dunn: ^7To nebude ono, Allene. Trvalo ti to moc dlouho a zabil jsi mnoho civlistů. Zkus to znovu.", + "SUBTITLE_TRAIN_CPD_TARGETSWITHKNIFE122": "^2Des. Dunn: ^7Zneškodnil jsi moc cílů nožem. Zkus to znovu, tentokrát s kulkami.", + "SUBTITLE_TRAIN_CPD_LONGANDTARGETS123": "^2Des. Dunn: ^7To nestačí, Allene. Trvalo ti to dlouho a minul jsi pár cílů. Zkus to znovu.", + "SUBTITLE_TRAIN_CPD_TARGETS124": "^2Des. Dunn: ^7To nestačí, Allene. Minul jsi příliš mnoho cílů. Zkus to znovu.", + "SUBTITLE_TRAIN_CPD_CIVILIANS125": "^2Des. Dunn: ^7To nestačí, Allene. Zabil jsi moc civilistů. Zkus to znovu.", + "SUBTITLE_TRAIN_CPD_CIVILIANS125_1": "^2Des. Dunn: ^7To nestačí, Allene. Zabil jsi moc civilistů. Zkus to znovu.", + "SUBTITLE_TRAIN_CPD_SLOPPY126": "^2Des. Dunn: ^7Nebylo to špatný. Ale měl jsi tam pár mezer.", + "SUBTITLE_TRAIN_CPD_ALRGIHTIGUESS127": "^2Des. Dunn: ^7Jo, řekl bych, že to šlo. Ale i tak to potřebuješ ještě doladit.", + "SUBTITLE_TRAIN_CPD_GOODENOUGH128": "^2Des. Dunn: ^7Šlo to, ale byly tam nějaké problémy.", + "SUBTITLE_TRAIN_CPD_ROUGHEDGES129": "^2Des. Dunn: ^7Dobrá, viděl jsem horší. Ale i tak jsi tam měl problémy.", + "SUBTITLE_TRAIN_CPD_WASNTHORRIBLE1210": "^2Des. Dunn: ^7Dobrá, nebylo to tak strašný, ale ani úžasný.", + "SUBTITLE_TRAIN_CPD_LOOKOK1211": "^2Des. Dunn: ^7Bylo to dobrý, ale pořád na sobě potřebuješ pracovat.", + "SUBTITLE_TRAIN_CPD_STILLGOTIT1212": "^2Des. Dunn: ^7To bylo dobrý, chlape, dost dobrý. Pořád to máš v sobě.", + "SUBTITLE_TRAIN_CPD_VERYNICE1213": "^2Des. Dunn: ^7Tak to bylo pěkný. Běháš jako profesionál.", + "SUBTITLE_TRAIN_CPD_JUSTSWITCH1214": "^2Des. Dunn: ^7Jen si změn zbraň! Je to rychlejší, než nabíjet!", + "SUBTITLE_TRAIN_CPD_PRETTYGOOD1215": "^2Des. Dunn: ^7To bylo zatraceně dobrý. Dobrá práce, Allene.", + "SUBTITLE_TRAIN_CPD_VERYIMPRESSIVE1216": "^2Des. Dunn: ^7Dost dobrý, chlape! Udělal sis z testu prdel!", + "SUBTITLE_TRAIN_CPD_AMAZINGWORK1217": "^2Des. Dunn: ^7Úžasná práce, chlape. Takhle se dělá test na cvičišti.", + "SUBTITLE_TRAIN_CPD_RUNAGAIN1218": "^2Des. Dunn: ^7Ok, zamiř nahoru a seskup se s týmem, nebo můžeš zpátky a zkusit test znovu.", + "SUBTITLE_TRAIN_CPD_HEADUPSTAIRS1219": "^2Des. Dunn: ^7Dobrá. Zamiř nahoru a seskup se s ostatníma.", + "SUBTITLE_TRAIN_CPD_ANOTHERGO1220": "^2Des. Dunn: ^7Dobrá. Jdi zpátky a znovu.", + "SUBTITLE_TRAIN_CPD_JUMPTHEDITCH1220": "^2Des. Dunn: ^7Přeskoč to!", + "SUBTITLE_TRAIN_CPD_NEEDTORUNAGAIN1221": "^2Des. Dunn: ^7Příliš pomalu. Musíš to zkusit znovu, vojíne.", + "SUBTITLE_TRAIN_HQR_HEADEDOUT131": "^2Overlord: ^7Všem jednotkám Hunter, seskupte se. Míříme pryč.", + "SUBTITLE_TRAIN_AR1_TRAPPED132": "^2Voj. Walden: ^7BCT Jedna je uvězněna v červené zóně za řekou! Ztratili jsme kontakt!", + "SUBTITLE_TRAIN_AR2_BLEWTHEBRIDGE133": "^2Sgt. Arnett: ^7Oni odpálí ten zatracenej most! Musíme si pohnout!", + "SUBTITLE_TRAIN_FLY_MOVINGOUT134": "^2Sgt. Foley: ^7Všichni do svých vozidel! Přesouváme se!", + "NEW_DOG_DEATH_TOO_SOON_ALT": "Příliš brzy. Stiskni ^3[{+melee}]^7 když se pes chystá, že tě pokouše. ", + "NEW_DOG_DEATH_TOO_LATE_ALT": "Příliš pozdě. Stiskni ^3[{+melee}]^7 když se pes chystá, že tě pokouše. ", + "NEW_DOG_DEATH_DO_NOTHING_ALT": "Stiskni ^3[{+melee}]^7 když se pes chystá, že tě pokouše. ", + "RANK_NEWRANK": "Dosáhl jsi nové hodnosti:", + "RANK_PROMOTED": "Byl jsi povýšen!", + "RANK_PLAYER_WAS_PROMOTED": "&&1 byl povýšen na &&2!", + "RANK_PLAYER_WAS_PROMOTED_N": "&&1 byl povýšen na &&2 &&3!", + "RANK_REC": "Rek.", + "RANK_REC_FULL": "Rekrut", + "RANK_PVT": "Voj.", + "RANK_PVT_FULL": "Private", + "RANK_PFC": "PFC.", + "RANK_PFC_FULL": "Private First Class", + "RANK_LCPL": "LCpl.", + "RANK_LCPL_FULL": "Lance Corporal", + "RANK_CPL": "Des.", + "RANK_CPL_FULL": "Corporal", + "RANK_SGT": "Sgt.", + "RANK_SGT_FULL": "Seržant", + "RANK_SSGT": "SSgt.", + "RANK_SSGT_FULL": "Staff Sergeant", + "RANK_GYSGT": "GySgt.", + "RANK_GYSGT_FULL": "Gunnery Sergeant", + "RANK_MSGT": "MSgt.", + "RANK_MSGT_FULL": "Master Sergeant", + "RANK_MGYSGT": "MGySgt.", + "RANK_MGYSGT_FULL": "Master Gunnery Sergeant", + "RANK_2NDLT": "2ndLt.", + "RANK_2NDLT_FULL": "2nd Lieutenant", + "RANK_1STLT": "1stLt.", + "RANK_1STLT_FULL": "1st Lieutenant", + "RANK_CAPT": "Capt.", + "RANK_CAPT_FULL": "Captain", + "RANK_MAJ": "Maj.", + "RANK_MAJ_FULL": "Major", + "RANK_LTCOL": "LtCol.", + "RANK_LTCOL_FULL": "Lieutenant Colonel", + "RANK_COL": "Col.", + "RANK_COL_FULL": "Colonel", + "RANK_BGEN": "BGen.", + "RANK_BGEN_FULL": "Brigadier General", + "RANK_MAJGEN": "MajGen.", + "RANK_MAJGEN_FULL": "Major General", + "RANK_LTGEN": "LtGen.", + "RANK_LTGEN_FULL": "Lieutenant General", + "RANK_GEN": "Gen.", + "RANK_GEN_FULL": "General", + "RANK_COMM": "Comm.", + "RANK_COMM_FULL": "Commander", + "RANK_1STLT_FULL2": "1st Lieutenant I", + "RANK_1STLT_FULL3": "1st Lieutenant II", + "RANK_2NDLT_FULL2": "2nd Lieutenant I", + "RANK_2NDLT_FULL3": "2nd Lieutenant II", + "RANK_BGEN_FULL2": "Brigadier General I", + "RANK_BGEN_FULL3": "Brigadier General II", + "RANK_CAPT_FULL2": "Captain I", + "RANK_CAPT_FULL3": "Captain II", + "RANK_COL_FULL2": "Colonel I", + "RANK_COL_FULL3": "Colonel II", + "RANK_COMM_FULL2": "Commander I", + "RANK_COMM_FULL3": "Commander II", + "RANK_CPL_FULL2": "Corporal I", + "RANK_CPL_FULL3": "Corporal II", + "RANK_GEN_FULL2": "General I", + "RANK_GEN_FULL3": "General II", + "RANK_GYSGT_FULL2": "Gunnery Sergeant I", + "RANK_GYSGT_FULL3": "Gunnery Sergeant II", + "RANK_LCPL_FULL2": "Lance Corporal I", + "RANK_LCPL_FULL3": "Lance Corporal II", + "RANK_LTCOL_FULL2": "Lieutenant Colonel I", + "RANK_DELETE": "DELETE ME", + "RANK_NEWREF": "Nový text", + "RANK_LTCOL_FULL3": "Lieutenant Colonel II", + "RANK_MAJ_FULL2": "Major I", + "RANK_MAJ_FULL3": "Major II", + "RANK_MAJGEN_FULL2": "Major General I", + "RANK_MAJGEN_FULL3": "Major General II", + "RANK_MGYSGT_FULL2": "Master Gunnery Sergeant I", + "RANK_MGYSGT_FULL3": "Master Gunnery Sergeant II", + "RANK_MSGT_FULL2": "Master Sergeant I", + "RANK_MSGT_FULL3": "Master Sergeant II", + "RANK_PFC_FULL2": "Private First Class I", + "RANK_PFC_FULL3": "Private First Class II", + "RANK_PVT_FULL2": "Private I", + "RANK_PVT_FULL3": "Private II", + "RANK_REC_FULL2": "Recruit I", + "RANK_REC_FULL3": "Recruit II", + "RANK_SGT_FULL2": "Sergeant I", + "RANK_SGT_FULL3": "Sergeant II", + "RANK_SSGT_FULL2": "Staff Sergeant I", + "RANK_SSGT_FULL3": "Staff Sergeant II", + "RANK_LTGEN_FULL2": "Lieutenant General I", + "RANK_LTGEN_FULL3": "Lieutenant General II", + "RANK_KILL_STREAK_N": "&&1 has a killstreak of &&2!", + "RANK_PVT_FULL_N": "Private &&1", + "RANK_PFC_FULL_N": "Private First Class &&1", + "RANK_LCPL_FULL_N": "Lance Corporal &&1", + "RANK_CPL_FULL_N": "Corporal &&1", + "RANK_SGT_FULL_N": "Sergeant &&1", + "RANK_SSGT_FULL_N": "Staff Sergeant &&1", + "RANK_GYSGT_FULL_N": "Gunnery Sergeant &&1", + "RANK_MSGT_FULL_N": "Master Sergeant &&1", + "RANK_MGYSGT_FULL_N": "Master Gunnery Sergeant &&1", + "RANK_2NDLT_FULL_N": "2nd Lieutenant &&1", + "RANK_1STLT_FULL_N": "1st Lieutenant &&1", + "RANK_CAPT_FULL_N": "Kapitán &&1", + "RANK_MAJ_FULL_N": "Major &&1", + "RANK_LTCOL_FULL_N": "Lieutenant Colonel &&1", + "RANK_COL_FULL_N": "Colonel &&1", + "RANK_BGEN_FULL_N": "Brigadier General &&1", + "RANK_MAJGEN_FULL_N": "Major General &&1", + "RANK_LTGEN_FULL_N": "Lieutenant General &&1", + "RANK_GEN_FULL_N": "General &&1", + "RANK_ROMANI": "I", + "RANK_ROMANII": "II", + "RANK_SCORE_PRE": "Skóre:", + "RANK_CHALLENGES_PRE": "Výzvy dokončena:", + "RANK_MATCHBONUS_PRE": "Match Bonus:", + "RANK_TOTALXP_PRE": "Celkově získáno XP:", + "RANK_RANK_PRE": "Rank:", + "RANK_XP_REQUIRED_PRE": "Potřebné XP:", + "RANK_NEXT_RANK_PRE": "Další rank:", + "RANK_SGTMAJ": "SgtMaj.", + "RANK_SGTMAJ_FULL": "Sergeant Major", + "RANK_SGTMAJ_FULL2": "Sergeant Major I", + "RANK_SGTMAJ_FULL3": "Sergeant Major II", + "RANK_SGTMAJ_FULL_N": "Sergeant Major &&1", + "RANK_COMM_FULL_N": "Velitel &&1", + "RANK_SPC": "Spc.", + "RANK_SPC_FULL": "Specialist", + "RANK_SPC_FULL2": "Specialist I", + "RANK_SPC_FULL3": "Specialist II", + "RANK_SPC_FULL_N": "Specialist &&1", + "RANK_SFC": "SFC.", + "RANK_SFC_FULL": "Sergeant First Class", + "RANK_SFC_FULL2": "Sergeant First Class I", + "RANK_SFC_FULL3": "Sergeant First Class II", + "RANK_SFC_FULL_N": "Sergeant First Class &&1", + "RANK_1STSGT": "1stSgt.", + "RANK_1STSGT_FULL": "First Sergeant", + "RANK_1STSGT_FULL2": "First Sergeant I", + "RANK_1STSGT_FULL3": "First Sergeant II", + "RANK_1STSGT_FULL_N": "First Sergeant &&1", + "RANK_CSM": "CSM.", + "RANK_CSM_FULL": "Command Sergeant Major", + "RANK_CSM_FULL2": "Command Sergeant Major I", + "RANK_CSM_FULL3": "Command Sergeant Major II", + "RANK_CSM_FULL_N": "Command Sergeant Major &&1", + "RANK_CSM_FULL4": "Command Sergeant Major III", + "RANK_GEN_FULL4": "General III", + "RANK_LTGEN_FULL4": "Lieutenant General III", + "RANK_MAJGEN_FULL4": "Major General III", + "RANK_BGEN_FULL4": "Brigadier General III", + "RANK_COL_FULL4": "Colonel III", + "RANK_LTCOL_FULL4": "Lieutenant Colonel III", + "RANK_MAJ_FULL4": "Major III", + "RANK_CAPT_FULL4": "Captain III", + "RANK_1STLT_FULL4": "1st Lieutenant III", + "RANK_2NDLT_FULL4": "2nd Lieutenant III", + "RANK_ROMANIII": "III", + "PMC_DEBUG_ENEMY_COUNT": "Živý nepřátelé: &&1", + "PMC_DEBUG_VEHICLE_COUNT": "Aktivní vozidla: &&1", + "PMC_DEBUG_SPAWNER_COUNT": "Enemy Spawners: &&1", + "PMC_ENEMIES_REMAINING": "Zbývyjící nepřátelé: &&1", + "PMC_TIME_REMAINING": "Zbývající čas: &&1", + "PMC_TIME_UNTIL_ATTACK": "Čas do útoku: &&1", + "PMC_OBJECTIVE_KILL_ENEMIES": "Odstraň všechny nepřátele.", + "PMC_OBJECTIVE_ABORT_CODES": "Získej nepř. počítače.", + "PMC_OBJECTIVE_KILL_ENEMIES_REMAINING": "Odstraň všechny nepřátele [ &&1 zbývá ].", + "PMC_OBJECTIVE_EXTRACT": "Dostaň se do extrakční zóny.", + "PMC_OBJECTIVE_SETUP_DEFENSES": "Sestav obranné pozice před útokem nepřítele.", + "PMC_OBJECTIVE_DEFEND": "Přežij než uběhne časový limit.", + "PMC_OBJECTIVE_FAILED": "Mise selhala. Cíle nebyly dokončeny včas.", + "PMC_SELECT_DENSITY": "Zvol obtížnost nepřátel", + "PMC_DIFFICULTY_LIGHT": "Lehká", + "PMC_DIFFICULTY_MODERATE": "Mírná", + "PMC_DIFFICULTY_HEAVY": "Těžká", + "PMC_DIFFICULTY_MAXIMUM": "Maximální", + "PMC_DIFFICULTY_LIGHT_DESC": "Obtížnost nepřátel bude lehká.", + "PMC_DIFFICULTY_MODERATE_DESC": "Obtížnost nepřátel bude mírná. Postupuj opatrně.", + "PMC_DIFFICULTY_HEAVY_DESC": "Obtížnost nepřátel bude těžká. Půjde po tobě mnoho nepřátel. Asi nepřežiješ.", + "PMC_DIFFICULTY_MAXIMUM_DESC": "Obtížnost nepřátel bude extrémně vysoká. Pouze elita může dokončit tuto misi.", + "PMC_SELECT_GAMETYPE": "Vybraný typ hry", + "PMC_TYPE_ELIMINATION": "Eliminace", + "PMC_TYPE_OBJECTIVE": "Úkol", + "PMC_TYPE_DEFEND": "Obrana", + "PMC_TYPE_ELIMINATION_DESC": "Odstraň všechny hrozby v misi bez časového omezení.", + "PMC_TYPE_OBJECTIVE_DESC": "Dokončí svůj úkol a dostaň se do extrakční zóny dřív než uplyne časový limit.", + "PMC_TYPE_DEFEND_DESC": "Sestav obranné pozice a přežij než uplyne časový limit.", + "PMC_CHARACTER_ASSAULT": "Útok", + "PMC_CHARACTER_SNIPER": "Odstřelovač", + "PMC_CHARACTER_DEMOLITION": "Demolice", + "PMC_SPECTATING": "Pozorování", + "PMC_HINT_USELAPTOP": "Stiskni a podrž &&1 pro použití počítače.", + "PMC_DEFEND_FAILED": "Drž nepřátele dál od cíle!", + "PMC_START_ATTACK_USE_HINT": "Stiskni a podrž &&1 na počítači abys zrušil nastavený čas.", + "PMC_START_ATTACK_HINT": "Přistup k počítači abys zrušil nastavený čas.", + "PMC_CLAYMORE_PICKUP": "Stiskni a podrž &&1 pro sebrání claymore", + "PMC_HQ_DAMAGE": "HQ zničeno", + "PMC_PMC_CONTRACT_1_DESC": "Vyčisti celou misi. Najdi a zabij 25 nepřátel. Dej pozor na jejich kulomety a helikoptéry.", + "PMC_PMC_CONTRACT_1_PRIZE": "$100 za nepřítele\n$500 bonus za dokončení mise", + "PMC_PMC_CONTRACT_1_PLAYERS": "1-2 hráči", + "PMC_PMC_CONTRACT_2_PRIZE": "$2000 bonus za dokončení mise", + "PMC_PMC_CONTRACT_3_PRIZE": "$25 za nepřítele\n$1500 bonus za dokončení mise", + "PMC_PMC_CONTRACT_5_PRIZE": "$3000 bonus za dokončení mise", + "PMC_PMC_CONTRACT_6_PRIZE": "$150 za nepřítele\n$3000 bonus za dokončení mise", + "PMC_PMC_CONTRACT_7_NAME": "$2500 Blackout Contract", + "PMC_PMC_CONTRACT_7_PRIZE": "$50 za nepřítele\n$2500 bonus za dokončení mise", + "PMC_PMC_CONTRACT_8_PRIZE": "$15000 bonus za dokončení mise", + "PMC_PMC_CONTRACT_9_PRIZE": "$50000 bonus za dokončení mise", + "PMC_PMC_GAME_SETTINGS": "PMC nastavení hry", + "PMC_PMC_CUSTOM_CONTRACT_TYPE": "Typ kontarktu", + "PMC_PMC_CUSTOM_CONTRACT_DENSITY": "Množství nepřátel", + "PMC_PMC_CUSTOM_CONTRACT_ENABLE_VEHICLES": "Nepřátelská vozidla", + "COOP_HOSTDISCONNECT": "Special Ops lobby closed.", + "COOP_WAITINGFORPLAYER": "Čekám na dalšího hráče...", + "COOP_CLIENTDROP": "Ztraceno spojení s druhým hráčem.", + "COOP_HOST_END_GAME": "Host ukončil hru", + "COOP_CLIENT_END_GAME": "Klient ukončil hru", + "COOP_FULL": "Tato operace už má dva hráče.", + "ELEVATOR_CALL_HINT": "Stiskni a podrž &&1 pro přivolání výtahu.", + "ELEVATOR_USE_HINT": "Stiskni a podrž &&1 pro použití výtahu.", + "ELEVATOR_FLOOR_SELECT_HINT": "Stiskni a podrž &&1 pro výběr podlaží.", + "MENU_PASSWORD2": "Heslo:", + "PLATFORM_SAVE_AND_QUIT": "ULOŽIT A UKONČIT", + "PLATFORM_QUIT": "Ukončit", + "PLATFORM_BACK": "Zpět", + "PLATFORM_YES": "Ano", + "PLATFORM_NO": "Ne", + + "MENU_YES": "Ano", + "MENU_MULTIPLAYER": "Multiplayer", + "MENU_QUIT": "Ukončit", + "MENU_OPTIONS": "Nastavení", + "MENU_SAVELOADGAME": "Uložit/Nahrát hru", + "MENU_LOADGAME": "Nahrát hru", + "MENU_NEWGAME": "Nová hra", + "MENU_TRAINING": "Výcvik", + "MENU_RESUMEGAME": "Pokračovat", + "MENU_BACKTOGAME": "Zpět do hry", + "MENU_CURRENTLYINAGAME": "Momentálně jsi ve hře", + "MENU_DOYOUWISHTOCONTINUE": "Chceš pokračovat?", + "MENU_CHOOSESKILLLEVEL": "Vyber si obtížnost", + "MENU_REGULAR": "Normální", + "MENU_HARDENED": "Těžká", + "MENU_VETERAN": "Veterán", + "MENU_BACK": "Zpět", + "MENU_STARTTRAINING": "Spustit výcvik?", + "MENU_SWITCHTOMULTIPLAYER": "Přepnout na Multiplayer?", + "MENU_NO": "Ne", + "MENU_SAVEGAMELIST": "Seznam uložení hry", + "MENU_SHOWAUTOSAVES": "Zobrazit autouložení", + "MENU_SHOWMANUALSAVES": "Zobrazit vlastní uložení", + "MENU_NAME": "Název", + "MENU_DATE": "Datum", + "MENU_SAVEAS": "Uložit jako:", + "MENU_DELETE": "Smazat", + "MENU_LOAD": "Nahrát", + "MENU_SAVE": "Uložit", + "MENU_DEL_SEL_SAVEGAME": "Smazat vybrané uložení?", + "MENU_OVERWRITE_EXISTING_FILE": "Přepsat existující soubor?", + "MENU_OK": "OK", + "MENU_YOU_MUST_SPECIFY_A_FILENAME": "Musíš zadat název souboru!", + "MENU_ARE_YOU_SURE_QUIT": "Opravdu chceš odejít?", + "MENU_QUIT_WARNING": "Opravdu chceš odejít?", + "MENU_SAVEQUIT_TEXT": "Opravdu chceš odejít? Ztratíš veškerý postup dosažený od posledního checkpointu.", + "MENU_CONTROLS": "Ovladání", + "MENU_CONTROLS_CAPS": "KLÁVESY", + "MENU_LOOK": "Pohled", + "MENU_MOVE": "Pohyb", + "MENU_SHOOT": "Střelba...", + "MENU_SAVE_INTERACT": "Uložit/Interakce", + "MENU_CONTROL_DEFAULTS": "Standardní ovládání", + "MENU_SYSTEM": "Systém", + "MENU_GRAPHICS": "Grafika ", + "MENU_SOUND": "Zvuk", + "MENU_PERFORMANCE": "Výkon", + "MENU_RESET_SYSTEM_DEFAULTS": "Optimální video a zvuk", + "MENU_CREDITS": "Titulky", + "MENU_RESET_TO_DEFAULTS": "Základní nastavení", + "MENU_THIS_WILL_RESTORE_ALL_SETTINGS": "Všechna nastavení budou resetována", + "MENU_TO_THEIR_DEFAULT_VALUE": "do základních hodnot.", + "MENU_ARE_YOU_SURE": "Jsi si jistý?", + "MENU_YOUR_CONTROLS_ARE_NOW_SET": "Ovládací prvky jsou nyní nastaveny", + "MENU_TO_THEIR_ORIGINAL_DEFAULT_VALUES": "na standardní hodnoty.", + "MENU_CLOSE": "Zavřít", + "MENU_OPTIONS_SYSTEM": "Nastavení - Systém", + "MENU_SET_RECOMMENDED": "Nastavit doporučené", + "MENU_QUALITY": "Kvalita", + "MENU_QUALITY_RECOMMENDED": "Kvalita: Doporučená", + "MENU_VIDEO_MODE": "Rozlišení", + "MENU_COLOR_DEPTH": "Barevná hloubka", + "MENU_FULLSCREEN": "Celá obrazovka", + "MENU_GEOMETRIC_DETAIL": "Geometrické detaily", + "MENU_CHARACTER_TEXTURES": "Textury postav", + "MENU_GENERAL_TEXTURES": "Textury obecně", + "MENU_TEXTURE_FILTER": "Filtrování textur", + "MENU_TEXTURE_QUALITY": "Kvalita textur", + "MENU_NVIDIA_DISTANCE_FOG": "NVidia - vzdálenost mlhy", + "MENU_BRIGHTNESS": "Jas", + "MENU_LANGUAGE": "Jazyk", + "MENU_APPLY_LANGUAGE_CHANGE": "Změnit jazyk", + "MENU_APPLY": "Aplikovat", + "MENU_APPLY_CAPS": "APLIKOVAT", + "MENU_YOUR_SETTINGS_ARE_NOW_SET": "Nyní je aplikováno tvoje nastavení", + "MENU_OPTIONS_CONTROLS": "Nastavení - Klávesy", + "MENU_LOOK_UP": "Pohled nahoru", + "MENU_LOOK_DOWN": "Pohle dolů", + "MENU_MOUSE_LOOK": "Otočit Myš", + "MENU_CENTER_VIEW": "Vystředit pohled", + "MENU_FREE_LOOK": "Volný pohled", + "MENU_INVERT_MOUSE": "Obrátit myš", + "MENU_SMOOTH_MOUSE": "Plynulá myš", + "MENU_MOUSE_SENSITIVITY": "Citlivost myši", + "MENU_SHOW_OBJECTIVES_SCORES": "Zobrazit cíle/skóre", + "MENU_USE": "Použít", + "MENU_QUICK_SAVE": "Rychlé uložení", + "MENU_QUICK_LOAD": "Rychlé načtení", + "MENU_SCREENSHOT": "Screenshot", + "MENU_FORWARD": "Dopředu", + "MENU_BACKPEDAL": "Brzda", + "MENU_MOVE_LEFT": "Doleva", + "MENU_MOVE_RIGHT": "Doprava", + "MENU_LEAN_LEFT": "Výklon vlevo", + "MENU_LEAN_RIGHT": "Výklon vpravo", + "MENU_STAND": "Postavit se", + "MENU_CROUCH": "Přikrčit se", + "MENU_PRONE": "Zalehnout", + "MENU_JUMP_STANCE_UP": "Skočit/Postavit se", + "MENU_STANCE_DOWN": "Postoj dolů", + "MENU_STANCE_UP": "Postoj nahoru", + "MENU_TOGGLE_CROUCH": "Přepnout přikrčení", + "MENU_TOGGLE_PRONE": "Přepnout lehnutí", + "MENU_HOLD_DOWN_CROUCH": "Zůstat přikrčený", + "MENU_HOLD_DOWN_PRONE": "Zůstat ležet", + "MENU_TURN_LEFT": "Otočit vlevo", + "MENU_TURN_RIGHT": "Otočit vpravo", + "MENU_STRAFE": "Pevný pohyb", + "MENU_WALL_MARKS": "Wall Marks", + "MENU_EJECTING_BRASS": "Ejecting Brass", + "MENU_DYNAMIC_LIGHTS": "Dynamická světla", + "MENU_LOW_QUALITY_SKY": "Nízká kvalita oblohy", + "MENU_SYNC_EVERY_FRAME": "SYNCHRONIZOVAT KAŽDÝ SNÍMEK", + "MENU_NVIDIA_FOG_TYPE": "Nvidia - typ mlhy", + "MENU_ATTACK": "Útok", + "MENU_TOGGLE_AIM_DOWN_THE_SIGHT": "Přepnout přesné míření", + "MENU_AIM_DOWN_THE_SIGHT": "Přesné míření", + "MENU_MELEE_ATTACK": "Nůž", + "MENU_RELOAD_WEAPON": "Nabít", + "MENU_TOGGLE_SEMIAUTOMATIC": "Přepnout na poloautomat ", + "MENU_SELECT_FIRST_WEAPON": "Vybrat první zbraň", + "MENU_SELECT_SECOND_WEAPON": "Vybrat druhou zbraň", + "MENU_SELECT_PISTOL": "Vybrat pistoly", + "MENU_SELECT_GRENADE": "Vybrat granát", + "MENU_NEXT_WEAPON": "Další zbraň", + "MENU_PREVIOUS_WEAPON": "Předchozí zbraň", + "MENU_LAST_WEAPON_USED": "Posledně použitá zbraň", + "MENU_EFFECTS_VOLUME": "Hlasitost efektů", + "MENU_MUSIC_VOLUME": "Hlasitost hudby", + "MENU_SOUND_QUALITY": "Kvalita zvuku", + "MENU_SPEAKER_CONFIG": "Konfigurace reproduktorů", + "MENU_THIS_WILL_APPLY_SOUND": "Tímto aplikuješ nastavení", + "MENU_SETTINGS_AND_RETURN": "zvuku a přepneš zpět", + "MENU_TO_THE_MAIN_MENU": "do hlavní nabídky.", + "MENU_NOTICE": "Upozornění", + "MENU_ERROR": "Chyba", + "MENU_EXIT": "Odejít", + "MENU_THIS_WILL_APPLY_VIDEO": "Tímto aplikuješ nastavení videa", + "MENU_RESTART_LEVEL": "Restartovat úroveň", + "MENU_RESTART_MISSION": "Restartovat misi", + "MENU_LOAD_LAST_SAVE": "Nahrát poslední uložení", + "MENU_MAIN_MENU": "Hlavní nabídka", + "MENU_MAIN_MENU_CAPS": "HLAVNÍ NABÍDKA", + "MENU_CLICK_TO_START_THE_MISSION": "Klikni pro spuštění mise", + "MENU_NEXT_LEVEL": "Další úroveň", + "MENU_THIS_WILL_SET": "Tímto nastavíš", + "MENU_RECOMMENDED_VIDEO_SETTINGS": "doporučené nastavení videa", + "MENU_AND_RETURN_TO_THE_MAIN_MENU": "a vrátíš se do hlavní nabídky.", + "MENU_RETURN_TO_MAIN_MENU": "ZPĚT DO HLAVNÍ NABÍDKY", + "MENU_JOIN_AN_INTERNET_GAME": "Připojit k internetové hře", + "MENU_JOIN_A_LAN_GAME": "Připojit k LAN hře", + "MENU_DISCONNECT": "Odpojit", + "MENU_START_NEW_SERVER": "Spustit nový server", + "MENU_MULTIPLAYER_OPTIONS": "Nastavení multiplayeru", + "MENU_MODS": "Módy", + "MENU_MODSWITHCOLON": "Módy:", + "MENU_SINGLE_PLAYER": "Samotný hráč", + "MENU_CLICK_FOR_AUTOUPDATE": "Klikni pro aktualizace", + "MENU_SWITCH_TO_SINGLE_PLAYER": "Přepnout do hlavní nabídky?", + "MENU_DOWNLOAD_AUTOUPDATE_PATCH": "Stáhnout aktualizační patch?", + "MENU_VERSION_INSTALLED": "Instalovaná verze:", + "MENU_VERSION_AVAILABLE": "Dostupná verze:", + "MENU_CDKEY": "CD klíč", + "MENU_ENTER_YOUR_ENCRYPTION_KEY_IN_THE_FIELD_BELOW": "Zadej svůj klíč do pole níže.", + "MENU_KEY": "Klíč:", + "MENU_CANCEL": "Zrušit", + "MENU_VERIFY": "Ověřit", + "MENU_NEW_FAVORITE": "Nový oblíbený", + "MENU_NAME1": "Název: ", + "MENU_IP_ADDRESS": "IP Addresa: ", + "MENU_FILTER_SERVERS": "Filtr serverů", + "MENU_VIEW_EMPTY": "Zobrazit prázdné:", + "MENU_VIEW_FULL": "Zobrazit plné:", + "MENU_FRIENDLY_FIRE": "Palba do vlastních: ", + "MENU_SHOW_MAX_LIVES": "Zobrazit maximum životů:", + "MENU_SHOW_TOURNEY": "Zobrazit turnaj:", + "MENU_TYPE": "Typ:", + "MENU_SERVER NAME": "Název serveru", + "MENU_MAP_NAME": "Název mapy", + "MENU_NUMPLAYERS": "#Hráči", + "MENU_PING": "Ping", + "MENU_GET_NEW_LIST": "Získat nový seznam", + "MENU_REFRESH_LIST": "Obnovit seznam", + "MENU_PASSWORD": "Heslo", + "MENU_ADD_TO_FAVORITES": "Přidat do oblíbených", + "MENU_DEL_FAVORITE": "Smazat oblíbené", + "MENU_FIND_FRIEND": "Najít přítele", + "MENU_ACCEPT": "Přijmout", + "MENU_CONNECTION_TYPE": "Typ připojení:", + "MENU_LAUNCH": "Spustit", + "MENU_SELECT_MOD_NAME_TO_LAUNCH": "Vybrat název MODU pro spuštění", + "MENU_JOIN_SERVER": "Připojit k serveru", + "MENU_CREATE_SERVER": "Vytvořit server", + "MENU_ENTER CD-KEY": "Zadat CD-klíč", + "MENU_SHOW_SCORES": "Zobrazit skóre:", + "MENU_CHAT": "Chat", + "MENU_TEAM_CHAT": "Týmový Chat", + "MENU_QUICK_CHAT": "Rychlý Chat", + "MENU_SHOW_COMPASS": "Zobrazit kompas:", + "MENU_TEAM_OVERLAY": "Team Overlay:", + "MENU_CHAT_ICON_TIME": "Chat Icon Time:", + "MENU_NET_DATA_RATE": "Rychlost přenosu dat:", + "MENU_PLAYER_NAME": "Jméno hráče", + "MENU_REFRESH": "Obnovit", + "MENU_CONTINUE": "Pokračovat", + "MENU_HIGHQUALITY": "Vysoká kvalita", + "MENU_NORMAL": "Normální", + "MENU_FAST": "Rychlé", + "MENU_FASTEST": "Nejrychlejší", + "MENU_CUSTOM": "Vlastní", + "MENU_INTERACT": "Interaktivní", + "MENU_SET_DEFAULT_CONTROLS": "Obnovit výchozí", + "MENU_STANDJUMP": "Postavit se/Skočit", + "MENU_GO_TO_CROUCH": "Přikrčit se", + "MENU_GO_TO_PRONE": "Zalehnout", + "MENU_LOAD_SELECTED_GAME": "Nahrát vybranou hru?", + "MENU_DEL_SEL_FAVORITE": "Smazat vybrané oblíbené ze seznamu?", + "MENU_VOTE_YES": "Hlasovat ANO", + "MENU_VOTE_NO": "Hlasovat NE", + "MENU_QUICK_REFRESH": "Rychlé obnovení", + "MENU_WORLD_DYNAMIC_LIGHT_QUALITY": "Kvalita dynamických světel - svět", + "MENU_SHOW_BLOOD": "Zobrazit krev", + "MENU_THIS_WILL_APPLY_THE": "Tímto aplikuješ", + "MENU_LANGUAGE_CHANGE_AND_RETURN": "změnu jazyka a vrátíš se", + "MENU_LOW": "Nízká", + "MENU_HIGH": "Vysoká", + "MENU_EXTRA": "Extra", + "MENU_BILINEAR": "Bilineární", + "MENU_TRILINEAR": "Trilineární", + "MENU_ANISOTROPIC": "Anisotropické", + "MENU_DEFAULT": "Základní", + "MENU_ON": "Zap", + "MENU_OFF": "Vyp", + "MENU_EVERYTHING": "Vše", + "MENU_MODELS_ONLY": "Pouze modely", + "MENU_NONE": "--", + "MENU_SP_DIFF_RANKING_0": "--", + "MENU_NICEST": "Nejhezčí", + "MENU_NV_RADIAL": "NV Radial", + "MENU_NV_PLANE": "NV Plane", + "MENU_11KHZ__": "11khz (Nízká kvalita, málo paměti)", + "MENU_22KHZ__": "22khz (Normální kvalita, středně paměti)", + "MENU_44KHZ__": "44khz (Vysoká kvalita, mnoho paměti)", + "MENU_WINDOWS_DEFAULT": "Dle nastavení Windows", + "MENU_MONO": "Mono", + "MENU_STEREO": "Stereo", + "MENU_FOUR_SPEAKERS": "4 reproduktory", + "MENU_FIVE_ONE_SPEAKERS": "5.1 reproduktorů", + "MENU_GAME_TYPE_SETTINGS": "Nastavení herního módu", + "MENU_SERVER_SETTINGS": "Nastavení serveru", + "MENU_GAME_TYPE": "Herní mód: ", + "MENU_SERVER_NAME": "Název serveru: ", + "MENU_DEDICATED": "Dedikovaný: ", + "MENU_PURE": "Čistý: ", + "MENU_MAXIMUM_PLAYERS": "Maximum hráčů: ", + "MENU_MINIMUM_PING": "Minimální ping: ", + "MENU_MAXIMUM_PING": "Maximální ping: ", + "MENU_MAXIMUM_RATE": "Maximální přenos: ", + "MENU_PASSWORD1": "Heslo: ", + "MENU_BOTH": "Obojí", + "MENU_LAN_CABLE_XDSL": "LAN/Kabel/DSL", + "MENU_SCORE_LIMIT_PLAYER_POINTS": "Limit skóre (body hráče): ", + "MENU_SCORE_LIMIT_TEAM_POINTS": "Limit skóre (body týmu): ", + "MENU_TIME_LIMIT": "Časový limit (minuty): ", + "MENU_FORCE_RESPAWNING": "Vynucené oživení: ", + "MENU_FRIENDLY_INDICATORS": "Ukazatel přátel: ", + "MENU_CARRIER_INDICATOR": "Ukazatel vozidel: ", + "MENU_GRACE_PERIOD": "Doba odkladu (sekundy): ", + "MENU_ROUND_LENGTH": "Délka kola (minuty): ", + "MENU_ROUND_LIMIT": "Limit kol (počet kol): ", + "MENU_TO_THE_GAME": "do hry.", + "MENU_NUMBER_OF_CORPSES": "Množství mrtvol", + "MENU_TINY": "Malé", + "MENU_SMALL": "Nevelké", + "MENU_MEDIUM": "Normální", + "MENU_LARGE": "Velké", + "MENU_INSANE": "Šílené", + "MENU_SETTINGS_WILL_BE_REAPPLIED": "Nastavení budou aplikována", + "MENU_NEXT_TIME_THE_SERVER": "při spuštění", + "MENU_IS_STARTED": "další hry.", + "MENU_JOIN": "Připojit", + "MENU_ALL_CURRENT_PROGRESS_WILL_BE_LOST": "Všechen aktuální postup bude ztracen.", + "MENU_PLAY_DEMO_LEVEL": "Hrát DEMO", + "MENU_ENABLE_CONSOLE": "Povolit konzoli", + "MENU_SUBTITLES": "Titulky", + "MENU_LOD": "LOD: ", + "MENU_AGGRESSIVE": "Agresivní", + "MENU_JOIN_A_GAME": "Připojit do hry", + "MENU_RESUMEGAME_Q": "Pokračovat ve hře?", + "MENU_RESUMEGAME_Q_DESC": "Chcete pokračovat následující misi?", + "MENU_CONNECTION": "Připojení", + "MENU_TYPE1": "Typ", + "MENU_RESET_TO": "Reset na", + "MENU_TO_ITS_OPTIMAL_VALUE": "optimální hodnoty.", + "MENU_RESTART_LEVEL_Q": "Restartovat úroveň?", + "MENU_LEVEL_OF_DETAIL": "Úroveň detailů:", + "MENU_ADD_SELECTED_SERVER_TO_FAVORITES": "Přidat vybraný srever do oblíbených?", + "MENU_REFLECT": "Reflect", + "MENU_SHARED": "Shared", + "MENU_KILLCAM": "Killcam: ", + "MENU_ALLOW_VOTING": "Povolené hlasování: ", + "MENU_AUTO_UPDATE": "Autoaktualizace", + "MENU_ALLOW_SNIPER_RIFLES": "Povolené sniperky: ", + "MENU_VIEW_PASSWORD": "S heslem:", + "MENU_VIEW_NOPASSWORD": "Bez hesla:", + "MENU_VIEW_PURE": "Pouze čisté servery:", + "MENU_VIEW_FRIENDLY_FIRE": "Palba do přátel:", + "MENU_VIEW_KILLCAM": "Killcam:", + "MENU_ALL": "Vše", + "MENU_MASTER_VOLUME": "Hlasitost", + "MENU_VOLUME": "Hlasitost hry", + "MENU_MODEL_DETAIL": "Detaily modelů", + "MENU_MINIMUM": "Minimum", + "MENU_UNLIMITED": "Bez limitu", + "MENU_MAXIMUM": "Maximum", + "MENU_POLISH": "Polish", + "MENU_SAFE": "Bezpečné", + "MENU_SAFE_MODE": "Bezp. mód", + "MENU_DEDICATEDONLY": "Pouze dedikované:", + "MENU_AUTOBALANCE_TEAMS": "Autom. vyrovnání týmů: ", + "MENU_ALLOW_ENEMY_SPECTATING": "Dovolené pozorování nepřítele: ", + "MENU_ALLOW_FREE_SPECTATING": "Dovolené volné pozorování: ", + "MENU_ALLOW_DOWNLOAD": "Dovolené stahování", + "MENU_PRESS_START": "Stiskni tlačítko START", + "MENU_SPLIT_SCREEN": "Rozdělená obrazovka", + "MENU_SPLIT_SCREEN_OFFLINE": "Rozdělená obrazovka Offline", + "MENU_START_GAME": "Start hry", + "MENU_JOIN_GAME": "Připojit do hry", + "MENU_CYCLE_ITEMS": "Cycle Items: ", + "MENU_USE_ITEM": "Use Item: ", + "MENU_HOLD_BREATH": "Zadržet dech", + "MENU_MELEE_BREATH": "Nůž/Zadržet dech", + "MENU_VOICECHAT": "Hlasový Chat...", + "MENU_VOICECHAT_RECORD_LEVEL": "Record Level", + "MENU_VOICECHAT_LEVEL_ADJUST": "Level Adjust", + "MENU_VOICECHAT_LEVEL_INDICATOR": "Level Indicator", + "MENU_VOICE": "Hlas", + "MENU_VOICE_CHAT_ENABLE": "Hlasový Chat:", + "MENU_CAMPAIGN": "Kampaň", + "MENU_LOOK_SENSITIVITY": "Citlivost", + "MENU_VERY_HIGH": "Velmi vysoká", + "MENU_LOOK_INVERSION": "Obrácený pohled", + "MENU_ENABLED": "Zapnuto", + "MENU_ENABLED_DEFAULT": "Zapnuto (základní)", + "MENU_DISABLED": "Vypnuto", + "MENU_DISABLED_DEFAULT": "Vypnuto (základní)", + "MENU_CONTROLLER_VIBRATION": "Vibrace", + "MENU_THUMBSTICK_LAYOUT": "Rozvržení přepínačů", + "MENU_CLASSIC": "Klasické", + "MENU_LEFTY": "Levák", + "MENU_DIVER": "Diver", + "MENU_BUTTON": "TLAČÍTKO", + "MENU_BUTTON_LAYOUT": "Rozvržení tlačítek", + "MENU_SOUTHPAW": "Southpaw", + "MENU_CREATE_GAME": "Vytvořit hru", + "MENU_SELECT_NEXT_MISSION": "Vybrat další misi", + "MENU_COMPLETED": "Dokončeno", + "MENU_LOCKED": "Uzamčeno", + "MENU_UNLOCK": "Odemčeno", + "MENU_RESET": "Reset", + "MENU_LOAD_MISSION": "Nahrát misi?", + "MENU_STATUS": "Stav:", + "MENU_NOT_STARTED": "Nezpuštěno", + "MENU_IN_PROGRESS": "V průběhu", + "MENU_COMPLETED_REGULAR": "Dokončeno na Normální", + "MENU_COMPLETED_HARDENED": "Dokončeno na Těžká", + "MENU_COMPLETED_VETERAN": "Dokonceno na Veterán", + "MENU_ASPECT_RATIO": "Poměr stran", + "MENU_TEXTURE_RESOLUTION": "Rozlišení textur", + "MENU_NORMAL_MAP_RESOLUTION": "Rozlišení normální mapy", + "MENU_SPECULAR_MAP_RESOLUTION": "Rozlišení zrcadlové mapy", + "MENU_VERY_LOW": "Velmi nízké", + "MENU_AUTO": "Auto", + "MENU_STANDARD_4_3": "Standardní 4:3", + "MENU_WIDE_16_9": "Širokoúhlé 16:9", + "MENU_WIDE_16_10": "Širokoúhlé 16:10", + "MENU_WIDE_21_9": "Širokoúhlé 21:9", + "MENU_MENU_COULDNT_BE_FOUND": "Nabídku nelze nalézt!", + "MENU_STANCE_UP_JUMP": "Postavit se/Skočit", + "MENU_USE_RELOAD": "Použít/Nabít", + "MENU_SWITCH_WEAPON": "Přepnout zbraň", + "MENU_THROW_GRENADE": "Hodit granát", + "MENU_CHANGE_GRENADE_TYPE": "Změnit typ granátu", + "MENU_AIM_DOWN_SIGHT": "Přesně zamířit", + "MENU_FIRE_WEAPON": "Střelba", + "MENU_OBJECTIVES_MENU": "Cíle/Nabídka", + "MENU_CHANGE_DIFFICULTY": "ZMĚNIT OBTÍŽNOST", + "MENU_RIGHT": "Vpravo", + "MENU_MOVE_FORWARD": "Dopředu", + "MENU_ROTATE_LEFT_RIGHT": "Otočit vlevo/vpravo", + "MENU_MOVE_BACK": "Dozadu", + "MENU_STRAFE_LEFT_RIGHT": "Strafe Left/Right", + "MENU_WAITING_FOR_MORE_PLAYERS": "Potřebujeme najít ještě &&1 hráčů", + "MENU_WAITING_FOR_MORE_PLAYERS1": "Čeká se na další hráče", + "MENU_MATCH_BEGINNING_IN": "Zápas začne za", + "MENU_XBOX_LIVE": "Xbox LIVE", + "MENU_XBOX_LIVE_LOBBY": "Xbox LIVE Lobby", + "MENU_QUICK_MATCH_STANDARD": "Rychlý zápas: Standardní", + "MENU_PLAY_A_QUICK_MATCH_WHICH_WILL_NOT_AFFECT_YOUR_RANK": "Hraním tohoto zápasu nijak neovlivníš své hodnocení", + "MENU_QUICK_MATCH_RANKED": "Rychlý zápas: Hodnocený", + "MENU_PLAY_A_QUICK_MATCH_WHICH_WILL_AFFECT_YOUR_RANK": "Hraním tohoto zápasu bude mít efekt na tvé hodnocení", + "MENU_CUSTOM_MATCH_STANDARD": "Vlastní zápas: Standardní", + "MENU_PLAY_A_CUSTOM_MATCH_WHICH_WILL_NOT_AFFECT_YOUR_RANK": "Hraním tohoto vlastního zápasu nijak neovlivníš své hodnocení", + "MENU_CUSTOM_MATCH_RANKED": "Vlastní zápas: Hodnocený", + "MENU_PLAY_A_CUSTOM_MATCH_WHICH_WILL_AFFECT_YOUR_RANK": "Hraním tohoto vlastního zápasu bude mít efekt na tvé hodnocení", + "MENU_TIME_LIMIT1": "Časový limit", + "MENU_2_MINUTES": "2 minuty", + "MENU_3_MINUTES": "3 minuty", + "MENU_4_MINUTES": "4 minuty", + "MENU_4_MINUTES_DEFAULT": "4 minuty (standard)", + "MENU_5_MINUTES": "5 minut", + "MENU_10_MINUTES": "10 minut", + "MENU_15_MINUTES": "15 minut", + "MENU_15_MINUTES_DEFAULT": "15 minut (standard)", + "MENU_30_MINUTES": "30 minut", + "MENU_30_MINUTES_DEFAULT": "30 minut (standard)", + "MENU_45_MINUTES": "45 minut", + "MENU_1_HOUR": "1 hodina", + "MENU_SCORE_LIMIT": "Limit skóre", + "MENU_5_POINTS": "5 bodů", + "MENU_5_POINTS_DEFAULT": "5 bodů (standard)", + "MENU_10_POINTS": "10 bodů", + "MENU_10_POINTS_DEFAULT": "10 bodů (standard)", + "MENU_15_POINTS": "15 bodů", + "MENU_20_POINTS": "20 bodů", + "MENU_25_POINTS": "25 bodů", + "MENU_25_POINTS_DEFAULT": "25 bodů (standard)", + "MENU_30_POINTS": "30 bodů", + "MENU_50_POINTS": "50 bodů", + "MENU_50_POINTS_DEFAULT": "50 bodů (standard)", + "MENU_100_POINTS": "100 bodů", + "MENU_100_POINTS_DEFAULT": "100 bodů (standard)", + "MENU_200_POINTS": "200 bodů", + "MENU_300_POINTS": "300 bodů", + "MENU_300_POINTS_DEFAULT": "300 bodů (standard)", + "MENU_400_POINTS": "400 bodů", + "MENU_400_POINTS_DEFAULT": "400 bodů (standard)", + "MENU_450_POINTS": "450 bodů", + "MENU_450_POINTS_DEFAULT": "450 bodů (standard)", + "MENU_600_POINTS": "600 bodů", + "MENU_600_POINTS_DEFAULT": "600 bodů (standard)", + "MENU_800_POINTS": "800 bodů", + "MENU_1000_POINTS": "1000 bodů", + "MENU_SIGN_IN": "Přihlásit se", + "MENU_QUICK_OPTIONS": "Rychlé volby", + "MENU_5_ROUNDS": "5 kol", + "MENU_10_ROUNDS": "10 kol", + "MENU_15_ROUNDS": "15 Rkol", + "MENU_20_ROUNDS": "20 kol", + "MENU_ROUND_LENGTH1": "Délka kol", + "MENU_ROUND_LIMIT1": "Limit kol", + "MENU_PLAYERS": "Hráčů", + "MENU_MODIFIERS": "Modifikace", + "MENU_MAPS": "Mapy", + "MENU_RANDOM": "Náhodný", + "MENU_GAME_TYPES": "Herních módů", + "MENU_A_GAME_TYPE_WILL_BE_SELECTED_AT_RANDOM": "Typ hry bude vybrán náhodně.", + "MENU_DEATHMATCH": "Deathmatch", + "MENU_YOU_ARE_ALL_ALONE_ELIMINATE_EVERYONE_ELSE": "Na všechno jsi sám. Odstraň všechny ostatní.", + "MENU_TEAM_DEATHMATCH": "Team Deathmatch", + "MENU_CAPTURE_THE_FLAG": "Capture the Flag", + "MENU_CTF_DESC": "Seber nepřátelskou vlajku a dones ji na svou základnu a získej body dotykem s vlastní vlajkou pokud je na základně.", + "MENU_HEADQUARTERS": "Headquarters", + "MENU_HQ_DESC": "Týmy musí založit radiostanici a bránit ji aby získaly co nejvíce bodů. Pokud založí radiostanici nepřátelé musíte ji zničit.", + "MENU_SEARCH_AND_DESTROY": "Search and Destroy", + "MENU_CUSTOM_MATCH": "Vlastní zápas", + "MENU_START_GAME_LOBBY": "Spustit herní místnost", + "MENU_CHANGE_GAME_TYPE": "Změnit typ hry", + "MENU_GAME_SETUP": "Nastavení hry", + "MENU_LOCATION": "Lokalita:", + "MENU_APPLY_SETTINGS": "Aplikovat nastavení?", + "MENU_SETTINGS_WILL_BE_APPLIED_NEXT_TIME": "Nastavení bude aplikováno při", + "MENU_THE_SERVER_IS_STARTED": "dalším spuštění hry.", + "MENU_VOICE_CHAT_WILL_BE_DISABLED_BECAUSE": "Hlasový chat je vypnutý, protože", + "MENU_YOUR_NETWORK_SETTINGS": "tvoje připojení", + "MENU_ARE_TOO_LOW_TO_SUPPORT_VOICE_CHAT": "je příliš pomalé.", + "MENU_CHANGE_WEAPON": "Změnit zbraň", + "MENU_APPLY_LANGUAGE_SETTINGS": "Aplikovat nastavení jazyka?", + "MENU_MISSION_01_02": "Demolice", + "MENU_MISSION_01_02_DESC": "Odraž nepřátelský útok a znič jejich stanoviště.", + "MENU_SELECT_LEVEL": "Vybrat úroveň", + "MENU_VETERAN_DESC": "Nepřežiješ.", + "MENU_SKILLED_DESC": "Tvoje schopnosti v boji", + "MENU_HARDENED_DESC": "Tvoje schopnosti budou napínány.", + "MENU_AIM_DOWN_THE_SIGHT_AUTOAIM": "Automíření při přesném míření", + "MENU_DIFFICULTY_REGULAR": "Obtížnost: Normální", + "MENU_DIFFICULTY_HARDENED": "Obtížnost: Těžká", + "MENU_DIFFICULTY_VETERAN": "Obtížnost: Veterán", + "MENU_SKILLED_DESC_2": "budou otestovány.", + "MENU_HARDENED_DESC_2": "až do bodu zlomu.", + "MENU_REGULAR_DESC_3": "Pro hráče kteří hrají", + "MENU_REGULAR_DESC_4": "první akční hru.", + "MENU_MISSION_SELECT": "Výběr mise", + "MENU_WEAPON_MENU": "Nabídka zbraně", + "MENU_NUMBER_OF_DYNAMIC_LIGHTS": "Počet dynamických světel", + "MENU_RED": "Červená", + "MENU_ENABLE_CROSSHAIR": "Zapnout zaměřovač", + "MENU_CROSSHAIR_COLOR": "Barva zaměřovače", + "MENU_AUTOMATIC": "Automaticky", + "MENU_MANUAL": "Manuálně", + "MENU_MISSION_SELECT_MENU": "Nabídka výběru mise", + "MENU_NEXT_MISSION": "Další mise", + "MENU_CONTINUE_MISSION": "Pokračovat v misi", + "MENU_CONTINUE_TO_NEXT_MISSION": "POKRAČOVAT DO MUZEA", + "MENU_CONTINUE_WITHOUT_SAVING": "Ukončit bez uložení", + "MENU_PROFILE_WARNING": "Nejsi přihlášen k profilu. Pokud se nepřihlásíš nelze ukládat postup ve hře. Opravdu chceš pokračovat?", + "MENU_WARNING": "VAROVÁNÍ", + "MENU_CAPTURE_LIMIT": "Limit ukořistění: ", + "MENU_CONTINUE_RESTART": "Pokračovat v restartu?", + "MENU_RESTART_TEXT_1": "Pokud nyní restartuješ, ztratíš veškerý postup získaný v této misi.", + "MENU_CONTINUE_SAVING": "Pokračovat v uložení?", + "MENU_SAVEQUIT_TEXT_1": "Pokud nyní uložíš hru, ", + "MENU_SAVEQUIT_TEXT_2": "ztratíš veškerý postup ", + "MENU_SAVEQUIT_TEXT_3": "od posledního checkpointu. ", + "MENU_CROSSHAIR": "Zaměřovač", + "MENU_SCORE_LIMIT1": "Limit skóre:", + "MENU_TIME_LIMIT2": "Časový limit:", + "MENU_ROUND_LIMIT2": "Limit kol:", + "MENU_ROUND_LENGTH2": "Délka kola:", + "MENU_REFLECTED_DAMAGE": "Reflected Damage", + "MENU_SHARED_DAMAGE": "Shared Damage", + "MENU_SERVER_INFORMATION": "Informace serveru", + "MENU_SAVE_ERROR_MP": "Postup nebude uložen", + "MENU_NO_SAVE_DEVICE_WARNING_MP": "Musíš vybrat úložné zařízení pro uložení postupu ve hře!", + "MENU_RETURN_SELECT_SAVE_DEVICE_MP": "Vybrat úložné zařízení", + "MENU_RESUMEGAME_NOSAVE_MP": "Pokračovat bez uložení", + "MENU_RESELECT_SAVE_DEVICE": "Znovu vybrat úložné zařízení", + "MENU_SAVE_ERROR": "Do vybraného zařízení nelze zapisovat", + "MENU_SAVE_ERROR_NOW_OKAY": "Úložné zařízení zvoleno", + "MENU_EXTRA_LOW": "Extra nízká", + "MENU_RETRY_SAVE": "Znovu uložit", + "MENU_QUIT_NO_SAVE": "Ukončit bez uložení", + "MENU_QUIT_TO_DESKTOP": "Ukončit na OS", + "MENU_RESUMEGAME_NOSAVE": "Pokračovat bez uložení", + "MENU_FIND_GAME": "Najít hru", + "MENU_SCOREBOARD": "Výsledková listina", + "MENU_EASY": "Snadné", + "MENU_COMPLETED_CHEAT": "Cheat odemknut", + "MENU_HOST_NAME": "Hostitel", + "MENU_WAITING_FOR_PLAYERS_TO_BE_READY": "Je potřeba ještě &&1 hráčů", + "MENU_WAITING_FOR_PLAYER_TO_BE_READY": "Je potřeba ještě jeden hráč", + "MENU_MATCH_WILL_BEGIN": "Zápas se chystá začít", + "MENU_SEARCHING_FOR_LOBBY": "Hledání dostupných her", + "MENU_ZFEATHER_SMOKE": "Jemné okraje kouře", + "MENU_WORLD_ONLY": "Pouze svět", + "MENU_PLAYER_SELECT": "Vybrat hráče", + "MENU_NEW": "Nový", + "MENU_NEW_PLAYER_NAME": "Nové jméno hráče", + "MENU_DELETE_PROFILE": "Smazat vybraný profil?", + "MENU_A_PROFILE_WITH_THE_SAME_NAME_ALREADY_EXISTS": "Profil stejnéhho jména už existuje", + "MENU_PROFILE_CREATE_TOO_MANY": "Už nejsou volné sloty. \nNejprve odstraň starý profil.", + "MENU_PROFILE_CREATION_FAILED": "Vytvoření profilu selhalo.\nUjisti se zda disk není plný a máš oprávnění k zápisu.\n", + "MENU_PROFILE_DELETION_FAILED": "Smazání profilu selhalo. \nSoubory jsou pouze pro čtení, nebo nemáš oprávnění k zápisu.\n", + "MENU_THROW_SMOKE_GRENADE": "Hodit kouřový granát", + "MENU_THROW_FRAG_GRENADE": "Hodit tříštivý granát", + "MENU_LOADING_DOTS": "Nahrávám...", + "MENU_CONNECTION_COLON": "Připojení: ", + "MENU_RANKING": "Hodnocení:", + "MENU_QUIT_TEXT_1": "Pokud nyní odejdeš, ztratíš ", + "MENU_CONTINUE_QUIT": "Ukončit hru?", + "MENU_RETURN": "Zpět do hry", + "MENU_FIND_RANKED_GAME": "Najít hodnocenou hru", + "MENU_FIND_STANDARD_GAME": "Najít standardní hru", + "MENU_UNRANKED_DESCRIPTION": "Najít nehodnocenou hru kam můžu pozvat přítele.", + "MENU_RANKED_DESCRIPTION": "Najít hodnocenou hru pro konkurenční boj. K hodnoceným zápasům nelze pozvat přátele.", + "MENU_SELECT_GAMETYPE": "Vybrat typ hry pro hraní.", + "MENU_SPECIAL_FEATURES": "Cheaty", + "MENU_MELEE_STEADY": "Nůž/Zadržet dech", + "MENU_STEADY_SNIPER_RIFLE": "Zadržet dech", + "MENU_GAME_OPTIONS": "Nastavení hry", + "MENU_CREATE_PLAYER_PROFILE": "vytvořit profil hráče", + "MENU_ANTIALIASING": "Anti-aliasing", + "MENU_OPTIMIZE_FOR_DUAL_VIDEO_CARDS": "Dvě grafiké karty", + "MENU_CLICK_TO_CONTINUE": "Klikni pro pokračování", + "MENU_NEED_PLAYER_PROFILE": "Pro hraní Modern Warfare 2 potřebuješ profil hráče.", + "MENU_SELECT_PROFILE": "Vybrat profil", + "MENU_KEY_CODE": "Klíč", + "MENU_ENTER_KEY_CODE": "Zadat klíč", + "MENU_ENTER_YOUR_KEY_CODE_IN_THE_FIELD_BELOW": "Zadej svůj klíš do pole níže.", + "MENU_11KHZ": "11KHZ (nízká)", + "MENU_22KHZ": "22KHZ (střední)", + "MENU_44KHZ": "44KHZ (vysoká)", + "MENU_CANT_SWITCH_PROFILES_INGAME": "Nelze přepnout profil pokud jsi ve hře.", + "MENU_QUIT_CURRENT_GAME": "Ukončit aktuální hru?", + "MENU_CANT_CHANGE_SETTINGS_WHILE_DEAD": "Nelze měnit nastavení když jsi mrtvý", + "MENU_PROGRESS_WILL_BE_LOST": "Načtením nové mise ztratíš pokrok v misi kterou jsi ještě nedokončil.", + "MENU_CONGRATULATIONS": "Blahopřejeme", + "MENU_FIND_STANDARD_MATCH": "Najít standardní zápas", + "MENU_FIND_RANKED_MATCH": "Najít hodnocený zápas", + "MENU_CAN_NOT_CHANGE_SETTINGS": "Nelze měnit nastavení", + "MENU_WHILE_RUNNING_A_SERVER": "během chodu serveru.", + "MENU_SHADOWS": "Stíny", + "MENU_SCREEN_REFRESH_RATE": "Obnovovací frekvence", + "MENU_EXTRAS": "Bonusy", + "MENU_CROUCH_PRONE": "Přikrčit se/Zalehnout", + "MENU_JUMP": "Skočit", + "MENU_RENDERING_METHOD_PREFERENCE": "Verze shaderů", + "MENU_GRAPHICS_WARNING": "Doporučujeme použít „Optimální nastavení videa a zvuku.“ Manuální změny nastavení mohou způsobovat nižší výkon.", + "MENU_INGAME_DIFFICULTY_CHANGING": "Změna obtížnosti restartuje aktuální misi.", + "MENU_DESCRIPTION_PLAYERMATCH": "Hrej pro radost s lidmi co mají podobné profily.", + "MENU_DESCRIPTION_RANKEDMATCH": "Hrej konkurenční zápasy aby sis zlepšil svoje hodnocení.", + "MENU_DESCRIPTION_QUICKMATCH": "Dostaň se rychle do hry. Nastavení hry budou zvolena náhodně.", + "MENU_DESCRIPTION_CUSTOMMATCH": "Najdi místnost s nastavením hry které si specifikuješ.", + "MENU_SELECT_GAME_TYPE": "Vybrat typ hry", + "MENU_SELECT_MATCH_TYPE": "Vybrat typ zápasu", + "MENU_PLAYER_MATCH": "Hráčský zápas", + "MENU_RANKED_MATCH": "Hodnocený zápas", + "MENU_QUICK_MATCH": "Rychlý zápas", + "MENU_SPECTATOR_MODE": "Divácký mód", + "MENU_GAME_EXPERIENCE_MAY_CHANGE": "Online interakce nejsou hodnoceny ESRB.", + "MENU_MAP_PREFERENCES": "Nastavení lokalit", + "MENU_SET_MAP_PREFERENCES": "Přednastav si lokality které by sis rád zahrál", + "MENU_TEXTURE_SETTINGS": "Nastavení textur", + "MENU_ARSENAL": "Sklad zbraní", + "MENU_APPEARANCE": "Objevení se", + "MENU_STATS": "Statistiky", + "MENU_STATS_CAPS": "STATISTIKY", + "MENU_CHALLENGES": "Výzvy", + "MENU_LOBBYPLAYERCOUNT": "&&1/&&2 HRÁČŮ", + "MENU_WAITING_FOR_1_MORE_PLAYER": "Čeká se ještě na 1 hráče", + "MENU_PRIVATE_MATCH": "Soukromý zápas", + "MENU_CREATE_PARTY": "Vytvořit párty", + "MENU_CQB_TEST": "CQB Test", + "MENU_MARKSMAN": "Odstřelovač", + "MENU_AUTOAIM": "Automíření", + "MENU_SAVE_DEVICE": "Uložné zařízení", + "MENU_1ST_PASS": "1st pass", + "MENU_100_INITIAL_GEO": "100% initial geo", + "MENU_40_INITIAL_GEO": "40% initial geo", + "MENU_25_SCRIPTED": "25% scripted", + "MENU_PROTOTYPE_LEVEL_30_SCRIPTED": "Prototype Level, 30% scripted", + "MENU_10_SCRIPTED": "10% scripted", + "MENU_35_INITIAL_GEO": "35% initial geo", + "MENU_5_SCRIPTED": "5% scripted", + "MENU_30": "30%", + "MENU_INITIAL_GEO_IN_PROGRESS": "Initial geo in progress", + "MENU_SPRINT": "Běh", + "MENU_ONLINE_STATS": "Online statitiky", + "MENU_EXPERIMENTAL": "Pokusný", + "MENU_CUSTOMMODE_KEYBOARD": "Název tvého vlastního módu", + "MENU_CUSTOMCLASS_KEYBOARD": "Název tvé vlastní třídy", + "MENU_SETTINGS": "Nastavení", + "MENU_MAP": "Mapa", + "MENU_GAME_TYPE1": "Mód hry", + "MENU_GAME_TYPE2": "Mód hry:", + "MENU_CREATEAMODE": "Vytvořit mód", + "MENU_PLACEHOLDER": "PLACEHOLDER", + "MENU_PARTY": "PÁRTY", + "MENU_PARTYRECONNECT": "Znovupřipojování k párty...", + "MENU_KILLS": "Zabití", + "MENU_DEATHS": "Úmrtí", + "MENU_KDRATIO": "Zabil/Zemřel", + "MENU_STREAK": "Streak", + "MENU_WINS": "Vítezí", + "MENU_LOSSES": "Prohrává", + "MENU_WLRATIO": "Výhra/Prohra", + "MENU_HITS": "Zásahů", + "MENU_MISSES": "Schází", + "MENU_ACCURACY": "Přesnost", + "MENU_TIME_PLAYED": "Doba hraní", + "MENU_EXPERIENCE": "Zkušenost", + "MENU_RATIO": "Poměr", + "MENU_PARTYPLAYERCOUNT": "&&1 hráč(ů) v &&2 párty.", + "MENU_AIM_ASSIST": "Asistence míření", + "MENU_PLAYER": "Hráč", + "MENU_RANK": "Hodnost", + "MENU_TESTINGBANDWIDTH": "Test odpovídá: &&1.&&2% - &&3/&&4 dobré hry", + "MENU_JOININGLOBBY": "Pokus o připojení do hry &&1/&&2", + "MENU_OFFENSIVETEXT": "Text zakázán kvůli nevhodnosti.", + "MENU_APPLYING_CHANGES": "Aplikování změn...", + "MENU_MAKING_TEAMS": "Probíhá vyrovnání týmů", + "MENU_WAITING_FOR_MORE_PLAYERS_TEAMS": "Hledá se víve hráčů pro vyrovnání týmů", + "MENU_INTERMISSION": "Přestávka", + "MENU_RESETCUSTOMCLASSES": "Tvůj rank a odmčené položky byly resetovány.", + "MENU_LEVEL": "Level", + "MENU_WAITING_FOR_HOST": "Čekání na hostitele", + "MENU_INVALIDCHARS": "Text je prázdný, nebo obsahuje nepovolené znaky.", + "MENU_MAPVETOSTATUS": "&&1 hlasovaání pro přeskočení - &&2 požadováno", + "MENU_VOTESKIPCONFIRM": "Hlasovat pro přeskočení?", + "MENU_MAPVOTEPASSED": "Hlasování skončilo!", + "MENU_MAPVETOSTATUSPLURAL": "&&1 hlasování pro přeskočení - &&2 požadováno", + "MENU_SAVING": "Ukládání...", + "MENU_SPRINT_HOLD_BREATH": "Běh/Zadržet dech", + "MENU_COMBAT": "Boj", + "MENU_ACTION_INVENTORY": "Granátomet/Inventář", + "MENU_MY_ASSAULT": "My Assault", + "MENU_MY_SPECOPS": "My Spec Ops", + "MENU_MY_HEAVYGUNNER": "My Heavy Gunner", + "MENU_MY_DEMOLITIONS": "My Demolitions", + "MENU_MY_SNIPER": "My Sniper", + "MENU_TEXTURE_MIPMAPS": "Filtrování textur", + "MENU_TEXTURE_ANISOTROPY": "Anisotropické filtrování", + "MENU_MULTIPLAYER_CONTROLS": "Ovládání multiplayeru", + "MENU_LOBBY": "MÍSTNOST", + "MENU_LEAVEMPGAMEWARNING": "Pokud přijmeš toto pozvání, opustíš aktuální herní místnost. Přijmout pozvání?", + "MENU_LEAVEMPGAMEWARNINGPARTYHOST": "Pokud se připojíš k jiné skupině, zrušíš svoji párty. Zrušit párty?", + "MENU_ACCEPTINVITETITLE": "Opustit párty?", + "MENU_LEAVEPARTYWARNING": "Pokud se připojíš k jiné skupině, opustíš tuto párty. Opustit párty?", + "MENU_CONFIRMINVITE": "Opustit párty", + "MENU_SPLIT_SCREEN_SIGNIN": "PŘIHLÁŠENÍ K ROZDĚLENÉ OBRAZOVCE", + "MENU_SPLIT_SCREEN_SETUP": "NASTAVENÍ ROZDĚLENÉ OBRAZOVKY", + "MENU_PLAYER1": "Hráč 1", + "MENU_PLAYER2": "Hráč 2", + "MENU_PLAYER3": "Hráč 3", + "MENU_PLAYER4": "Hráč 4", + "MENU_SPECULAR_MAP": "Spekulární mapa", + "MENU_THROW_SPECIAL_GRENADE": "Hodit speciální granát", + "MENU_STAYINPARTY": "Zůstat v této párty", + "MENU_VOICECHATCOLON": "Hlasový Chat: ", + "MENU_CHEATS": "CHEATY", + "MENU_NOT_USED": "Nepoužité", + "MENU_CHEAT_POINTS": "Našel jsi &&1 kus(ů) nepřátelských počítačů.", + "MENU_NO_SAVE_DEVICE_WARNING": "Není vybráno úložné zařízení; \nnebudeš moci ukládat herní postup.", + "MENU_NO_SAVE_DEVICE_WARNING_NOW_OKAY": "Nyní můžeš ukládat herní pokrok.", + "MENU_DIFFICULTY_COMPLETED": "Dokončená obtížnost:", + "MENU_SP_AFTERMATH_DESC": "...", + "MENU_SP_JEEPRIDE_DESC": "Vypadni ksakru odsud!", + "MENU_OPTIONS_UPPER_CASE": "NASTAVENÍ", + "MENU_INVENTORY": "Inventář", + "MENU_FRIENDS_CAP": "PŘÁTELÉ", + "MENU_SPECTATOR": "Divák", + "MENU_END_GAME": "Konec hry", + "MENU_PRIMARY_ATTRIBUTES": "Základní vlastnosti", + "MENU_ACCURACY1": "Přesnost:", + "MENU_DAMAGE": "Účinnost:", + "MENU_RANGE": "Rozsah:", + "MENU_FIRE_RATE": "Rychl. střelby:", + "MENU_MOBILITY": "Pohyblivost:", + "MENU_KILL_EVERYONE_FIRST_PLAYER": "Zabij všechny. Hru ukončí první hráč který dosáhne limitu skóre. Vyhrávají 3 nejlepší hráči.", + "MENU_KILL_PLAYERS_ON_THE_OPPOSING": "Zabij hráče nepřátelského týmu. Tým, který první dosáhne limitu skóre vyhrává!", + "MENU_TEAMS_TAKE_TURNS_DEFENDING": "Týmy se střídají v obraně a ničení cíle. ", + "MENU_ARENA": "Vyhrajte utkání eliminací protivníka nebo obsazením centrálního bodu.", + "MENU_ARENA_DESC": "ARÉNA.", + "MENU_DD": "Týmy se střídají v útočení a obraně dvou pumových stanovišť. Obě musí být zničena bombami útočícího týmu. ", + "MENU_VIP": "Střídejte se v doprovodu VIP osoby do únikové zóny.", + "MENU_VIP_DESC": "VIP", + "MENU_1_BOMB_IN_THE_CENTER": "1 bomba ve středu mapy. Chopte se jí a zničte nepřátelský cíl!", + "MENU_CAPTURE_AND_HOLD_THE": "Obsaďte a držte své pozice pro získání bodů.", + "MENU_GET_THE_ENEMY_FLAG_AND": "Seberte nepřátelům vlajku a vraťte se s ní ke své.", + "MENU_CAPTURE_THE_HEADQUARTERS": "Obsaďte velitelství a braňte ho před nepřítelem.", + "MENU_TEAMS_TAKE_TURNS_CAPTURING": "Týmy se střídají v obraně a obsazení cíle.", + "MENU_CHECK_HOW_YOUR_SCORE": "Porovnávej svoje skóre s přáteli a celým světem.", + "MENU_LEAVE_GAME": "Opustit hru", + "MENU_BRIGHTNESS1": "Jas...", + "MENU_TACTICAL": "Taktika", + "MENU_RENAME": "Přejmenovat", + "MENU_XP_REWARD": "XP odměna:", + "MENU_LOWER_DIFFICULTY": "SNÍŽIT OBTÍŽNOST", + "MENU_LOWER_DIFFICULTY_1_0": "Snížit obtížnost z normální na rekrut pro všechny mise?", + "MENU_LOWER_DIFFICULTY_2_1": "Snížit obtížnost z těžké na normální pro všechny mise?", + "MENU_LOWER_DIFFICULTY_3_2": "Snížit obtížnost z veterán na těžká pro všechny mise?", + "MENU_INVITE_FRIENDS": "Pozvat přítele", + "MENU_MISSIONS_CAP": "MISE", + "MENU_PROLOGUE": "Úvod", + "MENU_ACT_I": "Akt I", + "MENU_ACT_II": "Akt II", + "MENU_ACT_III": "Akt III", + "MENU_EPILOGUE": "Závěr", + "MENU_SPECIAL_OPS": "Zvláštní operace", + "MENU_SAVEDATA_CORRUPTED": "Nelze znovu načíst aktuální misi, protože uložená data jsou poškozená. Prosím restartuj misi z nabídky „Výběr mise“.", + "MENU_SAVE_CORRUPTED": "Uložení selhalo", + "MENU_WARNING_CHECKPOINT_RESET": "Tímto přepíšeš postup v aktuální misi. Chceš pokračovat?", + "MENU_WARNING_CHECKPOINT_RESET2": "Pokud budeš pokračovat, postup v poslední misi bude přepsán.", + "MENU_DOWNLOADING_GAME_SETTINGS": "STAHOVÁNÍ NASTAVENÍ HRY", + "MENU_PRESTIGE_RESET_WARNING1": "Získej díky svým schopnostem trochu prestiže. Navíc díky své nové hodnosti získáš přístup k dalším titulům, odznakům a výzvám. \nOstatní hráči uvidí tvoji hodnost v místnosti hry, výsledkové listině a hře samotné.", + "MENU_PRESTIGE_RESET_TITLE1": "Udělat vše znovu?", + "MENU_PRESTIGE_RESET_TITLE2": "Více informací", + "MENU_PRESTIGE_ENTER": "Zadej hodnost", + "MENU_PRESTIGE_RESET_WARNING2": "Hodnost má svou cenu: Vše co sis doposud odemknul, včětně zbraní, zkušeností a výzev bude resetováno; budeš se muset znovu vypracovat nahoru.\nPouze tvoje pozice ve výsledkové listině, název, odznak, klan a seznam hráčů nebudou ovlivněny.", + "MENU_PRESTIGE_RESET_WARNING3": "Není cesty zpět...", + "MENU_PRESTIGE_RESET_TITLE3": "Poslední šance...", + "MENU_CHEATS_WARNING": "Nemůžeš získávat hodnocení pokud jsou aktivované cheaty.", + "MENU_CHEATS_NAME2": "Fotonegativ", + "MENU_CHEATS_NAME3": "Extra kontrast", + "MENU_CHEATS_NAME4": "Směšná válka", + "MENU_CHEATS_NAME5": "Mnoho bomb", + "MENU_CHEATS_NAME6": "Špatný rok", + "MENU_CHEATS_NAME7": "Schopnost spomalení", + "MENU_CHEATS_NAME8": "Nekonečná munice", + "MENU_CHEATS_UNLOCK1": "Najdi 2 nepřátelské počítače pro odemčení.", + "MENU_CHEATS_UNLOCK2": "Najdi 4 nepřátelské počítače pro odemčení.", + "MENU_CHEATS_UNLOCK3": "Najdi 6 nepřátelských počítačů pro odemčení.", + "MENU_CHEATS_UNLOCK4": "Najdi 8 nepřátelských počítačů pro odemčení.", + "MENU_CHEATS_UNLOCK5": "Najdi 10 nepřátelských počítačů pro odemčení.", + "MENU_CHEATS_UNLOCK6": "Najdi 15 nepřátelských počítačů pro odemčení.", + "MENU_CHEATS_UNLOCK7": "Najdi 20 nepřátelských počítačů pro odemčení.", + "MENU_CHEATS_UNLOCK8": "Najdi 30 nepřátelských počítačů pro odemčení.", + "MENU_CHEATS_UNLOCK9": "Najdi 12 nepřátelských počítačů pro odemčení.", + "MENU_CHEATS_UNLOCK13": "Najdi 27 nepřátelských počítačů pro odemčení.", + "MENU_CHEATS_UNLOCK_BW": "Najdi 3 nepřátelské počítače pro odemčení.", + "MENU_CHEATS_UNLOCK_CHAPLIN": "Najdi 31 nepřátelských počítačů pro odemčení.", + "MENU_CHEATS_UNLOCK_CLUSTERGRENADE": "Najdi 16 nepřátelských počítačů pro odemčení.", + "MENU_CHEATS_UNLOCK_FOOTBALL": "Najdi 9 nepřátelských počítačů pro odemčení.", + "MENU_CHEATS_UNLOCK_IGNOREMAMMO": "Najdi 45 nepřátelských počítačů pro odemčení.", + "MENU_CHEATS_UNLOCK_PINATA": "Najdi 24 nepřátelských počítačů pro odemčení.", + "MENU_CHEATS_UNLOCK_PINEAPPLE": "Najdi 5 nepřátelské počítače pro odemčení.", + "MENU_CHEATS_UNLOCK_POMEGRENADE": "Najdi 20 nepřátelských počítačů pro odemčení.", + "MENU_CHEATS_UNLOCK_RAGDOLL": "Najdi 40 nepřátelských počítačů pro odemčení.", + "MENU_CHEATS_UNLOCK_SLOWMO": "Najdi 36 nepřátelských počítačů pro odemčení.", + "MENU_CHEATS_UNLOCK_TIRE_EXPLOSION": "Najdi 11 nepřátelských počítačů pro odemčení.", + "MENU_CHEATS_UNLOCK_WOLF": "Najdi 27 nepřátelských počítačů pro odemčení.", + + + + "MENU_CHEATS_DESC1": "Pro umělecký dojem.", + "MENU_CHEATS_DESC2": "Nelze vytisknout.", + "MENU_CHEATS_DESC3": "Vyzkoušej kombinaci těchto barevných cheatů pro získání jiných efektů.", + "MENU_CHEATS_DESC4": "Aktivuj tajný protokol směšná válka.", + "MENU_CHEATS_DESC5": "Hoď granát a užij si šou.", + "MENU_CHEATS_DESC6": "Zastřel někoho a koukni co se stane.", + "MENU_CHEATS_DESC_EXPLANATION_SLOWMO": "Poznámka: Použij MELEE pro zap/vyp.", + "MENU_CHEATS_DESC8": "Žádné nabíjení, žádné starosti.", + "MENU_CHEATS_HOWTO": "Pro odemčení cheatů musíš alespoň jednou dohrát hru na jakoukoliv obtížnost.", + "MENU_WARNING_AUTOSAVE": "Tato hra se ukládá automaticky v určitých místech. Nevypínej zařízení pokud bliká indikátor HDD.", + "MENU_READING_SAVE_DEVICE": "ČTENÍ ZE ZAŘÍZENÍ", + "MENU_BRIGHTNESS_DESC1": "Pohybuj posuvníkem aby sis nastavil jas obrazovky.", + "MENU_BRIGHTNESS_DESC2": "Pouze v prvních dvou oknech by měl být text viditelný.", + "MENU_BRIGHTNESS_NOT_VISIBLE": "Neviditelný", + "MENU_BRIGHTNESS_BARELY_VISIBLE": "Špatně viditelný", + "MENU_BRIGHTNESS_EASILY_VISIBLE": "Snadno viditelný", + "MENU_BRIGHTNESS_CAP": "JAS", + "MENU_BUNKER": "Bunkr", + "MENU_STICK_LAYOUT_CAP": "ROZVRŽENÍ PŘEPÍNAČŮ", + "MENU_BUTTON_LAYOUT_CAP": "ROZLOŽENÍ TLAČÍTEK", + "MENU_BUTTON_LAYOUT_CAPS": "ROZLOŽENÍ TLAČÍTEK", + "MENU_SENSITIVITY_CAP": "CITLIVOST", + "MENU_INTEL": "CHEATY", + "MENU_LEAVE_GAME_AND_PARTY": "Opustit hru a párty?", + "MENU_LEAVE_GAME_RANKED1": "Varování: Předčasné opuštění hry způsobí", + "MENU_LEAVE_GAME_RANKED2": "ztrátu získaných bonusů a bude započítáno", + "MENU_LEAVE_GAME_RANKED3": "jako prohra.", + "MENU_SCORE_TIED": "Remíza &&1 - &&2", + "MENU_SCORE_LOSING": "Prohráváte &&1 - &&2", + "MENU_SCORE_WINNING": "Vyhráváte &&1 - &&2", + "MENU_CUSTOM_CLASS_RESET_WARNING": "Tímto přepíšeš své aktuální nastavení pro tuto třídu. Chceš pokračovat?", + "MENU_PAUSED_CAP": "PAUZA", + "MENU_PUBLIC_PLAYLISTS": "Public Playlists", + "MENU_CHALLENGES_CAPS": "VÝZVY", + "MENU_RANK_AND_CHALLENGES_CAP": "HODNOST A VÝZVY", + "MENU_CHOOSE_MAP_CAP": "VYBRAT MAPU", + "MENU_CHOOSE_GAME_MODE_CAP": "VYBRAT MÓD HRY", + "MENU_SYSTEM_LINK_SETUP": "NASTAVENÍ SYSTEM LINK", + "MENU_FREE_FOR_ALL": "Volné pro všechny", + "MENU_RESUME_CREDITS": "Souhrn kreditů", + "MENU_RESUME_NEWGAME": "Vaše dokončili poslední misi kampaně. To bude pokračovat na první misi. Chcete pokračovat?", + "MENU_PRESS_START_TO_SKIP": "Stiskni tlačítko START pro přeskočení", + "MENU_DEFAULT_ALT": "Default Flipped", + "MENU_LEFTY_ALT": "Lefty Flipped", + "MENU_TACTICAL_ALT": "Tactical Flipped", + "MENU_GOTO_NEXT": ">>>", + "MENU_SENSITIVITY_CUSTOM_CAP": "SENSITIVITY CUSTOM", + "MENU_CUSTOM_N": "Vlastní (&&1)", + "MENU_SENSITIVITY_LOW_N": "(Nízká) &&1", + "MENU_SENSITIVITY_MEDIUM_N": "(Střední) &&1", + "MENU_SENSITIVITY_HIGH_N": "(Vysoká) &&1", + "MENU_SENSITIVITY_VERY_HIGH_N": "(Velmi vysoká) &&1", + "MENU_SENSITIVITY_INSANE_N": "(Šílená) &&1", + "MENU_RANK_AND_CHALLENGES": "Hodnost a výzvy", + "MENU_CHEAT_ENABLED": "Cheat povolen", + "MENU_MOVE_FORWARD_BACK": "Move\nForward/Back", + "MENU_LOOK_UP_DOWN": "Look\nUp/Down", + "MENU_ARCADEMODE": "Arcade Mode", + "MENU_ARCADE_FULL": "Full Challenge", + "MENU_ARCADE_SINGLE": "Mission Challenge", + "MENU_SELECT_ARCADEMODE": "Vybrat mód Arkáda", + "MENU_ARCADE_UNLOCK_DESC": "Dokonči hru pro odemčení módu Arkáda", + "MENU_RECRUIT": "Rekrut", + "MENU_DIFFICULTY_WARNING": "Obtížnost kterou sis vybral není doporučená. Chceš pokračovat?", + "MENU_DIFFICULTY_WARNING_EASIER": "Obtížnost kterou sis vybral je lehčí než je doporučená. Chceš pokračovat?", + "MENU_SELECT_DIFFICULTY": "VYBRAT OBTÍŽNOST", + "MENU_QUIT_WARNING_ARCADE": "Pokud odejdeš ztratíš postup v aktuální misi.", + "MENU_CHEAT_POINTS_LEVEL": "Našel jsi &&1 z &&2 nepřátelských počítačů v této misi.", + "MENU_ARCADE_SCORE": "Nejlepší skóre Arkády: &&1", + "MENU_VOICE_VOLUME": "Hlasitost slova", + "MENU_ARCADE_FULL_DESC": "Získej body rychlým projetím hry bez potíží. Nejlepší skóre: &&1", + "MENU_ARCADE_SINGLE_DESC": "Zkus získat co nejlepší skóre v misi dle tvého nastavení.", + "MENU_ARCADE_LBSCORE": "Skóre", + "MENU_SP_UNLOCK_DESC": "Cheaty jsou dostupné z nabídky pauzy. Mód \nArcade je dostupný z hlavní nabídky.", + "MENU_SP_UNLOCK_TITLE": "Gratulujeme!", + "MENU_SP_UNLOCK_INFO": "Odemknul jsi mód Arcade a cheaty.", + "MENU_TRIAL_GLOBAL_CAP": "ZÁVOD NA ČAS :: GLOBÁLNĚ", + "MENU_TRIAL_FRIENDS_CAP": "ZÁVOD NA ČAS :: PŘÁTELÉ", + "MENU_ARCADE_GLOBAL_CAP": "ARKÁDA :: GLOBÁLNĚ", + "MENU_ARCADE_FRIENDS_CAP": "ARKÁDA :: PŘÁTELÉ", + "MENU_LEADERBOARD_TIME_TRIAL": "Závod na čas", + "MENU_TRY_AGAIN": "Zkusit znovu", + "MENU_TRY_AGAIN_DESC": "Restartovat závod na čas.", + "MENU_PLAYERMATCH_PLAYLISTS": "Player Match Playlists", + "MENU_DOF": "Hloubka pole", + "MENU_GLOW": "Glow", + "MENU_SOUND_EQ": "EQ Filter", + "MENU_BULLET_IMPACTS": "Díry po kulkách", + "MENU_RAGDOLL": "Ragdoll", + "MENU_UNTIL_MATCH_BEGIN": "Until match begins.", + "MENU_WATER_DETAIL": "Detaily vody", + "MENU_NIGHT_VISION": "Noční vidění", + "MENU_CHANGE_STANCE": "Změna postoje", + "MENU_SPRINT_STEADY_SNIPER_RIFLE": "Běh/Zadržet dech", + "MENU_AIR_SUPPORT": "Letecká podpora", + "MENU_EQUIPMENT": "Vybavení", + "MENU_EQUIPMENT_SECONDARY": "Sekundární vybavení", + "MENU_WEAPON_ATTACHMENT": "Doplňky zbraně", + "MENU_RESTORE_DEFAULTS": "Obnovit optimální nastavení videa a zvuku?", + "MENU_RESTORE_EACH_SETTING": "Nastavit ovládání zpět na základní?", + "MENU_SETTINGS_RESET": "Nastavení ovládání bylo resetováno.", + "MENU_LAUNCH_WITHOUT_MODS": "Spustit bez módů", + "MENU_SCORE_TIED_WITH": "Remíza s &&1 z &&2 bodů.", + "MENU_SCORE_LOSING_WITH": "Prohráváte s &&1 z &&2 bodů.", + "MENU_SCORE_WINNING_WITH": "Vyhráváte s &&1 z &&2 bodů.", + "MENU_100PERCENT": "100%", + "MENU_COOP": "Co-op mise", + "MENU_SELECT_DIFFICULTY_PLAYER_1": "Vybrat obtížnost pro hráče 1", + "MENU_SELECT_DIFFICULTY_PLAYER_2": "Vybrat obtížnost pro hráče 2", + "MENU_HUD_MARGIN_HORIZONTAL": "Horizontální okraj", + "MENU_HUD_MARGIN_VERTICAL": "Vertickální okraj", + "MENU_SWITCH_CHARACTER": "Switch Character", + "MENU_TOP_PLAYER": "Horní hráč", + "MENU_BOTTOM_PLAYER": "Spodní hráč", + "MENU_PLAYER_AC130": "AC130", + "MENU_PLAYER_INFANTRY": "Pěchota", + "MENU_PLAYER_READY": "Připraven", + "MENU_GAMESKILL_EASY": "Pro hráče, kteří hrají poprvé akční hru.", + "MENU_GAMESKILL_NORMAL": "Tvoje schopnosti v boji budou otestovány.", + "MENU_ONE_FLAG": "One Flag CTF", + "MENU_NETWORK_COOP": "Online", + "MENU_LOAD_OFFLINE_PROFILE": "Offline profil", + "MENU_CREATE_NEW_OFFLINE_PROFILE": "Vytvořit nový", + "MENU_DELETE_OFFLINE_PROFILE": "Projít a smazat data", + "MENU_NO_OFFLINE_PROFILE_WARNING": "Vybrat offline profil k ukládání postupu ve hře.", + "MENU_N_OF_N": "&&1 z &&2", + "MENU_WINNING": "Vyhrává", + "MENU_LOSING": "Prohráva", + "MENU_TIED": "Remíza", + "MENU_SEARCHING_FOR_OPPONENTS": "Hledání protivníků", + "MENU_GAME_BEGINNING": "Spouštění", + "MENU_LAST_CHECKPOINT": "Poslední checkpoint", + "MENU_WAITING": "Čekám", + "MENU_HOST_MIGRATION": "HOST MIGRATION", + "MENU_LOOK_INVERSION_CAPS": "OBRÁTIT POHLED", + "MENU_CONTROLLER_VIBRATION_CAPS": "VIBRACE", + "MENU_HUD_MARGIN_HORIZONTAL_CAPS": "HORIZONTÁLNÍ OKRAJ", + "MENU_HUD_MARGIN_VERTICAL_CAPS": "VERTIKÁLNÍ OKRAJ", + "MENU_VOLUME_CAPS": "HLASITOST HRY", + "MENU_VOICE_VOLUME_CAPS": "HLASITOST ŘEČI", + "MENU_JOIN_GAME_CAPS": "PŘIPOJIT KE HŘE", + "MENU_CREATE_GAME_CAPS": "VYTVOŘIT HRU", + "MENU_CREATE_A_CLASS_CAPS": "VYTVOŘIT TŘÍDU", + "MENU_BARRACKS_CAPS": "KASÁRNA", + "MENU_START_GAME_CAPS": "SPUSTIT HRU", + "MENU_GAME_SETUP_CAPS": "NASTAVENÍ HRY", + "MENU_INVITE_CAPS": "POZVÁNÍ", + "MENU_CHANGE_MAP_CAPS": "ZMĚNIT MAPU", + "MENU_CHANGE_GAME_MODE_CAPS": "ZMĚNIT MÓD HRY", + "MENU_CHANGE_GAME_RULES_CAPS": "PRAVIDLA HRY", + "MENU_TITLE_CAPS": "TITUL", + "MENU_EMBLEM_CAPS": "EMBLÉM", + "MENU_KILLSTREAK_REWARDS_CAPS": "KILLSTREAK REWARDS", + "MENU_PRIVATE_MATCH_CAPS": "SOUKROMÝ ZÁPAS", + "MENU_SPLITSCREEN_CAPS": "SPLIT SCREEN", + "MENU_SINGLE_PLAYER_CAPS": "HRA PRO JEDNOHO", + "MENU_YOUR_CLASSES_CAPS": "VLASTNÍ TŘÍDY", + "MENU_PRIMARY_CAPS": "PRIMÁRNÍ", + "MENU_SECONDARY_CAPS": "SEKUNDÁRNÍ", + "MENU_PRIMARY_WEAPONS": "Primární zbraně", + "MENU_SECONDARY_WEAPONS": "Sekundární zbraně", + "MENU_SPECIAL_GRENADE_CAPS": "SPECIÁLNÍ GRANÁTY", + "MENU_PERK1_CAPS": "PERK 1", + "MENU_PERK2_CAPS": "PERK 2", + "MENU_PERK3_CAPS": "PERK 3", + "MENU_DEATHSTREAK_CAPS": "DEATH STREAK", + "MENU_RENAME_CAPS": "PŘEJMENOVAT", + "MENU_RENAME_IN_SYSTEM_BOX": "PŘEJMENOVAT", + "MENU_PLUS": "+&&1", + "MENU_ASSAULT_RIFLES_CAPS": "ÚTOČNÉ PUŠKY", + "MENU_LMGS_CAPS": "LEHKÉ KULOMETY", + "MENU_SNIPER_RIFLES_CAPS": "ODSTŘELOVAČKY", + "MENU_RIOT_SHIELD_CAPS": "RIOT SHIELD", + "MENU_MACHINE_PISTOLS_CAPS": "MACHINE PISTOLS", + "MENU_SHOTGUNS_CAPS": "BROKOVNICE", + "MENU_HANDGUNS_CAPS": "RUČNÍ ZBRANĚ", + "MENU_ROCKETS_CAPS": "GRANÁTOMETY", + "MENU_WEAPON_CLASS_CAPS": "TŘÍDA ZBRANĚ", + "MENU_WEAPONS_CAPS": "ZBRANĚ", + "MENU_ATTACHMENTS_CAPS": "DOPLŇKY", + "MENU_CAMO_CAPS": "MASKOVÁNÍ", + "MENU_CAMPAIGN_ARCADE_CHEAT_UNLOCKED": "Gratuluji!", + "MENU_WEAPON_CLASSES_CAPS": "TŘÍDY ZBRANÍ", + "MENU_UPGRADE_CAPS": "VYLEPŠENÍ", + "MENU_START_MATCH": "Start zápasu", + "MENU_START_MATCH_CAPS": "START ZÁPASU", + "MENU_DESC_START_MATCH": "Spustit zápas.", + "MENU_CHANGE_MAP": "Změnit mapu", + "MENU_DESC_START_MATCH_LOCKED": "Pouze hostitel místnosti může spustit zápas.", + "MENU_DESC_CHANGE_MAP": "Vybrat jinou mapu.", + "MENU_DESC_INVITE_FRIENDS": "Pozvat přátele do své hry.", + "MENU_INVITE_FRIEND": "Pozvat přítele", + "MENU_DESC_INVITE_FRIEND": "Pozvat přítele do své hry.", + "MENU_BOOTCAMP_CAPS": "BOOTCAMP", + "MENU_BLING_PRIMARY_DESC": "Extra primary weapon attachment.", + "MENU_BLING_SECONDARY_DESC": "Extra secondary weapon attachment.", + "MENU_IWNET_LOGIN": "Přihlásit na IW.net", + "MENU_IWNET_USERNAME": "Uživ. jméno: ", + "MENU_LOGIN": "Přihlásit", + "MENU_CONNECTING": "Připojování...", + "MENU_CREATING": "Vytváření účtu...", + "MENU_IWNET_CREATE_IWNET_ACCOUNT": "Vytvořit IW.net účet", + "MENU_IWNET_CREATE": "Vytvořit účet", + "MENU_IWNET_EMAIL": "Email: ", + "MENU_IWNET_NAME_TAKEN": "Tento název účtu je už používán.", + "MENU_IWNET_NAME_ILLEGAL": "Tento název účtu je neplatný, zkus nějaký jiný.", + "MENU_IWNET_CREATION_FAILED": "Vytvoření účtu selhalo.", + "MENU_IWNET_MUSTLOGIN": "Musíš být přihlášen na platný účet IW.net pro pokračování.", + "MENU_IWNET_LOGIN_SUCCESS": "Nyní jsi přihlášen.", + "MENU_IWNET_LOGIN_TIMEOUT": "Nebyla přijata žádná odezva od serverů IW.net. Prosím zkus to později.", + "MENU_IWNET_LOGIN_ERROR": "Nastal problém v komunikaci se servery IW.net.", + "MENU_IWNET_LOGIN_BADPASSWORD": "Heslo zadané pro tento účet je neplatné.", + "MENU_IWNET_LOGIN_UNKNOWNUSER": "Toto uživatelské jméno nebylo rozpoznáno.", + "MENU_IWNET_LOGIN_NOTENTITLED": "Tento účet nelze připojit k Modern Warfare 2.", + "MENU_IWNET_LOGIN_BANNED": "Tento účet byl zabanován.", + "MENU_IWNET_CREATE_SUCCESS": "Tvůj účet byl úspěšně vytvořen.", + "MENU_IWNET_CREATE_NAMETAKEN": "Toto uživatelské jméno už existuje.", + "MENU_IWNET_CREATE_BADNAME": "Toto jméno není povolené.", + "MENU_IWNET_CREATE_ERROR": "Při vytváření tvého účtu nastala chyba. Prosím zkus to později.", + "MENU_VOTE_TO_SKIP_CAPS": "HLASOVÁNÍ O PŘESKOČENÍ", + "MENU_MAP_PRE": "MAPA: ", + "MENU_GAMETYPE_PRE": "TYP HRY: ", + "MENU_SPECOP_SELECT_AC130_PILOT": "Zvolit pilota AC130", + "MENU_COOP_ONLY_CHALLENGE": "Tato zvláštní operace vyžaduje dva hráče.", + "MENU_LOWER_DIFFICULTY_1_0_BUTTON": "Snížit na rekrut", + "MENU_LOWER_DIFFICULTY_2_1_BUTTON": "Snížit na normální", + "MENU_LOWER_DIFFICULTY_3_2_BUTTON": "Snížit na težká", + "MENU_PLAYERCARD_DESC": "Personální statistiky", + "MENU_PLAYERCARD_TITLES": "Titles", + "MENU_PLAYERCARD_ICONS": "Emblems", + "MENU_PLAYERCARD_TITLES_DESC": "Choose your title.", + "MENU_PLAYERCARD_ICONS_DESC": "Choose your emblem.", + "MENU_KILLSTREAK_REWARD": "Killstreak Reward", + "MENU_KILLSTREAK_REWARD_DESC": "New killstreak rewards are available.", + "MENU_IWNET_LOGIN_BADPARAMS": "Musíš zadat jméno a heslo.", + "MENU_IWNET_CREATE_BADEMAIL": "Musíš zadat platný email.", + "MENU_IWNET_CREATE_PASSWORD_MISMATCH": "Obě hesla musí souhlasit.", + "MENU_IWNET_CREATE_NOUSER": "Musíš zadat jméno.", + "MENU_IWNET_CREATE_NOPASSWORD": "Musíš zadat heslo.", + "MENU_IWNET_CREATE_SHORT_USER": "Uživatelské jméno musí mít nejméně 3 znaky.", + "MENU_IWNET_CREATE_SHORT_PASSWORD": "Uživatelské jméno musí mít nejméně 4 znaky.", + "MENU_CHOOSE_TEAM_CAPS": "VYBRAT TÝM", + "MENU_IWNET_CREATE_BADCDKEY": "Musíš zadat platný CD klíč.", + "MENU_IWNET_CREATE_KEYUSED": "Tento CD klíč je již používán.", + "MENU_IWNET_CDKEY": "CD klíč:", + "MENU_MERGEDLOBBIES": "Místnosti úspěšně sloučeny", + "MENU_MERGINGLOBBIES": "Zkouším sloučit tuto místnost s jinou", + "MENU_SEARCHINGFORGAMES_50MS": "Hledání her - 50ms ping", + "MENU_NOSEARCHRESULTS": "Hra nenalezena", + "MENU_SEARCHRESULTCOUNT": "&&1 potencionálních her nalezeno", + "MENU_SEARCHINGFORGAMES_100MS": "Hledání her - 100ms ping", + "MENU_SEARCHINGFORGAMES_150MS": "Hledání her - 150ms ping", + "MENU_SEARCHINGFORGAMES_200MS": "Hledání her - 200ms ping", + "MENU_SEARCHINGFORGAMES_250MS": "Hledání her - 250ms ping", + "MENU_SEARCHINGFORGAMES_300MS": "Hledání her - 300ms ping", + "MENU_SEARCHINGFORGAMES_350MS": "Hledání her - 350ms ping", + "MENU_NEWPASSWORD": "Nové heslo:", + "MENU_ACCOUNT": "Nastavení účtu", + "MENU_IWNET_RESET": "Reset hesla", + "MENU_IWNET_ACCOUNT_SETTINGS": "Modern Warfare 2 Account Settings", + "MENU_IWNET_CHANGE_PASSWORD": "Změnit heslo", + "MENU_IWNET_CHANGE_EMAIL": "Změnit Email adresu", + "MENU_IWNET_RESET_PASSWORD": "Reset hesla účtu", + "MENU_IWNET_ACCOUNT_CDKEY": "Prosím zadej originální CD klíč použitý pro založení tohoto účtu.", + "MENU_DONE": "Hotovo", + "MENU_IWNET_RESET_PASSWORD_CONFIRM": "Zvol OK pro resetování hesla. Tvoje nové heslo bude zasláno na aktuální email přiřazený k tvému účtu.", + "MENU_IWNET_RP_SUCCESS": "Tvoje heslo bylo resetováno. Prosím zkontroluj svůj email přiřazený k účtu a přijmi zprávu obsahující nové heslo.", + "MENU_IWNET_RP_NOUSER": "Nebylo zadáno žádné jméno účtu.", + "MENU_IWNET_RP_BADKEY": "Zadaný CD klíč není platný.", + "MENU_IWNET_RP_WRONGKEY": "Zadaný CD klíč nebyl původně zadaný pro vytvoření tohoto účtu.", + "MENU_IWNET_RP_TOOSOON": "Na tomto účtu bylo heslo resetováno nedávno. Prosím počkej chvíli a zkus to znovu.", + "MENU_IWNET_UNKNOWN": "Požadovaná opearace selhala z neznámých důvodů. Prosím počkej chvíli a zkus to znovu.", + "MENU_IWNET_CP_SUCCESS": "Tvoje heslo bylo změněno.", + "MENU_IWNET_NOTLOGGEDIN": "Momentálně nejsi přihlášen na účet Modern Warfare 2. Prosím přihlas se a zkus to znovu.", + "MENU_IWNET_CE_SUCCESS": "Tvoje emailová adresa byla změněna.", + "MENU_IWNET_CE_BADEMAIL": "Prosím zadej platnou email adresu.", + "MENU_RESUMEGAME_CAPS": "POKRAČOVAT", + "MENU_NEWGAME_CAPS": "NOVÁ HRA", + "MENU_MISSION_SELECT_CAPS": "VÝBĚR MISE", + "MENU_SPECIAL_OPS_CAPS": "ZVLÁŠTNÍ OPERACE", + "MENU_SP_SPECIAL_OPS_CAPS": "ZVLÁŠTNÍ OPERACE", + "MENU_MULTIPLAYER_CAPS": "MULTIPLAYER", + "MENU_AIM_ASSIST_CAPS": "ASISTENCE MÍŘENÍ", + "MENU_SUBTITLES_CAPS": "TITULKY", + "MENU_RECRUIT_CAPS": "REKRUT", + "MENU_RECRUIT_CAPS_REC": "REKRUT (DOPORUČOVANÉ)", + "MENU_HARDENED_CAPS": "TĚŽKÁ", + "MENU_REGULAR_CAPS": "NORMÁLNÍ", + "MENU_REGULAR_CAPS_REC": "NORMÁLNÍ (DOPORUČOVANÉ)", + "MENU_VETERAN_CAPS": "VETERÁN", + "MENU_YES_CAPS": "ANO", + "MENU_NO_CAPS": "NE", + "MENU_TRY_AGAIN_CAPS": "ZKUSIT ZNOVU", + "MENU_SELECT_DIFFICULTY_PERSONAL": "Obtížnost", + "MENU_DESC_SET_DIFFICULTY_PLAYER": "Nastavit obtížnost hráče.", + "MENU_GTNW_DESC": "Globální thermonukleární válka", + "MENU_GAME_SELECTION_CAPS": "GAME SELECTION", + "MENU_POPUP_PLAYLISTS": "Fetching Playlists", + "MENU_POPUP_STATS": "Updating Rank and Unlocks", + "MENU_POPUP_CONNECTION": "Connecting to Matchmaking Server", + "MENU_POPUP_ACCEPTINVITE": "Joining game session, attempt #&&1", + "MENU_POPUP_COMPLETE": "Dokončeno.", + "MENU_USE_EQUIPMENT": "Použít vybavenít", + "MENU_NOMAD": "N0M4D", + "MENU_NOMAD_ALT": "N0M4D Flipped", + "MENU_MORE": "Další...", + "MENU_SAB_DANGER": "Losing Ground", + "MENU_SAB_NEUTRAL": "Neutral", + "MENU_SAB_SAFE": "Gaining Ground", + "MENU_DESC_CAS_WELCOME": "Choose your 3 killstreaks!", + "MENU_NO_SIGNIN_WARNING_MP": "Guests do not save progress. Sign in to retain your stats!", + "MENU_PLEASE_WAIT": "Počkej prosím", + "MENU_ONLINE_STATUS": "Online stav", + "MENU_DOWNLOADING": "STAHOVÁNÍ...", + "MENU_UPLOADING_STATS": "Odesílání statistik", + "MENU_UNABLE_TO_APPLY": "Nelze aplikovat nastavení dokud jsi připojen k serveru.", + "MENU_QUIT_CAPS": "UKONČIT", + "MENU_MOVEMENT": "Pohyb", + "MENU_ACTIONS": "Akce", + "MENU_RESTORE_DEFAULT_CONTROLS": "Reset ovládání", + "MENU_BRIGHTNESS_HINT_PC": "Nastavení jasu nemá žádný účinek pokud hraješ v okně.", + "MENU_HOLD_AIM_DOWN_SIGHT": "Držet přesně zamířeno", + "MENU_FRAG_EQUIPMENT": "Hodit granát/Použít vybavení", + "MENU_INVENTORY_KILLSTREAK": "Inventář/Smrtící útok", + "MENU_SECONDARY_INVENTORY": "Sekundární inventář", + "MENU_NVG_WATCH": "Noční vidění/Stopky", + "MENU_HOLD_MOUSE_LOOK": "Pohled myší", + "MENU_TEXT_CHAT": "Textový Chat", + "MENU_TEXT_TEAM_CHAT": "Týmový Chat", + "MENU_OPTIONAL": "Volitelné", + "MENU_ADVANCED_VIDEO": "Pokročilá nastavení", + "MENU_VIDEO": "Video", + "MENU_AUDIO": "Zvuk", + "MENU_MUTE_ALL": "Ztišit vše", + "MENU_SP_H1_EPILOGUE": "DOSLOV", + "MENU_SP_H1_ACT3": "AKT 3", + "MENU_SP_H1_ACT2": "AKT 2", + "MENU_SP_H1_ACT1": "AKT 1", + "MENU_SP_MISSION_COMPLETE": "MISE DOKONČENA", + "MENU_SP_MISSION_MODE_CAPS": "MISÍ", + "MENU_SP_MISSION_PRE": "Mise:", + "MENU_SP_SURVIVAL_MODE_CAPS": "PŘEŽITÍ", + "MENU_SP_ACT_I_CAPS": "AKT I", + "MENU_SP_ACT_II_CAPS": "AKT II", + "MENU_SP_ACT_III_CAPS": "AKT III", + "MENU_SP_MUSEUM_CAPS": "MUZEUM", + "MENU_SP_TRAINER_DESC": "Předveď místním účastníkům kurzu jak se má střílet.", + "MENU_SP_INVASION_DESC": "Lokalizuj a ochraň osobu s kódovým označením Raptor během začátku invaze.", + "MENU_SP_FAVELA_ESCAPE_DESC": "Unikni z favely.", + "MENU_SP_ARCADIA_DESC": "Asistuj při evakuaci civilistů a personálu na předměstí.", + "MENU_SP_OILRIG_DESC": "Dostaň se na ropnou plošinu, osvoboď rukojmí a vyčisti cestu do věznice.", + "MENU_SP_DCEMP_DESC": "Dostaň se do Whiskey Hotelu.", + "MENU_SP_DC_WHITEHOUSE_DESC": "Znovu dobij Whiskey Hotelu.", + "MENU_SP_ROADKILL_DESC": "Najdi a znič nepřátelské síly v Afghánistánu.", + "MENU_SP_CLIFFHANGER_DESC": "Lokalizuj a získej modul ACS z havarované družice.", + "MENU_SP_AIRPORT_DESC": "Získej Makarovovu důvěru.", + "MENU_SP_FAVELA_DESC": "Najdi a chyť překupníka zbraní Alejandro Rojase, skrývajícího se někde ve favele.", + "MENU_SP_GULAG_DESC": "Zachraň vězně #627, jediný muž Makarov nenávidí víc než Američané.", + "MENU_SP_DCBURNING_DESC": "Ochraň evakuační bod na Washingtonově památníku.", + "MENU_SP_CONTINGENCY_DESC": "Pomoz kapitánu Priceovi dostat ruskou ponorku.", + "MENU_SP_ESTATE_DESC": "Najdi a zabij Makarova v jeho bezpečném domě na hranicích Ruska.", + "MENU_SP_BONEYARD_DESC": "Uteč z pasti generála Shepherda na vrakovišti.", + "MENU_SP_AF_CHASE_DESC": "Zabij generála Shepherda.", + "MENU_SP_AF_CAVES_DESC": "Najdi jeskyni generála Shepherda v Afghánistánu.", + "MENU_SP_PROFILE_WARNING": "Nejsi přihlášen ke svému profilu. \nChceš se přihlásit?", + "MENU_SP_PROFILE_WARNING_SP": "Nejsi přihlášen ke svému profilu. Nebudeš moci ukládat svůj postup. \nChceš se přihlásit?", + "MENU_SP_TWO_PLAYER_SPLIT_SCREEN": "Dva hráči na jedné obrazovce", + "MENU_SP_TWO_PLAYER_SPLIT_SCREEN_CAPS": "DVA HRÁČI NA JEDNÉ OBRAZOVCE", + "MENU_SP_TWO_PLAYER_ONLINE": "Dva hráči Online", + "MENU_SP_TWO_PLAYER_ONLINE_CAPS": "DVA HRÁČI ONLINE", + "MENU_SP_WAITING_FOR_HOST": "Čeká se na hodtitele...", + "MENU_SP_NEED_ONE_MORE_PLAYER": "Je potřeba ještě jeden hráč...", + "MENU_SP_SELECT_YOUR_DIFF": "Vyber si obtížnost.", + "MENU_SP_TYPE_ASSAULT": "Útok", + "MENU_SP_TYPE_KILLSPREE": "Eliminace", + "MENU_SP_TYPE_ESCORT": "Doprovod", + "MENU_SP_TYPE_WAVE_DEFENSE": "Obrana", + "MENU_SP_TYPE_TIME_ASSAULT": "Útok na čas", + "MENU_SP_TYPE_STEALTH": "Tajné", + "MENU_SP_TYPE_ASSAULT_DEFEND": "Útok a obrana", + "MENU_SP_TYPE_VEHICLE_KILLSPREE": "Smrtící vozidlo", + "MENU_SP_TYPE_DRIVING": "Řízení", + "MENU_SP_TYPE_TIMED_ESCORT": "Doprovod na čas", + "MENU_SP_NOTE_SLOW_MO_BREACH": "Zdlouhavý průnik", + "MENU_SP_NOTE_TWO_PLAYERS_REQUIRED": "Vyžaduje dva hráče", + "MENU_SP_NOTE_CIVILIAN": "Civilisté", + "MENU_SP_NOTE_EXPLOSIVES_KNIVES_ONLY": "Pouze výbušniny a nože", + "MENU_SP_COMPLETION": "dokončeno", + "MENU_SP_OPPOSITION_FORCE": "Odpor opozice:", + "MENU_SP_LEVEL_TYPE": "Klasifikace: ", + "MENU_SP_LEVEL_N": "Úroveň &&1", + "MENU_SP_LEVEL_AVG_TIME": "Čas pro dokončení: ", + "MENU_SP_LEVEL_YOUR_BEST_TIME": "Tvůj nejlepší čas", + "MENU_SP_TYPE_TIMED_DRIVING": "Řízení na čas", + "MENU_SP_DESC_SINGLEPLAYER": "Užij si příběh Modern Warfare™ a poté pokračuj se získanou zkušeností.", + "MENU_SP_DESC_MULTIPLAYER": "Zvyšuj si hodnost, odemykej nové zbraně, vylepšení, smrtelné údery a mnoho dalšího online i lokálně.", + "MENU_SP_DESC_SPECIALOPS": "Nasbírej všech 69 hvězd sám a nebo s přítelem v různých výzvách a misích.", + "MENU_SP_STORY_CAPS": "PŘÍBĚH", + "MENU_SP_SOLO_PLAY_CAPS": "HRA PRO JEDNOHO", + "MENU_SP_TOTAL_PROGRESS": "CELKOVÝ POSTUP: ", + "MENU_SP_DIFF_RANKING_1": "Minimální", + "MENU_SP_DIFF_RANKING_2": "Lehké", + "MENU_SP_DIFF_RANKING_4": "Těžké", + "MENU_SP_DIFF_RANKING_5": "Masivní", + "MENU_SP_LEAVELOBBY": "Opustit místnost?", + "MENU_SP_ARE_YOU_ABSOLUTELY_SURE": "Jsi si skutečně jistý?", + "MENU_SP_VETERAN_IS_EXTREMELY_DIFFICULT": "Veterán je extrémní obtížnost, opravdu chceš hrát na obtížnost veterán?", + "MENU_SP_IW_BEST_TIME": "Nejlepší čas IW: ", + "MENU_SP_SELECT_SAVE_DEVICE_CAPS": "VYBRAT ÚLOŽNÉ ZAŘÍZENÍ", + "MENU_SP_MARGIN_HORIZONTAL_DESC": "Posuvníkem nastav horizontální okraj.", + "MENU_SP_MARGIN_VERTICAL_DESC": "Posuvníkem nastav vertikální okraj.", + "MENU_SP_STARS_EARNED": "Získal jsi hvězdy!", + "MENU_SP_NEXT_UNLOCK": "DALŠÍ ODEMKNUTÍ: ", + "MENU_SP_TIME_PLAYED": "DOBA HRANÍ", + "MENU_SP_PERCENTAGE_COMPLETED": "PROCENTNÍ POSTUP", + "MENU_SP_NA_FOR_THIS_OP": "Není dostupné pro tuto operaci.", + "MENU_SP_START_OP": "Start operace", + "MENU_SP_START_OP_DESC": "Spustit operaci.", + "MENU_SP_CHANGE_OP": "Změnit operaci", + "MENU_SP_CHANGE_OP_DESC": "Vybrat si jinou operaci.", + "MENU_SP_FRIEND_LOCK_GROUP_DESC": "Partner nemá odemčenu tuto skupinu.", + "MENU_SP_FRIEND_LOCK_OP_DESC": "Partner nemá odemčenu tuto operaci a nezíská žádné hvězdy za dokončení.", + "MENU_SP_YOU_LOCK_OP_DESC": "Nemáš odemčenu tuto operaci a nezískáš žádné hvězdy za dokončení.", + "MENU_SP_DIFFERENT_DIFF": "Vybrat jinou obtížnost.", + "MENU_SP_MAX_REWARD": "Max odměna: ", + "MENU_SP_FRIEND_UNLOCK_GROUP_HAS": "Máš: &&1", + "MENU_SP_FRIEND_UNLOCK_GROUP_REQ": "Je vyžadováno: &&1", + "MENU_SP_RECOMMENDATION": "Důrazně doporučujeme hrát nejdříve kampaň.", + "MENU_SP_PLAY": "HRÁT", + "MENU_SP_PLAY_STORY": "Hrát příběh", + "MENU_SP_CONTINUE_TO_SPECIAL_OPS": "Pokračovat do zvláštních operací", + "MENU_SP_CONTINUE_TO_SPECIAL_OPS_CAPS": "POKRAČOVAT DO ZVLÁŠTNÍCH OPERACÍ", + "MENU_SP_CONTINUE_TO_MULTIPLAYER": "Pokračovat do Multiplayeru", + "MENU_SP_FOR_THE_RECORD": "„Tohle jen pro pořádek“", + "MENU_SP_CHOOSE_A_DIFFERENT_OP": "Vybrat jinou operaci", + "MENU_SP_NO_STARS_FOR_LOCKED_OP": "Nezískáš žádné hvězdy dokud si neodemkneš tuto operaci.", + "MENU_SP_NOT_SIGNED_IN": "Nejsi přihlášen", + "MENU_SP_LAST_CHECKPOINT_CONFIRMATION": "Návrat na poslední checkpoint?", + "MENU_SP_STAT_GAME_PROGRESSION": "Postup ve hře:", + "MENU_SP_STAT_HARDENED_PROGRESS": "Postup na obtížnost těžká:", + "MENU_SP_STAT_VETERAN_PROGRESS": "Postup na obtížnost veterán:", + "MENU_SP_STAT_INTEL_ITEMS": "Nalezené počítače:", + "MENU_SP_STAT_TOTAL": "Celkově:", + "MENU_SP_STAT_PLAY_TIME": "Odehraný čas:", + "MENU_SP_STAT_SP_PLAY_TIME": "Odehraný čas kampaně:", + "MENU_SP_STAT_MP_PLAY_TIME": "Odehraný čas multiplayeru:", + "MENU_SP_STAT_TOTAL_PLAY_TIME": "Celkový odehraný čas:", + "MENU_SP_STAT_SO_PLAY_TIME": "Odehraný čas zvláštních operací:", + "MENU_SP_STAT_TIME_FORMAT": "DHMS", + "MENU_SP_STAT_SO_PROGRESSION": "Postup ve zvláštních operacích:", + "MENU_SP_STAT_SP_PROGRESSION": "Postup v kampani:", + "MENU_SP_STAT_MP_PROGRESSION": "Postup v multiplayeru:", + "MENU_SP_STAT_SP_EASY_REGULAR_PROGRESSION": "Postup na obtížnost rekrut a normální:", + "MENU_SP_STAT_STARS_EARNED": "Získáno hvězd:", + "MENU_SP_STAT_TOTAL_STARS": "Celkově hvězd:", + "MENU_SP_STAT_NUM_DOT_PERCENT": "&&1.&&2%", + "MENU_SP_STAT_NUM_PERCENT": "&&1%", + "MENU_SP_STAT_NUM_RATIO": "&&1/&&2", + "MENU_SP_COMPLETION_PERCENT": "dokončeno &&1%", + "MENU_SP_COMPLETION_DOT_PERCENT": "dokončeno &&1.&&2%", + "MENU_SP_CAMPAIGN_INCOMPLETE": "Kampaň není dokončena", + "MENU_SP_CLASSIFIED": "Klasifikované", + "MENU_SP_ONLY_HOST_CAN_CHOOSE": "Pouze hostitel může změnit operaci.", + "MENU_SP_VIEW_OP": "Procházet operace", + "MENU_SP_VIEW_OP_DESC": "Zobrazit odemčené operace.", + "MENU_SP_CURRENT_LEVEL_INTELS": "&&1/&&2 nalezených počítačů", + "MENU_SP_CURRENT_LEVEL_INTEL_TITLE": "Počítače nepřátel", + "MENU_SP_FIRST_DIFFICULTY_STAR": "Dokonči tuto operaci na obtížnost těžká nebo veterán abys získal další hvězdy.", + "MENU_SP_SKIP_MISSION": "Přeskočit misi", + "MENU_SP_OFFENSIVE_SKIP_1": "Následující mise může být pro některé hráče nasilná nebo znepokojující. Tuto misi můžeš kdykoliv přeskočit v nabídce pauzy.", + "MENU_SP_OFFENSIVE_SKIP_NOW": "Přeskočit tuto misi", + "MENU_SP_OFFENSIVE_TITLE": "Upozornění na násilný obsah", + "MENU_SP_OFFENSIVE_ARE_YOU_SURE": "Opravdu chceš přeskočit tuto misi?", + "MENU_SP_OFFENSIVE_SKIP_2": "Pro některé hráče mohou být některé z misí příliš násilné a znepokojující. Chceš mít možnost přeskočit tyto mise?", + "MENU_SP_OFFENSIVE_SKIP_YES_ASK_LATER": "Ano, zeptat se později", + "MENU_SP_OFFENSIVE_SKIP_NO_WONT_GET_OFFENDED": "Ne, nechci být obtěžován", + "MENU_SP_OFFENSIVE_SKIP_3": "Pokud odpovíš ano, nebudeš už znovu dotazován na přeskočení mise.", + "MENU_SP_OFFENSIVE_SKIP_4": "(Možnost přeskočení mise je dostupná v nabídce pauzy.)", + "MENU_SP_OFFENSIVE_SKIP_YES_NEVER_ASK": "Ano, příště se neptat", + "MENU_SP_CREDITS_CAPS": "AUTOŘI ", + "MENU_SP_69STAR_GRATZ": "Gratulujeme! Dokončil jsi zvláštní operace.", + "MENU_SP_CAMPAIGN": "KAMPAŇ", + "MENU_SP_SHOW_TIMER": "Zobrazit stopky", + "MENU_SP_TIMER_NIGHT_VISION": "Stopky/Noční vidění", + "MENU_SP_INVITE_FRIEND_PC_CPU": "Hostitelem by měl být hráč s výkonnějším CPU.", + "MENU_SP_STEAM_CHAT_HINT": "Chat spustíš dvojklikem na jméno přítele na Steamu.", + "CGAME_NOSPECTATORVOICECHAT": "Do chatu se nelze zapojit jako divák.", + "CGAME_NOW_SAVING": "Ukládání...", + "CGAME_SPECTATOR": "DIVÁK", + "CGAME_COMPLAINTFILED": "Tvoje stížnost byla registrována", + "CGAME_COMPLAINTDISMISSED": "Stížnost zamítnuta", + "CGAME_COMPLAINTSERVERHOST": "Nelze si stěžovat na hostitele serveru", + "CGAME_SERVERHOSTTEAMKILLED": "Byl jsi zabit hostitelem serveru", + "CGAME_COMPLAINTTEAMKILLFILE": "Podat stížnost na &&1 za team-kill?", + "CGAME_PRESSYESNO": "Stiskni '&&1' pro ANO, nebo '&&2' pro NE", + "CGAME_VOTE": "HLASOVÁNÍ", + "CGAME_FOLLOWING": "DIVÁCI", + "CGAME_YOUKILLED": "Zabil jsi &&1", + "CGAME_TEAMMATE": "SPOLUHRÁČ", + "CGAME_UNKNOWN": "neznámý", + "CGAME_MISSIONOBJECTIVES": "CÍLE MISE", + "CGAME_MISSIONOBJECTIVES_NONE": "ŽÁDNÝ CÍL MISE", + "CGAME_NO": "NE", + "CGAME_PAUSED": "Pauza", + "CGAME_PLAYERRENAMES": "přejmenovat na", + "CGAME_CONNECTIONINTERUPTED": "Spojení přerušeno", + "CGAME_SB_PLAYER": "&&1", + "CGAME_SPECTATORS": "Diváci", + "CGAME_FOR": "na", + "CGAME_DIED": "zemřel", + "CGAME_MELEE": "rvačku", + "CGAME_SUICIDE": "sebevraždu", + "CGAME_FALLING": "pád", + "CGAME_CRUSH": "rozdrcení", + "CGAME_DROWN": "utopení", + "CGAME_SLIME": "bláto", + "CGAME_WAITINGFORSERVERLOAD": "Čekám na server než načte novou mapu", + "CGAME_HEAD_SHOT": "zásah do hlavy", + "CGAME_PRONE_BLOCKED": "Lehnutí blokováno", + "CGAME_PRONE_BLOCKED_WEAPON": "S touto zbraní nemůžeš ležet.", + "CGAME_HEALTH": "Zdraví", + "CGAME_LISTENSERVER": "Sledovaný server", + "CGAME_THIS_WEAPON_HAS_NO_ALTERNATE": "Tato zbraň nejde přepnout na alternativní mód.", + "CGAME_YOUWEREKILLED": "Zabit hráčem &&1", + "CGAME_CONTINUE_SAVING": "ULOŽIT A UKONČIT", + "CGAME_SAVE_WARNING": "Pokud nyní uložíš hru, ztratíš veškerý postup dosažený od posledního checkpointu. Přesto uložit?", + "CGAME_RESTART_WARNING": "Pokud nyní restartuješ, stratíš \nveškerý postup dosažený \nv této misi.\n\nPřesto restartovat?", + "CGAME_SAVE_VICTORY": "Chceš uložit postup ve hře?", + "CGAME_SB_ASSISTS": "Asistuj", + "CGAME_SB_KILLS": "Zabití", + "CGAME_SB_PING": "Ping", + "CGAME_OBJECTIVE_BELOW": "Cíl je dole", + "CGAME_OBJECTIVE_ABOVE": "Cíl je nahoře", + "CGAME_SAVINGREPLAY": "&&1 ukládání záznamu na\n &&2 -> &&3", + "CGAME_OBJECTIVE_FOLLOWTEXT_DEFAULT": "Následuj", + "CGAME_SB_PLAYERS": "&&1", + "CGAME_SB_SCORE": "Skóre", + "CGAME_YES": "ANO", + + "PLATFORM_UI_PRESS_BUTTONSELECTCHOICE": "Stiskni ^3&&1^7 pro přeskočení.", + "PLATFORM_UI_AC130_CHANGE_WEAPON": "^3[{weapnext}]^7 Změnit zbraň\n", + "PLATFORM_UI_AC130_TOGGLE_THERMAL": "^3[{+activate}]^7 Termální vidění", + "PLATFORM_UI_AC130_TOGGLE_FLIR": "^3[{+activate}]^7 Přepnout FLIR", + "PLATFORM_UI_EOG_SUMMARY_PLAY_AGAIN": "HRÁT ZNOVU", + "PLATFORM_UI_EOG_SUMMARY_RETURN": "ZPĚT DO ZVLÁŠTNÍCH OPERACÍ", + "PLATFORM_UI_PRESS_TO_GO_BACK": "\u0002 Zrušit", + "PLATFORM_UI_PRESS_TO_CONTINUE": "\u0001 Aplikovat", + "PLATFORM_UI_CANCEL_RIGHT": "Zrušit ^3&&1^7", + "PLATFORM_UI_SHOW_SCORES": "Zobrazit skóre", + "PLATFORM_UI_NATIVE": "Nativní", + "PLATFORM_UI_HEADER_PLAY_MP_CAPS": "HRÁT ONLINE", + "PLATFORM_UI_THUMBSTICK_LAYOUT_CAPS": "ROZVRŽENÍ PŘEPÍNAČŮ", + "PLATFORM_UI_STICK_LAYOUT_CAP": "ROZVRŽENÍ PŘEPÍNAČŮ", + "PLATFORM_UI_THUMBSTICK_LAYOUT": "Rozvržení přepínačů", + "PLATFORM_UI_NATIVE_RENDER_RESOLUTION_OPTION": "Nativní (&&1 x &&2)", + "PLATFORM_UI_PRESS_TO_GO_BACK_PC": "^2ESC^7 Zrušit", + "PLATFORM_UI_PRESS_TO_CONTINUE_PC": "^2ENTER^7 Aplikovat", + "PLATFORM_UI_WARNING_CAPS": "VAROVÁNÍ", + "PLATFORM_UI_EXIT_GAME_CAPS": "UKONČIT HRU", + + "PLATFORM_FOLLOWPREVIOUSPLAYER": "^3&&1^7 - Předchozí hráč", + "PLATFORM_FOLLOWSTOP": "^3&&1^7 - Stop následování", + "PLATFORM_STANCEHINT_JUMP": "Stiskni ^3&&1^7 pro výskok", + "PLATFORM_STANCEHINT_STAND": "Stiskni ^3&&1^7 pro vstyk", + "PLATFORM_STANCEHINT_CROUCH": "Stiskni ^3&&1^7 pro skrčení", + "PLATFORM_STANCEHINT_PRONE": "Stiskni ^3&&1^7 pro zalehnutí", + "PLATFORM_SWAPWEAPONSGAMEPAD": "Podrž ^3&&1^7 pro ", + "PLATFORM_SWAPWEAPONS": "Stiskni ^3&&1^7 pro výměnu za ", + "PLATFORM_MANTLE_IF_JUMP": "Podrž ^3&&1^7 pro stoupání.", + "PLATFORM_MANTLE": "Stiskni ^3&&1^7 pro stoupání.", + "PLATFORM_HOLD_BREATH": "Podrž ^3&&1^7 pro ustálení.", + "PLATFORM_PICKUPNEWWEAPONGAMEPAD": "Podrž ^3&&1^7 pro sebrání ", + "PLATFORM_PICKUPNEWWEAPON": "Stiskni ^3&&1^7 pro sebrání ", + "PLATFORM_THROWBACKGRENADE": "^3&&1^7 pro odhození", + "PLATFORM_USEAION30CAL": "Stiskni USE^3 &&1 ^7pro povolání .30 cal", + "PLATFORM_PRESS_TO_SKIP": "Stiskni ^3[{+activate}]^7 pro přeskočení", + "PLATFORM_PRESS_TO_SPAWN": "Stiskni ^3[{+activate}]^7 pro oživení", + "PLATFORM_PRESS_TO_RESPAWN": "Stiskni ^3[{+activate}]^7 pro znovuoživení", + "PLATFORM_HOLD_TO_USE_GAMEPAD": "Podrž ^3[{+activate}]^7 pro použití", + "PLATFORM_HOLD_TO_USE": "Podrž ^3[{+activate}]^7 pro použití ", + "PLATFORM_HOLD_TO_DROP": "Stiskni ^3[{+activate}]^7 pro upuštění ", + "PLATFORM_HOLD_TO_PLANT_EXPLOSIVES": "Podrž ^3&&1^7 pro položení výbušniny ", + "PLATFORM_HOLD_TO_DEFUSE_EXPLOSIVES": "Podrž ^3&&1^7 pro zneškodnění výbušniny ", + "PLATFORM_EOG_PRESS_ESC": "Stiskni ^3ESC^7 pro ^2Create a Class^7 a dalších", + "PLATFORM_LOW_AMMO_NO_RELOAD": "Málo munice", + "PLATFORM_PICK_UP_STOPPING_POWER": "Stiskni ^3&&1^7 pro získání Stopping Power", + "PLATFORM_PICK_UP_JUGGERNAUT": "Stiskni ^3&&1^7 pro získání Juggernaut", + "PLATFORM_PICK_UP_DOUBLE_TAP": "Stiskni ^3&&1^7 pro získání Double Tap", + "PLATFORM_PICK_UP_LAST_STAND": "Stiskni ^3&&1^7 pro získání Last Stand", + "PLATFORM_PICK_UP_MARTYRDOM": "Stiskni ^3&&1^7 pro získání Martyrdom", + "PLATFORM_PICK_UP_SLEIGHT_OF_HAND": "Stiskni ^3&&1^7 pro získání Sleight of Hand", + "PLATFORM_PLAY_ONLINE": "Hrát Online", + "PLATFORM_NOMOTD": "Připoj se online pro získání novinek a aktualizací Modern Warfare 2", + "PLATFORM_NOMOTD_MP": "Vítej v multiplayeru Modern Warfare 2", + "PLATFORM_FOLLOWNEXTPLAYER": "^3&&1^7 - Další hráč", + "PLATFORM_LOCSEL_DIR_CONTROLS": "Podrž [Pravá myš] pro nastavení směru", + "PLATFORM_LOCSEL_POSITION_CONTROLS": "Použij myš pro označení cíle", + "PLATFORM_PRESS_TO_SET_AIRSTRIKE": "Stiskni tl. střelby pro zaměření vzdušného útoku", + "PLATFORM_COWARDS_WAY_OUT": "Podrž^3 [{+activate}] ^7pro zbabělý útěk", + "PLATFORM_DISCONNECTED_FROM_SERVER": "Odpojeno od serveru", + "PLATFORM_STATSREADERROR": "Během čtení dat statistiky nastala chyba. Tvoje statistiky byly resetovány.", + "PLATFORM_DYK_MSG1": "Získej body XP! Zkušenostní body (XP) získáš zabíjením, plněním výzev a dokončováním zápasů na hodoncených serverech.", + "PLATFORM_DYK_MSG2": "Zvyšuj úroveň! Sbíráním XP získáš vyšší hodnost a odemkneš nové úrovně a výzvy.", + "PLATFORM_DYK_MSG3": "Uprav si zbraň! Můžeš přidat maskování nebo jiné doplňky v sekci Vytvořit třídu.", + "PLATFORM_DYK_MSG4": "Navrhni si vlastní třídu! Sekce Vytvořit třídu ti dovolí zvolit si zbraně a perky, pak si třídu pojmenuj jak je ti libo.", + "PLATFORM_DYK_MSG5": "Pracuj kolektivně! Pokud nepřítele postřelíš, ale zabije ho někdo jiný, dostaneš body za asistenci.", + "PLATFORM_DYK_MSG6": "Zkus si hardcore. Mód hardcore odstraňuje HUD a dělá zbraně ještě více smrtelnými.", + "PLATFORM_DYK_MSG7": "Vlastní hry! Nehodnocené hry lze hrát s jakýmkoliv modem a vlastnimi pravidly.", + "PLATFORM_DYK_MSG8": "Výzvy jsou odměňovány. Plnění výzev odemyká příslušenství a maskování zbraní pro použití v sekci Vytvořit třídu.", + "PLATFORM_DYK_MSG9": "Získej další XP! Extra XP bonusy získáš dokončením výzev zahrnutých v Hodnostech a výzvách.", + "PLATFORM_DYK_MSG10": "Poslouchej... Můžeš odposlouchávat nepřátelské rozhovory s perkem Eavesdrop.", + "PLATFORM_DYK_MSG11": "Buď opatrný... Můžeš si všimnout nepřátelských výbušnin jako claymore a C4 s perkem Bomb Squad.", + "PLATFORM_DYK_MSG12": "Nevzdávej to! Vytáhni pistoli a zabij pár nepřátel ještě než zemřeš s perkem Last Stand.", + "PLATFORM_DYK_MSG13": "Využívej letectvo! Povolej vzdušný úder v kombinaci s UAV pro určení přesného bodu zásahu.", + "PLATFORM_DYK_MSG14": "Sundej vrtulník! Neboj se střílet do vrtulníku pouze s primární zbraní. Není to tak účinné jako raketa, ale rozhodně to bolí.", + "PLATFORM_DYK_MSG15": "Hledej nepřátele! Aktivuješ-li UAV zobrazí se nepřátele na radaru jako červené tečky. Znát pozici nepřátel je velká výhoda.", + "PLATFORM_DYK_MSG17": "Braň svoji vlajku! Držení značených cílů v herním módu Domination přináší teamu body. Čím více cílů držíte, tím více bodů dostanete.", + "PLATFORM_DYK_MSG18": "Dávej si bacha! Při hraní Search and Destroy buď opatrný - pokud zemřeš, tak už se neoživíš.", + "PLATFORM_DYK_MSG19": "Eskortuj bombu! Ochraň pouzdro s minou v Sabotage. Pro dosažení nepřátelského cíle je nutná týmová spolupráce.", + "PLATFORM_NOTSIGNEDINTOPROFILE": "Ještě nemáš vybraný profil.", + "PLATFORM_UNEXPECTEDDOWNLOADMESSAGE": "Neočekávaná www zpráva.", + "PLATFORM_DOWNLOADDISCONNECTED": "Klient spadnul při stahování souborů.", + "PLATFORM_PRESS_TO_SAFESPAWN": "[{+frag}] Bezpečné oživení", + "PLATFORM_RESUPPLY": "[{+activate}] Doplnění zásob", + "PLATFORM_GET_SENTRY": "[{+activate}] Stráž", + "PLATFORM_GET_AUTO_SHOT": "[{+activate}]A uto_Shot", + "PLATFORM_GET_THUMPER": "[{+activate}] Thumper", + "PLATFORM_GET_RANDOM": "[{+activate}] Random Item", + "PLATFORM_VEH_BOOST": "[Space] Boost", + "PLATFORM_VEH_BRAKE": "[S] Reverse", + "PLATFORM_VEH_FIRE": "[Left Mouse] Fire", + "PLATFORM_VEH_THROTTLE": "[W] Throttle", + "PLATFORM_GET_KIT": "[{+activate}] Nová výzbroj", + "PLATFORM_REVIVE": "[{+activate}] Oživení hráče", + "PLATFORM_USEONLINESTATS_TRUE": "IwNet odblokace: Zap", + "PLATFORM_USEONLINESTATS_FALSE": "IwNet odblokace: Vyp", + "PLATFORM_DESC_FIND_GAME": "Vyber herní mód a rychle se připoj do online hry.", + "PLATFORM_DESC_FIND_GAME_LOCKED": "Pouze hostitel párty může najít hry.", + "PLATFORM_BACK_CAPS": "ZPĚT ^0- ^3ESC^7", + "PLATFORM_DETONATE": "Stiskni [{+activate}] pro odpálení", + "PLATFORM_GET_KILLSTREAK": "[{+activate}] Smrtelný úder", + "PLATFORM_USE_BUTTONMOVE_TO_POSITION": "Použij myš k určení polohy", + "PLATFORM_USE_BUTTONLOOK_TO_AIM": "Podrž ^3[Right Mouse]^7 pro zamíření", + "PLATFORM_USE_BUTTONLOOK_TO_AIM_GAMEPAD": "Stiskni \u0011 pro zamíření", + "PLATFORM_PRESS_BUTTON_TO_CONFIRM_TARGET": "Stiskni ^3[Left Mouse]^7 pro potvrzení cíle", + "PLATFORM_PLAY_ONLINE_CAPS": "HRÁT", + "PLATFORM_SYSTEM_LINK_CAPS": "LAN PÁRTY", + "PLATFORM_FIND_GAME_CAPS": "NAJÍT HRU", + "PLATFORM_GAME_SUMMARY_CAPS": "SHRNUTÍ HRY ^0- ^3F1^7", + "PLATFORM_PREDATOR_MISSILE_AIM": "Řídit", + "PLATFORM_PREDATOR_MISSILE_BOOST": "[{+attack}] Podpora", + "PLATFORM_CONTINUE_CAPS": "POKRAČOVAT", + "PLATFORM_CLOSE_CAPS": "ZAVŘÍT", + "PLATFORM_PRESS_TO_COPYCAT": "Stiskni ^3[{weapnext}]^7 Ukrást jejich třídu!", + "PLATFORM_ACCEPT_INVITE": "Přijmout pozvání", + "PLATFORM_OFFENSIVE_NO_PANELTY": "(Nebudeš nijak ochuzen ani penalizován ve smyslu dokončení hry.)", + "PLATFORM_CHANGE_PROFILE_CAPS": "ZMĚNIT PROFIL", + "PLATFORM_UNLOCK_KILLSTREAK": "Klikni pro zpřístupnění smrtícího úderu.", + "PLATFORM_VIEW_CHALLENGES": "^3F2^0-^7 Zobrazit výzvy", + "PLATFORM_STEAM_AUTH_DENIED": "Autorizace Steamu selhala.", + "PLATFORM_STEAM_KICK_CHEAT": "Odhalen cheat.", + "PLATFORM_STEAM_CONNECT_FAIL": "Spojení Steamu selhalo.", + "PLATFORM_VIEW_CHALLENGE_DETAILS": "^3F2^0-^7 Detaily výzvy", + "PLATFORM_STEAM_JOIN_FAIL": "Selhalo připojení do místnosti Steamu.", + "PLATFORM_JOIN_FRIEND_FAILED": "Selhalo připojení k přítelově hře.", + "PLATFORM_POPUP_CONNECTION": "Připojování na IWNet", + "PLATFORM_STEAM_OFFLINE": "Pro hraní v Online módu musíš být přihlášen na Steam.", + "PLATFORM_STEAM_DISCONNECTED": "Odpojeno od Steamu.", + "SCRIPT_PLATFORM_HINT_OBJECTIVEKEY": "Stiskni^3 &&1 ^7pro zobrazení úkolů.", + "SCRIPT_PLATFORM_HINT_PRONEKEY": "Stiskni^3 &&1 ^7pro zalehnutí", + "SCRIPT_PLATFORM_HINT_DOUBLETAPPRONEKEY": "Dvojklik^3 &&1 ^7pro zalehnutí", + "SCRIPT_PLATFORM_HINT_HOLDDOWNPRONEKEY": "Stiskni^3 &&1 ^7pro zalehnutí", + "SCRIPT_PLATFORM_HINT_ADSKEY": "Stiskni^3 &&1 ^7pro zamíření", + "SCRIPT_PLATFORM_HINT_HOLDDOWNADSKEY": "Stiskni^3 &&1 ^7pro zamíření", + "SCRIPT_PLATFORM_HINT_STANDFROMPRONEKEY": "Stiskni^3 &&1 ^7pro vstyk z ležení", + "SCRIPT_PLATFORM_HINT_DOUBLETAPSTANDKEY": "Dvojklik^3 &&1 ^7pro vstyk z ležení", + "SCRIPT_PLATFORM_HINT_SWITCHTOGRENADE": "Stiskni^3 &&1 ^7pro přepnutí na granáty", + "SCRIPT_PLATFORM_HINT_MELEEATTACK": "Stiskni^3 &&1 ^7pro boj zblízka", + "SCRIPT_PLATFORM_DOG_DEATH_TOO_SOON": "Počkej, až tě pes povalí, abys mu zlomil vaz. ^3( [{+melee}] )^7 ", + "SCRIPT_PLATFORM_DOG_DEATH_TOO_LATE": "Zlom psovi vaz dřív, než tě na zemi pokouše. ^3( [{+melee}] )^7 ", + "SCRIPT_PLATFORM_DOG_DEATH_DO_NOTHING": "Zlom psovi vaz hned, jakmile tě povalí na zem. ^3( [{+melee}] )^7 ", + "SCRIPT_PLATFORM_DOG_HINT": "Stiskni ^3( [{+melee}] )^7", + "SCRIPT_PLATFORM_HINT_LEANOUTWINDOW": "Stiskni POUŽÍT^3 &&1 ^7pro vyskočení z okna", + "SCRIPT_PLATFORM_HINT_FIRSTOBJECTIVE": "Podívej se na svůj první cíl a stiskni POUŽÍT^3 &&1 ^7pro obnovení", + "SCRIPT_PLATFORM_HINT_STRAFELEFT": "Stiskni levé tlač. pohybu^3 &&1 ^7pro pohyb vlevo.", + "SCRIPT_PLATFORM_HINT_STRAFERIGHT": "Stiskni pravé tlač. pohybu^3 &&1 ^7pro pohyb vpravo.", + "SCRIPT_PLATFORM_HINT_MOVEFORWARD": "Stiskni přední tlač. pohybu^3 &&1 ^7pro pohyb dopředu.", + "SCRIPT_PLATFORM_HINT_MOVEBACKWARD": "Stiskni zadní tlač. pohybu^3 &&1 ^7pro pohyb dozadu.", + "SCRIPT_PLATFORM_HINT_CHECKCURRENTOBJECTIVE": "Stiskni^3 &&1 ^7pro kontrolu aktuálního úkolu.", + "SCRIPT_PLATFORM_HINT_SWITCHTOSECONDWEAPON": "Nyní máš dvě zbraně. Stiskni^3 &&1 ^7pře přepnutí na druhou zbraň.", + "SCRIPT_PLATFORM_HINT_TRAINING_SWITCHTOGRENADE": "Stiskni^3 &&1 ^7pro přepnutí na granáty.", + "SCRIPT_PLATFORM_HINT_CROUCHKEY": "Stiskni^3 &&1 ^7pro přikrčení.", + "SCRIPT_PLATFORM_HINT_CROUCHTOGGLEFROM": "Stiskni^3 &&1 ^7podruhé pro vztyk z přikrčení.", + "SCRIPT_PLATFORM_HINT_HOLDDOWNCROUCHKEY": "Stiskni^3 &&1 ^7pro přikrčení.", + "SCRIPT_PLATFORM_HINT_RAISEFROMPRONETOCROUCH": "Stiskni^3 &&1 ^7pro přikrčení z lehu.", + "SCRIPT_PLATFORM_HINT_STANDKEY": "Stiskni^3 &&1 ^7pro postavení.", + "SCRIPT_PLATFORM_HINT_STANDLETGOCROUCHKEY": "Pusť^3 &&1 ^7pro ukončení přikrčení.", + "SCRIPT_PLATFORM_HINT_STANDLETGOSECONDKEY": "Pokud chceš vstát, dvojklikni na^3 &&1].", + "SCRIPT_PLATFORM_HINT_STANDFROMCROUCHKEY": "Dvojklik^3 &&1 ^7pro vztyk z přikrčení.", + "SCRIPT_PLATFORM_HINT_RAISEFROMCROUCHTOSTAND": "Klik^3 &&1 ^7pro vztyk z přikrčení.", + "SCRIPT_PLATFORM_HINT_STANDLETGOPRONEKEY": "Pusť^3 &&1 ^7pro ukončení zalehnutí.", + "SCRIPT_PLATFORM_HINT_ADSSTOP": "Stiskni^3 &&1 ^7podruhé pro ukončení míření.", + "SCRIPT_PLATFORM_HINT_FIRSTWEAPONKEY": "Stiskni^3 &&1 ^7pro přepnutí na první zbraň.", + "SCRIPT_PLATFORM_HINT_SECONDWEAPONKEY": "Stiskni^3 &&1 ^7pro přepnutí na druhou zbraň.", + "SCRIPT_PLATFORM_HINT_SWAPWEAPONSKEY": "Podrž POUŽÍT^3 &&1 ^7pro záměnu aktuální zbraně za zbraň na kterou se díváš.", + "SCRIPT_PLATFORM_HINT_PICKUPWEAPONKEY": "Pro sebrání zbraně se na ni podívej a stiskni POUŽÍT^3 &&1].", + "SCRIPT_PLATFORM_HINT_JUMPSTANDKEY": "Když stojíš stiskni^3 &&1 ^7pro výskok.", + "SCRIPT_PLATFORM_HINT_LEANLEFTKEY": "Stiskni^3 &&1 ^7pro náklon vlevo.", + "SCRIPT_PLATFORM_HINT_LEANRIGHTKEY": "Stiskni^3 &&1 ^7pro náklon vpravo.", + "SCRIPT_PLATFORM_HINTSTR_PICKUPGRENADES": "Stiskni^3 &&1 ^7pro sebrání granátů.", + "SCRIPT_PLATFORM_HINTSTR_PLANTEXPLOSIVES": "Stiskni^3 &&1 ^7pro umístění výbušniny.", + "SCRIPT_PLATFORM_HINTSTR_PICKUPEXPLOSIVES": "Stiskni^3 &&1 ^7pro sebrání výbušnin.", + "SCRIPT_PLATFORM_HINT_RELOAD": "Stiskni^3 &&1 ^7pro nabití zbraně.", + "SCRIPT_PLATFORM_HINTSTR_TAKEEXPLOSIVES": "Stiskni^3 &&1 ^7pro sebrání výbušnin.", + "SCRIPT_PLATFORM_AC130_HINT_ZOOM_AND_FIRE": "Stiskni ^3[{+speed}]^7 pro zamíření a stiskni ^3[{+attack}]^7 pro střelbu.", + "SCRIPT_PLATFORM_AC130_HINT_TOGGLE_THERMAL": "Stiskni ^3[{+activate}]^7 pro přepnutí na černobílé termální vidění.", + "SCRIPT_PLATFORM_HINT_PLANTBEACON": "Stiskni^3 &&1 ^7pro položení IR majáku.", + "SCRIPT_PLATFORM_LAUNCHFACILITY_A_HINT_PLANT_C4_GLOW": "Pro umístění C4 se přibliž k zvýrazněnému místu a stiskni^3 [{+activate}]^7.", + "SCRIPT_PLATFORM_LAUNCHFACILITY_A_HINT_SMOKE": "Hoď kouř^3 [{+smoke}] ^7pro bezpečné přiblížení k vozidlu.", + "SCRIPT_PLATFORM_HINT_PLANTEXPLOSIVES": "Podívej se na označenou pozici a stiskni^3 &&1 ^7pro umístění výbušnin.", + "SCRIPT_PLATFORM_HINT_GET_DETONATOR": "Stiskni^3 &&1 ^7pro sebrání detonátoru.", + "SCRIPT_PLATFORM_SPOOL_MINIGUN": "Stiskni a podrž ^3[{+speed_throw}]^7 pro vytažení minizbraně.", + "SCRIPT_PLATFORM_LEARN_CHOPPER_AIR_SUPPORT2": "Stiskni^3 [{+attack}] ^7pro zadání souřadnic útoku.", + "SCRIPT_PLATFORM_OILRIG_HINT_STEALTH_KILL": "Stiskni^3 [{+melee}] ^7pro odstranění stráže.", + "SCRIPT_PLATFORM_BREACH_ACTIVATE": "Podrž ^3[{+activate}]^7 pro vtrhnutí", + "SCRIPT_PLATFORM_BREACH_ACTIVATE_KB": "Stiskni ^3[{+activate}]^7 pro vtrhnutí", + "SCRIPT_PLATFORM_SNOWMOBILE_ATTACK": "Podrž ^3[{+attack}]^7 pro střelbu.", + "SCRIPT_PLATFORM_SNOWMOBILE_DRIVE": "Podrž ^3[{+forward}]^7 pro jízdu.", + "SCRIPT_PLATFORM_SNOWMOBILE_REVERSE": "Stiskni ^3[{+back}]^7 pro jízdu zpět.", + "SCRIPT_PLATFORM_ZODIAC_STEADY": "Podrž ^3[{+stance}]^7 pro ustálení člunu.", + "SCRIPT_PLATFORM_HINTSTR_POPFLARE": "Stiskni ^3[{+attack}]^7 pro zapálení světlice.", + "SCRIPT_PLATFORM_STEER_DRONE": "Použij myš pro řízení střely.", + "SUBTITLE_ROADKILL_INTRO_RPG": "^2Ranger: ^7RPG!!!", + "SUBTITLE_TRAIN_FLY_WELCOME": "^2Sgt. Foley: ^7Vítejte na kurzu mladého bojovníka.", + "SUBTITLE_FAVELA_GST_NOHESNOT": "^2Ghost: ^7Už ne!", + "SUBTITLE_ROADKILL_AR4_ONEONTHELEFT": "^2Ranger: ^7Ten na levé straně." +} \ No newline at end of file diff --git a/data/zonetool/localizedstrings/english.json b/data/zonetool/localizedstrings/english.json new file mode 100644 index 00000000..af460e79 --- /dev/null +++ b/data/zonetool/localizedstrings/english.json @@ -0,0 +1,99 @@ +{ + "LOCALE_0": "English", + "LOCALE_1": "French", + "LOCALE_2": "German", + "LOCALE_3": "Italian", + "LOCALE_4": "Spanish", + "LOCALE_5": "Russian (Full)", + "LOCALE_6": "Polish", + "LOCALE_7": "Portuguese", + "LOCALE_8": "Japanese (Full)", + "LOCALE_9": "Japanese (Partial)", + "LOCALE_10": "Traditional Chinese", + "LOCALE_11": "Simplified Chinese", + "LOCALE_12": "Arabic", + "LOCALE_13": "Czech\nOriginally translated by Ctihy\nPorted and corrected by VladWinner", + "LOCALE_14": "Spanish (Latin America)", + "LOCALE_15": "Korean", + "LOCALE_16": "English (Safe)", + "LOCALE_17": "Russian (Partial)", + "LUA_MENU_FALLBACK_DISABLE": "Apply built-in fonts", + "LUA_MENU_FALLBACK_ENABLE": "Apply h2-mod fonts", + + "UPDATER_POPUP_NO_UPDATES_AVAILABLE": "No updates available", + "MENU_CCS_NEW_PATCH_NOTICE": "An update is available, proceed with installation?", + "MENU_DOWNLOAD_AUTOUPDATE_PATCH": " ", + "UPDATER_POPUP_SUCCESSFUL": "Update successful", + "MENU_CCS_RESTART_CONFIRMATION_TEXT": "Update requires restart", + "UPDATER_POPUP_CHECKING_FOR_UPDATES": "Checking for updates...", + + "LUA_MENU_CAMPAIGN_UNLOCKED_ALL_TITLE": "Unlock All Missions and Intel", + "LUA_MENU_CANCEL_UNLOCK_CAPS": "Cancel Unlock All Missions", + + "MENU_MODS_DESC": "Load installed mods.", + "LUA_MENU_MOD_DESC_DEFAULT": "Load &&1.", + "LUA_MENU_MOD_DESC": "&&1\nAuthor: &&2\nVersion: &&3", + "LUA_MENU_LOADED_MOD": "Loaded mod: ^3&&1", + "LUA_MENU_AVAILABLE_MODS": "Available mods", + "LUA_MENU_UNLOAD": "Unload", + "LUA_MENU_UNLOAD_DESC": "Unload the currently loaded mod.", + "LUA_MENU_WORKSHOP": "Workshop", + "LUA_MENU_WORKSHOP_DESC": "Download and install mods.", + + "MENU_GENERAL": "H2-MOD", + "MENU_GENERAL_DESC": "Set h2-mod's settings.", + "LUA_MENU_AUTO_UPDATE": "Automatic updates", + "LUA_MENU_AUTO_UPDATE_DESC": "Enable or disable automatic updates on startup.", + "LUA_MENU_CHECK_UPDATES": "Check for updates", + "LUA_MENU_CHECK_UPDATES_DESC": "Check for updates.", + "LUA_MENU_DRAWING": "Hud", + "LUA_MENU_UPDATES": "Updates", + "LUA_MENU_RENDERING": "Rendering", + "LUA_MENU_DRAW_FPS": "Draw FPS", + "LUA_MENU_DRAW_FPS_DESC": "Enable or disable drawing fps or viewpos on screen.", + "LUA_MENU_FPS_ONLY": "FPS only", + "LUA_MENU_FPS_AND_VIEWPOS": "FPS and View Pos", + "LUA_MENU_DRAW_SPEED": "Draw speed", + "LUA_MENU_DRAW_SPEED_DESC": "Enable or disable drawing the player speed on screen.", + "LUA_MENU_DRAW_SPEEDGRAPH": "Draw speed graph", + "LUA_MENU_DRAW_SPEEDGRAPH_DESC": "Enable or disable the speed graph.", + "LUA_MENU_R_FULLBRIGHT": "Fullbright", + "LUA_MENU_R_FULLBRIGHT_DESC": "Change the fullbright mode", + "LUA_MENU_MODE2": "No dynamic lighting", + "LUA_MENU_MODE3": "Debug shader", + "LUA_MENU_INTRO": "Intro movie", + "LUA_MENU_INTRO_DESC": "Show or skip intro movie with companies' logos on startup.", + + "MENU_SYSINFO_CUSTOMER_SUPPORT_LINK": "Github Page:", + "MENU_SYSINFO_CUSTOMER_SUPPORT_URL": "https://github.com/fedddddd/h2-mod", + "MENU_SYSINFO_DONATION_LINK": "Donation link:", + "MENU_SYSINFO_DONATION_URL": "https://paypal.me/fedecek", + + "MENU_ENGLISH": "English", + "MENU_FRENCH": "Français", + "MENU_GERMAN": "Deutsch", + "MENU_ITALIAN": "Italiano", + "MENU_SPANISH": "Español", + "MENU_RUSSIAN": "Русский", + "MENU_POLISH": "Polski", + "MENU_PORTUGUESE": "Português", + "MENU_JAPANESE_FULL": "日本語", + "MENU_JAPANESE_PARTIAL": "日本語(一部)", + "MENU_TRADITIONAL_CHINESE": "繁體中文", + "MENU_SIMPLIFIED_CHINESE": "简体中文", + "MENU_ARABIC": "ةيبرعلا", + "MENU_CZECH": "Čeština", + "MENU_SPANISHNA": "Español (América Latina)", + "MENU_KOREAN": "한국어", + "MENU_ENGLISH_SAFE": "English (Safe)", + "MENU_RUSSIAN_PARTIAL": "Русский (Англ. озвучка)", + + "MENU_CREDITS_1": "momo5502", + "MENU_CREDITS_2": "Vlad", + "MENU_CREDITS_3": "Future", + "MENU_CREDITS_4": "JariKCoding", + "MENU_CREDITS_5": "netadr", + "MENU_CREDITS_6": "quaK", + "MENU_CREDITS_7": "xensik", + "MENU_CREDITS_8": "ZoneTool" +} \ No newline at end of file diff --git a/data/zonetool/localizedstrings/english_safe.json b/data/zonetool/localizedstrings/english_safe.json new file mode 100644 index 00000000..7a73a41b --- /dev/null +++ b/data/zonetool/localizedstrings/english_safe.json @@ -0,0 +1,2 @@ +{ +} \ No newline at end of file diff --git a/data/zonetool/localizedstrings/french.json b/data/zonetool/localizedstrings/french.json new file mode 100644 index 00000000..b09e97f9 --- /dev/null +++ b/data/zonetool/localizedstrings/french.json @@ -0,0 +1,42 @@ +{ + "LOCALE_0": "Anglais", + "LOCALE_1": "Français", + "LOCALE_2": "Allemand", + "LOCALE_3": "Italien", + "LOCALE_4": "Espagnol", + "LOCALE_5": "Russe", + "LOCALE_6": "Polonais", + "LOCALE_7": "Portugais", + "LOCALE_8": "Japonais", + "LOCALE_9": "Japonais (partiel)", + "LOCALE_10": "Chinois traditionnel", + "LOCALE_11": "Chinois simplifié", + "LOCALE_12": "Arabe", + "LOCALE_13": "Tchèque", + "LOCALE_14": "Espagnol (Amérique latine)", + "LOCALE_15": "Coréen", + "LOCALE_16": "Anglais (sécuritaire)", + "LOCALE_17": "Russe (partiel)", + "LUA_MENU_FALLBACK_DISABLE": "Restaurer les polices par défaut", + "LUA_MENU_FALLBACK_ENABLE": "Utiliser les polices de h2-mod", + + "UPDATER_POPUP_NO_UPDATES_AVAILABLE": "Aucune mise à jour disponible", + "MENU_CCS_NEW_PATCH_NOTICE": "Une mise à jour est disponible,\npoursuivre l'installation ?", + "UPDATER_POPUP_SUCCESSFUL": "Mise à jour réussie", + "MENU_CCS_RESTART_CONFIRMATION_TEXT": "La mise à jour nécessite un redémarrage", + "UPDATER_POPUP_CHECKING_FOR_UPDATES": "Vérification des mises à jour...", + + "LUA_MENU_CAMPAIGN_UNLOCKED_ALL_TITLE": "Débloquer toutes les missions", + "LUA_MENU_CANCEL_UNLOCK_CAPS": "Annuler déblocage", + + "MENU_MODS": "MODS", + "MENU_MODS_DESC": "Charger les mods installés.", + "LUA_MENU_MOD_DESC_DEFAULT": "Charger &&1.", + "LUA_MENU_MOD_DESC": "&&1\nAuteur: &&2\nVersion: &&3", + "LUA_MENU_LOADED_MOD": "Mod chargé: ^3&&1", + "LUA_MENU_AVAILABLE_MODS": "Mods disponibles", + "LUA_MENU_UNLOAD": "Décharger", + "LUA_MENU_UNLOAD_DESC": "Déchargez le mod actuellement chargé.", + + "LUA_MENU_CHOOSE_LANGUAGE": "Choisissez la langue" +} \ No newline at end of file diff --git a/data/zonetool/localizedstrings/german.json b/data/zonetool/localizedstrings/german.json new file mode 100644 index 00000000..fe5bbb69 --- /dev/null +++ b/data/zonetool/localizedstrings/german.json @@ -0,0 +1,25 @@ +{ + "LOCALE_0": "Englisch", + "LOCALE_1": "Französisch", + "LOCALE_2": "Deutsch", + "LOCALE_3": "Italienisch", + "LOCALE_4": "Spanisch", + "LOCALE_5": "Russisch", + "LOCALE_6": "Polnisch", + "LOCALE_7": "Portugiesisch", + "LOCALE_8": "Japanisch", + "LOCALE_9": "Japanisch (Untertitelt)", + "LOCALE_10": "Traditionelles Chinesisch", + "LOCALE_11": "Vereinfachtes Chinesisch", + "LOCALE_12": "Arabisch", + "LOCALE_13": "Tschechisch", + "LOCALE_14": "Spanisch (Lateinamerika)", + "LOCALE_15": "Koreanisch", + "LOCALE_16": "Englisch (Sicher)", + "LOCALE_17": "Russisch (Untertitelt)", + "LUA_MENU_FALLBACK_DISABLE": "Auf Vorgabeschriften zurücksetzen", + "LUA_MENU_FALLBACK_ENABLE": "h2-mod Schriften verwenden", + + "LUA_MENU_CAMPAIGN_UNLOCKED_ALL_TITLE": "Alle Missionen freischalten", + "LUA_MENU_CANCEL_UNLOCK_CAPS": "Freischalten abbrechen" +} \ No newline at end of file diff --git a/data/zonetool/localizedstrings/italian.json b/data/zonetool/localizedstrings/italian.json new file mode 100644 index 00000000..9a7f3d05 --- /dev/null +++ b/data/zonetool/localizedstrings/italian.json @@ -0,0 +1,62 @@ +{ + "LOCALE_0": "Inglese", + "LOCALE_1": "Francese", + "LOCALE_2": "Tedesco", + "LOCALE_3": "Italiano", + "LOCALE_4": "Spagnolo", + "LOCALE_5": "Russo", + "LOCALE_6": "Polacco", + "LOCALE_7": "Portoghese", + "LOCALE_8": "Giapponese", + "LOCALE_9": "Giapponese (parziale)", + "LOCALE_10": "Cinese tradizionale", + "LOCALE_11": "Cinese semplificato", + "LOCALE_12": "Arabo", + "LOCALE_13": "Ceco", + "LOCALE_14": "Spagnolo (America Latina)", + "LOCALE_15": "Coreano", + "LOCALE_16": "Inglese (sicuro)", + "LOCALE_17": "Russo (parziale)", + "LUA_MENU_FALLBACK_DISABLE": "Ripristina caratteri predefiniti", + "LUA_MENU_FALLBACK_ENABLE": "Usare caratteri di h2-mod", + + "LUA_MENU_CAMPAIGN_UNLOCKED_ALL_TITLE": "Sblocca tutte le missioni", + "LUA_MENU_CANCEL_UNLOCK_CAPS": "Annulla sblocco", + + "MENU_MODS_DESC": "Abilita mod installate.", + "LUA_MENU_MOD_DESC_DEFAULT": "Abilita &&1.", + "LUA_MENU_MOD_DESC": "&&1\nAutore: &&2\nVersione: &&3", + "LUA_MENU_LOADED_MOD": "Mod attiva: ^3&&1", + "LUA_MENU_AVAILABLE_MODS": "Mod disponibili", + "LUA_MENU_UNLOAD": "Disabilita", + "LUA_MENU_UNLOAD_DESC": "Disabilita la mod attualmente attiva.", + "LUA_MENU_WORKSHOP": "Workshop", + "LUA_MENU_WORKSHOP_DESC": "Scarica e installa mod.", + + "MENU_GENERAL": "H2-MOD", + "MENU_GENERAL_DESC": "Imposta le opzioni di h2-mod.", + "LUA_MENU_AUTO_UPDATE": "Aggiornamenti automatici", + "LUA_MENU_AUTO_UPDATE_DESC": "Controlla automaticamente gli aggiornamenti all'avvio.", + "LUA_MENU_CHECK_UPDATES": "Controlla gli aggiornamenti", + "LUA_MENU_CHECK_UPDATES_DESC": "Controlla gli aggiornamenti.", + "LUA_MENU_DRAWING": "Hud", + "LUA_MENU_UPDATES": "Aggiornamenti", + "LUA_MENU_RENDERING": "Rendering", + "LUA_MENU_DRAW_FPS": "Mostra FPS", + "LUA_MENU_DRAW_FPS_DESC": "Mostra gli FPS o la posizione sullo schermo.", + "LUA_MENU_FPS_ONLY": "Solo FPS", + "LUA_MENU_FPS_AND_VIEWPOS": "FPS e Posizione", + "LUA_MENU_DRAW_SPEED": "Mostra la velocità", + "LUA_MENU_DRAW_SPEED_DESC": "Mostra la velocità sullo schermo.", + "LUA_MENU_DRAW_SPEEDGRAPH": "Mostra il grafico della velocità", + "LUA_MENU_DRAW_SPEEDGRAPH_DESC": "Attiva o disattiva il grafico della velocità.", + "LUA_MENU_R_FULLBRIGHT": "Fullbright", + "LUA_MENU_R_FULLBRIGHT_DESC": "Cambia la modalità di fullbright", + "LUA_MENU_MODE2": "No illuminazione dinamica", + "LUA_MENU_MODE3": "Shader di debug", + + "MENU_SYSINFO_CUSTOMER_SUPPORT_LINK": "Pagina di Github:", + "MENU_SYSINFO_CUSTOMER_SUPPORT_URL": "https://github.com/fedddddd/h2-mod", + "MENU_SYSINFO_DONATION_LINK": "Link per donazioni:", + "MENU_SYSINFO_DONATION_URL": "https://paypal.me/fedecek" +} \ No newline at end of file diff --git a/data/zonetool/localizedstrings/japanese_full.json b/data/zonetool/localizedstrings/japanese_full.json new file mode 100644 index 00000000..b4b9f1fd --- /dev/null +++ b/data/zonetool/localizedstrings/japanese_full.json @@ -0,0 +1,25 @@ +{ + "LOCALE_0": "英語", + "LOCALE_1": "フランス語", + "LOCALE_2": "ドイツ語", + "LOCALE_3": "イタリア語", + "LOCALE_4": "スペイン語", + "LOCALE_5": "ロシア語", + "LOCALE_6": "ポーランド語", + "LOCALE_7": "ポルトガル語", + "LOCALE_8": "日本語", + "LOCALE_9": "日本語(一部)", + "LOCALE_10": "繁体字中国語", + "LOCALE_11": "簡体字中国語", + "LOCALE_12": "阿拉伯语", + "LOCALE_13": "チェコ語", + "LOCALE_14": "スペイン語(南米)", + "LOCALE_15": "韓国語", + "LOCALE_16": "英語(検閲)", + "LOCALE_17": "ロシア語(一部)", + "LUA_MENU_FALLBACK_DISABLE": "デフォルトに戻す", + "LUA_MENU_FALLBACK_ENABLE": "h2-mod フォントを使用します", + + "LUA_MENU_CAMPAIGN_UNLOCKED_ALL_TITLE": "全ミッションをアンロック", + "LUA_MENU_CANCEL_UNLOCK_CAPS": "アンロックをキャンセル" +} \ No newline at end of file diff --git a/data/zonetool/localizedstrings/japenese_partial.json b/data/zonetool/localizedstrings/japenese_partial.json new file mode 100644 index 00000000..b4b9f1fd --- /dev/null +++ b/data/zonetool/localizedstrings/japenese_partial.json @@ -0,0 +1,25 @@ +{ + "LOCALE_0": "英語", + "LOCALE_1": "フランス語", + "LOCALE_2": "ドイツ語", + "LOCALE_3": "イタリア語", + "LOCALE_4": "スペイン語", + "LOCALE_5": "ロシア語", + "LOCALE_6": "ポーランド語", + "LOCALE_7": "ポルトガル語", + "LOCALE_8": "日本語", + "LOCALE_9": "日本語(一部)", + "LOCALE_10": "繁体字中国語", + "LOCALE_11": "簡体字中国語", + "LOCALE_12": "阿拉伯语", + "LOCALE_13": "チェコ語", + "LOCALE_14": "スペイン語(南米)", + "LOCALE_15": "韓国語", + "LOCALE_16": "英語(検閲)", + "LOCALE_17": "ロシア語(一部)", + "LUA_MENU_FALLBACK_DISABLE": "デフォルトに戻す", + "LUA_MENU_FALLBACK_ENABLE": "h2-mod フォントを使用します", + + "LUA_MENU_CAMPAIGN_UNLOCKED_ALL_TITLE": "全ミッションをアンロック", + "LUA_MENU_CANCEL_UNLOCK_CAPS": "アンロックをキャンセル" +} \ No newline at end of file diff --git a/data/zonetool/localizedstrings/korean.json b/data/zonetool/localizedstrings/korean.json new file mode 100644 index 00000000..c185a24e --- /dev/null +++ b/data/zonetool/localizedstrings/korean.json @@ -0,0 +1,25 @@ +{ + "LOCALE_0": "영어", + "LOCALE_1": "프랑스어", + "LOCALE_2": "독일어", + "LOCALE_3": "이탈리아어", + "LOCALE_4": "스페인어", + "LOCALE_5": "러시아어", + "LOCALE_6": "폴란드어", + "LOCALE_7": "포르투갈어", + "LOCALE_8": "일본어", + "LOCALE_9": "일본어(일부)", + "LOCALE_10": "중국어(번체)", + "LOCALE_11": "중국어(간체)", + "LOCALE_12": "아랍어", + "LOCALE_13": "체코어", + "LOCALE_14": "스페인어(라틴아메리카)", + "LOCALE_15": "한국어", + "LOCALE_16": "영어(검열)", + "LOCALE_17": "러시아어(일부)", + "LUA_MENU_FALLBACK_DISABLE": "기본 글꼴로 되돌리기", + "LUA_MENU_FALLBACK_ENABLE": "h2-mod 글꼴 사용", + + "LUA_MENU_CAMPAIGN_UNLOCKED_ALL_TITLE": "모든 임무 잠금 해제", + "LUA_MENU_CANCEL_UNLOCK_CAPS": "잠금 해제 취소" +} \ No newline at end of file diff --git a/data/zonetool/localizedstrings/polish.json b/data/zonetool/localizedstrings/polish.json new file mode 100644 index 00000000..6494f440 --- /dev/null +++ b/data/zonetool/localizedstrings/polish.json @@ -0,0 +1,25 @@ +{ + "LOCALE_0": "Angielski", + "LOCALE_1": "Francuski", + "LOCALE_2": "Niemiecki", + "LOCALE_3": "Włoski", + "LOCALE_4": "Hiszpański", + "LOCALE_5": "Rosyjski", + "LOCALE_6": "Polski", + "LOCALE_7": "Portugalski", + "LOCALE_8": "Japoński", + "LOCALE_9": "Japoński (częściowy)", + "LOCALE_10": "Chiński tradycyjny", + "LOCALE_11": "Chiński uproszczony", + "LOCALE_12": "Arabski", + "LOCALE_13": "Czeski", + "LOCALE_14": "Hiszpański (Iberoameryka)", + "LOCALE_15": "Koreański", + "LOCALE_16": "Angielski (cenzuralny)", + "LOCALE_17": "Rosyjski (częściowy)", + "LUA_MENU_FALLBACK_DISABLE": "Przywróć wbudowane czcionki", + "LUA_MENU_FALLBACK_ENABLE": "Aplikuj h2-mod czcionki", + + "LUA_MENU_CAMPAIGN_UNLOCKED_ALL_TITLE": "Odblokuj wszystkie misje", + "LUA_MENU_CANCEL_UNLOCK_CAPS": "Anuluj odblokowanie" +} \ No newline at end of file diff --git a/data/zonetool/localizedstrings/portuguese.json b/data/zonetool/localizedstrings/portuguese.json new file mode 100644 index 00000000..295e150e --- /dev/null +++ b/data/zonetool/localizedstrings/portuguese.json @@ -0,0 +1,25 @@ +{ + "LOCALE_0": "Inglês", + "LOCALE_1": "Français", + "LOCALE_2": "Alemão", + "LOCALE_3": "Italiano", + "LOCALE_4": "Español", + "LOCALE_5": "Russo", + "LOCALE_6": "Polonês", + "LOCALE_7": "Português", + "LOCALE_8": "Japonês", + "LOCALE_9": "Japonês (Parcial)", + "LOCALE_10": "Chinês tradicional", + "LOCALE_11": "Chinês simplificado", + "LOCALE_12": "Árabe", + "LOCALE_13": "Checo", + "LOCALE_14": "Español (América Latina)", + "LOCALE_15": "Coreano", + "LOCALE_16": "Inglês (Censurado)", + "LOCALE_17": "Russo (Parcial)", + "LUA_MENU_FALLBACK_DISABLE": "Repor fontes predefinidas", + "LUA_MENU_FALLBACK_ENABLE": "Usar fontes do h2-mod", + + "LUA_MENU_CAMPAIGN_UNLOCKED_ALL_TITLE": "Desbloquear todas as missões", + "LUA_MENU_CANCEL_UNLOCK_CAPS": "Cancelar desbloqueio" +} \ No newline at end of file diff --git a/data/zonetool/localizedstrings/russian.json b/data/zonetool/localizedstrings/russian.json new file mode 100644 index 00000000..8107342e --- /dev/null +++ b/data/zonetool/localizedstrings/russian.json @@ -0,0 +1,435 @@ +{ + "LOCALE_0": "Английский", + "LOCALE_1": "Французский", + "LOCALE_2": "Немецкий", + "LOCALE_3": "Итальянский", + "LOCALE_4": "Испанский", + "LOCALE_5": "Русский", + "LOCALE_6": "Польский", + "LOCALE_7": "Португальский", + "LOCALE_8": "Японский", + "LOCALE_9": "Японский (английская озвучка)", + "LOCALE_10": "Китайский традиционный", + "LOCALE_11": "Китайский упрощенный", + "LOCALE_12": "Арабский", + "LOCALE_13": "Чешский", + "LOCALE_14": "Испанский (Латинская Америка)", + "LOCALE_15": "Корейский", + "LOCALE_16": "Английский цензурный", + "LOCALE_17": "Русский (английская озвучка)", + "LUA_MENU_FALLBACK_DISABLE": "Вернуться к встроенным шрифтам", + "LUA_MENU_FALLBACK_ENABLE": "Применить шрифты от h2-mod", + + "UPDATER_POPUP_NO_UPDATES_AVAILABLE": "У вас установлены все последние обновления", + "MENU_CCS_NEW_PATCH_NOTICE": "Доступно обновление клиента игры,\nначать установку сейчас?", + "UPDATER_POPUP_SUCCESSFUL": "Обновление завершено", + "MENU_CCS_RESTART_CONFIRMATION_TEXT": "Для применения изменений необходим перезапуск игры", + "UPDATER_POPUP_CHECKING_FOR_UPDATES": "Проверка наличия обновлений...", + + "LUA_MENU_CAMPAIGN_UNLOCKED_ALL_TITLE": "Открыть все задания и чит-коды", + "LUA_MENU_CANCEL_UNLOCK_CAPS": "Вернуться к своему прогрессу прохождения", + + "MENU_MODS": "Моды", + "MENU_MODS_DESC": "Запуск установленных модов.", + "LUA_MENU_MOD_DESC_DEFAULT": "Запустить &&1.", + "LUA_MENU_MOD_DESC": "&&1\nАвтор: &&2\nВерсия: &&3.", + "LUA_MENU_LOADED_MOD": "Запущенный мод: ^3&&1", + "LUA_MENU_AVAILABLE_MODS": "Доступные моды", + "LUA_MENU_UNLOAD": "Выгрузить", + "LUA_MENU_UNLOAD_DESC": "Выгрузить из игры запущенный сейчас мод.", + "LUA_MENU_WORKSHOP": "Мастерская", + "LUA_MENU_WORKSHOP_DESC": "Скачивание и установка модов.", + + "MENU_GENERAL": "H2-MOD", + "MENU_GENERAL_DESC": "Настройка параметров от H2-Mod.", + "LUA_MENU_AUTO_UPDATE": "Автообновления", + "LUA_MENU_AUTO_UPDATE_DESC": "Включить или отключить автоматическое обновление клиента при запуске игры.", + "LUA_MENU_CHECK_UPDATES": "Проверить сейчас", + "LUA_MENU_CHECK_UPDATES_DESC": "Проверка наличия обновлений.", + "LUA_MENU_DRAWING": "Интерфейс (HUD)", + "LUA_MENU_UPDATES": "Обновления", + "LUA_MENU_RENDERING": "Отрисовка", + "LUA_MENU_DRAW_FPS": "Счетчик кадров", + "LUA_MENU_DRAW_FPS_DESC": "Включить или отключить показ на экране частоты кадров в секунду (FPS) или View Pos.", + "LUA_MENU_FPS_ONLY": "Только FPS", + "LUA_MENU_FPS_AND_VIEWPOS": "FPS и View Pos", + "LUA_MENU_DRAW_SPEED": "Выводить спидометр", + "LUA_MENU_DRAW_SPEED_DESC": "Включить или отключить показ на экране скорости игрока.", + "LUA_MENU_DRAW_SPEEDGRAPH": "Выводить график скорости", + "LUA_MENU_DRAW_SPEEDGRAPH_DESC": "Включить или отключить график скорости.", + "LUA_MENU_R_FULLBRIGHT": "«Fullbright»-хак", + "LUA_MENU_R_FULLBRIGHT_DESC": "Изменить режим работы fullbright. Отключает освещение в игре.", + "LUA_MENU_MODE2": "Без динамического освещения", + "LUA_MENU_MODE3": "Отладочный шейдер", + "LUA_MENU_INTRO": "Заставка", + "LUA_MENU_INTRO_DESC": "Показывать или пропускать вступительный ролик с логотипами разработчиков при запуске игры.", + + "MENU_SYSINFO_CUSTOMER_SUPPORT_LINK": "Страница на GitHub:", + "MENU_SYSINFO_CUSTOMER_SUPPORT_URL": "https://github.com/fedddddd/h2-mod", + "MENU_SYSINFO_DONATION_LINK": "Ссылка для донатов:", + "MENU_SYSINFO_DONATION_URL": "https://paypal.me/fedecek", + + "AF_CAVES_LINE1": "„Как в прежние времена“", + "AF_CAVES_LINE3": "«Соуп» Мактавиш", + "AF_CAVES_LINE4": "Точка „Хоутел-Браво“, Афганистан", + "AF_CHASE_INTROSCREEN_LINE1": "„Финальный аккорд“", + "AF_CHASE_INTROSCREEN_LINE3": "«Соуп» Мактавиш", + "AF_CHASE_INTROSCREEN_LINE4": "Точка „Хоутел-Браво“, Афганистан", + "AF_CHASE_PURSUE": "Не дайте Шепарду уйти.", + "AIRPORT_LINE1": "„Ни слова по-русски“", + "AIRPORT_LINE4": "Международный аэропорт имени Захаева", + "ARCADIA_INTROSCREEN_LINE_1": "„Исход“", + "ARCADIA_INTROSCREEN_LINE_4": "1-й батальон 75-го полка рейнджеров", + "ARCADIA_INTROSCREEN_LINE_5": "Северная Вирджиния, США", + "BONEYARD_INTROSCREEN_LINE_1": "„Враг моего врага“", + "BONEYARD_INTROSCREEN_LINE_3": "Капитан «Соуп» Мактавиш", + "BONEYARD_INTROSCREEN_LINE_4": "257 км к юго-востоку от Кандагара, Афганистан", + "BONEYARD_INTROSCREEN_LINE_5": "Свалка самолетов армии США №437", + "CGAME_CONTINUE_SAVING": "Сохранить и выйти", + "CGAME_MISSIONOBJECTIVES": "ЦЕЛИ ЗАДАНИЯ", + "CGAME_PRONE_BLOCKED": "Движение лежа заблокировано", + "CGAME_PRONE_BLOCKED_WEAPON": "С этим оружием нельзя лечь", + "CGAME_RESTART_WARNING": "Если начать игру заново, \nвесь прогресс в текущем \nзадании будет утрачен\n\nНачать заново?", + "CGAME_SAVE_WARNING": "Если вы сохраните игру сейчас,\nвесь прогресс с момента последней\nконтрольной точки будет утрачен\n\nСохранить игру?", + "CHAR_MUSEUM_LINE1": "„Вечер с Infinity Ward“", + "CHAR_MUSEUM_LINE3": "Экспонаты выставки Modern Warfare 2", + "CHAR_MUSEUM_LINE4": "Энсино, штат Калифорния, США", + "CLIFFHANGER_LINE1": "„Скалолаз“", + "CLIFFHANGER_LINE3": "Сержант Гари «Роуч» Сандерсон", + "CONTINGENCY_LINE1": "„Досадная случайность“", + "CONTINGENCY_LINE3": "Сержант Гари «Роуч» Сандерсон", + "CONTINGENCY_LINE5": "23 км на юго-юго-восток от Петропавловска, Россия", + "CREDITS_UI_DEVELOPED_BY": "Разработано в Infinity Ward", + "CREDITS_UI_REMASTERED_BY": "Обновлено в Beenox", + "DCBURNING_INTROSCREEN_1": "„По доброй воле“", + "DCBURNING_INTROSCREEN_4": "1-й батальон 75-го полка рейнджеров", + "DCBURNING_INTROSCREEN_5": "Вашингтон (округ Колумбия), США", + "DCEMP_INTROSCREEN_1": "„Второе солнце“", + "DCEMP_INTROSCREEN_4": "1-й батальон 75-го полка рейнджеров", + "DCEMP_INTROSCREEN_5": "Вашингтон (округ Колумбия), США", + "DC_WHITEHOUSE_INTROSCREEN_1": "„Виски-Хоутел“", + "DC_WHITEHOUSE_INTROSCREEN_4": "1-й батальон 75-го полка рейнджеров", + "DC_WHITEHOUSE_INTROSCREEN_5": "Вашингтон (округ Колумбия), США", + "DEADQUOTE_ALL_THAT_IS_NECESSARY": "\"Когда плохие люди объединяются, хорошие тоже должны действовать сообща,\nиначе все они падут жертвами этой безнадежной борьбы\".", + "DEADQUOTE_ALL_THAT_IS_NECESSARY_AUTHOR": "- Эдмунд Бёрк, британский философ и государственный деятель", + "DEADQUOTE_ALL_WARFARE_IS_BASED": "\"Война – это искусство обмана\".", + "DEADQUOTE_BEFORE_YOU_EMBARK_UPON": "\"Проклиная кого-то, ты сам роешь себе могилу\".", + "DEADQUOTE_BEFORE_YOU_EMBARK_UPON_AUTHOR": "- японская пословица", + "DEADQUOTE_DO_NOTHING": "\"Нет сильнее тех двух воинов, Терпение и Время; те всё сделают\".", + "DEADQUOTE_DO_NOTHING_AUTHOR": "- Лев Толстой, Война и мир", + "DEADQUOTE_GOD_TAKES_SIDES": "\"Бог не на стороне больших батальонов,\nа на стороне лучших стрелков\".", + "DEADQUOTE_GOD_TAKES_SIDES_AUTHOR": "- Вольтер", + "DEADQUOTE_IN_WAR_TRUTH_IS_THE_FIRST_AUTHOR": "- неизвестный автор", + "DEADQUOTE_IT_WOULD_BE_NAIVE_TO_AUTHOR": "- Михаил Горбачёв", + "DEADQUOTE_I_KNOW_NOT_WITH_WHAT": "\"Не знаю, каким оружием будут сражаться в Третьей Мировой войне, но в Четвёртой в ход пойдут палки и камни\".", + "DEADQUOTE_I_THINK_THAT_TECHNOLOGIES": "\"Я считаю, что технологии не имеют моральной ценности, пока мы не начинаем их применять. Только когда мы используем их на благо или зло, они становятся благими или злыми\".", + "DEADQUOTE_LIVE_WELL_IT_IS_THE_GREATEST": "\"Хорошо жить – лучшая месть\".", + "DEADQUOTE_LIVE_WELL_IT_IS_THE_GREATEST_AUTHOR": "- из сборника пословиц,\nсобранных Джоржем Хербертом", + "DEADQUOTE_NATION_GREAT_DISTINCT": "\"В государстве, где настойчиво проводят черту\nмежду воюющим и мыслящим человеком, воевать будут глупцы, а думать - трусы\".", + "DEADQUOTE_NATION_GREAT_DISTINCT_AUTHOR": "- сэр Уильям Батлер, офицер британской армии", + "DEADQUOTE_NEARLY_ALL_MEN_CAN_STAND": "\"Если хотите узнать, каков человек на самом деле, дайте ему власть.\nЛюбой может вынести невзгоды, но не злоупотребить властью - только великий\".", + "DEADQUOTE_NEARLY_ALL_MEN_CAN_STAND_AUTHOR": "- Роберт Грин Ингерсолл", + "DEADQUOTE_NO_BATTLE_PLAN_SURVIVES_AUTHOR": "- Хельмут фон Мольтке", + "DEADQUOTE_PATRIOTISM_RUINS_HISTORY_AUTHOR": "- Гёте", + "DEADQUOTE_REVENGE_AT_FIRST_THOUGH_AUTHOR": "- Джон Мильтон, Потерянный рай", + "DEADQUOTE_REVENGE_IS_PROFITABLE": "\"Отмщение выгодно, а признательность убыточна\".", + "DEADQUOTE_ROUGH_MEN_READY": "\"Те, кто „отрекаются“ от насилия, могут делать это только потому, что другие творят насилие за них\".", + "DEADQUOTE_THE_END_OF_WAR_AUTHOR": "- Джордж Сантаяна", + "DEADQUOTE_THE_PRESS_IS_OUR_CHIEF_AUTHOR": "- Никита Хрущёв", + "DEADQUOTE_THE_WILL_TO_WIN": "\"Война такое несправедливое и дурное дело,\nчто те, кто воюют, стараются заглушить в себе голос совести\".", + "DEADQUOTE_THE_WILL_TO_WIN_AUTHOR": "- из дневника Льва Толстого", + "DEADQUOTE_THE_WORLD_WILL_NOT_ACCEPT_AUTHOR": "- Михаил Горбачёв", + "DEADQUOTE_TRY_TO_LOOK_UNIMPORTANT": "\"Каждый хочет изменить человечество, но никто не задумывается о том, как изменить себя\"", + "DEADQUOTE_TRY_TO_LOOK_UNIMPORTANT_AUTHOR": "- Лев Толстой", + "DEADQUOTE_WAR_DOES_NOT_DETERMINE_AUTHOR": "- неизвестный автор", + "DEADQUOTE_WAR_IS_DELIGHTFUL_TO": "\"Война сладка для тех, кто никогда не пробовал её\".", + "DEADQUOTE_WAR_IS_DELIGHTFUL_TO_AUTHOR": "- Пиндар", + "DEADQUOTE_WE_KNOW_WHERE_THEY_ARE": "\"Мы знаем, где они [ОМП Ирака].\nОни находятся к востоку, западу, югу или северу от Тикрита и Багдада\".", + "DEADQUOTE_WE_KNOW_WHERE_THEY_ARE_AUTHOR": "- Дональд Рамсфелд,\nминистр обороны США в 2003 году", + "DEADQUOTE_WE_SLEEP_SAFELY_IN_OUR": "\"Чем больше государство, тем злее и жесточе его патриотизм,\nтем на большем количестве страданий зиждется его могущество\".", + "DEADQUOTE_WE_SLEEP_SAFELY_IN_OUR_AUTHOR": "- Лев Толстой", + "DEADQUOTE_WHETHER_YOU_LIKE_IT_OR_AUTHOR": "- Никита Хрущёв", + "DEADQUOTE_WORLD_WAR_IV": "\"Единственный способ выиграть следующую мировую войну – предотвратить её\".", + "DEADQUOTE_WORLD_WAR_IV_AUTHOR": "- Дуайт Дэвид Эйзенхауэр", + "ESTATE_DSM_DLRATE": "| &&1 Мбит/c", + "ESTATE_DSM_DLTIMELEFT_MINS": "&&1 мин", + "ESTATE_DSM_DLTIMELEFT_SECS": "&&1 с", + "ESTATE_INTROSCREEN_LINE_1": "„Неоконченные дела“", + "ESTATE_INTROSCREEN_LINE_3": "Сержант Гари «Роуч» Сандерсон", + "EXE_DISCONNECTED": "Соединение с сервером разорвано", + "EXE_ERR_BAD_GAME_FOLDER": "Указана неверная папка с игрой.", + "EXE_ERR_CORRECT_FOLDER": "Убедитесь, что игра запущена из правильной папки.", + "EXE_ERR_HUNK_ALLOC_FAILED": "Не удалось выделить &&1 Мб.", + "EXE_SHADERPRELOAD": "Подгрузка шейдеров... &&1%", + "EXE_YES": "Да", + "FAVELA_ESCAPE_INTROSCREEN_LINE_1": "„Осиное гнездо“", + "FAVELA_ESCAPE_INTROSCREEN_LINE_3": "Сержант Гари «Роуч» Сандерсон", + "FAVELA_ESCAPE_INTROSCREEN_LINE_5": "Рио-де-Жанейро, 518 м над уровнем моря", + "FAVELA_ESCAPE_OBJ_FOLLOW_SOAP": "Доберитесь с капитаном Мактавишем и отрядом до зоны посадки.", + "FAVELA_ESCAPE_OBJ_SUPPORT_SQUAD": "Оказывайте поддержку капитану Мактавишу и его отряду.", + "FAVELA_INTROSCREEN_LINE_1": "„Задержание“", + "FAVELA_INTROSCREEN_LINE_3": "Сержант Гари «Роуч» Сандерсон", + "GAME_CHEATSNOTENABLED": "Чит-коды недоступны на этом сервере.", + "GAME_CROUCH_BLOCKED": "Здесь нельзя пригнуться", + "GAME_OBJECTIVECOMPLETED": "Задача выполнена.", + "GAME_OBJECTIVEFAILED": "Цель не достигнута.", + "GAME_OBJECTIVESUPDATED": "Новая цель.", + "GULAG_INTROSCREEN_1": "„Колония“", + "GULAG_INTROSCREEN_3": "Сержант Гари «Роуч» Сандерсон", + "GULAG_INTROSCREEN_5": "64 км к востоку от Петропавловска, Россия", + "INVASION_LINE1": "„Росомахи!“", + "INVASION_LINE4": "1-й батальон 75-го полка рейнджеров", + "INVASION_LINE5": "Северная Вирджиния, США", + "KEY_COMMAND": "Command", + "KEY_ENTER": "Enter", + "KEY_ESCAPE": "Escape", + "KEY_KP_MINUS": "- (цифр.)", + "KEY_KP_PLUS": "+ (цифр.)", + "KEY_KP_STAR": "* (цифр.)", + "KEY_USE": "использовать", + "LUA_MENU_ADVANCED_VIDEO": "Параметры графики", + "LUA_MENU_AIM_ASSIST_LOCKON_DESC": "Поворот оружия в сторону цели во время движения.", + "LUA_MENU_AIM_ASSIST_SLOWDOWN_DESC": "Замедление движений прицела при наведении оружия на цель.", + "LUA_MENU_COLOR_BLIND_DESC": "Включение и отключение цветовой схемы для людей с пониженной чувствительностью к цвету.", + "LUA_MENU_COMPLETE": "ЗАВЕРШЕНО", + "LUA_MENU_DATE": "&&2.&&1.&&3", + "LUA_MENU_DAYS": "&&1 д", + "LUA_MENU_DAYS_HOURS_MINUTES_SECONDS": "&&1 д &&2 ч &&3 м &&4 с", + "LUA_MENU_DISPLAY_OPTIONS": "Интерфейс", + "LUA_MENU_END_GAME": "Выйти из боя", + "LUA_MENU_GAME_SETUP": "Параметры боя", + "LUA_MENU_GAME_SETUP_CAPS": "ПАРАМЕТРЫ БОЯ", + "LUA_MENU_GRAPHICS": "Изображение", + "LUA_MENU_GRAPHIC_OPTIONS": "Изображение", + "LUA_MENU_HEALTH_AND_DAMAGE": "Здоровье и урон", + "LUA_MENU_INTELS_CAMPAIGN": "Чтобы получить возможность использовать чит-коды, пройдите игру на любом уровне сложности.", + "LUA_MENU_INTELS_COLLECT": "Для получения доступа к чит-кодам собирайте фрагменты разведданных.", + "LUA_MENU_INTEL_CHEAT_UNAVAILABLE": "Данный чит-код недоступен в этом задании.", + "LUA_MENU_INTEL_SELECT_MESSAGE": "Включение и отключение чит-кодов, полученных благодаря сбору разведданных при выполнении заданий.", + "LUA_MENU_INTEL_SELECT_MESSAGE_NOTAVAILABLE": "Чит-коды недоступны в этом задании.", + "LUA_MENU_KILLCAM_FINAL_CAPS": "ПОСЛЕДНЕЕ УБИЙСТВО", + "LUA_MENU_LEAVE_GAME_TITLE": "ПОКИНУТЬ БОЙ?", + "LUA_MENU_MODE_WINDOWED_NO_BORDER": "В окне (без границ)", + "LUA_MENU_OPTIMAL_VIDEO_AUDIO": "Сбросить настройки изображения", + "LUA_MENU_OPTIONS_UPPER_CASE": "НАСТРОЙКИ", + "LUA_MENU_PLAY_TIME": "Всего наиграно", + "LUA_MENU_PUBLIC_SERVICE_ANNOUNCEMENT": "Это обновлённая версия кампании Call of Duty: Modern Warfare 2, вышедшей в 2009 году.\n\nВсе персонажи и события в игре вымышленные.", + "LUA_MENU_PUBLIC_SERVICE_ANNOUNCEMENT_TITLE": "Об игре", + "LUA_MENU_RECIPE_LOAD_CUSTOM": "Загрузить свою версию", + "LUA_MENU_RESTORE_EACH_SETTING": "Вернуть параметры управления к значениям по умолчанию?", + "LUA_MENU_ROTATION": "Несколько", + "LUA_MENU_VERSUS": "VS", + "LUA_MENU_VIDEO_OPTIONS": "Отображение", + "LUA_MENU_VIDEO_OPTIONS_CAPS": "ОТОБРАЖЕНИЕ", + "LUA_MENU_WEAPON_ATTRIBUTE_HEADER": "СВОЙСТВА", + "MENU_ADVANCED_VIDEO": "Параметры графики", + "MENU_AIM_DOWN_THE_SIGHT": "Прицелиться", + "MENU_APPLY_SETTINGS": "Применить новые значения?", + "MENU_AUTOAIM": "Автонаведение", + "MENU_BRIGHTNESS": "Яркость изображения", + "MENU_BUTTON_LAYOUT": "Раскладка кнопок", + "MENU_CAMPAIGN_ARCADE_CHEAT_UNLOCKED_DESC": "Вы получили доступ к ^3музею^7 и ^3чит-кодам^7.\n\n\nОсмотрите ^3экспонаты галереи^7, иллюстрирующие историю нашей игры, и разнообразьте игровой процесс с помощью потрясающих эффектов.\nМузей доступен из главного меню. Чит-коды можно активировать в главном меню или меню паузы.", + "MENU_CAMPAIGN_ARCADE_CHEAT_UNLOCKED_DESC2": "Музей доступен из главного меню. Чит-коды можно активировать в главном меню или меню паузы.", + "MENU_CAMPAIGN_ARCADE_CHEAT_UNLOCKED_DESC_GERMAN_SKU": "Вы получили доступ к чит-кодам игры.\n\nАктивировать их можно в главном меню или меню паузы.\n ", + "MENU_CCS_RESTART_BUTTON_LABEL": "Перезапустить", + "MENU_CHANGE_GAME_TYPE": "Изменить режим игры", + "MENU_CHANGE_RATE_OF_FIRE": "Изменить темп стрельбы", + "MENU_CHANGE_WEAPON": "Сменить оружие", + "MENU_CHEATS_HOWTO": "Чтобы получить доступ к чит-кодам, вам нужно полностью пройти игру как минимум один раз на любом уровне сложности.", + "MENU_CHEATS_WARNING": "При использовании чит-кодов вы не сможете открывать достижения.", + "MENU_CHEAT_ENABLED": "Чит-код активирован", + "MENU_CHEAT_EXCLUSION": "Включение этого параметра приведет к отключению следующих чит-кодов:", + "MENU_COMPLETED": "Пройдено", + "MENU_COMPLETED_CHEAT": "Доступен чит-код", + "MENU_CORRUPT_SAVEDATA_MESSAGE": "Сохраненные данные не были загружены, поскольку они повреждены. В случае продолжения они будут удалены.", + "MENU_CUSTOM": "Свои", + "MENU_DEFAULT_ALT": "Станд. перевернутая", + "MENU_DIFFICULTY_WARNING": "Вам рекомендуется другой уровень сложности. Хотите продолжить на этом?", + "MENU_DISPLAY_MODE": "Режим вывода", + "MENU_DOF": "Глубина резкости", + "MENU_EXTRA": "Ультра", + "MENU_FILL_MEMORY_TEXTURES": "Заполнить оставшуюся память", + "MENU_GAME_SETUP_CAPS": "ПАРАМЕТРЫ БОЯ", + "MENU_GRAPHICS": "Изображение", + "MENU_HIGH": "Высок.", + "MENU_INSANE": "Безумн.", + "MENU_INSPECT_WEAPON": "Осмотреть оружие", + "MENU_INTEL": "Чит-коды", + "MENU_LARGE": "Больш.", + "MENU_LAST_CHECKPOINT": "Посл. контрольная точка", + "MENU_LOCKED_INTEL_BUTTON": "разведданных", + "MENU_LOOK_INVERSION": "Инверсия обзора", + "MENU_LOWER_DIFFICULTY": "Понизить сложность", + "MENU_NORMAL_MAP_RESOLUTION": "Разрешение карт нормалей", + "MENU_NO_CONTROLLER_INITIAL": "У вас не подключен геймпад. Переключиться на схему управления клавиатурой и мышью?", + "MENU_OPTIONS": "Настройки", + "MENU_OPTIONS_UPPER_CASE": "НАСТРОЙКИ", + "MENU_QUIT": "Выйти", + "MENU_QUIT_TO_DESKTOP": "Выйти на рабочий стол", + "MENU_RESET_CHEATS": "Все чит-коды будут деактивированы.\nПродолжить?", + "MENU_RESET_SYSTEM_DEFAULTS": "Оптимальные настройки игры", + "MENU_RESTART_MISSION": "Начать уровень заново", + "MENU_RESTORE_DEFAULTS": "Системные настройки будут возвращены к значениям по умолчанию, продолжить?", + "MENU_RESTORE_EACH_SETTING": "Все параметры будут возвращены к значениям по умолчанию, продолжить?", + "MENU_RESUMEGAME_Q_DESC": "Хотите возобновить прохождение задания?", + "MENU_SAVEDATA_CORRUPTED": "Невозможно возобновить игру, т.к. поврежден файл сохранения. Пожалуйста, перезапустите уровень из меню выбора задания.", + "MENU_SAVEQUIT_TEXT": "Если выйти сейчас, весь прогресс с момента последней контрольной точки будет утрачен.", + "MENU_SCREENSHOT": "Скриншот", + "MENU_SPECULAR_MAP": "Карта бликов", + "MENU_SPECULAR_MAP_RESOLUTION": "Разрешение карт бликов", + "MENU_SPRINT_HOLD_BREATH": "Бег/Задержка дыхания", + "MENU_SP_69STAR_GRATZ": "Поздравляем! \nВы полностью прошли Спецоперации.", + "MENU_SP_AF_CAVES": "Как в прежние времена", + "MENU_SP_AF_CAVES_DESC": "Макаров выяснил, что генерал Шепард со своим штабом находится в точке \"Хоутел-Браво\". Найдите и убейте его.", + "MENU_SP_AF_CHASE": "Финальный аккорд", + "MENU_SP_CLIFFHANGER_DESC": "На территории России упал американский спутник. Найдите его и заберите модуль системы контроля, содержащий ключевую информацию об американской системе обороны.", + "MENU_SP_DCBURNING": "По доброй воле", + "MENU_SP_DCBURNING_DESC": "Армия США теряет позиции в Вашингтоне. Сдерживайте захватчиков, чтобы прикрыть эвакуацию войск у мемориала ветеранов Второй мировой войны.", + "MENU_SP_DESC_QUIT": "Закрыть приложение игры.", + "MENU_SP_FAVELA": "Задержание", + "MENU_SP_FOR_THE_RECORD": "„Для записи“", + "MENU_SP_GULAG_DESC": "Освободите заключённого №627 - единственного человека, которого Макаров ненавидит больше, чем американцев.", + "MENU_SP_INVASION_DESC": "Найдите и эвакуируйте важную персону под кодовым названием \"Рэптор\" из подбитого вертолета, пока рейнджеры отражают атаку радикальных националистов в Северной Вирджинии.", + "MENU_SP_OFFENSIVE_SKIP_2": "В игре есть задание, которое может задеть чувства некоторых игроков.\nНужна ли вам возможность пропустить его?", + "MENU_SP_OFFENSIVE_SKIP_4": "У вас будет возможность пропустить задание в меню паузы.", + "MENU_SP_OFFENSIVE_SKIP_NO_WONT_GET_OFFENDED": "Не нужна, это не заденет мои чувства", + "MENU_SP_OFFENSIVE_SKIP_YES_ASK_LATER": "Да, нужна, спросите позже", + "MENU_SP_OILRIG": "Единственный легкий день... был вчера", + "MENU_SP_OILRIG_DESC": "Проникните на захваченную буровую вышку. Освободите заложников и нейтрализуйте врага, чтобы американские войска смогли уничтожить ЗРК и расчистить путь к колонии.", + "MENU_SP_TRAINER_DESC": "Покажите бойцам местной армии, как надо воевать. И помните: за вами будет наблюдать генерал Шепард.", + "MENU_STANDARD_4_3": "Стандартное 4:3", + "MENU_TEXTURE_RESOLUTION": "Разрешение текстур", + "MENU_VIDEO": "Отображение", + "MENU_WARNING": "Внимание", + "MENU_WARNING_CHECKPOINT_RESET_TITLE": "Откат к началу задания", + "MENU_WIDE_16_10": "Широкое 16:10", + "MENU_WIDE_16_9": "Широкое 16:9", + "MENU_WIDE_21_9": "Сверхширокое 21:9", + "MENU_YES": "Да", + "OILRIG_HINT_C4_SWITCH": "Нажмите [{+actionslot 2}]^7, чтобы запустить детонатор C4", + "OILRIG_INTROSCREEN_LINE_1": "„Единственный легкий день... был вчера“", + "OILRIG_INTROSCREEN_LINE_2": "День 5 - [{FAKE_INTRO_TIME:05:47:10}]", + "OILRIG_INTROSCREEN_LINE_3": "Сержант Гари «Роуч» Сандерсон", + "OILRIG_INTROSCREEN_LINE_5": "Вихоревка-36, нефтяная платформа, Россия", + "PLATFORM_FOV": "Угол обзора (FOV)", + "PLATFORM_HOLD_TO_SKIP": "Удерживайте \u0001 для пропуска", + "PLATFORM_HOLD_TO_SKIP_KEYBOARD": "Удерживайте ^3ENTER^7 для пропуска\n", + "PLATFORM_LOW_AMMO_NO_RELOAD": "Мало боеприпасов", + "PLATFORM_LOW_AMMO_NO_RELOAD_CAPS": "МАЛО БОЕПРИПАСОВ", + "PLATFORM_MDAO": "Затенение методом MDAO", + "PLATFORM_OFFENSIVE_NO_PENALTY": "На статистике прохождения это никак не скажется.", + "PLATFORM_QUIT": "Выйти в главное меню", + "PLATFORM_SAVE_AND_QUIT": "Выйти в главное меню", + "PLATFORM_SSAO": "Затенение методом SSAO", + "PLATFORM_UI_ADAPTER": "Видеокарта", + "PLATFORM_UI_CACHED_SPOT_SHADOWS": "Кэшировать точечные тени", + "PLATFORM_UI_CACHED_SUN_SHADOWS": "Кэшировать тени от солнца", + "PLATFORM_UI_IMAGE_QUALITY": "Разрешение картинки", + "PLATFORM_UI_NATIVE_RENDER_RESOLUTION": "Отрисовка в родном разрешении", + "PLATFORM_UI_NATIVE_RENDER_RESOLUTION_OPTION": "Родное (&&1 x &&2)", + "PLATFORM_UI_POST_AA": "Постобработка", + "PLATFORM_UI_SHADER_PRELOAD_AFTER_CINEMATIC": "Во время роликов", + "PLATFORM_UI_VIDEO_ADAPTER": "Видеокарта", + "PLATFORM_YES": "Да", + "PRESENCE_SP_AF_CAVES": "Как в прежние времена", + "PRESENCE_SP_AF_CAVES_SYSTEM_DIALOG": "Как в прежние времена", + "PRESENCE_SP_AF_CHASE": "Финальный аккорд", + "PRESENCE_SP_AF_CHASE_SYSTEM_DIALOG": "Финальный аккорд", + "PRESENCE_SP_DCBURNING": "По доброй воле", + "PRESENCE_SP_DCBURNING_SYSTEM_DIALOG": "По доброй воле", + "PRESENCE_SP_ENDING": "Финальный аккорд", + "PRESENCE_SP_ENDING_SYSTEM_DIALOG": "Финальный аккорд", + "PRESENCE_SP_FAVELA": "Задержание", + "PRESENCE_SP_FAVELA_SYSTEM_DIALOG": "Задержание", + "PRESENCE_SP_OILRIG": "Единственный легкий день... был вчера", + "PRESENCE_SP_OILRIG_SYSTEM_DIALOG": "Единственный легкий день... был вчера", + "ROADKILL_LINE_1": "„Командный игрок“", + "ROADKILL_LINE_4": "1-й батальон 75-го полка рейнджеров", + "SCRIPT_INVULERABLE_FRAGS": "Осколочные гранаты не могут навредить этой технике", + "SCRIPT_MISSIONFAIL_HOSTAGEEXECUTED": "Задание провалено. Заложник убит.", + "SCRIPT_MISSIONFAIL_HOSTAGEEXECUTED_USEMULTIDOOR": "Задание провалено. Заложник убит.\nПопробуйте штурмовать через противоположные двери.", + "SCRIPT_MISSIONFAIL_KILLEDHOSTAGE": "Задание провалено. Вы убили заложника.", + "SCRIPT_MISSIONFAIL_KILLEDHOSTAGE_THROUGH_ENEMY": "Задание провалено. Вы убили заложника, прострелив врага насквозь.\nПули у некоторого оружия обладают большой проникающей способностью.", + "SCRIPT_PLATFORM_HINTSTR_PICKUPEXPLOSIVES": "Нажмите ^3&&1^7, чтобы поднять взрывчатку.", + "SCRIPT_PLATFORM_HINTSTR_PICKUPGRENADES": "Нажмите ^3&&1^7, чтобы поднять гранаты.", + "SCRIPT_PLATFORM_HINTSTR_PLANTEXPLOSIVES_KBM": "Нажмите ^3[{+activate}]^7, чтобы установить взрывчатку.", + "SCRIPT_PLATFORM_HINTSTR_TAKEEXPLOSIVES": "Нажмите ^3&&1^7, чтобы взять взрывчатку.", + "SCRIPT_PLATFORM_HINT_ADSKEY": "Нажмите^3 &&1^7, чтобы прицелиться", + "SCRIPT_PLATFORM_HINT_JUMPSTANDKEY": "Нажмите ^3&&1^7, находясь в положении стоя, чтобы подпрыгнуть.", + "SCRIPT_PLATFORM_HINT_LEANOUTWINDOW": "Нажмите клавишу использования ^3&&1^7, чтобы высунуться из окна", + "SCRIPT_PLATFORM_HINT_MELEEATTACK": "Нажмите ^3&&1^7, чтобы выполнить атаку ближнего боя", + "SCRIPT_PLATFORM_HINT_OBJECTIVEKEY": "^3&&1 ^7- просмотреть цели.", + "SCRIPT_PLATFORM_HINT_PICKUPWEAPONKEY": "Чтобы поднять оружие, смотрите на него и нажмите \"Использовать\" ^3&&1].", + "SCRIPT_PLATFORM_HINT_PRONEKEY": "Нажмите^3 &&1^7, чтобы лечь", + "SCRIPT_PLATFORM_HINT_RAISEFROMPRONETOCROUCH": "Нажмите^3 &&1^7, чтобы перейти из сидячего положения в лежачее", + "SCRIPT_PLATFORM_HINT_RELOAD": "Нажмите ^3&&1^7, чтобы перезарядить оружие.", + "SCRIPT_PLATFORM_LEARN_CHOPPER_AIR_SUPPORT2": "Нажмите^3 [{+attack}]^7, чтобы задать координаты атаки.", + "SCRIPT_PLATFORM_OILRIG_HINT_STEALTH_KILL": "Нажмите^3 [{+melee}]^7, чтобы снять часового.", + "SUBTITLE_AFCAVES_PRI_COMPROMISEDGOLOUD66": "^2Капитан Прайс: ^7Мы замечены, к бою.", + "SUBTITLE_AFCAVES_PRI_MOVEOUT24": "^2Капитан Прайс: ^7Выдвигаемся.", + "SUBTITLE_AIRPORT_MKV_FORZAKHAEV91": "^2Макаров: ^7За Захаева.", + "SUBTITLE_AIRPORT_MKV_HOLDFIRE94": "^2Макаров: ^7Не стрелять.", + "SUBTITLE_AIRPORT_MKV_THISWILL293": "^1Макаров: ^7Вот это - подарочек.", + "SUBTITLE_AIRPORT_VT_BEENOUGH291": "^2Анатолий: ^7Да, Макаров, хороший подарочек мы им преподнесли.", + "SUBTITLE_BYARD_MKV_HOTELBRAVO49": "^1Макаров: ^7Шепард держит точку „Хоутел-Браво“. Ты знаешь, где это. Ладно, встретимся в аду.", + "SUBTITLE_BYARD_PRI_CONTACTAHEAD102": "^2Капитан Прайс: ^7Контакт, прямо перед нами!", + "SUBTITLE_BYARD_PRI_FOUDNTRANSPORT81": "^2Капитан Прайс: ^7Соуп! Я нашел транспорт! Иди на запад! Я тебя подхвачу по дороге!", + "SUBTITLE_BYARD_PRI_LANDTHEPLANE62": "^2Капитан Прайс: ^7Заткнись уже и сажай самолет! Мы идем к тебе!", + "SUBTITLE_BYARD_PRI_MYFRIEND247": "^2Капитан Прайс: ^7Макаров... Ты слыхал такую пословицу: «враг моего врага - мой друг»?", + "SUBTITLE_BYARD_PRI_MYFRIEND46": "^2Капитан Прайс: ^7Макаров... Ты слыхал такую пословицу: «враг моего врага - мой друг»?", + "SUBTITLE_BYARD_PRI_WHEREAREYOU51": "^2Капитан Прайс: ^7Николай, ты где, черт подери?", + "SUBTITLE_DCWHITE_CPD_BURNITDOWN215": "^2Капрал Данн: ^7Нескоро, приятель. Но когда мы туда доберёмся, мы сожжём её до основания.", + "SUBTITLE_FAVELA_CMT_DRIVERSDEAD22": "^2Капитан Мактавиш: ^7Гоуст! Наш водитель убит! Идем пешком! Жди нас у гостиницы Рио и постарайся задержать объект!", + "TRAINER_INTROSCREEN_LINE_1": "„Курс молодого бойца“", + "TRAINER_INTROSCREEN_LINE_4": "1-й батальон 75-го полка рейнджеров", + "TRAINER_INTROSCREEN_LINE_5": "База огневой поддержки „Феникс“, Афганистан", + "WEAPON_AA12_FMJ": "AA-12 с ЦМ патронами", + "WEAPON_ANACONDA_TACTICAL": "\"Магнум\" .44 с тактическим ножом", + "WEAPON_ATTACHMENT_SHOTGUN": "ПОДСТВОЛЬНЫЙ ДРОБОВИК", + "WEAPON_ATTACHMENT_TACTICAL": "ТАКТИЧЕСКИЙ", + "WEAPON_AUG_FMJ": "AUG HBAR с ЦМ патронами", + "WEAPON_BENELLI_FMJ": "M1014 с ЦМ патронами", + "WEAPON_BERETTA_FMJ": "M9 с ЦМ патронами", + "WEAPON_COLT1911": "M1911 .45", + "WEAPON_COLT45": "M1911 .45", + "WEAPON_FAL_FMJ": "FAL с ЦМ патронами", + "WEAPON_FAMAS_FMJ": "FAMAS с ЦМ патронами", + "WEAPON_FN2000_FMJ": "F2000 с ЦМ патронами", + "WEAPON_GLOCK_FMJ": "G18 с ЦМ патронами", + "WEAPON_KRISS_ACOG_SILENCER": "\"Вектор\" с глушителем и прицелом ACOG", + "WEAPON_M16A4_GRENADIER": "M16A4 с гранатометом", + "WEAPON_M16_FMJ": "M16A4 с ЦМ патронами", + "WEAPON_M21_FMJ": "M21 EBR с ЦМ патронами", + "WEAPON_M240_FMJ": "M240 с ЦМ патронами", + "WEAPON_M4M203_SILENCER": "M4A1 SOPMOD", + "WEAPON_M4_CARBINE_FMJ": "M4A1 с ЦМ патронами", + "WEAPON_MASADA_FMJ": "ACR с ЦМ патронами", + "WEAPON_MASADA_GL_EOTECH": "ACR с гранатометом и голографическим прицелом", + "WEAPON_MODEL1887_BLING": "1887 класса люкс", + "WEAPON_MP5K_FMJ": "MP5K с ЦМ патронами", + "WEAPON_MP5_SILENCED_REDDOT": "MP5K с глушителем и коллиматорным прицелом", + "WEAPON_MP5_SILENCER": "MP5K с глушителем", + "WEAPON_P90_FMJ": "P90 с ЦМ патронами", + "WEAPON_PP2000_FMJ": "ПП2000 с ЦМ патронами", + "WEAPON_RPD_FMJ": "РПД с ЦМ патронами", + "WEAPON_SA80_ACOG": "L86 LSW с прицелом ACOG", + "WEAPON_SA80_FMJ": "L86 LSW с ЦМ патронами", + "WEAPON_SA80_GRIP": "L86 LSW с тактической рукоятью", + "WEAPON_SA80_SILENCER": "L86 LSW с глушителем", + "WEAPON_SAW_ACOG": "M249 с прицелом ACOG", + "WEAPON_SMGS": "Пистолеты-пулеметы", + "WEAPON_TAVOR_FMJ": "TAR-21 с ЦМ патронами", + "WEAPON_TMP_FMJ": "TMP с ЦМ патронами", + "WEAPON_UMP45_ACOG": "UMP45 с прицелом ACOG", + "WEAPON_UMP45_AKIMBO": "Парные UMP45", + "WEAPON_UMP45_BLING": "UMP45 класса люкс", + "WEAPON_UMP45_EOTECH": "UMP45 с голографическим прицелом", + "WEAPON_UMP45_FMJ": "UMP45 с ЦМ патронами", + "WEAPON_UMP45_HEARTBEAT": "UMP45 с датчиком сердцебиения", + "WEAPON_UMP45_REDDOT": "UMP45 с коллиматорным прицелом", + "WEAPON_UMP45_ROF": "Скорострельный UMP45", + "WEAPON_UMP45_SILENCER": "UMP45 с глушителем", + "WEAPON_UMP45_THERMAL": "UMP45 с тепловизором", + "WEAPON_UMP45_XMAGS": "UMP45 с магазином повышенной емкости", + "WEAPON_WA2000_FMJ": "WA2000 с ЦМ патронами" +} \ No newline at end of file diff --git a/data/zonetool/localizedstrings/russian_partial.json b/data/zonetool/localizedstrings/russian_partial.json new file mode 100644 index 00000000..4959cfc2 --- /dev/null +++ b/data/zonetool/localizedstrings/russian_partial.json @@ -0,0 +1,435 @@ +{ + "LOCALE_0": "Английский", + "LOCALE_1": "Французский", + "LOCALE_2": "Немецкий", + "LOCALE_3": "Итальянский", + "LOCALE_4": "Испанский", + "LOCALE_5": "Русский", + "LOCALE_6": "Польский", + "LOCALE_7": "Португальский", + "LOCALE_8": "Японский", + "LOCALE_9": "Японский (английская озвучка)", + "LOCALE_10": "Китайский традиционный", + "LOCALE_11": "Китайский упрощенный", + "LOCALE_12": "Арабский", + "LOCALE_13": "Чешский", + "LOCALE_14": "Испанский (Латинская Америка)", + "LOCALE_15": "Корейский", + "LOCALE_16": "Английский цензурный", + "LOCALE_17": "Русский (английская озвучка)", + "LUA_MENU_FALLBACK_DISABLE": "Вернуться к встроенным шрифтам", + "LUA_MENU_FALLBACK_ENABLE": "Применить шрифты от h2-mod", + + "UPDATER_POPUP_NO_UPDATES_AVAILABLE": "У вас установлены все последние обновления", + "MENU_CCS_NEW_PATCH_NOTICE": "Доступно обновление клиента игры,\nначать установку сейчас?", + "UPDATER_POPUP_SUCCESSFUL": "Обновление завершено", + "MENU_CCS_RESTART_CONFIRMATION_TEXT": "Для применения изменений необходим перезапуск игры", + "UPDATER_POPUP_CHECKING_FOR_UPDATES": "Проверка наличия обновлений...", + + "LUA_MENU_CAMPAIGN_UNLOCKED_ALL_TITLE": "Открыть все задания и чит-коды", + "LUA_MENU_CANCEL_UNLOCK_CAPS": "Вернуться к своему прогрессу прохождения", + + "MENU_MODS": "Моды", + "MENU_MODS_DESC": "Запуск установленных модов.", + "LUA_MENU_MOD_DESC_DEFAULT": "Запустить &&1.", + "LUA_MENU_MOD_DESC": "&&1\nАвтор: &&2\nВерсия: &&3.", + "LUA_MENU_LOADED_MOD": "Запущенный мод: ^3&&1", + "LUA_MENU_AVAILABLE_MODS": "Доступные моды", + "LUA_MENU_UNLOAD": "Выгрузить", + "LUA_MENU_UNLOAD_DESC": "Выгрузить из игры запущенный сейчас мод.", + "LUA_MENU_WORKSHOP": "Мастерская", + "LUA_MENU_WORKSHOP_DESC": "Скачивание и установка модов.", + + "MENU_GENERAL": "H2-MOD", + "MENU_GENERAL_DESC": "Настройка параметров от H2-Mod.", + "LUA_MENU_AUTO_UPDATE": "Автообновления", + "LUA_MENU_AUTO_UPDATE_DESC": "Включить или отключить автоматическое обновление клиента при запуске игры.", + "LUA_MENU_CHECK_UPDATES": "Проверить сейчас", + "LUA_MENU_CHECK_UPDATES_DESC": "Проверка наличия обновлений.", + "LUA_MENU_DRAWING": "Интерфейс (HUD)", + "LUA_MENU_UPDATES": "Обновления", + "LUA_MENU_RENDERING": "Отрисовка", + "LUA_MENU_DRAW_FPS": "Счетчик кадров", + "LUA_MENU_DRAW_FPS_DESC": "Включить или отключить показ на экране частоты кадров в секунду (FPS) или View Pos.", + "LUA_MENU_FPS_ONLY": "Только FPS", + "LUA_MENU_FPS_AND_VIEWPOS": "FPS и View Pos", + "LUA_MENU_DRAW_SPEED": "Выводить спидометр", + "LUA_MENU_DRAW_SPEED_DESC": "Включить или отключить показ на экране скорости игрока.", + "LUA_MENU_DRAW_SPEEDGRAPH": "Выводить график скорости", + "LUA_MENU_DRAW_SPEEDGRAPH_DESC": "Включить или отключить график скорости.", + "LUA_MENU_R_FULLBRIGHT": "«Fullbright»-хак", + "LUA_MENU_R_FULLBRIGHT_DESC": "Изменить режим работы fullbright. Отключает освещение в игре.", + "LUA_MENU_MODE2": "Без динамического освещения", + "LUA_MENU_MODE3": "Отладочный шейдер", + "LUA_MENU_INTRO": "Заставка", + "LUA_MENU_INTRO_DESC": "Показывать или пропускать вступительный ролик с логотипами разработчиков при запуске игры.", + + "MENU_SYSINFO_CUSTOMER_SUPPORT_LINK": "Страница на GitHub:", + "MENU_SYSINFO_CUSTOMER_SUPPORT_URL": "https://github.com/fedddddd/h2-mod", + "MENU_SYSINFO_DONATION_LINK": "Ссылка для донатов:", + "MENU_SYSINFO_DONATION_URL": "https://paypal.me/fedecek", + + "AF_CAVES_LINE1": "„Как в прежние времена“", + "AF_CAVES_LINE3": "«Соуп» Мактавиш", + "AF_CAVES_LINE4": "Точка „Хоутел-Браво“, Афганистан", + "AF_CHASE_INTROSCREEN_LINE1": "„Финальный аккорд“", + "AF_CHASE_INTROSCREEN_LINE3": "«Соуп» Мактавиш", + "AF_CHASE_INTROSCREEN_LINE4": "Точка „Хоутел-Браво“, Афганистан", + "AF_CHASE_PURSUE": "Не дайте Шепарду уйти.", + "AIRPORT_LINE1": "„Ни слова по-русски“", + "AIRPORT_LINE4": "Международный аэропорт имени Захаева", + "ARCADIA_INTROSCREEN_LINE_1": "„Исход“", + "ARCADIA_INTROSCREEN_LINE_4": "1-й батальон 75-го полка рейнджеров", + "ARCADIA_INTROSCREEN_LINE_5": "Северная Вирджиния, США", + "BONEYARD_INTROSCREEN_LINE_1": "„Враг моего врага“", + "BONEYARD_INTROSCREEN_LINE_3": "Капитан «Соуп» Мактавиш", + "BONEYARD_INTROSCREEN_LINE_4": "257 км к юго-востоку от Кандагара, Афганистан", + "BONEYARD_INTROSCREEN_LINE_5": "Свалка самолетов армии США №437", + "CGAME_CONTINUE_SAVING": "Сохранить и выйти", + "CGAME_MISSIONOBJECTIVES": "ЦЕЛИ ЗАДАНИЯ", + "CGAME_PRONE_BLOCKED": "Движение лежа заблокировано", + "CGAME_PRONE_BLOCKED_WEAPON": "С этим оружием нельзя лечь", + "CGAME_RESTART_WARNING": "Если начать игру заново, \nвесь прогресс в текущем \nзадании будет утрачен\n\nНачать заново?", + "CGAME_SAVE_WARNING": "Если вы сохраните игру сейчас,\nвесь прогресс с момента последней\nконтрольной точки будет утрачен\n\nСохранить игру?", + "CHAR_MUSEUM_LINE1": "„Вечер с Infinity Ward“", + "CHAR_MUSEUM_LINE3": "Экспонаты выставки Modern Warfare 2", + "CHAR_MUSEUM_LINE4": "Энсино, штат Калифорния, США", + "CLIFFHANGER_LINE1": "„Скалолаз“", + "CLIFFHANGER_LINE3": "Сержант Гари «Роуч» Сандерсон", + "CONTINGENCY_LINE1": "„Досадная случайность“", + "CONTINGENCY_LINE3": "Сержант Гари «Роуч» Сандерсон", + "CONTINGENCY_LINE5": "23 км на юго-юго-восток от Петропавловска, Россия", + "CREDITS_UI_DEVELOPED_BY": "Разработано в Infinity Ward", + "CREDITS_UI_REMASTERED_BY": "Обновлено в Beenox", + "DCBURNING_INTROSCREEN_1": "„По доброй воле“", + "DCBURNING_INTROSCREEN_4": "1-й батальон 75-го полка рейнджеров", + "DCBURNING_INTROSCREEN_5": "Вашингтон (округ Колумбия), США", + "DCEMP_INTROSCREEN_1": "„Второе солнце“", + "DCEMP_INTROSCREEN_4": "1-й батальон 75-го полка рейнджеров", + "DCEMP_INTROSCREEN_5": "Вашингтон (округ Колумбия), США", + "DC_WHITEHOUSE_INTROSCREEN_1": "„Виски-Хоутел“", + "DC_WHITEHOUSE_INTROSCREEN_4": "1-й батальон 75-го полка рейнджеров", + "DC_WHITEHOUSE_INTROSCREEN_5": "Вашингтон (округ Колумбия), США", + "DEADQUOTE_ALL_THAT_IS_NECESSARY_AUTHOR": "- Эдмунд Бёрк, британский философ и государственный деятель", + "DEADQUOTE_ALL_WARFARE_IS_BASED": "\"Война – это искусство обмана\".", + "DEADQUOTE_BEFORE_YOU_EMBARK_UPON": "\"Проклиная кого-то, ты сам роешь себе могилу\".", + "DEADQUOTE_BEFORE_YOU_EMBARK_UPON_AUTHOR": "- японская пословица", + "DEADQUOTE_DO_NOTHING": "\"Нет сильнее тех двух воинов, Терпение и Время; те всё сделают\".", + "DEADQUOTE_DO_NOTHING_AUTHOR": "- Лев Толстой, Война и мир", + "DEADQUOTE_GOD_TAKES_SIDES": "\"Бог не на стороне больших батальонов,\nа на стороне лучших стрелков\".", + "DEADQUOTE_GOD_TAKES_SIDES_AUTHOR": "- Вольтер", + "DEADQUOTE_IN_WAR_TRUTH_IS_THE_FIRST_AUTHOR": "- неизвестный автор", + "DEADQUOTE_IT_WOULD_BE_NAIVE_TO_AUTHOR": "- Михаил Горбачёв", + "DEADQUOTE_I_KNOW_NOT_WITH_WHAT": "\"Не знаю, каким оружием будут сражаться в Третьей Мировой войне, но в Четвёртой в ход пойдут палки и камни\".", + "DEADQUOTE_I_THINK_THAT_TECHNOLOGIES": "\"Я считаю, что технологии не имеют моральной ценности, пока мы не начинаем их применять. Только когда мы используем их на благо или зло, они становятся благими или злыми\".", + "DEADQUOTE_LIVE_WELL_IT_IS_THE_GREATEST": "\"Хорошо жить – лучшая месть\".", + "DEADQUOTE_LIVE_WELL_IT_IS_THE_GREATEST_AUTHOR": "- из сборника пословиц,\nсобранных Джоржем Хербертом", + "DEADQUOTE_NATION_GREAT_DISTINCT": "\"В государстве, где настойчиво проводят черту\nмежду воюющим и мыслящим человеком, воевать будут глупцы, а думать - трусы\".", + "DEADQUOTE_NATION_GREAT_DISTINCT_AUTHOR": "- сэр Уильям Батлер, офицер британской армии", + "DEADQUOTE_NEARLY_ALL_MEN_CAN_STAND": "\"Если хотите узнать, каков человек на самом деле, дайте ему власть.\nЛюбой может вынести невзгоды, но не злоупотребить властью - только великий\".", + "DEADQUOTE_NEARLY_ALL_MEN_CAN_STAND_AUTHOR": "- Роберт Грин Ингерсолл", + "DEADQUOTE_NO_BATTLE_PLAN_SURVIVES_AUTHOR": "- Хельмут фон Мольтке", + "DEADQUOTE_PATRIOTISM_RUINS_HISTORY_AUTHOR": "- Гёте", + "DEADQUOTE_REVENGE_AT_FIRST_THOUGH_AUTHOR": "- Джон Мильтон, Потерянный рай", + "DEADQUOTE_REVENGE_IS_PROFITABLE": "\"Отмщение выгодно, а признательность убыточна\".", + "DEADQUOTE_ROUGH_MEN_READY": "\"Те, кто „отрекаются“ от насилия, могут делать это только потому, что другие творят насилие за них\".", + "DEADQUOTE_THE_END_OF_WAR_AUTHOR": "- Джордж Сантаяна", + "DEADQUOTE_THE_PRESS_IS_OUR_CHIEF_AUTHOR": "- Никита Хрущёв", + "DEADQUOTE_THE_WILL_TO_WIN": "\"Война такое несправедливое и дурное дело,\nчто те, кто воюют, стараются заглушить в себе голос совести\".", + "DEADQUOTE_THE_WILL_TO_WIN_AUTHOR": "- из дневника Льва Толстого", + "DEADQUOTE_THE_WORLD_WILL_NOT_ACCEPT_AUTHOR": "- Михаил Горбачёв", + "DEADQUOTE_TRY_TO_LOOK_UNIMPORTANT": "\"Каждый хочет изменить человечество, но никто не задумывается о том, как изменить себя\"", + "DEADQUOTE_TRY_TO_LOOK_UNIMPORTANT_AUTHOR": "- Лев Толстой", + "DEADQUOTE_WAR_DOES_NOT_DETERMINE_AUTHOR": "- неизвестный автор", + "DEADQUOTE_WAR_IS_DELIGHTFUL_TO": "\"Война сладка для тех, кто никогда не пробовал её\".", + "DEADQUOTE_WAR_IS_DELIGHTFUL_TO_AUTHOR": "- Пиндар", + "DEADQUOTE_WE_KNOW_WHERE_THEY_ARE": "\"Мы знаем, где они [ОМП Ирака].\nОни находятся к востоку, западу, югу или северу от Тикрита и Багдада\".", + "DEADQUOTE_WE_KNOW_WHERE_THEY_ARE_AUTHOR": "- Дональд Рамсфелд,\nминистр обороны США в 2003 году", + "DEADQUOTE_WE_SLEEP_SAFELY_IN_OUR": "\"Чем больше государство, тем злее и жесточе его патриотизм,\nтем на большем количестве страданий зиждется его могущество\".", + "DEADQUOTE_WE_SLEEP_SAFELY_IN_OUR_AUTHOR": "- Лев Толстой", + "DEADQUOTE_WHETHER_YOU_LIKE_IT_OR_AUTHOR": "- Никита Хрущёв", + "DEADQUOTE_WORLD_WAR_IV": "\"Единственный способ выиграть следующую мировую войну – предотвратить её\".", + "DEADQUOTE_WORLD_WAR_IV_AUTHOR": "- Дуайт Дэвид Эйзенхауэр", + "ESTATE_DSM_DLRATE": "| &&1 Мбит/c", + "ESTATE_DSM_DLTIMELEFT_MINS": "&&1 мин", + "ESTATE_DSM_DLTIMELEFT_SECS": "&&1 с", + "ESTATE_INTROSCREEN_LINE_1": "„Неоконченные дела“", + "ESTATE_INTROSCREEN_LINE_3": "Сержант Гари «Роуч» Сандерсон", + "EXE_DISCONNECTED": "Соединение с сервером разорвано", + "EXE_ERR_BAD_GAME_FOLDER": "Указана неверная папка с игрой.", + "EXE_ERR_CORRECT_FOLDER": "Убедитесь, что игра запущена из правильной папки.", + "EXE_ERR_HUNK_ALLOC_FAILED": "Не удалось выделить &&1 Мб.", + "EXE_SHADERPRELOAD": "Подгрузка шейдеров... &&1%", + "EXE_YES": "Да", + "FAVELA_ESCAPE_INTROSCREEN_LINE_1": "„Осиное гнездо“", + "FAVELA_ESCAPE_INTROSCREEN_LINE_3": "Сержант Гари «Роуч» Сандерсон", + "FAVELA_ESCAPE_INTROSCREEN_LINE_5": "Рио-де-Жанейро, 518 м над уровнем моря", + "FAVELA_ESCAPE_OBJ_FOLLOW_SOAP": "Доберитесь с капитаном Мактавишем и отрядом до зоны посадки.", + "FAVELA_ESCAPE_OBJ_SUPPORT_SQUAD": "Оказывайте поддержку капитану Мактавишу и его отряду.", + "FAVELA_INTROSCREEN_LINE_1": "„Задержание“", + "FAVELA_INTROSCREEN_LINE_3": "Сержант Гари «Роуч» Сандерсон", + "GAME_CHEATSNOTENABLED": "Чит-коды недоступны на этом сервере.", + "GAME_CROUCH_BLOCKED": "Здесь нельзя пригнуться", + "GAME_OBJECTIVECOMPLETED": "Задача выполнена.", + "GAME_OBJECTIVEFAILED": "Цель не достигнута.", + "GAME_OBJECTIVESUPDATED": "Новая цель.", + "GULAG_INTROSCREEN_1": "„Колония“", + "GULAG_INTROSCREEN_3": "Сержант Гари «Роуч» Сандерсон", + "GULAG_INTROSCREEN_5": "64 км к востоку от Петропавловска, Россия", + "INVASION_LINE1": "„Росомахи!“", + "INVASION_LINE4": "1-й батальон 75-го полка рейнджеров", + "INVASION_LINE5": "Северная Вирджиния, США", + "KEY_COMMAND": "Command", + "KEY_ENTER": "Enter", + "KEY_ESCAPE": "Escape", + "KEY_KP_MINUS": "- (цифр.)", + "KEY_KP_PLUS": "+ (цифр.)", + "KEY_KP_STAR": "* (цифр.)", + "KEY_USE": "использовать", + "LUA_MENU_ADVANCED_VIDEO": "Параметры графики", + "LUA_MENU_AIM_ASSIST_LOCKON_DESC": "Поворот оружия в сторону цели во время движения.", + "LUA_MENU_AIM_ASSIST_SLOWDOWN_DESC": "Замедление движений прицела при наведении оружия на цель.", + "LUA_MENU_COLOR_BLIND_DESC": "Включение и отключение цветовой схемы для людей с пониженной чувствительностью к цвету.", + "LUA_MENU_COMPLETE": "ЗАВЕРШЕНО", + "LUA_MENU_DATE": "&&2.&&1.&&3", + "LUA_MENU_DAYS": "&&1 д", + "LUA_MENU_DAYS_HOURS_MINUTES_SECONDS": "&&1 д &&2 ч &&3 м &&4 с", + "LUA_MENU_DISPLAY_OPTIONS": "Интерфейс", + "LUA_MENU_END_GAME": "Выйти из боя", + "LUA_MENU_GAME_SETUP": "Параметры боя", + "LUA_MENU_GAME_SETUP_CAPS": "ПАРАМЕТРЫ БОЯ", + "LUA_MENU_GRAPHICS": "Изображение", + "LUA_MENU_GRAPHIC_OPTIONS": "Изображение", + "LUA_MENU_HEALTH_AND_DAMAGE": "Здоровье и урон", + "LUA_MENU_INTELS_CAMPAIGN": "Чтобы получить возможность использовать чит-коды, пройдите игру на любом уровне сложности.", + "LUA_MENU_INTELS_COLLECT": "Для получения доступа к чит-кодам собирайте фрагменты разведданных.", + "LUA_MENU_INTEL_CHEAT_UNAVAILABLE": "Данный чит-код недоступен в этом задании.", + "LUA_MENU_INTEL_SELECT_MESSAGE": "Включение и отключение чит-кодов, полученных благодаря сбору разведданных при выполнении заданий.", + "LUA_MENU_INTEL_SELECT_MESSAGE_NOTAVAILABLE": "Чит-коды недоступны в этом задании.", + "LUA_MENU_KILLCAM_FINAL_CAPS": "ПОСЛЕДНЕЕ УБИЙСТВО", + "LUA_MENU_LEAVE_GAME_TITLE": "ПОКИНУТЬ БОЙ?", + "LUA_MENU_MODE_WINDOWED_NO_BORDER": "В окне (без границ)", + "LUA_MENU_OPTIMAL_VIDEO_AUDIO": "Сбросить настройки изображения", + "LUA_MENU_OPTIONS_UPPER_CASE": "НАСТРОЙКИ", + "LUA_MENU_PLAY_TIME": "Всего наиграно", + "LUA_MENU_PUBLIC_SERVICE_ANNOUNCEMENT": "Это обновлённая версия кампании Call of Duty: Modern Warfare 2, вышедшей в 2009 году.\n\nВсе персонажи и события в игре вымышленные.", + "LUA_MENU_PUBLIC_SERVICE_ANNOUNCEMENT_TITLE": "Об игре", + "LUA_MENU_RECIPE_LOAD_CUSTOM": "Загрузить свою версию", + "LUA_MENU_RESTORE_EACH_SETTING": "Вернуть параметры управления к значениям по умолчанию?", + "LUA_MENU_ROTATION": "Несколько", + "LUA_MENU_VERSUS": "VS", + "LUA_MENU_VIDEO_OPTIONS": "Отображение", + "LUA_MENU_VIDEO_OPTIONS_CAPS": "ОТОБРАЖЕНИЕ", + "LUA_MENU_WEAPON_ATTRIBUTE_HEADER": "СВОЙСТВА", + "MENU_ADVANCED_VIDEO": "Параметры графики", + "MENU_AIM_DOWN_THE_SIGHT": "Прицелиться", + "MENU_APPLY_SETTINGS": "Применить новые значения?", + "MENU_AUTOAIM": "Автонаведение", + "MENU_BRIGHTNESS": "Яркость изображения", + "MENU_BUTTON_LAYOUT": "Раскладка кнопок", + "MENU_CAMPAIGN_ARCADE_CHEAT_UNLOCKED_DESC": "Вы получили доступ к ^3музею^7 и ^3чит-кодам^7.\n\n\nОсмотрите ^3экспонаты галереи^7, иллюстрирующие историю нашей игры, и разнообразьте игровой процесс с помощью потрясающих эффектов.\nМузей доступен из главного меню. Чит-коды можно активировать в главном меню или меню паузы.", + "MENU_CAMPAIGN_ARCADE_CHEAT_UNLOCKED_DESC2": "Музей доступен из главного меню. Чит-коды можно активировать в главном меню или меню паузы.", + "MENU_CAMPAIGN_ARCADE_CHEAT_UNLOCKED_DESC_GERMAN_SKU": "Вы получили доступ к чит-кодам игры.\n\nАктивировать их можно в главном меню или меню паузы.\n ", + "MENU_CCS_RESTART_BUTTON_LABEL": "Перезапустить", + "MENU_CHANGE_GAME_TYPE": "Изменить режим игры", + "MENU_CHANGE_RATE_OF_FIRE": "Изменить темп стрельбы", + "MENU_CHANGE_WEAPON": "Сменить оружие", + "MENU_CHEATS_HOWTO": "Чтобы получить доступ к чит-кодам, вам нужно полностью пройти игру как минимум один раз на любом уровне сложности.", + "MENU_CHEATS_WARNING": "При использовании чит-кодов вы не сможете открывать достижения.", + "MENU_CHEAT_ENABLED": "Чит-код активирован", + "MENU_CHEAT_EXCLUSION": "Включение этого параметра приведет к отключению следующих чит-кодов:", + "MENU_COMPLETED": "Пройдено", + "MENU_COMPLETED_CHEAT": "Доступен чит-код", + "MENU_CORRUPT_SAVEDATA_MESSAGE": "Сохраненные данные не были загружены, поскольку они повреждены. В случае продолжения они будут удалены.", + "MENU_CUSTOM": "Свои", + "MENU_DEFAULT_ALT": "Станд. перевернутая", + "MENU_DIFFICULTY_WARNING": "Вам рекомендуется другой уровень сложности. Хотите продолжить на этом?", + "MENU_DISPLAY_MODE": "Режим вывода", + "MENU_DOF": "Глубина резкости", + "MENU_EXTRA": "Ультра", + "MENU_FILL_MEMORY_TEXTURES": "Заполнить оставшуюся память", + "MENU_GAME_SETUP_CAPS": "ПАРАМЕТРЫ БОЯ", + "MENU_GRAPHICS": "Изображение", + "MENU_HIGH": "Высок.", + "MENU_INSANE": "Безумн.", + "MENU_INSPECT_WEAPON": "Осмотреть оружие", + "MENU_INTEL": "Чит-коды", + "MENU_LARGE": "Больш.", + "MENU_LAST_CHECKPOINT": "Посл. контрольная точка", + "MENU_LOCKED_INTEL_BUTTON": "разведданных", + "MENU_LOOK_INVERSION": "Инверсия обзора", + "MENU_LOWER_DIFFICULTY": "Понизить сложность", + "MENU_NORMAL_MAP_RESOLUTION": "Разрешение карт нормалей", + "MENU_NO_CONTROLLER_INITIAL": "У вас не подключен геймпад. Переключиться на схему управления клавиатурой и мышью?", + "MENU_OPTIONS": "Настройки", + "MENU_OPTIONS_UPPER_CASE": "НАСТРОЙКИ", + "MENU_QUIT": "Выйти", + "MENU_QUIT_TO_DESKTOP": "Выйти на рабочий стол", + "MENU_RESET_CHEATS": "Все чит-коды будут деактивированы.\nПродолжить?", + "MENU_RESET_SYSTEM_DEFAULTS": "Оптимальные настройки игры", + "MENU_RESTART_MISSION": "Начать уровень заново", + "MENU_RESTORE_DEFAULTS": "Системные настройки будут возвращены к значениям по умолчанию, продолжить?", + "MENU_RESTORE_EACH_SETTING": "Все параметры будут возвращены к значениям по умолчанию, продолжить?", + "MENU_RESUMEGAME_Q_DESC": "Хотите возобновить прохождение задания?", + "MENU_SAVEDATA_CORRUPTED": "Невозможно возобновить игру, т.к. поврежден файл сохранения. Пожалуйста, перезапустите уровень из меню выбора задания.", + "MENU_SAVEQUIT_TEXT": "Если выйти сейчас, весь прогресс с момента последней контрольной точки будет утрачен.", + "MENU_SCREENSHOT": "Скриншот", + "MENU_SPECULAR_MAP": "Карта бликов", + "MENU_SPECULAR_MAP_RESOLUTION": "Разрешение карт бликов", + "MENU_SPRINT_HOLD_BREATH": "Бег/Задержка дыхания", + "MENU_SP_69STAR_GRATZ": "Поздравляем! \nВы полностью прошли Спецоперации.", + "MENU_SP_AF_CAVES": "Как в прежние времена", + "MENU_SP_AF_CAVES_DESC": "Макаров выяснил, что генерал Шепард со своим штабом находится в точке \"Хоутел-Браво\". Найдите и убейте его.", + "MENU_SP_AF_CHASE": "Финальный аккорд", + "MENU_SP_CLIFFHANGER_DESC": "На территории России упал американский спутник. Найдите его и заберите модуль системы контроля, содержащий ключевую информацию об американской системе обороны.", + "MENU_SP_DCBURNING": "По доброй воле", + "MENU_SP_DCBURNING_DESC": "Армия США теряет позиции в Вашингтоне. Сдерживайте захватчиков, чтобы прикрыть эвакуацию войск у мемориала ветеранов Второй мировой войны.", + "MENU_SP_DESC_QUIT": "Закрыть приложение игры.", + "MENU_SP_FAVELA": "Задержание", + "MENU_SP_FOR_THE_RECORD": "„Для записи“", + "MENU_SP_GULAG_DESC": "Освободите заключённого №627 - единственного человека, которого Макаров ненавидит больше, чем американцев.", + "MENU_SP_INVASION_DESC": "Найдите и эвакуируйте важную персону под кодовым названием \"Рэптор\" из подбитого вертолета, пока рейнджеры отражают атаку радикальных националистов в Северной Вирджинии.", + "MENU_SP_OFFENSIVE_SKIP_2": "В игре есть задание, которое может задеть чувства некоторых игроков.\nНужна ли вам возможность пропустить его?", + "MENU_SP_OFFENSIVE_SKIP_4": "У вас будет возможность пропустить задание в меню паузы.", + "MENU_SP_OFFENSIVE_SKIP_NO_WONT_GET_OFFENDED": "Не нужна, это не заденет мои чувства", + "MENU_SP_OFFENSIVE_SKIP_YES_ASK_LATER": "Да, нужна, спросите позже", + "MENU_SP_OILRIG": "Единственный легкий день... был вчера", + "MENU_SP_OILRIG_DESC": "Проникните на захваченную буровую вышку. Освободите заложников и нейтрализуйте врага, чтобы американские войска смогли уничтожить ЗРК и расчистить путь к колонии.", + "MENU_SP_TRAINER_DESC": "Покажите бойцам местной армии, как надо воевать. И помните: за вами будет наблюдать генерал Шепард.", + "MENU_STANDARD_4_3": "Стандартное 4:3", + "MENU_TEXTURE_RESOLUTION": "Разрешение текстур", + "MENU_VIDEO": "Отображение", + "MENU_WARNING": "Внимание", + "MENU_WARNING_CHECKPOINT_RESET_TITLE": "Откат к началу задания", + "MENU_WIDE_16_10": "Широкое 16:10", + "MENU_WIDE_16_9": "Широкое 16:9", + "MENU_WIDE_21_9": "Сверхширокое 21:9", + "MENU_YES": "Да", + "OILRIG_HINT_C4_SWITCH": "Нажмите [{+actionslot 2}]^7, чтобы запустить детонатор C4", + "OILRIG_INTROSCREEN_LINE_1": "„Единственный легкий день... был вчера“", + "OILRIG_INTROSCREEN_LINE_2": "День 5 - [{FAKE_INTRO_TIME:05:47:10}]", + "OILRIG_INTROSCREEN_LINE_3": "Сержант Гари «Роуч» Сандерсон", + "OILRIG_INTROSCREEN_LINE_5": "Вихоревка-36, нефтяная платформа, Россия", + "PLATFORM_FOV": "Угол обзора (FOV)", + "PLATFORM_HOLD_TO_SKIP": "Удерживайте \u0001 для пропуска", + "PLATFORM_HOLD_TO_SKIP_KEYBOARD": "Удерживайте ^3ENTER^7 для пропуска\n", + "PLATFORM_LOW_AMMO_NO_RELOAD": "Мало боеприпасов", + "PLATFORM_LOW_AMMO_NO_RELOAD_CAPS": "МАЛО БОЕПРИПАСОВ", + "PLATFORM_MDAO": "Затенение методом MDAO", + "PLATFORM_OFFENSIVE_NO_PENALTY": "На статистике прохождения это никак не скажется.", + "PLATFORM_QUIT": "Выйти в главное меню", + "PLATFORM_SAVE_AND_QUIT": "Выйти в главное меню", + "PLATFORM_SSAO": "Затенение методом SSAO", + "PLATFORM_UI_ADAPTER": "Видеокарта", + "PLATFORM_UI_CACHED_SPOT_SHADOWS": "Кэшировать точечные тени", + "PLATFORM_UI_CACHED_SUN_SHADOWS": "Кэшировать тени от солнца", + "PLATFORM_UI_IMAGE_QUALITY": "Разрешение картинки", + "PLATFORM_UI_NATIVE_RENDER_RESOLUTION": "Отрисовка в родном разрешении", + "PLATFORM_UI_NATIVE_RENDER_RESOLUTION_OPTION": "Родное (&&1 x &&2)", + "PLATFORM_UI_POST_AA": "Постобработка", + "PLATFORM_UI_SHADER_PRELOAD_AFTER_CINEMATIC": "Во время роликов", + "PLATFORM_UI_VIDEO_ADAPTER": "Видеокарта", + "PLATFORM_YES": "Да", + "PRESENCE_SP_AF_CAVES": "Как в прежние времена", + "PRESENCE_SP_AF_CAVES_SYSTEM_DIALOG": "Как в прежние времена", + "PRESENCE_SP_AF_CHASE": "Финальный аккорд", + "PRESENCE_SP_AF_CHASE_SYSTEM_DIALOG": "Финальный аккорд", + "PRESENCE_SP_DCBURNING": "По доброй воле", + "PRESENCE_SP_DCBURNING_SYSTEM_DIALOG": "По доброй воле", + "PRESENCE_SP_ENDING": "Финальный аккорд", + "PRESENCE_SP_ENDING_SYSTEM_DIALOG": "Финальный аккорд", + "PRESENCE_SP_FAVELA": "Задержание", + "PRESENCE_SP_FAVELA_SYSTEM_DIALOG": "Задержание", + "PRESENCE_SP_OILRIG": "Единственный легкий день... был вчера", + "PRESENCE_SP_OILRIG_SYSTEM_DIALOG": "Единственный легкий день... был вчера", + "ROADKILL_LINE_1": "„Командный игрок“", + "ROADKILL_LINE_4": "1-й батальон 75-го полка рейнджеров", + "SCRIPT_INVULERABLE_FRAGS": "Осколочные гранаты не могут навредить этой технике", + "SCRIPT_MISSIONFAIL_HOSTAGEEXECUTED": "Задание провалено. Заложник убит.", + "SCRIPT_MISSIONFAIL_HOSTAGEEXECUTED_USEMULTIDOOR": "Задание провалено. Заложник убит.\nПопробуйте штурмовать через противоположные двери.", + "SCRIPT_MISSIONFAIL_KILLEDHOSTAGE": "Задание провалено. Вы убили заложника.", + "SCRIPT_MISSIONFAIL_KILLEDHOSTAGE_THROUGH_ENEMY": "Задание провалено. Вы убили заложника, прострелив врага насквозь.\nПули у некоторого оружия обладают большой проникающей способностью.", + "SCRIPT_PLATFORM_HINTSTR_PICKUPEXPLOSIVES": "Нажмите ^3&&1^7, чтобы поднять взрывчатку.", + "SCRIPT_PLATFORM_HINTSTR_PICKUPGRENADES": "Нажмите ^3&&1^7, чтобы поднять гранаты.", + "SCRIPT_PLATFORM_HINTSTR_PLANTEXPLOSIVES_KBM": "Нажмите ^3[{+activate}]^7, чтобы установить взрывчатку.", + "SCRIPT_PLATFORM_HINTSTR_TAKEEXPLOSIVES": "Нажмите ^3&&1^7, чтобы взять взрывчатку.", + "SCRIPT_PLATFORM_HINT_ADSKEY": "Нажмите^3 &&1^7, чтобы прицелиться", + "SCRIPT_PLATFORM_HINT_JUMPSTANDKEY": "Нажмите ^3&&1^7, находясь в положении стоя, чтобы подпрыгнуть.", + "SCRIPT_PLATFORM_HINT_LEANOUTWINDOW": "Нажмите клавишу использования ^3&&1^7, чтобы высунуться из окна", + "SCRIPT_PLATFORM_HINT_MELEEATTACK": "Нажмите ^3&&1^7, чтобы выполнить атаку ближнего боя", + "SCRIPT_PLATFORM_HINT_OBJECTIVEKEY": "^3&&1 ^7- просмотреть цели.", + "SCRIPT_PLATFORM_HINT_PICKUPWEAPONKEY": "Чтобы поднять оружие, смотрите на него и нажмите \"Использовать\" ^3&&1].", + "SCRIPT_PLATFORM_HINT_PRONEKEY": "Нажмите^3 &&1^7, чтобы лечь", + "SCRIPT_PLATFORM_HINT_RAISEFROMPRONETOCROUCH": "Нажмите^3 &&1^7, чтобы перейти из сидячего положения в лежачее", + "SCRIPT_PLATFORM_HINT_RELOAD": "Нажмите ^3&&1^7, чтобы перезарядить оружие.", + "SCRIPT_PLATFORM_LEARN_CHOPPER_AIR_SUPPORT2": "Нажмите^3 [{+attack}]^7, чтобы задать координаты атаки.", + "SCRIPT_PLATFORM_OILRIG_HINT_STEALTH_KILL": "Нажмите^3 [{+melee}]^7, чтобы снять часового.", + "SUBTITLE_AFCAVES_NKL_GOODLUCK23": "^2Николай: ^7Тогда желаю удачи, мой друг. С Богом.", + "SUBTITLE_AFCAVES_PRI_COMPROMISEDGOLOUD66": "^2Капитан Прайс: ^7Мы замечены, к бою.", + "SUBTITLE_AFCAVES_PRI_MOVEOUT24": "^2Капитан Прайс: ^7Выдвигаемся.", + "SUBTITLE_AIRPORT_MKV_FORZAKHAEV91": "^2Макаров: ^7За Захаева.", + "SUBTITLE_AIRPORT_MKV_HOLDFIRE94": "^2Макаров: ^7Не стрелять.", + "SUBTITLE_AIRPORT_MKV_THISWILL293": "^1Макаров: ^7Вот это - подарочек.", + "SUBTITLE_AIRPORT_VT_BEENOUGH291": "^2Анатолий: ^7Да, Макаров, хороший подарочек мы им преподнесли.", + "SUBTITLE_BYARD_MKV_HOTELBRAVO49": "^1Макаров: ^7Шепард держит точку „Хоутел-Браво“. Ты знаешь, где это. Ладно, встретимся в аду.", + "SUBTITLE_BYARD_PRI_CONTACTAHEAD102": "^2Капитан Прайс: ^7Контакт, прямо перед нами!", + "SUBTITLE_BYARD_PRI_FOUDNTRANSPORT81": "^2Капитан Прайс: ^7Соуп! Я нашел транспорт! Иди на запад! Я тебя подхвачу по дороге!", + "SUBTITLE_BYARD_PRI_LANDTHEPLANE62": "^2Капитан Прайс: ^7Заткнись уже и сажай самолет! Мы идем к тебе!", + "SUBTITLE_BYARD_PRI_MYFRIEND247": "^2Капитан Прайс: ^7Макаров... Ты слыхал такую пословицу: «враг моего врага - мой друг»?", + "SUBTITLE_BYARD_PRI_MYFRIEND46": "^2Капитан Прайс: ^7Макаров... Ты слыхал такую пословицу: «враг моего врага - мой друг»?", + "SUBTITLE_BYARD_PRI_WHEREAREYOU51": "^2Капитан Прайс: ^7Николай, ты где, черт подери?", + "SUBTITLE_DCWHITE_CPD_BURNITDOWN215": "^2Капрал Данн: ^7Нескоро, приятель. Но когда мы туда доберёмся, мы сожжём её до основания.", + "SUBTITLE_FAVELA_CMT_DRIVERSDEAD22": "^2Капитан Мактавиш: ^7Гоуст! Наш водитель убит! Идем пешком! Жди нас у гостиницы Рио и постарайся задержать объект!", + "TRAINER_INTROSCREEN_LINE_1": "„Курс молодого бойца“", + "TRAINER_INTROSCREEN_LINE_4": "1-й батальон 75-го полка рейнджеров", + "TRAINER_INTROSCREEN_LINE_5": "База огневой поддержки „Феникс“, Афганистан", + "WEAPON_AA12_FMJ": "AA-12 с ЦМ патронами", + "WEAPON_ANACONDA_TACTICAL": "\"Магнум\" .44 с тактическим ножом", + "WEAPON_ATTACHMENT_SHOTGUN": "ПОДСТВОЛЬНЫЙ ДРОБОВИК", + "WEAPON_ATTACHMENT_TACTICAL": "ТАКТИЧЕСКИЙ", + "WEAPON_AUG_FMJ": "AUG HBAR с ЦМ патронами", + "WEAPON_BENELLI_FMJ": "M1014 с ЦМ патронами", + "WEAPON_BERETTA_FMJ": "M9 с ЦМ патронами", + "WEAPON_COLT1911": "M1911 .45", + "WEAPON_COLT45": "M1911 .45", + "WEAPON_FAL_FMJ": "FAL с ЦМ патронами", + "WEAPON_FAMAS_FMJ": "FAMAS с ЦМ патронами", + "WEAPON_FN2000_FMJ": "F2000 с ЦМ патронами", + "WEAPON_GLOCK_FMJ": "G18 с ЦМ патронами", + "WEAPON_KRISS_ACOG_SILENCER": "\"Вектор\" с глушителем и прицелом ACOG", + "WEAPON_M16A4_GRENADIER": "M16A4 с гранатометом", + "WEAPON_M16_FMJ": "M16A4 с ЦМ патронами", + "WEAPON_M21_FMJ": "M21 EBR с ЦМ патронами", + "WEAPON_M240_FMJ": "M240 с ЦМ патронами", + "WEAPON_M4M203_SILENCER": "M4A1 SOPMOD", + "WEAPON_M4_CARBINE_FMJ": "M4A1 с ЦМ патронами", + "WEAPON_MASADA_FMJ": "ACR с ЦМ патронами", + "WEAPON_MASADA_GL_EOTECH": "ACR с гранатометом и голографическим прицелом", + "WEAPON_MODEL1887_BLING": "1887 класса люкс", + "WEAPON_MP5K_FMJ": "MP5K с ЦМ патронами", + "WEAPON_MP5_SILENCED_REDDOT": "MP5K с глушителем и коллиматорным прицелом", + "WEAPON_MP5_SILENCER": "MP5K с глушителем", + "WEAPON_P90_FMJ": "P90 с ЦМ патронами", + "WEAPON_PP2000_FMJ": "ПП2000 с ЦМ патронами", + "WEAPON_RPD_FMJ": "РПД с ЦМ патронами", + "WEAPON_SA80_ACOG": "L86 LSW с прицелом ACOG", + "WEAPON_SA80_FMJ": "L86 LSW с ЦМ патронами", + "WEAPON_SA80_GRIP": "L86 LSW с тактической рукоятью", + "WEAPON_SA80_SILENCER": "L86 LSW с глушителем", + "WEAPON_SAW_ACOG": "M249 с прицелом ACOG", + "WEAPON_SMGS": "Пистолеты-пулеметы", + "WEAPON_TAVOR_FMJ": "TAR-21 с ЦМ патронами", + "WEAPON_TMP_FMJ": "TMP с ЦМ патронами", + "WEAPON_UMP45_ACOG": "UMP45 с прицелом ACOG", + "WEAPON_UMP45_AKIMBO": "Парные UMP45", + "WEAPON_UMP45_BLING": "UMP45 класса люкс", + "WEAPON_UMP45_EOTECH": "UMP45 с голографическим прицелом", + "WEAPON_UMP45_FMJ": "UMP45 с ЦМ патронами", + "WEAPON_UMP45_HEARTBEAT": "UMP45 с датчиком сердцебиения", + "WEAPON_UMP45_REDDOT": "UMP45 с коллиматорным прицелом", + "WEAPON_UMP45_ROF": "Скорострельный UMP45", + "WEAPON_UMP45_SILENCER": "UMP45 с глушителем", + "WEAPON_UMP45_THERMAL": "UMP45 с тепловизором", + "WEAPON_UMP45_XMAGS": "UMP45 с магазином повышенной емкости", + "WEAPON_WA2000_FMJ": "WA2000 с ЦМ патронами" +} \ No newline at end of file diff --git a/data/zonetool/localizedstrings/simplified_chinese.json b/data/zonetool/localizedstrings/simplified_chinese.json new file mode 100644 index 00000000..da99654f --- /dev/null +++ b/data/zonetool/localizedstrings/simplified_chinese.json @@ -0,0 +1,25 @@ +{ + "LOCALE_0": "英语", + "LOCALE_1": "法语", + "LOCALE_2": "德语", + "LOCALE_3": "意大利语", + "LOCALE_4": "西班牙语", + "LOCALE_5": "俄语", + "LOCALE_6": "波兰语", + "LOCALE_7": "葡萄牙语", + "LOCALE_8": "日语", + "LOCALE_9": "日语(部分)", + "LOCALE_10": "繁体中文", + "LOCALE_11": "简体中文", + "LOCALE_12": "阿拉伯语", + "LOCALE_13": "捷克语", + "LOCALE_14": "西班牙语(拉丁美洲)", + "LOCALE_15": "韩语", + "LOCALE_16": "英语 (审查制度)", + "LOCALE_17": "俄语(拉丁美洲)", + "LUA_MENU_FALLBACK_DISABLE": "恢复为默认字体", + "LUA_MENU_FALLBACK_ENABLE": "使用 h2-mod 字体", + + "LUA_MENU_CAMPAIGN_UNLOCKED_ALL_TITLE": "解锁全部任务", + "LUA_MENU_CANCEL_UNLOCK_CAPS": "取消解锁" +} \ No newline at end of file diff --git a/data/zonetool/localizedstrings/spanish.json b/data/zonetool/localizedstrings/spanish.json new file mode 100644 index 00000000..abc9ecf8 --- /dev/null +++ b/data/zonetool/localizedstrings/spanish.json @@ -0,0 +1,25 @@ +{ + "LOCALE_0": "Inglés", + "LOCALE_1": "Français", + "LOCALE_2": "Alemán", + "LOCALE_3": "Italiano", + "LOCALE_4": "Español", + "LOCALE_5": "Ruso", + "LOCALE_6": "Polaco", + "LOCALE_7": "Portugués", + "LOCALE_8": "Japonés", + "LOCALE_9": "Japonés (parcial)", + "LOCALE_10": "Chino tradicional", + "LOCALE_11": "Chino simplificado", + "LOCALE_12": "Árabe", + "LOCALE_13": "Checo", + "LOCALE_14": "Español (América Latina)", + "LOCALE_15": "Coreano", + "LOCALE_16": "Inglés (censura)", + "LOCALE_17": "Ruso (parcial)", + "LUA_MENU_FALLBACK_DISABLE": "Restaurar tipografías predeterminadas", + "LUA_MENU_FALLBACK_ENABLE": "Usar tipografías de h2-mod", + + "LUA_MENU_CAMPAIGN_UNLOCKED_ALL_TITLE": "Desbloquear todas las misiones", + "LUA_MENU_CANCEL_UNLOCK_CAPS": "Cancelar desbloqueo" +} \ No newline at end of file diff --git a/data/zonetool/localizedstrings/spanishna.json b/data/zonetool/localizedstrings/spanishna.json new file mode 100644 index 00000000..abc9ecf8 --- /dev/null +++ b/data/zonetool/localizedstrings/spanishna.json @@ -0,0 +1,25 @@ +{ + "LOCALE_0": "Inglés", + "LOCALE_1": "Français", + "LOCALE_2": "Alemán", + "LOCALE_3": "Italiano", + "LOCALE_4": "Español", + "LOCALE_5": "Ruso", + "LOCALE_6": "Polaco", + "LOCALE_7": "Portugués", + "LOCALE_8": "Japonés", + "LOCALE_9": "Japonés (parcial)", + "LOCALE_10": "Chino tradicional", + "LOCALE_11": "Chino simplificado", + "LOCALE_12": "Árabe", + "LOCALE_13": "Checo", + "LOCALE_14": "Español (América Latina)", + "LOCALE_15": "Coreano", + "LOCALE_16": "Inglés (censura)", + "LOCALE_17": "Ruso (parcial)", + "LUA_MENU_FALLBACK_DISABLE": "Restaurar tipografías predeterminadas", + "LUA_MENU_FALLBACK_ENABLE": "Usar tipografías de h2-mod", + + "LUA_MENU_CAMPAIGN_UNLOCKED_ALL_TITLE": "Desbloquear todas las misiones", + "LUA_MENU_CANCEL_UNLOCK_CAPS": "Cancelar desbloqueo" +} \ No newline at end of file diff --git a/data/zonetool/localizedstrings/traditional_chinese.json b/data/zonetool/localizedstrings/traditional_chinese.json new file mode 100644 index 00000000..abad4b8c --- /dev/null +++ b/data/zonetool/localizedstrings/traditional_chinese.json @@ -0,0 +1,25 @@ +{ + "LOCALE_0": "英文", + "LOCALE_1": "法文", + "LOCALE_2": "德文", + "LOCALE_3": "義大利文", + "LOCALE_4": "西班牙文", + "LOCALE_5": "俄文", + "LOCALE_6": "波蘭文", + "LOCALE_7": "葡萄牙文", + "LOCALE_8": "日文", + "LOCALE_9": "日文(部份)", + "LOCALE_10": "繁體中文", + "LOCALE_11": "簡體中文", + "LOCALE_12": "阿拉伯文", + "LOCALE_13": "捷克文", + "LOCALE_14": "西班牙文(洛杉磯)", + "LOCALE_15": "韓文", + "LOCALE_16": "英文 (審查制度)", + "LOCALE_17": "俄文(部份)", + "LUA_MENU_FALLBACK_DISABLE": "還原為預設字型", + "LUA_MENU_FALLBACK_ENABLE": "使用 h2-mod 字型", + + "LUA_MENU_CAMPAIGN_UNLOCKED_ALL_TITLE": "解鎖所有任務", + "LUA_MENU_CANCEL_UNLOCK_CAPS": "取消解鎖" +} \ No newline at end of file diff --git a/data/zonetool/rup_h2_mod_common/video/subtitles.csv b/data/zonetool/rup_h2_mod_common/video/subtitles.csv new file mode 100644 index 00000000..e27b9880 --- /dev/null +++ b/data/zonetool/rup_h2_mod_common/video/subtitles.csv @@ -0,0 +1,460 @@ +af_caves_load,1.7,6.8,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141", +af_caves_load,8,11.3,"^5САМЫЕ РАЗЫСКИВАЕМЫЕ ЛИЦА", +af_caves_load,11.3,14,"^5САМЫЕ РАЗЫСКИВАЕМЫЕ ЛИЦА\nДЖОН ПРАЙС «СОУП» МАКТАВИШ", +af_caves_load,14,15.5,"^5САМЫЕ РАЗЫСКИВАЕМЫЕ ЛИЦА\nДЖОН ПРАЙС «СОУП» МАКТАВИШ\n^2Мактавиш: ^7У нас всего один пулемет. У них – тысяча.", +af_caves_load,15.5,17.5,"\n\n^2Мактавиш: ^7У нас всего один пулемет. У них – тысяча.", +af_caves_load,18,21,"^2Мактавиш: ^7Мы даже не знаем, не солгал ли Макаров.", +af_caves_load,21.3,22.3,^2Мактавиш: ^7Прайс., +af_caves_load,23.3,24.3,^2Мактавиш: ^7…Прайс?, +af_caves_load,25,30.2,"^2Прайс: ^7Нормальный человек не просыпается с мыслью о том, что сегодня – последний день его жизни.", +af_caves_load,30.5,33.6,"^2Прайс: ^7Но я считаю, это роскошь. Не проклятие. ", +af_caves_load,33.6,36.7,"^2Прайс: ^7Знание, что конец близок, даёт свободу. ", +af_caves_load,37.5,40,"^2Прайс: ^7Самое время… свести счёты.", +af_caves_load,41,46,^2Прайс: ^7Враг силён. Нас мало. Мы на пределе. Идём на верную смерть. , +af_caves_load,46,50,"^2Прайс: ^7Но камни и песок, за тысячи лет войны впитавшие столько крови…", +af_caves_load,51.2,54,^2Прайс: ^7Они будут помнить нас. За это., +af_caves_load,54.5,60,"^2Прайс: ^7Потому что мы сами выбрали свой путь. И, поверь, этот путь страшнее любого кошмара.", +af_caves_load,60.5,63.4,^2Прайс: ^7У нас нет другого выхода., +af_caves_load,64,66.7,^2Прайс: ^7Мы должны это сделать., +af_caves_load,67.8,70,^2Прайс: ^7Мы. Его., +af_caves_load,70,72,"^2Прайс: ^7Мы. Его.\nУничтожим." +af_chase_load,16.3,18,^2Прайс: ^7Говорю для записи., +af_chase_load,18.3,21,^2Прайс: ^7Историю пишет победитель., +af_chase_load,22,24,^2Прайс: ^7В истории много лжи. , +af_chase_load,25,30,"^2Прайс: ^7Если мы проиграем, его правда станет истиной,", +af_chase_load,30,32,"^2Прайс: ^7Если мы проиграем, его правда станет истиной,\nа нашу забудут.", +af_chase_load,32,39,"^2Прайс: ^7Шепард станет героем. Ведь чтобы изменить мир, нужна красивая ложь и море крови.", +af_chase_load,40,45,^2Прайс: ^7Он собирается совершить самый большой обман в истории человечества., +af_chase_load,45.7,48,^2Прайс: ^7Его правда станет истиной., +af_chase_load,48,52.2,"^2Прайс: ^7Но только, если он выживет, а мы умрем.", +airport_load,1.7,2.8,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141", +airport_load,2.8,6.4,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141\nСЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН", +airport_load,6.4,6.6,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141", +airport_load,7.5,11,"\n\n^2Шепард: ^7Группа 141 захватила систему автоматического контроля, Аллен.", +airport_load,12,13,"\n\n^2Шепард: ^7Два бойца вынесли целую базу. Твоя задача будет ещё сложней.", +airport_load,13,14,"^1ЦРУ\n\n^2Шепард: ^7Два бойца вынесли целую базу. Твоя задача будет ещё сложней.", +airport_load,14,16.1,"^1ЦРУ\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n^2Шепард: ^7Два бойца вынесли целую базу. Твоя задача будет ещё сложней.", +airport_load,16.1,17.9,"^1ЦРУ\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n", +airport_load,17.9,17.94,"^1ЦРУ: \nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n", +airport_load,17.94,17.98,"^1ЦРУ: О\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n", +airport_load,17.98,18.02,"^1ЦРУ: О\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,18.02,18.06,"^1ЦРУ: ОП\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,18.06,18.10,"^1ЦРУ: ОПЕ\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,18.10,18.14,"^1ЦРУ: ОПЕР\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,18.14,18.18,"^1ЦРУ: ОПЕРА\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,18.18,18.22,"^1ЦРУ: ОПЕРАЦ\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,18.22,18.26,"^1ЦРУ: ОПЕРАЦИ\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,18.26,18.30,"^1ЦРУ: ОПЕРАЦИЯ\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,18.30,18.34,"^1ЦРУ: ОПЕРАЦИЯ \nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,18.34,18.38,"^1ЦРУ: ОПЕРАЦИЯ П\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,18.38,18.42,"^1ЦРУ: ОПЕРАЦИЯ ПО\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,18.42,18.46,"^1ЦРУ: ОПЕРАЦИЯ ПОД\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,18.46,18.50,"^1ЦРУ: ОПЕРАЦИЯ ПОД \nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,18.50,18.54,"^1ЦРУ: ОПЕРАЦИЯ ПОД П\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,18.54,18.58,"^1ЦРУ: ОПЕРАЦИЯ ПОД ПР\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,18.58,18.62,"^1ЦРУ: ОПЕРАЦИЯ ПОД ПРИ\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,18.62,18.66,"^1ЦРУ: ОПЕРАЦИЯ ПОД ПРИК\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,18.66,18.70,"^1ЦРУ: ОПЕРАЦИЯ ПОД ПРИКР\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,18.70,18.74,"^1ЦРУ: ОПЕРАЦИЯ ПОД ПРИКРЫ\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,18.74,18.78,"^1ЦРУ: ОПЕРАЦИЯ ПОД ПРИКРЫТ\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,18.78,18.82,"^1ЦРУ: ОПЕРАЦИЯ ПОД ПРИКРЫТИ\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,18.82,18.86,"^1ЦРУ: ОПЕРАЦИЯ ПОД ПРИКРЫТИЕ\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,18.86,18.9,"^1ЦРУ: ОПЕРАЦИЯ ПОД ПРИКРЫТИЕМ\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,18.9,19.6,"^1ЦРУ: ОПЕРАЦИЯ ПОД ПРИКРЫТИЕМ\n\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,19.6,21.4,"^1ЦРУ: ОПЕРАЦИЯ ПОД ПРИКРЫТИЕМ\nАЛЕКСЕЙ БОРОДИН\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,21.4,21.6,"^1ЦРУ: ОПЕРАЦИЯ ПОД ПРИКРЫТИЕМ\n\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,21.6,23,"\n\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,23,29,"\n\n^2Шепард: ^7Война идёт повсюду. А где война, там непременно будут и жертвы.", +airport_load,36,36.3,"\n\n^2Шепард: ^7Этот Макаров ведёт собственную войну вне всяких правил и границ." +airport_load,36.3,39,"^1ЯДЕРНО-ОРУЖЕЙНЫЙ АРСЕНАЛ?\n\n^2Шепард: ^7Этот Макаров ведёт собственную войну вне всяких правил и границ." +airport_load,39,41,"^1МАКАРОВ: МЫ БУДЕМ ВЗРЫВАТЬ И ДАЛЬШЕ\n\n^2Шепард: ^7Этот Макаров ведёт собственную войну вне всяких правил и границ." +airport_load,41,42.1,"^1МАКАРОВ: МЫ БУДЕМ ВЗРЫВАТЬ И ДАЛЬШЕ\n\n^2Шепард: ^7Он не побрезгует ни пытками, ни торговлей людьми, ни геноцидом.", +airport_load,42.1,44.3,"^1СТРАХ НАРАСТАЕТ ПО ВСЕЙ ЕВРОПЕ\n\n^2Шепард: ^7Он не побрезгует ни пытками, ни торговлей людьми, ни геноцидом.", +airport_load,44.3,44.5,"^1СТРАХ НАРАСТАЕТ ПО ВСЕЙ ЕВРОПЕ\n\n", +airport_load,44.5,45,"^1ТОНКАЯ ГРАНЬ МИРНОГО СОСУЩЕСТВОВАНИЯ…\n\n", +airport_load,45,45.2,"^1ТОНКАЯ ГРАНЬ МИРНОГО СОСУЩЕСТВОВАНИЯ…\n\n^2Шепард: ^7У него нет идеалов, нет чести, нет родины. Он проливает кровь за деньги.", +airport_load,45.2,47.3,"^1ТОНКАЯ ГРАНЬ МИРНОГО СОСУЩЕСТВОВАНИЯ…\n^1…ЧИСЛО ЖЕРТВ БЕЗУМЦА РАСТЕТ\n^2Шепард: ^7У него нет идеалов, нет чести, нет родины. Он проливает кровь за деньги.", +airport_load,47.3,52,"\n\n^2Шепард: ^7У него нет идеалов, нет чести, нет родины. Он проливает кровь за деньги.", +airport_load,53,55,"\n\n^2Шепард: ^7Теперь это твой лучший друг.", +airport_load,56,59.3,"\n\n^2Шепард: ^7Тебе лучше не знать, во что обошлось твоё внедрение.", +airport_load,60,62.6,"\n\n^2Шепард: ^7От тебя это потребует больших жертв.", +airport_load,64,67,"\n\n^2Шепард: ^7В сравнении с целью, эта цена невысока.", +arcadia_load,1.7,2.8,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141", +arcadia_load,2.8,6.4,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141\nСЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН", +arcadia_load,6.4,6.6,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141", +arcadia_load,15.15,16.1,"^3РЕЙНДЖЕРЫ АРМИИ США", +arcadia_load,16.1,19.85,"^3РЕЙНДЖЕРЫ АРМИИ США\nРЯДОВОЙ ДЖЕЙМС РАМИРЕС", +arcadia_load,19.85,20.05,"^3РЕЙНДЖЕРЫ АРМИИ США", +arcadia_load,24.5,25,"\n\n^2Шепард: ^7Кто-нибудь, выключите этот чёртов телевизор.", +arcadia_load,25,27.15,"^3ШТАБ-КВАРТИРА ЦРУ, ЛЭНГЛИ, ВИРДЖИНИЯ | 09:12:54 | НЕСЕКРЕТНО\n\n^2Шепард: ^7Кто-нибудь, выключите этот чёртов телевизор.", +arcadia_load,27.9,29,"^3КЭМП-ДЭВИД, ПАРК ГОРЫ КАТОКТИН, МЭРИЛЕНД | 10:27:53 | НЕСЕКРЕТНО\n(ЗАГОРОДНАЯ РЕЗИДЕНЦИЯ ПРЕЗИДЕНТА США)", +arcadia_load,29,30,"^3КЭМП-ДЭВИД, ПАРК ГОРЫ КАТОКТИН, МЭРИЛЕНД | 10:27:53 | НЕСЕКРЕТНО\n(ЗАГОРОДНАЯ РЕЗИДЕНЦИЯ ПРЕЗИДЕНТА США)\n^2Шепард: ^7Моя опергруппа за границей.\nПринимаю командование вашей частью, сержант Фоули.", +arcadia_load,30,30.5,"\n\n^2Шепард: ^7Моя опергруппа за границей.\nПринимаю командование вашей частью, сержант Фоули.", +arcadia_load,30.5,33.5,"^3ПЕНТАГОН, АРЛИНГТОН, ВИРДЖИНИЯ | 08:35:02 | НЕСЕКРЕТНО\n\n^2Шепард: ^7Моя опергруппа за границей.\nПринимаю командование вашей частью, сержант Фоули.", +arcadia_load,34,36,"^2Сержант Фоули: ^7Есть, сэр. Слушаюсь, сэр.", +arcadia_load,37,40,"^2Шепард: ^7Я реквизировал «Страйкер» у восьмой бронетанковой.", +arcadia_load,46,48,"^2Сержант Фоули: ^7С Бэджером шутки плохи, сэр.", +arcadia_load,48,52,"^2Шепард: ^7Он доставит вас на место.\nРусские легко проходят сквозь нашу оборону,", +arcadia_load,52,54,"^2Шепард: ^7Он доставит вас на место.\nРусские легко проходят сквозь нашу оборону,\nнельзя дать им сделать это здесь.", +arcadia_load,54.6,58.3,"^2Сержант Фоули: ^7Укажите точку на карте. Её они не возьмут." +boneyard_load,1.7,2.8,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141", +boneyard_load,2.8,6.4,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141\nСЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН", +boneyard_load,6.4,6.6,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141", +boneyard_load,8,9.5,"^5СЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН", +boneyard_load,9.5,9.8,"^5СЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН\nСТАТУС: ПОГИБ В БОЮ", +boneyard_load,9.8,10.17,"^5СЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН", +boneyard_load,10.17,10.54,"^5СЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН\nСТАТУС: ПОГИБ В БОЮ", +boneyard_load,10.54,10.9,"^5СЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН", +boneyard_load,10.9,11.27,"^5СЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН\nСТАТУС: ПОГИБ В БОЮ", +boneyard_load,11.27,11.63,"^5СЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН", +boneyard_load,11.63,12,"^5СЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН\nСТАТУС: ПОГИБ В БОЮ", +boneyard_load,12,12.4,"^5СЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН", +boneyard_load,12.4,12.73,"^5СЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН\nСТАТУС: ПОГИБ В БОЮ", +boneyard_load,12.73,13.1,"^5СЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН", +boneyard_load,13.1,13.47,"^5СЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН\nСТАТУС: ПОГИБ В БОЮ", +boneyard_load,13.47,13.8,"^5СЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН", +boneyard_load,13.8,14.07,"^5СЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН\nСТАТУС: ПОГИБ В БОЮ", +boneyard_load,14.07,14.2,"^5\nСТАТУС: ПОГИБ В БОЮ", +boneyard_load,14.64,15.47,"^5КАПИТАН «СОУП» МАКТАВИШ", +boneyard_load,15.47,16.7,"^5КАПИТАН «СОУП» МАКТАВИШ\nАФГАНИСТАН, СВАЛКА САМОЛЕТОВ АРМИИ США №437", +boneyard_load,16.7,20,"^5КАПИТАН «СОУП» МАКТАВИШ\nАФГАНИСТАН, СВАЛКА САМОЛЕТОВ АРМИИ США №437\n^2Мактавиш: ^7Роуч? Гоуст? Гоуст, приём! Выходите на связь! Кто-нибудь меня слышит?", +boneyard_load,20,22.45,"^5КАПИТАН «СОУП» МАКТАВИШ\nАФГАНИСТАН, СВАЛКА САМОЛЕТОВ АРМИИ США №437\n^2Прайс: ^7Их нет, Соуп. Шепард убил всех. Я пытаюсь к тебе пробиться.", +boneyard_load,22.45,23.1,"^5\nАФГАНИСТАН, СВАЛКА САМОЛЕТОВ АРМИИ США №437\n^2Прайс: ^7Их нет, Соуп. Шепард убил всех. Я пытаюсь к тебе пробиться.", +boneyard_load,23.1,25,"\n\n^2Прайс: ^7Их нет, Соуп. Шепард убил всех. Я пытаюсь к тебе пробиться.", +boneyard_load,26,28,"\n\n^2Мактавиш: ^7Шепард нас предал.", +boneyard_load,28,31,"\n\n^2Прайс: ^7Предают тех, кто доверяет. Я никому не верю.", +boneyard_load,31.3,34,"^2Прайс: ^7Николай, приём. Засёк координаты?", +boneyard_load,34,38,"^2Николай: ^7Да. Я уже на подходе. Но я не один.", +boneyard_load,38,41,"^2Николай: ^7С одной стороны люди Шепарда, с другой – люди Макарова.", +boneyard_load,43,45,"^2Прайс: ^7Придётся с ними разобраться.", +boneyard_load,45,47,"^2Николай: ^7Или дай им перебить друг друга.", +boneyard_load,47,50,"^2Николай: ^7Что ж, тогда до скорой встречи, мой друг.", +cliffhanger_load,1.7,2.8,"^1ЦРУ", +cliffhanger_load,2.8,6.4,"^1ЦРУ\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН", +cliffhanger_load,6.4,6.6,"^1ЦРУ", +cliffhanger_load,9.7,14.85,"^1\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n", +cliffhanger_load,15.32,15.69,"^1\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\nСТАТУС: ПЕРЕВЕДЕН НА НОВОЕ МЕСТО СЛУЖБЫ", +cliffhanger_load,15.69,16.05,"^1\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n", +cliffhanger_load,16.05,16.41,"^1\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\nСТАТУС: ПЕРЕВЕДЕН НА НОВОЕ МЕСТО СЛУЖБЫ", +cliffhanger_load,16.41,16.77,"^1\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n", +cliffhanger_load,16.77,17.13,"^1\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\nСТАТУС: ПЕРЕВЕДЕН НА НОВОЕ МЕСТО СЛУЖБЫ", +cliffhanger_load,17.13,17.49,"^1\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n", +cliffhanger_load,17.49,17.85,"^1\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\nСТАТУС: ПЕРЕВЕДЕН НА НОВОЕ МЕСТО СЛУЖБЫ", +cliffhanger_load,17.85,18.21,"^1\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n", +cliffhanger_load,18.21,18.57,"^1\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\nСТАТУС: ПЕРЕВЕДЕН НА НОВОЕ МЕСТО СЛУЖБЫ", +cliffhanger_load,18.57,18.93,"^1\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n", +cliffhanger_load,18.93,19.29,"^1\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\nСТАТУС: ПЕРЕВЕДЕН НА НОВОЕ МЕСТО СЛУЖБЫ", +cliffhanger_load,19.29,19.65,"^1\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n", +cliffhanger_load,19.65,20.01,"^1\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\nСТАТУС: ПЕРЕВЕДЕН НА НОВОЕ МЕСТО СЛУЖБЫ", +cliffhanger_load,20.01,20.37,"^1\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n", +cliffhanger_load,20.37,20.73,"^1\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\nСТАТУС: ПЕРЕВЕДЕН НА НОВОЕ МЕСТО СЛУЖБЫ", +cliffhanger_load,20.73,21.09,"^1\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n", +cliffhanger_load,21.09,21.45,"^1\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\nСТАТУС: ПЕРЕВЕДЕН НА НОВОЕ МЕСТО СЛУЖБЫ", +cliffhanger_load,21.45,21.81,"^1\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n", +cliffhanger_load,21.81,22.17,"^1\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\nСТАТУС: ПЕРЕВЕДЕН НА НОВОЕ МЕСТО СЛУЖБЫ", +cliffhanger_load,22.17,22.53,"^1\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n", +cliffhanger_load,22.53,22.89,"^1\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\nСТАТУС: ПЕРЕВЕДЕН НА НОВОЕ МЕСТО СЛУЖБЫ", +cliffhanger_load,23.3,25,"^2Рядовой 1-го класса Аллен: ^7Как я выгляжу?", +cliffhanger_load,25,27,"^2Шепард: ^7Как настоящий плохой парень.", +cliffhanger_load,27,29,"^2Шепард: ^7Для твоего задания – идеально.", +cliffhanger_load,29,31,"^2Рядовой 1-го класса Аллен: ^7Макаров будет наградой.", +cliffhanger_load,31,36,"^2Шепард: ^7Макаров – не награда. Он шавка. Бешеный пес, убивающий направо и налево.", +cliffhanger_load,37,40,"^2Шепард: ^7Помни легенду – это залог твоего выживания.", +cliffhanger_load,41,44.42,"\n\n^2Шепард: ^7Это отряд 141 – добро пожаловать в ряды лучших бойцов планеты!", +cliffhanger_load,44.42,45.5,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141\n\n^2Шепард: ^7Это отряд 141 – добро пожаловать в ряды лучших бойцов планеты!", +cliffhanger_load,45.5,46,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141\nСЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН\n^2Шепард: ^7Это отряд 141 – добро пожаловать в ряды лучших бойцов планеты!", +cliffhanger_load,46,49.1,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141\nСЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН\n^2Рядовой 1-го класса Аллен: ^7Благодарю, сэр. Когда я увижу остальных?", +cliffhanger_load,49.1,49.3,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141\n\n^2Рядовой 1-го класса Аллен: ^7Благодарю, сэр. Когда я увижу остальных?", +cliffhanger_load,49.3,54,"\n\n^2Шепард: ^7Они на задании. Цель – модуль автоматической системы контроля в тылу врага.", +cliffhanger_load,54,56,"\n\n^2Рядовой 1-го класса Аллен: ^7По колено в воде?", +cliffhanger_load,56,59,"\n\n^2Шепард: ^7Я бы сказал, на жестоком холоде.", +contingency_load,1.7,2.8,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141", +contingency_load,2.8,6.4,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141\nСЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН", +contingency_load,6.4,6.6,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141", +contingency_load,12,14,"^2Капитан Мактавиш: ^7Соединение почти установлено.", +contingency_load,16.3,19,"^2Капитан Мактавиш: ^7Генерал Шепард, на связи капитан Прайс.", +contingency_load,20,22,"^2Шепард: ^7С возвращением с того света, капитан.", +contingency_load,22,24,"^2Капитан Прайс: ^7Да уж, как у чёрта со сковороды…", +contingency_load,24,27,"^2Капитан Прайс: ^7Этот мир превращается в настоящий ад.", +contingency_load,28,31,"^2Шепард: ^7Мы надеялись вернуть модуль до того, как русские его взломают.", +contingency_load,32,33,"^2Шепард: ^7Мы ошиблись.", +contingency_load,33.6,38,"^2Шепард: ^7После этого Макаров атаковал США. Теперь всё вокруг в огне.", +contingency_load,39,41,"^2Шепард: ^7Что ты мне передаёшь?", +contingency_load,41.6,46,"^2Капитан Прайс: ^7Чтобы потушить горящую нефть, сэр, обычно рядом с пожаром устраивают взрыв.", +contingency_load,46,48.2,"^2Капитан Прайс: ^7Убрать кислород – и пламя погаснет.", +contingency_load,49,54,"^2Шепард: ^7Прайс, похоже, ты переутомился. Приди в себя, не говори ерунды, сынок.", +contingency_load,55,58,"^2Капитан Прайс: ^7Шепард, ты готов сделать то, что нужно для победы?", +contingency_load,58.6,60,"^2Шепард: ^7Конечно.", +contingency_load,60.5,65,"^2Капитан Прайс: ^7Назревает большой пожар. Взрыв должен быть не меньше.", +contingency_load,66,70.2,"^2Шепард: ^7Ты слишком долго был в русской колонии, Прайс. Займись Макаровым.", +contingency_load,71,72.12,"^5ЯДЕРНЫЙ АРСЕНАЛ НОСИТЕЛЕЙ: ••••••••••••••\n^2Капитан Прайс: ^7Нет времени, сэр. Войну надо закончить сегодня.", +contingency_load,72.12,73,"^5ЯДЕРНЫЙ АРСЕНАЛ НОСИТЕЛЕЙ: 16 МЕГАТОНН\n^2Капитан Прайс: ^7Нет времени, сэр. Войну надо закончить сегодня.", +contingency_load,73,76,"^5ЯДЕРНЫЙ АРСЕНАЛ НОСИТЕЛЕЙ: 16 МЕГАТОНН\n^2Шепард: ^7Это не просьба, Прайс. Это приказ! Ты д…", +contingency_load,77.22,78.8,"^5СОЕДИНЕНИЕ РАЗОРВАНО", +contingency_load,78.8,82,"^5СОЕДИНЕНИЕ РАЗОРВАНО\n^2Капитан Прайс: ^7Хм. Кажется, связь оборвалась...", +dcburning_load,8,18,"^2 ^7ЖИТЕЛЯМ ОКРУГА ПРИНС-ДЖОРДЖЕС НАДЛЕЖИТ ПРОСЛЕДОВАТЬ В УПРАВЛЕНИЕ ЗДРАВООХРАНЕНИЯ, РАСПОЛОЖЕННОЕ ПО АДРЕСУ КЕРКВУД-АВЕНЮ, 147. ",1 +dcburning_load,18,27,^2 ^7МАШИНЫ ОТЪЕЗЖАЮТ ОТ СТУДЕНЧЕСКОГО ГОРОДКА МУНИЦИПАЛЬНОГО КОЛЛЕДЖА КАЖДЫЕ 15 МИНУТ. /// ПРОВОДИТСЯ ЭКСТРЕННАЯ ЭВАКУАЦИЯ. /// ,1 +dcburning_load,27,36,^2 ^7НЕЗАМЕДЛИТЕЛЬНО ПРОСЛЕДУЙТЕ В БЛИЖАЙШЕЕ УБЕЖИЩЕ. ТАМ ВАС БУДУТ ЖДАТЬ ПРЕДСТАВИТЕЛИ ВООРУЖЕННЫХ СИЛ. ,1 +dcburning_load,36,44,^2 ^7ПРИ СЕБЕ ИМЕТЬ УДОСТОВЕРЕНИЕ ЛИЧНОСТИ И НЕ БОЛЕЕ ОДНОГО ПРЕДМЕТА БАГАЖА НА ЧЕЛОВЕКА. /// СМОТРИТЕ ПО СТОРОНАМ. БУДЬТЕ ВНИМАТЕЛЬНЫ.,1 +dcemp_load,1.7,2.8,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141", +dcemp_load,2.8,6.4,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141\nСЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН", +dcemp_load,6.4,6.6,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141", +dcemp_load,12,15.02,"^5США, ШТАТ КОЛОРАДО", +dcemp_load,16,20.13,"^5ГОРА ШАЙЕНН, ГОРОД КОЛОРАДО-СПРИНГС\nКОМАНДОВАНИЕ ВОЗДУШНО-КОСМИЧЕСКОЙ ОБОРОНЫ\nСЕВЕРНОЙ АМЕРИКИ", +dcemp_load,27,31.5,"^2Министр обороны: ^7Джентльмены, по нашим расчетам, цель ракеты – восточное побережье. Под угрозой Белый дом.", +dcemp_load,32,35,"^2Шепард: ^7Мы восстановим его. Это не в первый раз.", +dcemp_load,36,37,"^2Министр обороны: ^7Потери?", +dcemp_load,37.8,45,"^2Шепард: ^7В зависимости от места взрыва от 30 до 50 тысяч. Плюс отказ всей техники.", +dcemp_load,46,49,"^2Министр обороны: ^7А ведь вы нас предупреждали, генерал Шепард…", +dcemp_load,49.5,55,^2Шепард: ^7Не будем о прошлом. Мы просто не можем оставить такой удар без ответа., +dcemp_load,55.2,61,^2Шепард: ^7И мы знаем имя виновного. Нужно добраться до Макарова., +dcemp_load,61.8,66,"^2Министр обороны: ^7Даю вам полный карт-бланш, генерал. Задействуйте любые ресурсы.", +estate_load,1.7,2.8,"^3РЕЙНДЖЕРЫ АРМИИ США", +estate_load,2.8,6.4,"^3РЕЙНДЖЕРЫ АРМИИ США\nРЯДОВОЙ ДЖЕЙМС РАМИРЕС", +estate_load,6.4,6.6,"^3РЕЙНДЖЕРЫ АРМИИ США", +estate_load,7,12,"\n\n^2Шепард: ^7Это была тяжёлая неделя, джентльмены. Мы потеряли больше, чем рассчитывали. Мы восстановим силы.", +estate_load,12.9,14,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141", +estate_load,14,16,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141\nСЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН", +estate_load,16,17.6,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141\nСЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН\n^2Шепард: ^7У нас карт-бланш, и мы сделаем всё, чтобы убить Макарова.", +estate_load,17.6,17.8,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141\n\n^2Шепард: ^7У нас карт-бланш, и мы сделаем всё, чтобы убить Макарова.", +estate_load,17.8,20.3,"\n\n^2Шепард: ^7У нас карт-бланш, и мы сделаем всё, чтобы убить Макарова.", +estate_load,22,28,"\n\n^2Шепард: ^7Кто бы что ни говорил, мы совсем не варвары. Мы не убиваем гражданских. Бьём точно в цель.", +estate_load,30,34,"\n\n^2Шепард: ^7Этот преступник ушёл в тень, но мы вытащим его на свет.", +estate_load,34.7,38,"\n\n^2Шепард: ^7Откроем его истинное лицо, и будем сами писать историю, друзья.", +estate_load,42.5,45.8,"\n\n^2Шепард: ^7Для Макарова и его людей во всём мире остались только эти два убежища.", +estate_load,45.8,46.2,"^5КАВКАЗСКИЕ ГОРЫ | АФГАНИСТАН\n\n^2Шепард: ^7Для Макарова и его людей во всём мире остались только эти два убежища.", +estate_load,46.2,47,"^5КАВКАЗСКИЕ ГОРЫ | АФГАНИСТАН\n\n", +estate_load,47,49.3,"^5КАВКАЗСКИЕ ГОРЫ | АФГАНИСТАН\n\n^2Капитан Прайс: ^7Получается, нужно быть в двух местах сразу.", +estate_load,49.3,50,"^51) „ОСОБНЯК“ ВЕРОЯТНОЕ УБЕЖИЩЕ МАКАРОВА (Российско-грузинская граница)\n\n", +estate_load,50,51,"^51) „ОСОБНЯК“ ВЕРОЯТНОЕ УБЕЖИЩЕ МАКАРОВА (Российско-грузинская граница)\n\n^2Шепард: ^7Невозможно?", +estate_load,51,53,"^51) „ОСОБНЯК“ ВЕРОЯТНОЕ УБЕЖИЩЕ МАКАРОВА (Российско-грузинская граница)\n2) „КЛАДБИЩЕ“ СВАЛКА САМОЛЕТОВ АРМИИ США №437 (Место заключения оружейной сделки)\n^2Капитан Прайс: ^7Только не для 1-4-1.", +estate_load,53,55.4,"^51) „ОСОБНЯК“ ВЕРОЯТНОЕ УБЕЖИЩЕ МАКАРОВА (Российско-грузинская граница)\n2) „КЛАДБИЩЕ“ СВАЛКА САМОЛЕТОВ АРМИИ США №437 (Место заключения оружейной сделки)\n^2Гоуст: ^7Шансы убить Макарова 50 на 50, да?", +estate_load,55.4,56,"^51) „ОСОБНЯК“ ВЕРОЯТНОЕ УБЕЖИЩЕ МАКАРОВА (Российско-грузинская граница)\n2) „КЛАДБИЩЕ“ СВАЛКА САМОЛЕТОВ АРМИИ США №437 (Место заключения оружейной сделки)", +estate_load,56,59,"^51) „ОСОБНЯК“ ВЕРОЯТНОЕ УБЕЖИЩЕ МАКАРОВА (Российско-грузинская граница)\n2) „КЛАДБИЩЕ“ СВАЛКА САМОЛЕТОВ АРМИИ США №437 (Место заключения оружейной сделки)\n^2Гоуст: ^7Капитан Прайс, прошу разрешения взять логово вместе с Роучем.", +estate_load,59,59.8,"^51) „ОСОБНЯК“ ВЕРОЯТНОЕ УБЕЖИЩЕ МАКАРОВА (Российско-грузинская граница)\n2) „КЛАДБИЩЕ“ СВАЛКА САМОЛЕТОВ АРМИИ США №437 (Место заключения оружейной сделки)", +estate_load,59.8,63,"^51) „ОСОБНЯК“ ВЕРОЯТНОЕ УБЕЖИЩЕ МАКАРОВА (Российско-грузинская граница)\n2) „КЛАДБИЩЕ“ СВАЛКА САМОЛЕТОВ АРМИИ США №437 (Место заключения оружейной сделки)\n^2Капитан Прайс: ^7Разрешаю. Мы с Соупом возьмём свалку в Афганистане.", +estate_load,63,63.3,"^51) „ОСОБНЯК“ ВЕРОЯТНОЕ УБЕЖИЩЕ МАКАРОВА (Российско-грузинская граница)\n2) „КЛАДБИЩЕ“ СВАЛКА САМОЛЕТОВ АРМИИ США №437 (Место заключения оружейной сделки)", +estate_load,63.3,66,"^51) „ОСОБНЯК“ ВЕРОЯТНОЕ УБЕЖИЩЕ МАКАРОВА (Российско-грузинская граница)\n2) „КЛАДБИЩЕ“ СВАЛКА САМОЛЕТОВ АРМИИ США №437 (Место заключения оружейной сделки)\n^2Шепард: ^7Хорошо. Мы отрежем им все пути к отступлению. Сегодня всё закончится.", +estate_load,66,69,"\n\n^2Шепард: ^7Хорошо. Мы отрежем им все пути к отступлению. Сегодня всё закончится.", +estate_load,70,74,"\n\n^2Капитан Прайс: ^7Странно. Я думал, всё закончилось ещё вчера.", +favela_escape_load,1.7,2.8,"^3РЕЙНДЖЕРЫ АРМИИ США", +favela_escape_load,2.8,6.4,"^3РЕЙНДЖЕРЫ АРМИИ США\nРЯДОВОЙ ДЖЕЙМС РАМИРЕС", +favela_escape_load,6.4,6.6,"^3РЕЙНДЖЕРЫ АРМИИ США", +favela_escape_load,15.14,16.24,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141", +favela_escape_load,16.24,19.84,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141\nСЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН", +favela_escape_load,19.84,20.04,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141", +favela_escape_load,28.3,30.5,^2Гоуст: ^7Не могу установить связь., +favela_escape_load,38,42.5,^2Капитан Мактавиш: ^7Русские скопировали модуль автоматической системы контроля. Могут открыть любой замок в Америке!, +favela_escape_load,42.5,48,"^2Гоуст: ^7И они намерены отомстить за каждого убитого в Москве. Похоже, у нас совсем не осталось друзей.", +favela_escape_load,49.2,53,"^2Капитан Мактавиш: ^7Я знаю его. Надо найти таксофон, если они ещё существуют.", +favela_escape_load,53.3,59,"^2Гоуст: ^7От Рохаса мы узнали, что единственный человек, которого Макаров ненавидит больше, чем американцев, сидит в тюрьме.", +favela_escape_load,59.5,66,"^2Капитан Мактавиш: ^7Это всё, что у нас есть. Если тот зэк – наживка для поимки этого психопата, туда ему и дорога.", +favela_load,1.7,2.8,"^1ЦРУ: ОПЕРАЦИЯ ПОД ПРИКРЫТИЕМ", +favela_load,2.8,4.6,"^1ЦРУ: ОПЕРАЦИЯ ПОД ПРИКРЫТИЕМ\nАЛЕКСЕЙ БОРОДИН", +favela_load,4.6,5.06,"^1ЦРУ: ОПЕРАЦИЯ ПОД ПРИКРЫТИЕМ", +favela_load,5.06,5.56,"^1ЦРУ: ОПЕРАЦИЯ ПОД ПРИКРЫТИЕМ\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n", +favela_load,5.56,5.93,"^1ЦРУ: ОПЕРАЦИЯ ПОД ПРИКРЫТИЕМ\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\nСТАТУС: ПОГИБ В БОЮ", +favela_load,5.93,6.3,"^1ЦРУ: ОПЕРАЦИЯ ПОД ПРИКРЫТИЕМ\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n", +favela_load,6.3,6.67,"^1ЦРУ: ОПЕРАЦИЯ ПОД ПРИКРЫТИЕМ\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\nСТАТУС: ПОГИБ В БОЮ", +favela_load,6.67,7.04,"^1ЦРУ: ОПЕРАЦИЯ ПОД ПРИКРЫТИЕМ\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n", +favela_load,7.04,7.3,"^1ЦРУ: ОПЕРАЦИЯ ПОД ПРИКРЫТИЕМ\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\nСТАТУС: ПОГИБ В БОЮ", +favela_load,7.3,7.41,"^1\n\nСТАТУС: ПОГИБ В БОЮ", +favela_load,9,9.36,"^1РЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\nСТАТУС: ПОГИБ В БОЮ", +favela_load,9.36,9.72,"^1РЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n", +favela_load,9.72,10.08,"^1РЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\nСТАТУС: ПОГИБ В БОЮ", +favela_load,10.08,10.44,"^1РЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n", +favela_load,10.44,10.8,"^1РЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\nСТАТУС: ПОГИБ В БОЮ", +favela_load,10.8,11.16,"^1РЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n", +favela_load,11.16,11.52,"^1РЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\nСТАТУС: ПОГИБ В БОЮ", +favela_load,11.52,11.88,"^1РЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n", +favela_load,11.88,12.3,"^1РЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\nСТАТУС: ПОГИБ В БОЮ", +favela_load,12.37,13,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141", +favela_load,13,13.47,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141\n\n^2Гоуст: ^7Русские не оставят эту резню без ответа. Прольётся много крови.", +favela_load,13.47,16.5,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141\nСЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН\n^2Гоуст: ^7Русские не оставят эту резню без ответа. Прольётся много крови.", +favela_load,16.5,17,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141\nСЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН\n", +favela_load,17,17.27,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141\n\n^2Капитан Мактавиш: ^7Ты прав как никогда, приятель. Сейчас для всего мира они – жертвы.", +favela_load,17.27,20,"\n\n^2Капитан Мактавиш: ^7Ты прав как никогда, приятель. Сейчас для всего мира они – жертвы.", +favela_load,20,22.84,"^5СПИСОК ПОГИБШИХ И РАНЕНЫХ\n\n^2Капитан Мактавиш: ^7Никто и слова не скажет, если русские порешают каждого американца, до которого смогут добраться.", +favela_load,22.84,24.3,"^5СПИСОК ПОГИБШИХ И РАНЕНЫХ\nДЖОЗЕФ АЛЛЕН | 22 ГОДА | ИТАКА, ШТАТ НЬЮ-ЙОРК | ЦРУ\n^2Капитан Мактавиш: ^7Никто и слова не скажет, если русские порешают каждого американца, до которого смогут добраться.", +favela_load,24.3,25.6,"^5СПИСОК ПОГИБШИХ И РАНЕНЫХ\nДЖОЗЕФ АЛЛЕН | 22 ГОДА | ИТАКА, ШТАТ НЬЮ-ЙОРК | ЦРУ\n^2Шепард: ^7Макаров оказался на шаг впереди. Он повесил на американца тысячи трупов.", +favela_load,25.6,30,"\n\n^2Шепард: ^7Макаров оказался на шаг впереди. Он повесил на американца тысячи трупов.", +favela_load,31,36.9,"\n\n^2Капитан Мактавиш: ^7Только мы знаем, что это организовал Макаров, не ЦРУ. После Аллена нам никто не поверит. Нужны доказательства.", +favela_load,36.9,37.3,"^5НАЙДЕНО СОВПАДЕНИЕ\nМЕСТО ИЗГОТОВЛЕНИЯ: БРАЗИЛИЯ\n", +favela_load,37.3,39.3,"^5НАЙДЕНО СОВПАДЕНИЕ\nМЕСТО ИЗГОТОВЛЕНИЯ: БРАЗИЛИЯ\n^2Шепард: ^7Пойдём по следу.", +favela_load,39.3,40.7,"^5НАЙДЕНО СОВПАДЕНИЕ\nМЕСТО ИЗГОТОВЛЕНИЯ: БРАЗИЛИЯ\n", +favela_load,45,47,"^5ПОМОЩНИК РОХАСА | АЛЕХАНДРО РОХАС\n^2Шепард: ^7Алехандро Рохас.", +favela_load,47,47.3,"^5ПОМОЩНИК РОХАСА | АЛЕХАНДРО РОХАС\n", +favela_load,48.5,50,"^2Капитан Мактавиш: ^7Не знаю такого, сэр.", +favela_load,50,53,"^2Шепард: ^7Он же Алекс Красный. Он снабдил их оружием перед нападанием.", +favela_load,54,59,"^2Капитан Мактавиш: ^7Одна пуля становится причиной ярости целого государства. А это значит…", +favela_load,59,61,"^2Шепард: ^7Это наш ключ к Макарову.", +gulag_load,1.7,2.8,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141", +gulag_load,2.8,6.4,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141\nСЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН", +gulag_load,6.4,6.6,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141", +gulag_load,15.8,19,"^2Капитан Мактавиш: ^7Шестой флот начинает зачистку. Пора.", +gulag_load,20.7,24,"^2Капитан Мактавиш: ^7Строение с долгой историей. Долгой и печальной.", +gulag_load,24,28,"^2Капитан Мактавиш: ^7Когда-то это был замок. Настоящая крепость, твердыня, готовая выдержать любой удар.", +gulag_load,28.8,33.2,"^2Капитан Мактавиш: ^7Оно пережило немало суровых зим. Чего не скажешь о его жителях.", +gulag_load,34,37,"^2Капитан Мактавиш: ^7Монастырь. Где живут совсем не монахи.", +gulag_load,37,41,"^2Капитан Мактавиш: ^7Последние сто лет здесь держат тех, кто неугоден правительству, но кого нельзя убить.", +gulag_load,43,48,"^2Капитан Мактавиш: ^7Внутри полно выживших жертв последней войны… в которой, клянусь, я думал, мы победили…", +gulag_load,48,53,"^2Капитан Мактавиш: ^7Но, похоже, в политике, как на ипподроме: поставишь не на ту лошадь – и окажешься здесь.", +gulag_load,53.8,58,^2Капитан Мактавиш: ^7Макарову нужен номер 6-2-7. Вот за ним мы и пришли., +intro_credits_load,5.50,7.8,"^2„ДЛЯ ЗАПИСИ“", +intro_credits_load,20,22,"^2САС: ^7Это новичок, сэр.", +intro_credits_load,25,29,"^2Капитан Прайс: ^7Да, что у тебя за имя такое дурацкое, Соуп?", +intro_credits_load,43.5,45.2,"^1Аль-Асад: ^7Война – это искусство обмана.", +intro_credits_load,48.5,51.8,^2Капитан Прайс: ^7Николай сейчас в аду. Проводим его!, +intro_credits_load,51.8,54,^2Капитан Прайс: ^7Мы позаботимся о наших друзьях. Уходим!, +intro_credits_load,64,67,^2Капитан Прайс: ^7Захаев. Имран Захаев., +intro_credits_load,78,82,^1Захаев: ^7Моя кровь – на их руках., +intro_credits_load,89,93.5,"^2Капитан Прайс: ^7D1X, выпущена ракета, повторяю, выпущена…", +intro_credits_load,121.58,125.58,"^25 ЛЕТ СПУСТЯ", +invasion_load,1.7,2.8,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141", +invasion_load,2.8,6.4,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141\nСЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН", +invasion_load,6.4,6.6,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141", +invasion_load,15.15,16.1,"^3РЕЙНДЖЕРЫ АРМИИ США", +invasion_load,16.1,19.85,"^3РЕЙНДЖЕРЫ АРМИИ США\nРЯДОВОЙ ДЖЕЙМС РАМИРЕС", +invasion_load,19.85,20.05,"^3РЕЙНДЖЕРЫ АРМИИ США", +invasion_load,22,23.5,"^3\nНа связи НОРАД (командование воздушно-космической обороны)\n^2Штаб-квартира НОРАД: ^7Сэнд Браво, мы засекли 70 самолетов противника в вашем квадрате. Подтвердите.", +invasion_load,23.5,26.5,"^3Система контроля воздушного пространства: АКТИВНА…\nНа связи НОРАД (командование воздушно-космической обороны)\n^2Штаб-квартира НОРАД: ^7Сэнд Браво, мы засекли 70 самолетов противника в вашем квадрате. Подтвердите.", +invasion_load,26.5,27,"^3Система контроля воздушного пространства: АКТИВНА…\nНа связи НОРАД (командование воздушно-космической обороны)\n", +invasion_load,27,31.5,"^3Система контроля воздушного пространства: АКТИВНА…\nНа связи НОРАД (командование воздушно-космической обороны)\n^2База Ноум: ^7Очень смешно. Нет, не подтверждаем.", +invasion_load,31.5,31.516,"^3Система контроля воздушного пространства: АКТИВНА…\nНа связи НОРАД (командование воздушно-космической обороны\n", +invasion_load,31.516,31.532,"^3Система контроля воздушного пространства: АКТИВНА…\nНа связи НОРАД (командование воздушно-космической оборон\n", +invasion_load,31.532,31.548,"^3Система контроля воздушного пространства: АКТИВНА…\nНа связи НОРАД (командование воздушно-космической оборо\n", +invasion_load,31.548,31.564,"^3Система контроля воздушного пространства: АКТИВНА…\nНа связи НОРАД (командование воздушно-космической обор\n", +invasion_load,31.564,31.58,"^3Система контроля воздушного пространства: АКТИВНА…\nНа связи НОРАД (командование воздушно-космической обо\n", +invasion_load,31.58,31.596,"^3Система контроля воздушного пространства: АКТИВНА…\nНа связи НОРАД (командование воздушно-космической об\n", +invasion_load,31.596,31.612,"^3Система контроля воздушного пространства: АКТИВНА…\nНа связи НОРАД (командование воздушно-космической о\n", +invasion_load,31.612,31.628,"^3Система контроля воздушного пространства: АКТИВНА…\nНа связи НОРАД (командование воздушно-космической \n", +invasion_load,31.628,31.644,"^3Система контроля воздушного пространства: АКТИВНА…\nНа связи НОРАД (командование воздушно-космической\n", +invasion_load,31.644,31.66,"^3Система контроля воздушного пространства: АКТИВНА…\nНа связи НОРАД (командование воздушно-космическо\n", +invasion_load,31.66,31.676,"^3Система контроля воздушного пространства: АКТИВНА…\nНа связи НОРАД (командование воздушно-космическ\n", +invasion_load,31.676,31.692,"^3Система контроля воздушного пространства: АКТИВНА…\nНа связи НОРАД (командование воздушно-космичес\n", +invasion_load,31.692,31.708,"^3Система контроля воздушного пространства: АКТИВНА…\nНа связи НОРАД (командование воздушно-космиче\n", +invasion_load,31.708,31.724,"^3Система контроля воздушного пространства: АКТИВНА…\nНа связи НОРАД (командование воздушно-космич\n", +invasion_load,31.724,31.74,"^3Система контроля воздушного пространства: АКТИВНА…\nНа связи НОРАД (командование воздушно-косми\n", +invasion_load,31.74,31.756,"^3Система контроля воздушного пространства: АКТИВНА…\nНа связи НОРАД (командование воздушно-косм\n", +invasion_load,31.756,31.772,"^3Система контроля воздушного пространства: АКТИВНА…\nНа связи НОРАД (командование воздушно-кос\n", +invasion_load,31.772,31.788,"^3Система контроля воздушного пространства: АКТИВНА…\nНа связи НОРАД (командование воздушно-ко\n", +invasion_load,31.788,31.8,"^3Система контроля воздушного пространства: АКТИВНА…\nНа связи НОРАД (командование воздушно-ко\n", +invasion_load,31.8,31.804,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (командование воздушно-ко\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,31.804,31.82,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (командование воздушно-к\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,31.82,31.836,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (командование воздушно-\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,31.836,31.852,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (командование воздушно\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,31.852,31.868,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (командование воздушн\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,31.868,31.884,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (командование воздуш\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,31.884,31.9,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (командование возду\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,31.9,31.916,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (командование возд\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,31.916,31.932,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (командование воз\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,31.932,31.948,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (командование во\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,31.948,31.964,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (командование в\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,31.964,31.98,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (командование \n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,31.98,31.996,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (командование\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,31.996,32.012,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (командовани\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.012,32.028,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (командован\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.028,32.044,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (командова\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.044,32.06,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (командов\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.06,32.076,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (командо\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.076,32.092,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (команд\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.092,32.108,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (коман\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.108,32.124,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (кома\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.124,32.14,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (кома\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.14,32.156,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (ком\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.156,32.172,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (ко\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.172,32.188,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (к\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.188,32.204,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.204,32.22,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД \n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.22,32.236,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.236,32.252,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРА\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.252,32.268,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОР\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.268,32.284,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НО\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.284,32.3,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи Н\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.3,32.316,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи \n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.316,32.332,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.332,32.348,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связ\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.348,32.364,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа свя\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.364,32.38,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа св\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.38,32.396,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа с\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.396,32.412,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа \n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.412,32.428,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.428,32.444,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nН\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.444,33.9,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\n\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,33.9,34,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\n\n", +invasion_load,34,37.75,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\n\n^2Штаб-квартира НОРАД: ^7Сэнд Браво, будем искать поломку в оборудовании.", +invasion_load,37.75,38,"^9Система контроля воздушного пространства: ИДЕТ\n\n^2Штаб-квартира НОРАД: ^7Сэнд Браво, будем искать поломку в оборудовании.", +invasion_load,38,38.25,"^9Система контроля воздушного пространства:\n\n", +invasion_load,38.25,38.5,"^9Система контроля воздушного\n\n", +invasion_load,38.5,38.75,"^9Система контроля\n\n", +invasion_load,38.75,39,"^9Система\n\n", +invasion_load,39,42.4,"\n^2База Ноум: ^7У нас всё чисто. Видно, у вас там радары барахлят. Отбой.", +invasion_load,43,48.3,"\n^2Штаб-квартира НОРАД: ^7Зулу Икс-рей 6, в вашем квадрате обнаружено около 100 неизвестных объектов. Подтвердите.", +invasion_load,49,55,"\n^2База Ванденберг: ^7Не подтверждаем. У нас всё чисто. Даже не знаю, что вам сказать… Может, буря на солнце? Сегодня повышенная солнечная активность.", +invasion_load,55.8,61,"\n^2Штаб-квартира НОРАД: ^7Сьерра Дельта… ох, у нас тут сбой системы контроля… кого-нибудь наблюдаете, приём?", +invasion_load,61.3,63,"\n^2Авиадиспетчер: ^7Они повсюду!", +invasion_load,63,64.9,"\n^2Штаб-квартира НОРАД: ^7Сьерра Дельта, повторите!", +invasion_load,64.9,69,"\n^2Авиадиспетчер: ^7Вижу истребители в секторе I-95!\nКак, чёрт возьми, они туда вообще могли попасть?!", +invasion_load,69,73,"\n^2Штаб-квартира НОРАД: ^7Спокойно! Пробую связаться с ближайшим отрядом в этом секторе.", +invasion_load,73,77,"\n^2Сержант Фоули: ^7…на связи 1-й батальон 75-го полка рейнджеров, это сержант Фоули, замкомандира Хантер 2-1. Как слышно, приём?", +invasion_load,77,77.6,"^3ДИАГНОСТИКА ВЫЯВИЛА НЕИСПРАВНОСТЬ\n^2Сержант Фоули: ^7…на связи 1-й батальон 75-го полка рейнджеров, это сержант Фоули, замкомандира Хантер 2-1. Как слышно, приём?", +invasion_load,77.6,77.95,"\n^2Сержант Фоули: ^7…на связи 1-й батальон 75-го полка рейнджеров, это сержант Фоули, замкомандира Хантер 2-1. Как слышно, приём?", +invasion_load,77.95,78.65,"^3ДИАГНОСТИКА ВЫЯВИЛА НЕИСПРАВНОСТЬ\n^2Сержант Фоули: ^7…на связи 1-й батальон 75-го полка рейнджеров, это сержант Фоули, замкомандира Хантер 2-1. Как слышно, приём?", +invasion_load,78.65,79,"\n^2Сержант Фоули: ^7…на связи 1-й батальон 75-го полка рейнджеров, это сержант Фоули, замкомандира Хантер 2-1. Как слышно, приём?", +invasion_load,79,79.7,"^3ДИАГНОСТИКА ВЫЯВИЛА НЕИСПРАВНОСТЬ\n^2Штаб-квартира НОРАД: ^7Всем постам, спутниковое наблюдение отключено. Система акустического наблюдения и радиолокационная станция тоже не работают.", +invasion_load,79.7,80,"\n^2Штаб-квартира НОРАД: ^7Всем постам, спутниковое наблюдение отключено. Система акустического наблюдения и радиолокационная станция тоже не работают.", +invasion_load,80,80.7,"^3ДИАГНОСТИКА ВЫЯВИЛА НЕИСПРАВНОСТЬ\n^2Штаб-квартира НОРАД: ^7Всем постам, спутниковое наблюдение отключено. Система акустического наблюдения и радиолокационная станция тоже не работают.", +invasion_load,80.7,81,"\n^2Штаб-квартира НОРАД: ^7Всем постам, спутниковое наблюдение отключено. Система акустического наблюдения и радиолокационная станция тоже не работают.", +invasion_load,81,81.64,"^3ДИАГНОСТИКА ВЫЯВИЛА НЕИСПРАВНОСТЬ\n^2Штаб-квартира НОРАД: ^7Всем постам, спутниковое наблюдение отключено. Система акустического наблюдения и радиолокационная станция тоже не работают.", +invasion_load,81.64,81.74,"\n^2Штаб-квартира НОРАД: ^7Всем постам, спутниковое наблюдение отключено. Система акустического наблюдения и радиолокационная станция тоже не работают.", +invasion_load,81.74,81.8,"^3ДИАГНОСТИКА ВЫЯВИЛА НЕИСПРАВНОСТЬ\n^2Штаб-квартира НОРАД: ^7Всем постам, спутниковое наблюдение отключено. Система акустического наблюдения и радиолокационная станция тоже не работают.", +invasion_load,81.8,81.84,"\n^2Штаб-квартира НОРАД: ^7Всем постам, спутниковое наблюдение отключено. Система акустического наблюдения и радиолокационная станция тоже не работают.", +invasion_load,81.84,81.94,"^3ДИАГНОСТИКА ВЫЯВИЛА НЕИСПРАВНОСТЬ\n^2Штаб-квартира НОРАД: ^7Всем постам, спутниковое наблюдение отключено. Система акустического наблюдения и радиолокационная станция тоже не работают.", +invasion_load,81.94,82.04,"\n^2Штаб-квартира НОРАД: ^7Всем постам, спутниковое наблюдение отключено. Система акустического наблюдения и радиолокационная станция тоже не работают.", +invasion_load,82.04,82.07,"^3ДИАГНОСТИКА ВЫЯВИЛА НЕИСПРАВНОСТЬ\n^2Штаб-квартира НОРАД: ^7Всем постам, спутниковое наблюдение отключено. Система акустического наблюдения и радиолокационная станция тоже не работают.", +invasion_load,82.07,87,"\n^2Штаб-квартира НОРАД: ^7Всем постам, спутниковое наблюдение отключено. Система акустического наблюдения и радиолокационная станция тоже не работают.", +oilrig_load,1.7,2.8,"^3РЕЙНДЖЕРЫ АРМИИ США", +oilrig_load,2.8,6.4,"^3РЕЙНДЖЕРЫ АРМИИ США\nРЯДОВОЙ ДЖЕЙМС РАМИРЕС", +oilrig_load,6.4,6.6,"^3РЕЙНДЖЕРЫ АРМИИ США", +oilrig_load,12.2,13.3,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141", +oilrig_load,13.3,16.9,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141\nСЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН", +oilrig_load,16.9,17.1,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141\n", +oilrig_load,20.8,24,"^2Капитан Мактавиш: ^7Похоже, мы движемся не в том направлении, сэр. Может, вернёмся в бой?", +oilrig_load,24,26,"^2Шепард: ^7Тут для тебя полно работы, Мактавиш.", +oilrig_load,27,33,"^2Шепард: ^7Рад, что ты выбрался из Южной Америки. Объединишься с 6-м флотом. Нанесёте ответный удар.", +oilrig_load,35,42,"^2Шепард: ^7Заключённый 6-2-7. Мы считаем, что именно этого человека ищет Макаров, но не можем до него добраться.", +oilrig_load,45,47,"^2Капитан Мактавиш: ^7Нефтяные вышки, сэр?", +oilrig_load,47,49,^2Шепард: ^7Русские располагают там зенитки., +oilrig_load,50,56,^2Шепард: ^7Нефтяники – это живой щит. Мы не можем просто взять и взорвать вышку. Эта защищена слабее всех., +oilrig_load,58.8,62,"^2Шепард: ^7Ребята, я знаю, что сейчас посылаю вас на смерть…", +oilrig_load,62,67,"^2Капитан Мактавиш: ^7Они охраняют это место – значит, там что-то нужное. Особенно, если мы хотим найти заключённого 6-2-7.", +roadkill_load,1.7,2.8,"^3РЕЙНДЖЕРЫ АРМИИ США", +roadkill_load,2.8,6.4,"^3РЕЙНДЖЕРЫ АРМИИ США\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН", +roadkill_load,6.4,6.6,"^3РЕЙНДЖЕРЫ АРМИИ США", +roadkill_load,8,12.3,^2Шепард: ^7Мы – самая мощная армия в истории человечества., +roadkill_load,13,15,^2Шепард: ^7Каждая битва – наша битва., +roadkill_load,16,21,^2Шепард: ^7Происходящее здесь может иметь далеко идущие последствия… и мы не будем в стороне., +roadkill_load,22,30,"^2Шепард: ^7Ваша судьба сейчас зависит от того, сможете ли вы научиться использовать современные методы ведения войны.", +roadkill_load,30.5,37,"^2Шепард: ^7Мы не можем дать вам свободу. Но мы можем научить вас, как обрести её.", +roadkill_load,37,41.0,"^2Шепард: ^7А это, друзья мои, стоит дороже целой военной базы.", +roadkill_load,42.5,48,"^2Шепард: ^7Конечно, это важно, у кого самая большая дубина. Но не менее важно, кто ею размахивает.", +roadkill_load,49,53,^2Шепард: ^7Пришло время героев. Время легенд., +roadkill_load,54,56,^2Шепард: ^7Историю пишут победители., +roadkill_load,57,59,^2Шепард: ^7За работу., +trainer_load,3.866,5.658,"^7МОСКВА\nРОССИЯ", +trainer_load,5.658,10.159,"^7МОСКВА", +trainer_load,10.7,14,^2Шепард: ^7Что-то меняется… Что-то остается прежним., +trainer_load,15,21,"^2Шепард: ^7Границы сдвигаются, приходят новые игроки, но власть всегда находит себе место.", +trainer_load,24,29,"^2Шепард: ^7Мы сражались плечом к плечу с русскими. Надо было предвидеть, что нас возненавидят за это.", +trainer_load,30,35,"^2Шепард: ^7Историю пишут победители. Лично я думаю, что мы победили.", +trainer_load,37,41,^2Шепард: ^7Но уничтожаешь одного врага – и ему на смену приходит ещё более опасный., +trainer_load,43.8,48,"^2Шепард: ^7Новые страны, новые цели, новая идеология.", +trainer_load,49,52,^2Шепард: ^7Вчерашние враги – нынешние новобранцы., +trainer_load,52,59,"^2Шепард: ^7Учите их сражаться и молитесь, чтобы они тоже не возненавидели вас за это.", +trainer_load,64.27,65.37,"^3РЕЙНДЖЕРЫ АРМИИ США", +trainer_load,65.37,68.97,"^3РЕЙНДЖЕРЫ АРМИИ США\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН", +trainer_load,68.97,69,"^3РЕЙНДЖЕРЫ АРМИИ США", +trainer_load,70,72,^2Шепард: ^7Новый день – та же хрень., +trainer_load,72.658,72.8,"^3АФГАНИСТАН", +trainer_load,72.8,77,"^3АФГАНИСТАН\n^2Шепард: ^7Вы знаете, чего я ищу, сержант Фоули. Будьте начеку.", +trainer_load,78,82,"^2Сержант Фоули: ^7На полигоне тренируется новый отряд, сэр. Пошлю к вам самого лучшего.", \ No newline at end of file diff --git a/data/zonetool/rup_h2_mod_patch_af_caves/sounds/afcaves_nkl_goodluck.json b/data/zonetool/rup_h2_mod_patch_af_caves/sounds/afcaves_nkl_goodluck.json new file mode 100644 index 00000000..a77097b6 --- /dev/null +++ b/data/zonetool/rup_h2_mod_patch_af_caves/sounds/afcaves_nkl_goodluck.json @@ -0,0 +1,199 @@ +{ + "aliasName": "afcaves_nkl_goodluck", + "count": 1, + "head": [ + { + "aliasName": "afcaves_nkl_goodluck", + "secondaryAliasName": null, + "chainAliasName": null, + "subtitle": "SUBTITLE_AFCAVES_NKL_GOODLUCK23", + "mixerGroup": null, + "soundfile": { + "type": 2, + "exists": true, + "totalMsec": 4568, + "isLocalized": true, + "isStreamed": true, + "fileIndex": 0, + "raw": { + "dir": "voiceovers/afcaves", + "name": "afcaves_nkl_2_3_r" + } + }, + "flags": 2097562, + "priority": 18, + "dspBus": "voices_critical", + "volMod": "voices_dialog_radio", + "volMin": 0.7936999797821045, + "volMax": 0.7936999797821045, + "pitchMin": 1.0, + "pitchMax": 1.0, + "distMin": 120.0, + "distMax": 600.0, + "velocityMin": 0.0, + "probability": 1.0, + "sequence": 1, + "startDelay": 0, + "masterPriority": 100, + "masterPercentage": 0.20000000298023224, + "slavePercentage": 1.0, + "playbackPercentage": 100, + "lfePercentage": 0.0, + "centerPercentage": 0.0, + "poly": 1, + "polyGlobal": 174, + "polyEntityType": 0, + "polyGlobalType": 0, + "envelopMin": 0.0, + "envelopMax": 0.0, + "envelopPercentage": 0.0, + "reverbWetMixOverride": 0.0, + "reverbMultiplier": 0.0, + "smartPanDistance2d": 0.0, + "smartPanDistance3d": 0.0, + "smartPanAttenuation3d": 1.0, + "stereo3dAngle": 0, + "stereo3dStart": 0.0, + "stereo3dEnd": 0.0, + "sndContext": null, + "sndCurve": "$default", + "lpfCurve": "$default", + "hpfCurve": "$defaultHpf", + "reverbSendCurve": "$default", + "speakerMap": { + "channelMaps": [ + { + "speakerCount": 2, + "speakers": [ + { + "levels0": 1.0, + "levels1": 0.0, + "numLevels": 1, + "speaker": 0 + }, + { + "levels0": 1.0, + "levels1": 0.0, + "numLevels": 1, + "speaker": 1 + } + ] + }, + { + "speakerCount": 6, + "speakers": [ + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 1, + "speaker": 0 + }, + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 1, + "speaker": 1 + }, + { + "levels0": 1.0, + "levels1": 0.0, + "numLevels": 1, + "speaker": 2 + }, + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 1, + "speaker": 3 + }, + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 1, + "speaker": 4 + }, + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 1, + "speaker": 5 + } + ] + }, + { + "speakerCount": 2, + "speakers": [ + { + "levels0": 1.0, + "levels1": 0.0, + "numLevels": 2, + "speaker": 0 + }, + { + "levels0": 0.0, + "levels1": 1.0, + "numLevels": 2, + "speaker": 1 + } + ] + }, + { + "speakerCount": 6, + "speakers": [ + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 2, + "speaker": 0 + }, + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 2, + "speaker": 1 + }, + { + "levels0": 0.5, + "levels1": 0.5, + "numLevels": 2, + "speaker": 2 + }, + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 2, + "speaker": 3 + }, + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 2, + "speaker": 4 + }, + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 2, + "speaker": 5 + } + ] + } + ], + "isDefault": false, + "name": "radio" + }, + "allowDoppler": 0, + "dopplerPreset": null, + "unknown": { + "pad": [ + { + "bytes": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "subtype": null + } + ], + "u1": 4, + "u2": 0.0010000000474974513 + } + } + ] +} \ No newline at end of file diff --git a/data/zonetool/rus_h2_mod_common/video/subtitles.csv b/data/zonetool/rus_h2_mod_common/video/subtitles.csv new file mode 100644 index 00000000..e27b9880 --- /dev/null +++ b/data/zonetool/rus_h2_mod_common/video/subtitles.csv @@ -0,0 +1,460 @@ +af_caves_load,1.7,6.8,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141", +af_caves_load,8,11.3,"^5САМЫЕ РАЗЫСКИВАЕМЫЕ ЛИЦА", +af_caves_load,11.3,14,"^5САМЫЕ РАЗЫСКИВАЕМЫЕ ЛИЦА\nДЖОН ПРАЙС «СОУП» МАКТАВИШ", +af_caves_load,14,15.5,"^5САМЫЕ РАЗЫСКИВАЕМЫЕ ЛИЦА\nДЖОН ПРАЙС «СОУП» МАКТАВИШ\n^2Мактавиш: ^7У нас всего один пулемет. У них – тысяча.", +af_caves_load,15.5,17.5,"\n\n^2Мактавиш: ^7У нас всего один пулемет. У них – тысяча.", +af_caves_load,18,21,"^2Мактавиш: ^7Мы даже не знаем, не солгал ли Макаров.", +af_caves_load,21.3,22.3,^2Мактавиш: ^7Прайс., +af_caves_load,23.3,24.3,^2Мактавиш: ^7…Прайс?, +af_caves_load,25,30.2,"^2Прайс: ^7Нормальный человек не просыпается с мыслью о том, что сегодня – последний день его жизни.", +af_caves_load,30.5,33.6,"^2Прайс: ^7Но я считаю, это роскошь. Не проклятие. ", +af_caves_load,33.6,36.7,"^2Прайс: ^7Знание, что конец близок, даёт свободу. ", +af_caves_load,37.5,40,"^2Прайс: ^7Самое время… свести счёты.", +af_caves_load,41,46,^2Прайс: ^7Враг силён. Нас мало. Мы на пределе. Идём на верную смерть. , +af_caves_load,46,50,"^2Прайс: ^7Но камни и песок, за тысячи лет войны впитавшие столько крови…", +af_caves_load,51.2,54,^2Прайс: ^7Они будут помнить нас. За это., +af_caves_load,54.5,60,"^2Прайс: ^7Потому что мы сами выбрали свой путь. И, поверь, этот путь страшнее любого кошмара.", +af_caves_load,60.5,63.4,^2Прайс: ^7У нас нет другого выхода., +af_caves_load,64,66.7,^2Прайс: ^7Мы должны это сделать., +af_caves_load,67.8,70,^2Прайс: ^7Мы. Его., +af_caves_load,70,72,"^2Прайс: ^7Мы. Его.\nУничтожим." +af_chase_load,16.3,18,^2Прайс: ^7Говорю для записи., +af_chase_load,18.3,21,^2Прайс: ^7Историю пишет победитель., +af_chase_load,22,24,^2Прайс: ^7В истории много лжи. , +af_chase_load,25,30,"^2Прайс: ^7Если мы проиграем, его правда станет истиной,", +af_chase_load,30,32,"^2Прайс: ^7Если мы проиграем, его правда станет истиной,\nа нашу забудут.", +af_chase_load,32,39,"^2Прайс: ^7Шепард станет героем. Ведь чтобы изменить мир, нужна красивая ложь и море крови.", +af_chase_load,40,45,^2Прайс: ^7Он собирается совершить самый большой обман в истории человечества., +af_chase_load,45.7,48,^2Прайс: ^7Его правда станет истиной., +af_chase_load,48,52.2,"^2Прайс: ^7Но только, если он выживет, а мы умрем.", +airport_load,1.7,2.8,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141", +airport_load,2.8,6.4,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141\nСЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН", +airport_load,6.4,6.6,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141", +airport_load,7.5,11,"\n\n^2Шепард: ^7Группа 141 захватила систему автоматического контроля, Аллен.", +airport_load,12,13,"\n\n^2Шепард: ^7Два бойца вынесли целую базу. Твоя задача будет ещё сложней.", +airport_load,13,14,"^1ЦРУ\n\n^2Шепард: ^7Два бойца вынесли целую базу. Твоя задача будет ещё сложней.", +airport_load,14,16.1,"^1ЦРУ\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n^2Шепард: ^7Два бойца вынесли целую базу. Твоя задача будет ещё сложней.", +airport_load,16.1,17.9,"^1ЦРУ\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n", +airport_load,17.9,17.94,"^1ЦРУ: \nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n", +airport_load,17.94,17.98,"^1ЦРУ: О\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n", +airport_load,17.98,18.02,"^1ЦРУ: О\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,18.02,18.06,"^1ЦРУ: ОП\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,18.06,18.10,"^1ЦРУ: ОПЕ\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,18.10,18.14,"^1ЦРУ: ОПЕР\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,18.14,18.18,"^1ЦРУ: ОПЕРА\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,18.18,18.22,"^1ЦРУ: ОПЕРАЦ\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,18.22,18.26,"^1ЦРУ: ОПЕРАЦИ\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,18.26,18.30,"^1ЦРУ: ОПЕРАЦИЯ\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,18.30,18.34,"^1ЦРУ: ОПЕРАЦИЯ \nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,18.34,18.38,"^1ЦРУ: ОПЕРАЦИЯ П\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,18.38,18.42,"^1ЦРУ: ОПЕРАЦИЯ ПО\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,18.42,18.46,"^1ЦРУ: ОПЕРАЦИЯ ПОД\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,18.46,18.50,"^1ЦРУ: ОПЕРАЦИЯ ПОД \nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,18.50,18.54,"^1ЦРУ: ОПЕРАЦИЯ ПОД П\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,18.54,18.58,"^1ЦРУ: ОПЕРАЦИЯ ПОД ПР\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,18.58,18.62,"^1ЦРУ: ОПЕРАЦИЯ ПОД ПРИ\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,18.62,18.66,"^1ЦРУ: ОПЕРАЦИЯ ПОД ПРИК\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,18.66,18.70,"^1ЦРУ: ОПЕРАЦИЯ ПОД ПРИКР\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,18.70,18.74,"^1ЦРУ: ОПЕРАЦИЯ ПОД ПРИКРЫ\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,18.74,18.78,"^1ЦРУ: ОПЕРАЦИЯ ПОД ПРИКРЫТ\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,18.78,18.82,"^1ЦРУ: ОПЕРАЦИЯ ПОД ПРИКРЫТИ\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,18.82,18.86,"^1ЦРУ: ОПЕРАЦИЯ ПОД ПРИКРЫТИЕ\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,18.86,18.9,"^1ЦРУ: ОПЕРАЦИЯ ПОД ПРИКРЫТИЕМ\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,18.9,19.6,"^1ЦРУ: ОПЕРАЦИЯ ПОД ПРИКРЫТИЕМ\n\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,19.6,21.4,"^1ЦРУ: ОПЕРАЦИЯ ПОД ПРИКРЫТИЕМ\nАЛЕКСЕЙ БОРОДИН\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,21.4,21.6,"^1ЦРУ: ОПЕРАЦИЯ ПОД ПРИКРЫТИЕМ\n\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,21.6,23,"\n\n^2Шепард: ^7Вчера ты был солдатом на передовой. Но сегодня фронта больше нет.", +airport_load,23,29,"\n\n^2Шепард: ^7Война идёт повсюду. А где война, там непременно будут и жертвы.", +airport_load,36,36.3,"\n\n^2Шепард: ^7Этот Макаров ведёт собственную войну вне всяких правил и границ." +airport_load,36.3,39,"^1ЯДЕРНО-ОРУЖЕЙНЫЙ АРСЕНАЛ?\n\n^2Шепард: ^7Этот Макаров ведёт собственную войну вне всяких правил и границ." +airport_load,39,41,"^1МАКАРОВ: МЫ БУДЕМ ВЗРЫВАТЬ И ДАЛЬШЕ\n\n^2Шепард: ^7Этот Макаров ведёт собственную войну вне всяких правил и границ." +airport_load,41,42.1,"^1МАКАРОВ: МЫ БУДЕМ ВЗРЫВАТЬ И ДАЛЬШЕ\n\n^2Шепард: ^7Он не побрезгует ни пытками, ни торговлей людьми, ни геноцидом.", +airport_load,42.1,44.3,"^1СТРАХ НАРАСТАЕТ ПО ВСЕЙ ЕВРОПЕ\n\n^2Шепард: ^7Он не побрезгует ни пытками, ни торговлей людьми, ни геноцидом.", +airport_load,44.3,44.5,"^1СТРАХ НАРАСТАЕТ ПО ВСЕЙ ЕВРОПЕ\n\n", +airport_load,44.5,45,"^1ТОНКАЯ ГРАНЬ МИРНОГО СОСУЩЕСТВОВАНИЯ…\n\n", +airport_load,45,45.2,"^1ТОНКАЯ ГРАНЬ МИРНОГО СОСУЩЕСТВОВАНИЯ…\n\n^2Шепард: ^7У него нет идеалов, нет чести, нет родины. Он проливает кровь за деньги.", +airport_load,45.2,47.3,"^1ТОНКАЯ ГРАНЬ МИРНОГО СОСУЩЕСТВОВАНИЯ…\n^1…ЧИСЛО ЖЕРТВ БЕЗУМЦА РАСТЕТ\n^2Шепард: ^7У него нет идеалов, нет чести, нет родины. Он проливает кровь за деньги.", +airport_load,47.3,52,"\n\n^2Шепард: ^7У него нет идеалов, нет чести, нет родины. Он проливает кровь за деньги.", +airport_load,53,55,"\n\n^2Шепард: ^7Теперь это твой лучший друг.", +airport_load,56,59.3,"\n\n^2Шепард: ^7Тебе лучше не знать, во что обошлось твоё внедрение.", +airport_load,60,62.6,"\n\n^2Шепард: ^7От тебя это потребует больших жертв.", +airport_load,64,67,"\n\n^2Шепард: ^7В сравнении с целью, эта цена невысока.", +arcadia_load,1.7,2.8,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141", +arcadia_load,2.8,6.4,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141\nСЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН", +arcadia_load,6.4,6.6,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141", +arcadia_load,15.15,16.1,"^3РЕЙНДЖЕРЫ АРМИИ США", +arcadia_load,16.1,19.85,"^3РЕЙНДЖЕРЫ АРМИИ США\nРЯДОВОЙ ДЖЕЙМС РАМИРЕС", +arcadia_load,19.85,20.05,"^3РЕЙНДЖЕРЫ АРМИИ США", +arcadia_load,24.5,25,"\n\n^2Шепард: ^7Кто-нибудь, выключите этот чёртов телевизор.", +arcadia_load,25,27.15,"^3ШТАБ-КВАРТИРА ЦРУ, ЛЭНГЛИ, ВИРДЖИНИЯ | 09:12:54 | НЕСЕКРЕТНО\n\n^2Шепард: ^7Кто-нибудь, выключите этот чёртов телевизор.", +arcadia_load,27.9,29,"^3КЭМП-ДЭВИД, ПАРК ГОРЫ КАТОКТИН, МЭРИЛЕНД | 10:27:53 | НЕСЕКРЕТНО\n(ЗАГОРОДНАЯ РЕЗИДЕНЦИЯ ПРЕЗИДЕНТА США)", +arcadia_load,29,30,"^3КЭМП-ДЭВИД, ПАРК ГОРЫ КАТОКТИН, МЭРИЛЕНД | 10:27:53 | НЕСЕКРЕТНО\n(ЗАГОРОДНАЯ РЕЗИДЕНЦИЯ ПРЕЗИДЕНТА США)\n^2Шепард: ^7Моя опергруппа за границей.\nПринимаю командование вашей частью, сержант Фоули.", +arcadia_load,30,30.5,"\n\n^2Шепард: ^7Моя опергруппа за границей.\nПринимаю командование вашей частью, сержант Фоули.", +arcadia_load,30.5,33.5,"^3ПЕНТАГОН, АРЛИНГТОН, ВИРДЖИНИЯ | 08:35:02 | НЕСЕКРЕТНО\n\n^2Шепард: ^7Моя опергруппа за границей.\nПринимаю командование вашей частью, сержант Фоули.", +arcadia_load,34,36,"^2Сержант Фоули: ^7Есть, сэр. Слушаюсь, сэр.", +arcadia_load,37,40,"^2Шепард: ^7Я реквизировал «Страйкер» у восьмой бронетанковой.", +arcadia_load,46,48,"^2Сержант Фоули: ^7С Бэджером шутки плохи, сэр.", +arcadia_load,48,52,"^2Шепард: ^7Он доставит вас на место.\nРусские легко проходят сквозь нашу оборону,", +arcadia_load,52,54,"^2Шепард: ^7Он доставит вас на место.\nРусские легко проходят сквозь нашу оборону,\nнельзя дать им сделать это здесь.", +arcadia_load,54.6,58.3,"^2Сержант Фоули: ^7Укажите точку на карте. Её они не возьмут." +boneyard_load,1.7,2.8,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141", +boneyard_load,2.8,6.4,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141\nСЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН", +boneyard_load,6.4,6.6,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141", +boneyard_load,8,9.5,"^5СЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН", +boneyard_load,9.5,9.8,"^5СЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН\nСТАТУС: ПОГИБ В БОЮ", +boneyard_load,9.8,10.17,"^5СЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН", +boneyard_load,10.17,10.54,"^5СЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН\nСТАТУС: ПОГИБ В БОЮ", +boneyard_load,10.54,10.9,"^5СЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН", +boneyard_load,10.9,11.27,"^5СЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН\nСТАТУС: ПОГИБ В БОЮ", +boneyard_load,11.27,11.63,"^5СЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН", +boneyard_load,11.63,12,"^5СЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН\nСТАТУС: ПОГИБ В БОЮ", +boneyard_load,12,12.4,"^5СЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН", +boneyard_load,12.4,12.73,"^5СЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН\nСТАТУС: ПОГИБ В БОЮ", +boneyard_load,12.73,13.1,"^5СЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН", +boneyard_load,13.1,13.47,"^5СЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН\nСТАТУС: ПОГИБ В БОЮ", +boneyard_load,13.47,13.8,"^5СЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН", +boneyard_load,13.8,14.07,"^5СЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН\nСТАТУС: ПОГИБ В БОЮ", +boneyard_load,14.07,14.2,"^5\nСТАТУС: ПОГИБ В БОЮ", +boneyard_load,14.64,15.47,"^5КАПИТАН «СОУП» МАКТАВИШ", +boneyard_load,15.47,16.7,"^5КАПИТАН «СОУП» МАКТАВИШ\nАФГАНИСТАН, СВАЛКА САМОЛЕТОВ АРМИИ США №437", +boneyard_load,16.7,20,"^5КАПИТАН «СОУП» МАКТАВИШ\nАФГАНИСТАН, СВАЛКА САМОЛЕТОВ АРМИИ США №437\n^2Мактавиш: ^7Роуч? Гоуст? Гоуст, приём! Выходите на связь! Кто-нибудь меня слышит?", +boneyard_load,20,22.45,"^5КАПИТАН «СОУП» МАКТАВИШ\nАФГАНИСТАН, СВАЛКА САМОЛЕТОВ АРМИИ США №437\n^2Прайс: ^7Их нет, Соуп. Шепард убил всех. Я пытаюсь к тебе пробиться.", +boneyard_load,22.45,23.1,"^5\nАФГАНИСТАН, СВАЛКА САМОЛЕТОВ АРМИИ США №437\n^2Прайс: ^7Их нет, Соуп. Шепард убил всех. Я пытаюсь к тебе пробиться.", +boneyard_load,23.1,25,"\n\n^2Прайс: ^7Их нет, Соуп. Шепард убил всех. Я пытаюсь к тебе пробиться.", +boneyard_load,26,28,"\n\n^2Мактавиш: ^7Шепард нас предал.", +boneyard_load,28,31,"\n\n^2Прайс: ^7Предают тех, кто доверяет. Я никому не верю.", +boneyard_load,31.3,34,"^2Прайс: ^7Николай, приём. Засёк координаты?", +boneyard_load,34,38,"^2Николай: ^7Да. Я уже на подходе. Но я не один.", +boneyard_load,38,41,"^2Николай: ^7С одной стороны люди Шепарда, с другой – люди Макарова.", +boneyard_load,43,45,"^2Прайс: ^7Придётся с ними разобраться.", +boneyard_load,45,47,"^2Николай: ^7Или дай им перебить друг друга.", +boneyard_load,47,50,"^2Николай: ^7Что ж, тогда до скорой встречи, мой друг.", +cliffhanger_load,1.7,2.8,"^1ЦРУ", +cliffhanger_load,2.8,6.4,"^1ЦРУ\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН", +cliffhanger_load,6.4,6.6,"^1ЦРУ", +cliffhanger_load,9.7,14.85,"^1\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n", +cliffhanger_load,15.32,15.69,"^1\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\nСТАТУС: ПЕРЕВЕДЕН НА НОВОЕ МЕСТО СЛУЖБЫ", +cliffhanger_load,15.69,16.05,"^1\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n", +cliffhanger_load,16.05,16.41,"^1\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\nСТАТУС: ПЕРЕВЕДЕН НА НОВОЕ МЕСТО СЛУЖБЫ", +cliffhanger_load,16.41,16.77,"^1\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n", +cliffhanger_load,16.77,17.13,"^1\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\nСТАТУС: ПЕРЕВЕДЕН НА НОВОЕ МЕСТО СЛУЖБЫ", +cliffhanger_load,17.13,17.49,"^1\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n", +cliffhanger_load,17.49,17.85,"^1\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\nСТАТУС: ПЕРЕВЕДЕН НА НОВОЕ МЕСТО СЛУЖБЫ", +cliffhanger_load,17.85,18.21,"^1\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n", +cliffhanger_load,18.21,18.57,"^1\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\nСТАТУС: ПЕРЕВЕДЕН НА НОВОЕ МЕСТО СЛУЖБЫ", +cliffhanger_load,18.57,18.93,"^1\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n", +cliffhanger_load,18.93,19.29,"^1\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\nСТАТУС: ПЕРЕВЕДЕН НА НОВОЕ МЕСТО СЛУЖБЫ", +cliffhanger_load,19.29,19.65,"^1\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n", +cliffhanger_load,19.65,20.01,"^1\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\nСТАТУС: ПЕРЕВЕДЕН НА НОВОЕ МЕСТО СЛУЖБЫ", +cliffhanger_load,20.01,20.37,"^1\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n", +cliffhanger_load,20.37,20.73,"^1\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\nСТАТУС: ПЕРЕВЕДЕН НА НОВОЕ МЕСТО СЛУЖБЫ", +cliffhanger_load,20.73,21.09,"^1\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n", +cliffhanger_load,21.09,21.45,"^1\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\nСТАТУС: ПЕРЕВЕДЕН НА НОВОЕ МЕСТО СЛУЖБЫ", +cliffhanger_load,21.45,21.81,"^1\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n", +cliffhanger_load,21.81,22.17,"^1\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\nСТАТУС: ПЕРЕВЕДЕН НА НОВОЕ МЕСТО СЛУЖБЫ", +cliffhanger_load,22.17,22.53,"^1\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n", +cliffhanger_load,22.53,22.89,"^1\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\nСТАТУС: ПЕРЕВЕДЕН НА НОВОЕ МЕСТО СЛУЖБЫ", +cliffhanger_load,23.3,25,"^2Рядовой 1-го класса Аллен: ^7Как я выгляжу?", +cliffhanger_load,25,27,"^2Шепард: ^7Как настоящий плохой парень.", +cliffhanger_load,27,29,"^2Шепард: ^7Для твоего задания – идеально.", +cliffhanger_load,29,31,"^2Рядовой 1-го класса Аллен: ^7Макаров будет наградой.", +cliffhanger_load,31,36,"^2Шепард: ^7Макаров – не награда. Он шавка. Бешеный пес, убивающий направо и налево.", +cliffhanger_load,37,40,"^2Шепард: ^7Помни легенду – это залог твоего выживания.", +cliffhanger_load,41,44.42,"\n\n^2Шепард: ^7Это отряд 141 – добро пожаловать в ряды лучших бойцов планеты!", +cliffhanger_load,44.42,45.5,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141\n\n^2Шепард: ^7Это отряд 141 – добро пожаловать в ряды лучших бойцов планеты!", +cliffhanger_load,45.5,46,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141\nСЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН\n^2Шепард: ^7Это отряд 141 – добро пожаловать в ряды лучших бойцов планеты!", +cliffhanger_load,46,49.1,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141\nСЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН\n^2Рядовой 1-го класса Аллен: ^7Благодарю, сэр. Когда я увижу остальных?", +cliffhanger_load,49.1,49.3,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141\n\n^2Рядовой 1-го класса Аллен: ^7Благодарю, сэр. Когда я увижу остальных?", +cliffhanger_load,49.3,54,"\n\n^2Шепард: ^7Они на задании. Цель – модуль автоматической системы контроля в тылу врага.", +cliffhanger_load,54,56,"\n\n^2Рядовой 1-го класса Аллен: ^7По колено в воде?", +cliffhanger_load,56,59,"\n\n^2Шепард: ^7Я бы сказал, на жестоком холоде.", +contingency_load,1.7,2.8,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141", +contingency_load,2.8,6.4,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141\nСЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН", +contingency_load,6.4,6.6,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141", +contingency_load,12,14,"^2Капитан Мактавиш: ^7Соединение почти установлено.", +contingency_load,16.3,19,"^2Капитан Мактавиш: ^7Генерал Шепард, на связи капитан Прайс.", +contingency_load,20,22,"^2Шепард: ^7С возвращением с того света, капитан.", +contingency_load,22,24,"^2Капитан Прайс: ^7Да уж, как у чёрта со сковороды…", +contingency_load,24,27,"^2Капитан Прайс: ^7Этот мир превращается в настоящий ад.", +contingency_load,28,31,"^2Шепард: ^7Мы надеялись вернуть модуль до того, как русские его взломают.", +contingency_load,32,33,"^2Шепард: ^7Мы ошиблись.", +contingency_load,33.6,38,"^2Шепард: ^7После этого Макаров атаковал США. Теперь всё вокруг в огне.", +contingency_load,39,41,"^2Шепард: ^7Что ты мне передаёшь?", +contingency_load,41.6,46,"^2Капитан Прайс: ^7Чтобы потушить горящую нефть, сэр, обычно рядом с пожаром устраивают взрыв.", +contingency_load,46,48.2,"^2Капитан Прайс: ^7Убрать кислород – и пламя погаснет.", +contingency_load,49,54,"^2Шепард: ^7Прайс, похоже, ты переутомился. Приди в себя, не говори ерунды, сынок.", +contingency_load,55,58,"^2Капитан Прайс: ^7Шепард, ты готов сделать то, что нужно для победы?", +contingency_load,58.6,60,"^2Шепард: ^7Конечно.", +contingency_load,60.5,65,"^2Капитан Прайс: ^7Назревает большой пожар. Взрыв должен быть не меньше.", +contingency_load,66,70.2,"^2Шепард: ^7Ты слишком долго был в русской колонии, Прайс. Займись Макаровым.", +contingency_load,71,72.12,"^5ЯДЕРНЫЙ АРСЕНАЛ НОСИТЕЛЕЙ: ••••••••••••••\n^2Капитан Прайс: ^7Нет времени, сэр. Войну надо закончить сегодня.", +contingency_load,72.12,73,"^5ЯДЕРНЫЙ АРСЕНАЛ НОСИТЕЛЕЙ: 16 МЕГАТОНН\n^2Капитан Прайс: ^7Нет времени, сэр. Войну надо закончить сегодня.", +contingency_load,73,76,"^5ЯДЕРНЫЙ АРСЕНАЛ НОСИТЕЛЕЙ: 16 МЕГАТОНН\n^2Шепард: ^7Это не просьба, Прайс. Это приказ! Ты д…", +contingency_load,77.22,78.8,"^5СОЕДИНЕНИЕ РАЗОРВАНО", +contingency_load,78.8,82,"^5СОЕДИНЕНИЕ РАЗОРВАНО\n^2Капитан Прайс: ^7Хм. Кажется, связь оборвалась...", +dcburning_load,8,18,"^2 ^7ЖИТЕЛЯМ ОКРУГА ПРИНС-ДЖОРДЖЕС НАДЛЕЖИТ ПРОСЛЕДОВАТЬ В УПРАВЛЕНИЕ ЗДРАВООХРАНЕНИЯ, РАСПОЛОЖЕННОЕ ПО АДРЕСУ КЕРКВУД-АВЕНЮ, 147. ",1 +dcburning_load,18,27,^2 ^7МАШИНЫ ОТЪЕЗЖАЮТ ОТ СТУДЕНЧЕСКОГО ГОРОДКА МУНИЦИПАЛЬНОГО КОЛЛЕДЖА КАЖДЫЕ 15 МИНУТ. /// ПРОВОДИТСЯ ЭКСТРЕННАЯ ЭВАКУАЦИЯ. /// ,1 +dcburning_load,27,36,^2 ^7НЕЗАМЕДЛИТЕЛЬНО ПРОСЛЕДУЙТЕ В БЛИЖАЙШЕЕ УБЕЖИЩЕ. ТАМ ВАС БУДУТ ЖДАТЬ ПРЕДСТАВИТЕЛИ ВООРУЖЕННЫХ СИЛ. ,1 +dcburning_load,36,44,^2 ^7ПРИ СЕБЕ ИМЕТЬ УДОСТОВЕРЕНИЕ ЛИЧНОСТИ И НЕ БОЛЕЕ ОДНОГО ПРЕДМЕТА БАГАЖА НА ЧЕЛОВЕКА. /// СМОТРИТЕ ПО СТОРОНАМ. БУДЬТЕ ВНИМАТЕЛЬНЫ.,1 +dcemp_load,1.7,2.8,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141", +dcemp_load,2.8,6.4,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141\nСЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН", +dcemp_load,6.4,6.6,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141", +dcemp_load,12,15.02,"^5США, ШТАТ КОЛОРАДО", +dcemp_load,16,20.13,"^5ГОРА ШАЙЕНН, ГОРОД КОЛОРАДО-СПРИНГС\nКОМАНДОВАНИЕ ВОЗДУШНО-КОСМИЧЕСКОЙ ОБОРОНЫ\nСЕВЕРНОЙ АМЕРИКИ", +dcemp_load,27,31.5,"^2Министр обороны: ^7Джентльмены, по нашим расчетам, цель ракеты – восточное побережье. Под угрозой Белый дом.", +dcemp_load,32,35,"^2Шепард: ^7Мы восстановим его. Это не в первый раз.", +dcemp_load,36,37,"^2Министр обороны: ^7Потери?", +dcemp_load,37.8,45,"^2Шепард: ^7В зависимости от места взрыва от 30 до 50 тысяч. Плюс отказ всей техники.", +dcemp_load,46,49,"^2Министр обороны: ^7А ведь вы нас предупреждали, генерал Шепард…", +dcemp_load,49.5,55,^2Шепард: ^7Не будем о прошлом. Мы просто не можем оставить такой удар без ответа., +dcemp_load,55.2,61,^2Шепард: ^7И мы знаем имя виновного. Нужно добраться до Макарова., +dcemp_load,61.8,66,"^2Министр обороны: ^7Даю вам полный карт-бланш, генерал. Задействуйте любые ресурсы.", +estate_load,1.7,2.8,"^3РЕЙНДЖЕРЫ АРМИИ США", +estate_load,2.8,6.4,"^3РЕЙНДЖЕРЫ АРМИИ США\nРЯДОВОЙ ДЖЕЙМС РАМИРЕС", +estate_load,6.4,6.6,"^3РЕЙНДЖЕРЫ АРМИИ США", +estate_load,7,12,"\n\n^2Шепард: ^7Это была тяжёлая неделя, джентльмены. Мы потеряли больше, чем рассчитывали. Мы восстановим силы.", +estate_load,12.9,14,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141", +estate_load,14,16,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141\nСЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН", +estate_load,16,17.6,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141\nСЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН\n^2Шепард: ^7У нас карт-бланш, и мы сделаем всё, чтобы убить Макарова.", +estate_load,17.6,17.8,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141\n\n^2Шепард: ^7У нас карт-бланш, и мы сделаем всё, чтобы убить Макарова.", +estate_load,17.8,20.3,"\n\n^2Шепард: ^7У нас карт-бланш, и мы сделаем всё, чтобы убить Макарова.", +estate_load,22,28,"\n\n^2Шепард: ^7Кто бы что ни говорил, мы совсем не варвары. Мы не убиваем гражданских. Бьём точно в цель.", +estate_load,30,34,"\n\n^2Шепард: ^7Этот преступник ушёл в тень, но мы вытащим его на свет.", +estate_load,34.7,38,"\n\n^2Шепард: ^7Откроем его истинное лицо, и будем сами писать историю, друзья.", +estate_load,42.5,45.8,"\n\n^2Шепард: ^7Для Макарова и его людей во всём мире остались только эти два убежища.", +estate_load,45.8,46.2,"^5КАВКАЗСКИЕ ГОРЫ | АФГАНИСТАН\n\n^2Шепард: ^7Для Макарова и его людей во всём мире остались только эти два убежища.", +estate_load,46.2,47,"^5КАВКАЗСКИЕ ГОРЫ | АФГАНИСТАН\n\n", +estate_load,47,49.3,"^5КАВКАЗСКИЕ ГОРЫ | АФГАНИСТАН\n\n^2Капитан Прайс: ^7Получается, нужно быть в двух местах сразу.", +estate_load,49.3,50,"^51) „ОСОБНЯК“ ВЕРОЯТНОЕ УБЕЖИЩЕ МАКАРОВА (Российско-грузинская граница)\n\n", +estate_load,50,51,"^51) „ОСОБНЯК“ ВЕРОЯТНОЕ УБЕЖИЩЕ МАКАРОВА (Российско-грузинская граница)\n\n^2Шепард: ^7Невозможно?", +estate_load,51,53,"^51) „ОСОБНЯК“ ВЕРОЯТНОЕ УБЕЖИЩЕ МАКАРОВА (Российско-грузинская граница)\n2) „КЛАДБИЩЕ“ СВАЛКА САМОЛЕТОВ АРМИИ США №437 (Место заключения оружейной сделки)\n^2Капитан Прайс: ^7Только не для 1-4-1.", +estate_load,53,55.4,"^51) „ОСОБНЯК“ ВЕРОЯТНОЕ УБЕЖИЩЕ МАКАРОВА (Российско-грузинская граница)\n2) „КЛАДБИЩЕ“ СВАЛКА САМОЛЕТОВ АРМИИ США №437 (Место заключения оружейной сделки)\n^2Гоуст: ^7Шансы убить Макарова 50 на 50, да?", +estate_load,55.4,56,"^51) „ОСОБНЯК“ ВЕРОЯТНОЕ УБЕЖИЩЕ МАКАРОВА (Российско-грузинская граница)\n2) „КЛАДБИЩЕ“ СВАЛКА САМОЛЕТОВ АРМИИ США №437 (Место заключения оружейной сделки)", +estate_load,56,59,"^51) „ОСОБНЯК“ ВЕРОЯТНОЕ УБЕЖИЩЕ МАКАРОВА (Российско-грузинская граница)\n2) „КЛАДБИЩЕ“ СВАЛКА САМОЛЕТОВ АРМИИ США №437 (Место заключения оружейной сделки)\n^2Гоуст: ^7Капитан Прайс, прошу разрешения взять логово вместе с Роучем.", +estate_load,59,59.8,"^51) „ОСОБНЯК“ ВЕРОЯТНОЕ УБЕЖИЩЕ МАКАРОВА (Российско-грузинская граница)\n2) „КЛАДБИЩЕ“ СВАЛКА САМОЛЕТОВ АРМИИ США №437 (Место заключения оружейной сделки)", +estate_load,59.8,63,"^51) „ОСОБНЯК“ ВЕРОЯТНОЕ УБЕЖИЩЕ МАКАРОВА (Российско-грузинская граница)\n2) „КЛАДБИЩЕ“ СВАЛКА САМОЛЕТОВ АРМИИ США №437 (Место заключения оружейной сделки)\n^2Капитан Прайс: ^7Разрешаю. Мы с Соупом возьмём свалку в Афганистане.", +estate_load,63,63.3,"^51) „ОСОБНЯК“ ВЕРОЯТНОЕ УБЕЖИЩЕ МАКАРОВА (Российско-грузинская граница)\n2) „КЛАДБИЩЕ“ СВАЛКА САМОЛЕТОВ АРМИИ США №437 (Место заключения оружейной сделки)", +estate_load,63.3,66,"^51) „ОСОБНЯК“ ВЕРОЯТНОЕ УБЕЖИЩЕ МАКАРОВА (Российско-грузинская граница)\n2) „КЛАДБИЩЕ“ СВАЛКА САМОЛЕТОВ АРМИИ США №437 (Место заключения оружейной сделки)\n^2Шепард: ^7Хорошо. Мы отрежем им все пути к отступлению. Сегодня всё закончится.", +estate_load,66,69,"\n\n^2Шепард: ^7Хорошо. Мы отрежем им все пути к отступлению. Сегодня всё закончится.", +estate_load,70,74,"\n\n^2Капитан Прайс: ^7Странно. Я думал, всё закончилось ещё вчера.", +favela_escape_load,1.7,2.8,"^3РЕЙНДЖЕРЫ АРМИИ США", +favela_escape_load,2.8,6.4,"^3РЕЙНДЖЕРЫ АРМИИ США\nРЯДОВОЙ ДЖЕЙМС РАМИРЕС", +favela_escape_load,6.4,6.6,"^3РЕЙНДЖЕРЫ АРМИИ США", +favela_escape_load,15.14,16.24,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141", +favela_escape_load,16.24,19.84,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141\nСЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН", +favela_escape_load,19.84,20.04,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141", +favela_escape_load,28.3,30.5,^2Гоуст: ^7Не могу установить связь., +favela_escape_load,38,42.5,^2Капитан Мактавиш: ^7Русские скопировали модуль автоматической системы контроля. Могут открыть любой замок в Америке!, +favela_escape_load,42.5,48,"^2Гоуст: ^7И они намерены отомстить за каждого убитого в Москве. Похоже, у нас совсем не осталось друзей.", +favela_escape_load,49.2,53,"^2Капитан Мактавиш: ^7Я знаю его. Надо найти таксофон, если они ещё существуют.", +favela_escape_load,53.3,59,"^2Гоуст: ^7От Рохаса мы узнали, что единственный человек, которого Макаров ненавидит больше, чем американцев, сидит в тюрьме.", +favela_escape_load,59.5,66,"^2Капитан Мактавиш: ^7Это всё, что у нас есть. Если тот зэк – наживка для поимки этого психопата, туда ему и дорога.", +favela_load,1.7,2.8,"^1ЦРУ: ОПЕРАЦИЯ ПОД ПРИКРЫТИЕМ", +favela_load,2.8,4.6,"^1ЦРУ: ОПЕРАЦИЯ ПОД ПРИКРЫТИЕМ\nАЛЕКСЕЙ БОРОДИН", +favela_load,4.6,5.06,"^1ЦРУ: ОПЕРАЦИЯ ПОД ПРИКРЫТИЕМ", +favela_load,5.06,5.56,"^1ЦРУ: ОПЕРАЦИЯ ПОД ПРИКРЫТИЕМ\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n", +favela_load,5.56,5.93,"^1ЦРУ: ОПЕРАЦИЯ ПОД ПРИКРЫТИЕМ\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\nСТАТУС: ПОГИБ В БОЮ", +favela_load,5.93,6.3,"^1ЦРУ: ОПЕРАЦИЯ ПОД ПРИКРЫТИЕМ\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n", +favela_load,6.3,6.67,"^1ЦРУ: ОПЕРАЦИЯ ПОД ПРИКРЫТИЕМ\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\nСТАТУС: ПОГИБ В БОЮ", +favela_load,6.67,7.04,"^1ЦРУ: ОПЕРАЦИЯ ПОД ПРИКРЫТИЕМ\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n", +favela_load,7.04,7.3,"^1ЦРУ: ОПЕРАЦИЯ ПОД ПРИКРЫТИЕМ\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\nСТАТУС: ПОГИБ В БОЮ", +favela_load,7.3,7.41,"^1\n\nСТАТУС: ПОГИБ В БОЮ", +favela_load,9,9.36,"^1РЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\nСТАТУС: ПОГИБ В БОЮ", +favela_load,9.36,9.72,"^1РЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n", +favela_load,9.72,10.08,"^1РЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\nСТАТУС: ПОГИБ В БОЮ", +favela_load,10.08,10.44,"^1РЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n", +favela_load,10.44,10.8,"^1РЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\nСТАТУС: ПОГИБ В БОЮ", +favela_load,10.8,11.16,"^1РЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n", +favela_load,11.16,11.52,"^1РЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\nСТАТУС: ПОГИБ В БОЮ", +favela_load,11.52,11.88,"^1РЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\n", +favela_load,11.88,12.3,"^1РЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН\nСТАТУС: ПОГИБ В БОЮ", +favela_load,12.37,13,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141", +favela_load,13,13.47,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141\n\n^2Гоуст: ^7Русские не оставят эту резню без ответа. Прольётся много крови.", +favela_load,13.47,16.5,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141\nСЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН\n^2Гоуст: ^7Русские не оставят эту резню без ответа. Прольётся много крови.", +favela_load,16.5,17,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141\nСЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН\n", +favela_load,17,17.27,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141\n\n^2Капитан Мактавиш: ^7Ты прав как никогда, приятель. Сейчас для всего мира они – жертвы.", +favela_load,17.27,20,"\n\n^2Капитан Мактавиш: ^7Ты прав как никогда, приятель. Сейчас для всего мира они – жертвы.", +favela_load,20,22.84,"^5СПИСОК ПОГИБШИХ И РАНЕНЫХ\n\n^2Капитан Мактавиш: ^7Никто и слова не скажет, если русские порешают каждого американца, до которого смогут добраться.", +favela_load,22.84,24.3,"^5СПИСОК ПОГИБШИХ И РАНЕНЫХ\nДЖОЗЕФ АЛЛЕН | 22 ГОДА | ИТАКА, ШТАТ НЬЮ-ЙОРК | ЦРУ\n^2Капитан Мактавиш: ^7Никто и слова не скажет, если русские порешают каждого американца, до которого смогут добраться.", +favela_load,24.3,25.6,"^5СПИСОК ПОГИБШИХ И РАНЕНЫХ\nДЖОЗЕФ АЛЛЕН | 22 ГОДА | ИТАКА, ШТАТ НЬЮ-ЙОРК | ЦРУ\n^2Шепард: ^7Макаров оказался на шаг впереди. Он повесил на американца тысячи трупов.", +favela_load,25.6,30,"\n\n^2Шепард: ^7Макаров оказался на шаг впереди. Он повесил на американца тысячи трупов.", +favela_load,31,36.9,"\n\n^2Капитан Мактавиш: ^7Только мы знаем, что это организовал Макаров, не ЦРУ. После Аллена нам никто не поверит. Нужны доказательства.", +favela_load,36.9,37.3,"^5НАЙДЕНО СОВПАДЕНИЕ\nМЕСТО ИЗГОТОВЛЕНИЯ: БРАЗИЛИЯ\n", +favela_load,37.3,39.3,"^5НАЙДЕНО СОВПАДЕНИЕ\nМЕСТО ИЗГОТОВЛЕНИЯ: БРАЗИЛИЯ\n^2Шепард: ^7Пойдём по следу.", +favela_load,39.3,40.7,"^5НАЙДЕНО СОВПАДЕНИЕ\nМЕСТО ИЗГОТОВЛЕНИЯ: БРАЗИЛИЯ\n", +favela_load,45,47,"^5ПОМОЩНИК РОХАСА | АЛЕХАНДРО РОХАС\n^2Шепард: ^7Алехандро Рохас.", +favela_load,47,47.3,"^5ПОМОЩНИК РОХАСА | АЛЕХАНДРО РОХАС\n", +favela_load,48.5,50,"^2Капитан Мактавиш: ^7Не знаю такого, сэр.", +favela_load,50,53,"^2Шепард: ^7Он же Алекс Красный. Он снабдил их оружием перед нападанием.", +favela_load,54,59,"^2Капитан Мактавиш: ^7Одна пуля становится причиной ярости целого государства. А это значит…", +favela_load,59,61,"^2Шепард: ^7Это наш ключ к Макарову.", +gulag_load,1.7,2.8,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141", +gulag_load,2.8,6.4,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141\nСЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН", +gulag_load,6.4,6.6,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141", +gulag_load,15.8,19,"^2Капитан Мактавиш: ^7Шестой флот начинает зачистку. Пора.", +gulag_load,20.7,24,"^2Капитан Мактавиш: ^7Строение с долгой историей. Долгой и печальной.", +gulag_load,24,28,"^2Капитан Мактавиш: ^7Когда-то это был замок. Настоящая крепость, твердыня, готовая выдержать любой удар.", +gulag_load,28.8,33.2,"^2Капитан Мактавиш: ^7Оно пережило немало суровых зим. Чего не скажешь о его жителях.", +gulag_load,34,37,"^2Капитан Мактавиш: ^7Монастырь. Где живут совсем не монахи.", +gulag_load,37,41,"^2Капитан Мактавиш: ^7Последние сто лет здесь держат тех, кто неугоден правительству, но кого нельзя убить.", +gulag_load,43,48,"^2Капитан Мактавиш: ^7Внутри полно выживших жертв последней войны… в которой, клянусь, я думал, мы победили…", +gulag_load,48,53,"^2Капитан Мактавиш: ^7Но, похоже, в политике, как на ипподроме: поставишь не на ту лошадь – и окажешься здесь.", +gulag_load,53.8,58,^2Капитан Мактавиш: ^7Макарову нужен номер 6-2-7. Вот за ним мы и пришли., +intro_credits_load,5.50,7.8,"^2„ДЛЯ ЗАПИСИ“", +intro_credits_load,20,22,"^2САС: ^7Это новичок, сэр.", +intro_credits_load,25,29,"^2Капитан Прайс: ^7Да, что у тебя за имя такое дурацкое, Соуп?", +intro_credits_load,43.5,45.2,"^1Аль-Асад: ^7Война – это искусство обмана.", +intro_credits_load,48.5,51.8,^2Капитан Прайс: ^7Николай сейчас в аду. Проводим его!, +intro_credits_load,51.8,54,^2Капитан Прайс: ^7Мы позаботимся о наших друзьях. Уходим!, +intro_credits_load,64,67,^2Капитан Прайс: ^7Захаев. Имран Захаев., +intro_credits_load,78,82,^1Захаев: ^7Моя кровь – на их руках., +intro_credits_load,89,93.5,"^2Капитан Прайс: ^7D1X, выпущена ракета, повторяю, выпущена…", +intro_credits_load,121.58,125.58,"^25 ЛЕТ СПУСТЯ", +invasion_load,1.7,2.8,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141", +invasion_load,2.8,6.4,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141\nСЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН", +invasion_load,6.4,6.6,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141", +invasion_load,15.15,16.1,"^3РЕЙНДЖЕРЫ АРМИИ США", +invasion_load,16.1,19.85,"^3РЕЙНДЖЕРЫ АРМИИ США\nРЯДОВОЙ ДЖЕЙМС РАМИРЕС", +invasion_load,19.85,20.05,"^3РЕЙНДЖЕРЫ АРМИИ США", +invasion_load,22,23.5,"^3\nНа связи НОРАД (командование воздушно-космической обороны)\n^2Штаб-квартира НОРАД: ^7Сэнд Браво, мы засекли 70 самолетов противника в вашем квадрате. Подтвердите.", +invasion_load,23.5,26.5,"^3Система контроля воздушного пространства: АКТИВНА…\nНа связи НОРАД (командование воздушно-космической обороны)\n^2Штаб-квартира НОРАД: ^7Сэнд Браво, мы засекли 70 самолетов противника в вашем квадрате. Подтвердите.", +invasion_load,26.5,27,"^3Система контроля воздушного пространства: АКТИВНА…\nНа связи НОРАД (командование воздушно-космической обороны)\n", +invasion_load,27,31.5,"^3Система контроля воздушного пространства: АКТИВНА…\nНа связи НОРАД (командование воздушно-космической обороны)\n^2База Ноум: ^7Очень смешно. Нет, не подтверждаем.", +invasion_load,31.5,31.516,"^3Система контроля воздушного пространства: АКТИВНА…\nНа связи НОРАД (командование воздушно-космической обороны\n", +invasion_load,31.516,31.532,"^3Система контроля воздушного пространства: АКТИВНА…\nНа связи НОРАД (командование воздушно-космической оборон\n", +invasion_load,31.532,31.548,"^3Система контроля воздушного пространства: АКТИВНА…\nНа связи НОРАД (командование воздушно-космической оборо\n", +invasion_load,31.548,31.564,"^3Система контроля воздушного пространства: АКТИВНА…\nНа связи НОРАД (командование воздушно-космической обор\n", +invasion_load,31.564,31.58,"^3Система контроля воздушного пространства: АКТИВНА…\nНа связи НОРАД (командование воздушно-космической обо\n", +invasion_load,31.58,31.596,"^3Система контроля воздушного пространства: АКТИВНА…\nНа связи НОРАД (командование воздушно-космической об\n", +invasion_load,31.596,31.612,"^3Система контроля воздушного пространства: АКТИВНА…\nНа связи НОРАД (командование воздушно-космической о\n", +invasion_load,31.612,31.628,"^3Система контроля воздушного пространства: АКТИВНА…\nНа связи НОРАД (командование воздушно-космической \n", +invasion_load,31.628,31.644,"^3Система контроля воздушного пространства: АКТИВНА…\nНа связи НОРАД (командование воздушно-космической\n", +invasion_load,31.644,31.66,"^3Система контроля воздушного пространства: АКТИВНА…\nНа связи НОРАД (командование воздушно-космическо\n", +invasion_load,31.66,31.676,"^3Система контроля воздушного пространства: АКТИВНА…\nНа связи НОРАД (командование воздушно-космическ\n", +invasion_load,31.676,31.692,"^3Система контроля воздушного пространства: АКТИВНА…\nНа связи НОРАД (командование воздушно-космичес\n", +invasion_load,31.692,31.708,"^3Система контроля воздушного пространства: АКТИВНА…\nНа связи НОРАД (командование воздушно-космиче\n", +invasion_load,31.708,31.724,"^3Система контроля воздушного пространства: АКТИВНА…\nНа связи НОРАД (командование воздушно-космич\n", +invasion_load,31.724,31.74,"^3Система контроля воздушного пространства: АКТИВНА…\nНа связи НОРАД (командование воздушно-косми\n", +invasion_load,31.74,31.756,"^3Система контроля воздушного пространства: АКТИВНА…\nНа связи НОРАД (командование воздушно-косм\n", +invasion_load,31.756,31.772,"^3Система контроля воздушного пространства: АКТИВНА…\nНа связи НОРАД (командование воздушно-кос\n", +invasion_load,31.772,31.788,"^3Система контроля воздушного пространства: АКТИВНА…\nНа связи НОРАД (командование воздушно-ко\n", +invasion_load,31.788,31.8,"^3Система контроля воздушного пространства: АКТИВНА…\nНа связи НОРАД (командование воздушно-ко\n", +invasion_load,31.8,31.804,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (командование воздушно-ко\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,31.804,31.82,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (командование воздушно-к\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,31.82,31.836,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (командование воздушно-\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,31.836,31.852,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (командование воздушно\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,31.852,31.868,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (командование воздушн\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,31.868,31.884,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (командование воздуш\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,31.884,31.9,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (командование возду\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,31.9,31.916,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (командование возд\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,31.916,31.932,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (командование воз\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,31.932,31.948,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (командование во\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,31.948,31.964,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (командование в\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,31.964,31.98,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (командование \n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,31.98,31.996,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (командование\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,31.996,32.012,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (командовани\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.012,32.028,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (командован\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.028,32.044,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (командова\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.044,32.06,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (командов\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.06,32.076,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (командо\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.076,32.092,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (команд\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.092,32.108,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (коман\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.108,32.124,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (кома\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.124,32.14,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (кома\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.14,32.156,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (ком\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.156,32.172,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (ко\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.172,32.188,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (к\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.188,32.204,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД (\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.204,32.22,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД \n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.22,32.236,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРАД\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.236,32.252,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОРА\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.252,32.268,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НОР\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.268,32.284,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи НО\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.284,32.3,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи Н\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.3,32.316,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи \n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.316,32.332,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связи\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.332,32.348,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа связ\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.348,32.364,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа свя\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.364,32.38,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа св\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.38,32.396,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа с\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.396,32.412,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа \n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.412,32.428,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nНа\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.428,32.444,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\nН\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,32.444,33.9,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\n\n^2Диспетчер НОРАД: ^7Должно быть, глюк одного из модулей автоконтроля, сэр…", +invasion_load,33.9,34,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\n\n", +invasion_load,34,37.75,"^3Система контроля воздушного пространства: ИДЕТ ДИАГНОСТИКА…\n\n^2Штаб-квартира НОРАД: ^7Сэнд Браво, будем искать поломку в оборудовании.", +invasion_load,37.75,38,"^9Система контроля воздушного пространства: ИДЕТ\n\n^2Штаб-квартира НОРАД: ^7Сэнд Браво, будем искать поломку в оборудовании.", +invasion_load,38,38.25,"^9Система контроля воздушного пространства:\n\n", +invasion_load,38.25,38.5,"^9Система контроля воздушного\n\n", +invasion_load,38.5,38.75,"^9Система контроля\n\n", +invasion_load,38.75,39,"^9Система\n\n", +invasion_load,39,42.4,"\n^2База Ноум: ^7У нас всё чисто. Видно, у вас там радары барахлят. Отбой.", +invasion_load,43,48.3,"\n^2Штаб-квартира НОРАД: ^7Зулу Икс-рей 6, в вашем квадрате обнаружено около 100 неизвестных объектов. Подтвердите.", +invasion_load,49,55,"\n^2База Ванденберг: ^7Не подтверждаем. У нас всё чисто. Даже не знаю, что вам сказать… Может, буря на солнце? Сегодня повышенная солнечная активность.", +invasion_load,55.8,61,"\n^2Штаб-квартира НОРАД: ^7Сьерра Дельта… ох, у нас тут сбой системы контроля… кого-нибудь наблюдаете, приём?", +invasion_load,61.3,63,"\n^2Авиадиспетчер: ^7Они повсюду!", +invasion_load,63,64.9,"\n^2Штаб-квартира НОРАД: ^7Сьерра Дельта, повторите!", +invasion_load,64.9,69,"\n^2Авиадиспетчер: ^7Вижу истребители в секторе I-95!\nКак, чёрт возьми, они туда вообще могли попасть?!", +invasion_load,69,73,"\n^2Штаб-квартира НОРАД: ^7Спокойно! Пробую связаться с ближайшим отрядом в этом секторе.", +invasion_load,73,77,"\n^2Сержант Фоули: ^7…на связи 1-й батальон 75-го полка рейнджеров, это сержант Фоули, замкомандира Хантер 2-1. Как слышно, приём?", +invasion_load,77,77.6,"^3ДИАГНОСТИКА ВЫЯВИЛА НЕИСПРАВНОСТЬ\n^2Сержант Фоули: ^7…на связи 1-й батальон 75-го полка рейнджеров, это сержант Фоули, замкомандира Хантер 2-1. Как слышно, приём?", +invasion_load,77.6,77.95,"\n^2Сержант Фоули: ^7…на связи 1-й батальон 75-го полка рейнджеров, это сержант Фоули, замкомандира Хантер 2-1. Как слышно, приём?", +invasion_load,77.95,78.65,"^3ДИАГНОСТИКА ВЫЯВИЛА НЕИСПРАВНОСТЬ\n^2Сержант Фоули: ^7…на связи 1-й батальон 75-го полка рейнджеров, это сержант Фоули, замкомандира Хантер 2-1. Как слышно, приём?", +invasion_load,78.65,79,"\n^2Сержант Фоули: ^7…на связи 1-й батальон 75-го полка рейнджеров, это сержант Фоули, замкомандира Хантер 2-1. Как слышно, приём?", +invasion_load,79,79.7,"^3ДИАГНОСТИКА ВЫЯВИЛА НЕИСПРАВНОСТЬ\n^2Штаб-квартира НОРАД: ^7Всем постам, спутниковое наблюдение отключено. Система акустического наблюдения и радиолокационная станция тоже не работают.", +invasion_load,79.7,80,"\n^2Штаб-квартира НОРАД: ^7Всем постам, спутниковое наблюдение отключено. Система акустического наблюдения и радиолокационная станция тоже не работают.", +invasion_load,80,80.7,"^3ДИАГНОСТИКА ВЫЯВИЛА НЕИСПРАВНОСТЬ\n^2Штаб-квартира НОРАД: ^7Всем постам, спутниковое наблюдение отключено. Система акустического наблюдения и радиолокационная станция тоже не работают.", +invasion_load,80.7,81,"\n^2Штаб-квартира НОРАД: ^7Всем постам, спутниковое наблюдение отключено. Система акустического наблюдения и радиолокационная станция тоже не работают.", +invasion_load,81,81.64,"^3ДИАГНОСТИКА ВЫЯВИЛА НЕИСПРАВНОСТЬ\n^2Штаб-квартира НОРАД: ^7Всем постам, спутниковое наблюдение отключено. Система акустического наблюдения и радиолокационная станция тоже не работают.", +invasion_load,81.64,81.74,"\n^2Штаб-квартира НОРАД: ^7Всем постам, спутниковое наблюдение отключено. Система акустического наблюдения и радиолокационная станция тоже не работают.", +invasion_load,81.74,81.8,"^3ДИАГНОСТИКА ВЫЯВИЛА НЕИСПРАВНОСТЬ\n^2Штаб-квартира НОРАД: ^7Всем постам, спутниковое наблюдение отключено. Система акустического наблюдения и радиолокационная станция тоже не работают.", +invasion_load,81.8,81.84,"\n^2Штаб-квартира НОРАД: ^7Всем постам, спутниковое наблюдение отключено. Система акустического наблюдения и радиолокационная станция тоже не работают.", +invasion_load,81.84,81.94,"^3ДИАГНОСТИКА ВЫЯВИЛА НЕИСПРАВНОСТЬ\n^2Штаб-квартира НОРАД: ^7Всем постам, спутниковое наблюдение отключено. Система акустического наблюдения и радиолокационная станция тоже не работают.", +invasion_load,81.94,82.04,"\n^2Штаб-квартира НОРАД: ^7Всем постам, спутниковое наблюдение отключено. Система акустического наблюдения и радиолокационная станция тоже не работают.", +invasion_load,82.04,82.07,"^3ДИАГНОСТИКА ВЫЯВИЛА НЕИСПРАВНОСТЬ\n^2Штаб-квартира НОРАД: ^7Всем постам, спутниковое наблюдение отключено. Система акустического наблюдения и радиолокационная станция тоже не работают.", +invasion_load,82.07,87,"\n^2Штаб-квартира НОРАД: ^7Всем постам, спутниковое наблюдение отключено. Система акустического наблюдения и радиолокационная станция тоже не работают.", +oilrig_load,1.7,2.8,"^3РЕЙНДЖЕРЫ АРМИИ США", +oilrig_load,2.8,6.4,"^3РЕЙНДЖЕРЫ АРМИИ США\nРЯДОВОЙ ДЖЕЙМС РАМИРЕС", +oilrig_load,6.4,6.6,"^3РЕЙНДЖЕРЫ АРМИИ США", +oilrig_load,12.2,13.3,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141", +oilrig_load,13.3,16.9,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141\nСЕРЖАНТ ГАРИ «РОУЧ» САНДЕРСОН", +oilrig_load,16.9,17.1,"^5ОПЕРАТИВНО-ТАКТИЧЕСКАЯ ГРУППА 141\n", +oilrig_load,20.8,24,"^2Капитан Мактавиш: ^7Похоже, мы движемся не в том направлении, сэр. Может, вернёмся в бой?", +oilrig_load,24,26,"^2Шепард: ^7Тут для тебя полно работы, Мактавиш.", +oilrig_load,27,33,"^2Шепард: ^7Рад, что ты выбрался из Южной Америки. Объединишься с 6-м флотом. Нанесёте ответный удар.", +oilrig_load,35,42,"^2Шепард: ^7Заключённый 6-2-7. Мы считаем, что именно этого человека ищет Макаров, но не можем до него добраться.", +oilrig_load,45,47,"^2Капитан Мактавиш: ^7Нефтяные вышки, сэр?", +oilrig_load,47,49,^2Шепард: ^7Русские располагают там зенитки., +oilrig_load,50,56,^2Шепард: ^7Нефтяники – это живой щит. Мы не можем просто взять и взорвать вышку. Эта защищена слабее всех., +oilrig_load,58.8,62,"^2Шепард: ^7Ребята, я знаю, что сейчас посылаю вас на смерть…", +oilrig_load,62,67,"^2Капитан Мактавиш: ^7Они охраняют это место – значит, там что-то нужное. Особенно, если мы хотим найти заключённого 6-2-7.", +roadkill_load,1.7,2.8,"^3РЕЙНДЖЕРЫ АРМИИ США", +roadkill_load,2.8,6.4,"^3РЕЙНДЖЕРЫ АРМИИ США\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН", +roadkill_load,6.4,6.6,"^3РЕЙНДЖЕРЫ АРМИИ США", +roadkill_load,8,12.3,^2Шепард: ^7Мы – самая мощная армия в истории человечества., +roadkill_load,13,15,^2Шепард: ^7Каждая битва – наша битва., +roadkill_load,16,21,^2Шепард: ^7Происходящее здесь может иметь далеко идущие последствия… и мы не будем в стороне., +roadkill_load,22,30,"^2Шепард: ^7Ваша судьба сейчас зависит от того, сможете ли вы научиться использовать современные методы ведения войны.", +roadkill_load,30.5,37,"^2Шепард: ^7Мы не можем дать вам свободу. Но мы можем научить вас, как обрести её.", +roadkill_load,37,41.0,"^2Шепард: ^7А это, друзья мои, стоит дороже целой военной базы.", +roadkill_load,42.5,48,"^2Шепард: ^7Конечно, это важно, у кого самая большая дубина. Но не менее важно, кто ею размахивает.", +roadkill_load,49,53,^2Шепард: ^7Пришло время героев. Время легенд., +roadkill_load,54,56,^2Шепард: ^7Историю пишут победители., +roadkill_load,57,59,^2Шепард: ^7За работу., +trainer_load,3.866,5.658,"^7МОСКВА\nРОССИЯ", +trainer_load,5.658,10.159,"^7МОСКВА", +trainer_load,10.7,14,^2Шепард: ^7Что-то меняется… Что-то остается прежним., +trainer_load,15,21,"^2Шепард: ^7Границы сдвигаются, приходят новые игроки, но власть всегда находит себе место.", +trainer_load,24,29,"^2Шепард: ^7Мы сражались плечом к плечу с русскими. Надо было предвидеть, что нас возненавидят за это.", +trainer_load,30,35,"^2Шепард: ^7Историю пишут победители. Лично я думаю, что мы победили.", +trainer_load,37,41,^2Шепард: ^7Но уничтожаешь одного врага – и ему на смену приходит ещё более опасный., +trainer_load,43.8,48,"^2Шепард: ^7Новые страны, новые цели, новая идеология.", +trainer_load,49,52,^2Шепард: ^7Вчерашние враги – нынешние новобранцы., +trainer_load,52,59,"^2Шепард: ^7Учите их сражаться и молитесь, чтобы они тоже не возненавидели вас за это.", +trainer_load,64.27,65.37,"^3РЕЙНДЖЕРЫ АРМИИ США", +trainer_load,65.37,68.97,"^3РЕЙНДЖЕРЫ АРМИИ США\nРЯДОВОЙ 1-ГО КЛАССА ДЖОЗЕФ АЛЛЕН", +trainer_load,68.97,69,"^3РЕЙНДЖЕРЫ АРМИИ США", +trainer_load,70,72,^2Шепард: ^7Новый день – та же хрень., +trainer_load,72.658,72.8,"^3АФГАНИСТАН", +trainer_load,72.8,77,"^3АФГАНИСТАН\n^2Шепард: ^7Вы знаете, чего я ищу, сержант Фоули. Будьте начеку.", +trainer_load,78,82,"^2Сержант Фоули: ^7На полигоне тренируется новый отряд, сэр. Пошлю к вам самого лучшего.", \ No newline at end of file diff --git a/data/zonetool/rus_h2_mod_patch_dc_whitehouse/sounds/dcwhite_cpd_burnitdown.json b/data/zonetool/rus_h2_mod_patch_dc_whitehouse/sounds/dcwhite_cpd_burnitdown.json new file mode 100644 index 00000000..c60ad69b --- /dev/null +++ b/data/zonetool/rus_h2_mod_patch_dc_whitehouse/sounds/dcwhite_cpd_burnitdown.json @@ -0,0 +1,199 @@ +{ + "aliasName": "dcwhite_cpd_burnitdown", + "count": 1, + "head": [ + { + "aliasName": "dcwhite_cpd_burnitdown", + "secondaryAliasName": null, + "chainAliasName": null, + "subtitle": "SUBTITLE_DCWHITE_CPD_BURNITDOWN215", + "mixerGroup": null, + "soundfile": { + "type": 2, + "exists": true, + "totalMsec": 1158, + "isLocalized": true, + "isStreamed": true, + "fileIndex": 0, + "raw": { + "dir": "voiceovers/dcwhite", + "name": "dcwhite_cpd_21_5" + } + }, + "flags": 2162962, + "priority": 17, + "dspBus": "voices_critical", + "volMod": "voices_dialog", + "volMin": 0.6299999952316284, + "volMax": 0.6299999952316284, + "pitchMin": 1.0, + "pitchMax": 1.0, + "distMin": 1.0, + "distMax": 2000.0, + "velocityMin": 0.0, + "probability": 1.0, + "sequence": 1, + "startDelay": 0, + "masterPriority": 100, + "masterPercentage": 0.20000000298023224, + "slavePercentage": 1.0, + "playbackPercentage": 100, + "lfePercentage": 0.0, + "centerPercentage": 0.0, + "poly": 1, + "polyGlobal": 174, + "polyEntityType": 0, + "polyGlobalType": 0, + "envelopMin": 0.0, + "envelopMax": 0.0, + "envelopPercentage": 0.0, + "reverbWetMixOverride": 0.7936999797821045, + "reverbMultiplier": 0.0, + "smartPanDistance2d": 0.0, + "smartPanDistance3d": 0.0, + "smartPanAttenuation3d": 1.0, + "stereo3dAngle": 0, + "stereo3dStart": 0.0, + "stereo3dEnd": 0.0, + "sndContext": null, + "sndCurve": "h2_vo_critical", + "lpfCurve": "h2_vo_critical", + "hpfCurve": "$defaultHpf", + "reverbSendCurve": "h2_vo_critical", + "speakerMap": { + "channelMaps": [ + { + "speakerCount": 2, + "speakers": [ + { + "levels0": 0.5, + "levels1": 0.0, + "numLevels": 1, + "speaker": 0 + }, + { + "levels0": 0.5, + "levels1": 0.0, + "numLevels": 1, + "speaker": 1 + } + ] + }, + { + "speakerCount": 6, + "speakers": [ + { + "levels0": 0.5, + "levels1": 0.0, + "numLevels": 1, + "speaker": 0 + }, + { + "levels0": 0.5, + "levels1": 0.0, + "numLevels": 1, + "speaker": 1 + }, + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 1, + "speaker": 2 + }, + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 1, + "speaker": 3 + }, + { + "levels0": 0.5, + "levels1": 0.0, + "numLevels": 1, + "speaker": 4 + }, + { + "levels0": 0.5, + "levels1": 0.0, + "numLevels": 1, + "speaker": 5 + } + ] + }, + { + "speakerCount": 2, + "speakers": [ + { + "levels0": 1.0, + "levels1": 0.0, + "numLevels": 2, + "speaker": 0 + }, + { + "levels0": 0.0, + "levels1": 1.0, + "numLevels": 2, + "speaker": 1 + } + ] + }, + { + "speakerCount": 6, + "speakers": [ + { + "levels0": 1.0, + "levels1": 0.0, + "numLevels": 2, + "speaker": 0 + }, + { + "levels0": 0.0, + "levels1": 1.0, + "numLevels": 2, + "speaker": 1 + }, + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 2, + "speaker": 2 + }, + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 2, + "speaker": 3 + }, + { + "levels0": 1.0, + "levels1": 0.0, + "numLevels": 2, + "speaker": 4 + }, + { + "levels0": 0.0, + "levels1": 1.0, + "numLevels": 2, + "speaker": 5 + } + ] + } + ], + "isDefault": true, + "name": "" + }, + "allowDoppler": 0, + "dopplerPreset": null, + "unknown": { + "pad": [ + { + "bytes": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "subtype": null + } + ], + "u1": 4, + "u2": 0.0010000000474974513 + } + } + ] +} \ No newline at end of file diff --git a/data/zonetool/sna_h2_mod_patch_af_caves/sounds/afcaves_nkl_goodluck.json b/data/zonetool/sna_h2_mod_patch_af_caves/sounds/afcaves_nkl_goodluck.json new file mode 100644 index 00000000..a77097b6 --- /dev/null +++ b/data/zonetool/sna_h2_mod_patch_af_caves/sounds/afcaves_nkl_goodluck.json @@ -0,0 +1,199 @@ +{ + "aliasName": "afcaves_nkl_goodluck", + "count": 1, + "head": [ + { + "aliasName": "afcaves_nkl_goodluck", + "secondaryAliasName": null, + "chainAliasName": null, + "subtitle": "SUBTITLE_AFCAVES_NKL_GOODLUCK23", + "mixerGroup": null, + "soundfile": { + "type": 2, + "exists": true, + "totalMsec": 4568, + "isLocalized": true, + "isStreamed": true, + "fileIndex": 0, + "raw": { + "dir": "voiceovers/afcaves", + "name": "afcaves_nkl_2_3_r" + } + }, + "flags": 2097562, + "priority": 18, + "dspBus": "voices_critical", + "volMod": "voices_dialog_radio", + "volMin": 0.7936999797821045, + "volMax": 0.7936999797821045, + "pitchMin": 1.0, + "pitchMax": 1.0, + "distMin": 120.0, + "distMax": 600.0, + "velocityMin": 0.0, + "probability": 1.0, + "sequence": 1, + "startDelay": 0, + "masterPriority": 100, + "masterPercentage": 0.20000000298023224, + "slavePercentage": 1.0, + "playbackPercentage": 100, + "lfePercentage": 0.0, + "centerPercentage": 0.0, + "poly": 1, + "polyGlobal": 174, + "polyEntityType": 0, + "polyGlobalType": 0, + "envelopMin": 0.0, + "envelopMax": 0.0, + "envelopPercentage": 0.0, + "reverbWetMixOverride": 0.0, + "reverbMultiplier": 0.0, + "smartPanDistance2d": 0.0, + "smartPanDistance3d": 0.0, + "smartPanAttenuation3d": 1.0, + "stereo3dAngle": 0, + "stereo3dStart": 0.0, + "stereo3dEnd": 0.0, + "sndContext": null, + "sndCurve": "$default", + "lpfCurve": "$default", + "hpfCurve": "$defaultHpf", + "reverbSendCurve": "$default", + "speakerMap": { + "channelMaps": [ + { + "speakerCount": 2, + "speakers": [ + { + "levels0": 1.0, + "levels1": 0.0, + "numLevels": 1, + "speaker": 0 + }, + { + "levels0": 1.0, + "levels1": 0.0, + "numLevels": 1, + "speaker": 1 + } + ] + }, + { + "speakerCount": 6, + "speakers": [ + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 1, + "speaker": 0 + }, + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 1, + "speaker": 1 + }, + { + "levels0": 1.0, + "levels1": 0.0, + "numLevels": 1, + "speaker": 2 + }, + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 1, + "speaker": 3 + }, + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 1, + "speaker": 4 + }, + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 1, + "speaker": 5 + } + ] + }, + { + "speakerCount": 2, + "speakers": [ + { + "levels0": 1.0, + "levels1": 0.0, + "numLevels": 2, + "speaker": 0 + }, + { + "levels0": 0.0, + "levels1": 1.0, + "numLevels": 2, + "speaker": 1 + } + ] + }, + { + "speakerCount": 6, + "speakers": [ + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 2, + "speaker": 0 + }, + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 2, + "speaker": 1 + }, + { + "levels0": 0.5, + "levels1": 0.5, + "numLevels": 2, + "speaker": 2 + }, + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 2, + "speaker": 3 + }, + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 2, + "speaker": 4 + }, + { + "levels0": 0.0, + "levels1": 0.0, + "numLevels": 2, + "speaker": 5 + } + ] + } + ], + "isDefault": false, + "name": "radio" + }, + "allowDoppler": 0, + "dopplerPreset": null, + "unknown": { + "pad": [ + { + "bytes": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "subtype": null + } + ], + "u1": 4, + "u2": 0.0010000000474974513 + } + } + ] +} \ No newline at end of file diff --git a/deps/GSL b/deps/GSL index 2bfd4950..9f85e4e0 160000 --- a/deps/GSL +++ b/deps/GSL @@ -1 +1 @@ -Subproject commit 2bfd4950802a223dde37a08a205812b6dfdfeb61 +Subproject commit 9f85e4e0880bf90d51b8dee15c65386b8e8e9fc2 diff --git a/deps/asmjit b/deps/asmjit index a4cb51b5..8552e286 160000 --- a/deps/asmjit +++ b/deps/asmjit @@ -1 +1 @@ -Subproject commit a4cb51b532af0f8137c4182914244c3b05d7745f +Subproject commit 8552e286c2960d18df0e096166f29a26f2d3c2f1 diff --git a/deps/curl b/deps/curl index af2dac82..1645e9b4 160000 --- a/deps/curl +++ b/deps/curl @@ -1 +1 @@ -Subproject commit af2dac82988f95e10351d13af8d4693ea4175183 +Subproject commit 1645e9b44505abd5cbaf65da5282c3f33b5924a5 diff --git a/deps/extra/gsc-tool/interface.cpp b/deps/extra/gsc-tool/interface.cpp new file mode 100644 index 00000000..218ed650 --- /dev/null +++ b/deps/extra/gsc-tool/interface.cpp @@ -0,0 +1,30 @@ +#include "stdafx.hpp" + +#include + +#include "interface.hpp" + +namespace gsc +{ + std::unique_ptr compiler() + { + auto compiler = std::make_unique(); + compiler->mode(xsk::gsc::build::prod); + return compiler; + } + + std::unique_ptr decompiler() + { + return std::make_unique(); + } + + std::unique_ptr assembler() + { + return std::make_unique(); + } + + std::unique_ptr disassembler() + { + return std::make_unique(); + } +} diff --git a/deps/extra/gsc-tool/interface.hpp b/deps/extra/gsc-tool/interface.hpp new file mode 100644 index 00000000..133e6ae2 --- /dev/null +++ b/deps/extra/gsc-tool/interface.hpp @@ -0,0 +1,9 @@ +#pragma once + +namespace gsc +{ + std::unique_ptr compiler(); + std::unique_ptr decompiler(); + std::unique_ptr assembler(); + std::unique_ptr disassembler(); +} diff --git a/deps/gsc-tool-h2 b/deps/gsc-tool-h2 new file mode 160000 index 00000000..c86b0b53 --- /dev/null +++ b/deps/gsc-tool-h2 @@ -0,0 +1 @@ +Subproject commit c86b0b53921e91a300359f0f4da38e103641ef5a diff --git a/deps/json b/deps/json new file mode 160000 index 00000000..b2306145 --- /dev/null +++ b/deps/json @@ -0,0 +1 @@ +Subproject commit b2306145e1789368e6f261680e8dc007e91cc986 diff --git a/deps/libtomcrypt b/deps/libtomcrypt index 06a81aeb..2a1b2846 160000 --- a/deps/libtomcrypt +++ b/deps/libtomcrypt @@ -1 +1 @@ -Subproject commit 06a81aeb227424182125363f7554fad5146d6d2a +Subproject commit 2a1b284677a51f587ab7cd9d97395e0c0c93a447 diff --git a/deps/libtommath b/deps/libtommath index 5108f123..03de03de 160000 --- a/deps/libtommath +++ b/deps/libtommath @@ -1 +1 @@ -Subproject commit 5108f12350b6daa4aa5dbc846517ad1db2f8388a +Subproject commit 03de03dee753442d4b23166982514639c4ccbc39 diff --git a/deps/lua b/deps/lua index 8426d9b4..cf08915d 160000 --- a/deps/lua +++ b/deps/lua @@ -1 +1 @@ -Subproject commit 8426d9b4d4df1da3c5b2d759e509ae1c50a86667 +Subproject commit cf08915d62e338c987b71c078b148490510e9fe7 diff --git a/deps/minhook b/deps/minhook index 4a455528..49d03ad1 160000 --- a/deps/minhook +++ b/deps/minhook @@ -1 +1 @@ -Subproject commit 4a455528f61b5a375b1f9d44e7d296d47f18bb18 +Subproject commit 49d03ad118cf7f6768c79a8f187e14b8f2a07f94 diff --git a/deps/premake/gsc-tool.lua b/deps/premake/gsc-tool.lua new file mode 100644 index 00000000..0c5367f4 --- /dev/null +++ b/deps/premake/gsc-tool.lua @@ -0,0 +1,68 @@ +gsc_tool = { + source = path.join(dependencies.basePath, "gsc-tool-h2/src") +} + +function gsc_tool.import() + links {"xsk-gsc-h2", "xsk-gsc-utils"} + gsc_tool.includes() +end + +function gsc_tool.includes() + includedirs { + path.join(gsc_tool.source, "utils"), + path.join(gsc_tool.source, "h2"), + path.join(dependencies.basePath, "extra/gsc-tool") -- https://github.com/GEEKiDoS/open-teknomw3/blob/master/deps/extra/gsc-tool + } +end + +-- https://github.com/xensik/gsc-tool/blob/dev/premake5.lua#L95 +function gsc_tool.project() + project "xsk-gsc-utils" + kind "StaticLib" + language "C++" + + pchheader "stdafx.hpp" + pchsource(path.join(gsc_tool.source, "utils/stdafx.cpp")) + + files { + path.join(gsc_tool.source, "utils/**.h"), + path.join(gsc_tool.source, "utils/**.hpp"), + path.join(gsc_tool.source, "utils/**.cpp") + } + + includedirs { + path.join(gsc_tool.source, "utils"), + gsc_tool.source + } + + zlib.includes() + + project "xsk-gsc-h2" + kind "StaticLib" + language "C++" + + pchheader "stdafx.hpp" + pchsource(path.join(gsc_tool.source, "h2/stdafx.cpp")) + + files { + path.join(gsc_tool.source, "h2/**.h"), + path.join(gsc_tool.source, "h2/**.hpp"), + path.join(gsc_tool.source, "h2/**.cpp"), + path.join(dependencies.basePath, "extra/gsc-tool/interface.cpp") + } + + includedirs { + path.join(gsc_tool.source, "h2"), + gsc_tool.source, + path.join(dependencies.basePath, "extra/gsc-tool") + } + + -- https://github.com/xensik/gsc-tool/blob/dev/premake5.lua#L25 + -- adding these build options fixes a bunch of parser stuff + filter "action:vs*" + buildoptions "/bigobj" + buildoptions "/Zc:__cplusplus" + filter {} +end + +table.insert(dependencies, gsc_tool) diff --git a/deps/premake/json.lua b/deps/premake/json.lua new file mode 100644 index 00000000..c060e3a0 --- /dev/null +++ b/deps/premake/json.lua @@ -0,0 +1,17 @@ +json = { + source = path.join(dependencies.basePath, "json") +} + +function json.import() + json.includes() +end + +function json.includes() + includedirs {path.join(json.source, "single_include/*")} +end + +function json.project() + +end + +table.insert(dependencies, json) diff --git a/deps/rapidjson b/deps/rapidjson index fcb23c2d..012be852 160000 --- a/deps/rapidjson +++ b/deps/rapidjson @@ -1 +1 @@ -Subproject commit fcb23c2dbf561ec0798529be4f66394d3e4996d8 +Subproject commit 012be8528783cdbf4b7a9e64f78bd8f056b97e24 diff --git a/deps/sol2 b/deps/sol2 index 64096348..eab1430c 160000 --- a/deps/sol2 +++ b/deps/sol2 @@ -1 +1 @@ -Subproject commit 64096348465b980e2f1d0e5ba9cbeea8782e8f27 +Subproject commit eab1430ccdbf61a0d61d11bf86b4975838dcfb9a diff --git a/deps/stb b/deps/stb index af1a5bc3..8b5f1f37 160000 --- a/deps/stb +++ b/deps/stb @@ -1 +1 @@ -Subproject commit af1a5bc352164740c1cc1354942b1c6b72eacb8a +Subproject commit 8b5f1f37b5b75829fc72d38e7b5d4bcbf8a26d55 diff --git a/deps/zlib b/deps/zlib index 21767c65..04f42cec 160000 --- a/deps/zlib +++ b/deps/zlib @@ -1 +1 @@ -Subproject commit 21767c654d31d2dccdde4330529775c6c5fd5389 +Subproject commit 04f42ceca40f73e2978b50e93806c2a18c1281fc diff --git a/premake5.lua b/premake5.lua index 1818c93c..3b69b2c5 100644 --- a/premake5.lua +++ b/premake5.lua @@ -227,10 +227,12 @@ targetdir "%{wks.location}/bin/%{cfg.platform}/%{cfg.buildcfg}" configurations {"Debug", "Release"} -architecture "x64" +language "C++" +cppdialect "C++20" + +architecture "x86_64" platforms "x64" -buildoptions "/std:c++latest" systemversion "latest" symbols "On" staticruntime "On" @@ -255,7 +257,7 @@ filter {} filter "configurations:Release" optimize "Size" buildoptions {"/GL"} - linkoptions { "/IGNORE:4702", "/LTCG" } + linkoptions {"/IGNORE:4702", "/LTCG"} defines {"NDEBUG"} flags {"FatalCompileWarnings"} filter {} @@ -321,13 +323,3 @@ resincludedirs {"$(ProjectDir)src"} group "Dependencies" dependencies.projects() - -rule "ProtobufCompiler" -display "Protobuf compiler" -location "./build" -fileExtension ".proto" -buildmessage "Compiling %(Identity) with protoc..." -buildcommands {'@echo off', 'path "$(SolutionDir)\\..\\tools"', - 'if not exist "$(ProjectDir)\\src\\proto" mkdir "$(ProjectDir)\\src\\proto"', - 'protoc --error_format=msvs -I=%(RelativeDir) --cpp_out=src\\proto %(Identity)'} -buildoutputs {'$(ProjectDir)\\src\\proto\\%(Filename).pb.cc', '$(ProjectDir)\\src\\proto\\%(Filename).pb.h'} diff --git a/src/client/component/binding.cpp b/src/client/component/binding.cpp index e29c2871..30c3affd 100644 --- a/src/client/component/binding.cpp +++ b/src/client/component/binding.cpp @@ -93,23 +93,49 @@ namespace binding // custom binds return ORIGINAL_BIND_COUNT + get_binding_for_custom_command(command); } + + std::optional get_custom_binding_for_key(int key) + { + key -= ORIGINAL_BIND_COUNT; + + if (static_cast(key) < custom_binds.size() && !custom_binds[key].empty()) + { + return {custom_binds[key]}; + } + + return {}; + } void cl_execute_key_stub(const int local_client_num, int key, const int down, const unsigned int time) { if (key >= ORIGINAL_BIND_COUNT) { - key -= ORIGINAL_BIND_COUNT; - - if (static_cast(key) < custom_binds.size() && !custom_binds[key].empty()) + const auto bind = get_custom_binding_for_key(key); + if (!bind.has_value()) { - game::Cbuf_AddText(local_client_num, utils::string::va("%s\n", custom_binds[key].data())); + return; } - return; + return game::Cbuf_AddText(local_client_num, utils::string::va("%s\n", bind.value().data())); } cl_execute_key_hook.invoke(local_client_num, key, down, time); } + + const char* cmd_get_binding_for_key_stub(unsigned int key) + { + if (key >= ORIGINAL_BIND_COUNT) + { + const auto bind = get_custom_binding_for_key(key); + if (!bind.has_value()) + { + return ""; + } + return utils::string::va("%s", bind.value().data()); + } + + return game::command_whitelist[key]; + } } class component final : public component_interface @@ -125,6 +151,8 @@ namespace binding // execute custom binds cl_execute_key_hook.create(0x1403CF1E0, &cl_execute_key_stub); + + utils::hook::jump(0x14059AE90, cmd_get_binding_for_key_stub); } }; } diff --git a/src/client/component/branding.cpp b/src/client/component/branding.cpp index 42204839..25576b44 100644 --- a/src/client/component/branding.cpp +++ b/src/client/component/branding.cpp @@ -1,11 +1,12 @@ #include #include "loader/component_loader.hpp" + +#include "game/game.hpp" +#include "game/dvars.hpp" + #include "localized_strings.hpp" #include "scheduler.hpp" #include "command.hpp" -#include "game/game.hpp" - -#include "game/ui_scripting/execution.hpp" #include #include @@ -17,18 +18,35 @@ namespace branding { float color[4] = {0.9f, 0.9f, 0.5f, 1.f}; - int get_build_number_stub(game::hks::lua_State* s) + utils::hook::detour ui_get_formatted_build_number_hook; + + const char* ui_get_formatted_build_number_stub() { - ui_scripting::push_value(VERSION); - return 1; + const auto* const build_num = ui_get_formatted_build_number_hook.invoke(); + return utils::string::va("%s (%s)", VERSION, build_num); } void draw() { - const auto font = game::R_RegisterFont("fonts/defaultBold.otf", 22); - game::R_AddCmdDrawText("h2-mod", 0x7FFFFFFF, font, 15.f, - 15.f + static_cast(font->pixelHeight), - 1.f, 1.f, 0.f, color, 0); + const auto font = game::R_RegisterFont("fonts/fira_mono_bold.ttf", 22); + if (!font) + { + return; + } + + const auto placement = game::ScrPlace_GetViewPlacement(); + + game::rectDef_s rect{}; + rect.x = 0; + rect.y = 0; + rect.w = 500; + rect.horzAlign = 1; + rect.vertAlign = 0; + + game::rectDef_s text_rect{}; + + game::UI_DrawWrappedText(placement, "h2-mod", &rect, font, + 5.f, 13.f, 0.20f, color, 0, 0, &text_rect, 0); } } @@ -40,12 +58,8 @@ namespace branding scheduler::loop(draw, scheduler::pipeline::renderer); localized_strings::override("MENU_SP_CAMPAIGN", "H2-MOD"); - localized_strings::override("MENU_SYSINFO_CUSTOMER_SUPPORT_LINK", "Github Page:"); - localized_strings::override("MENU_SYSINFO_CUSTOMER_SUPPORT_URL", "https://github.com/fedddddd/h2-mod"); - localized_strings::override("MENU_SYSINFO_DONATION_LINK", "Donation Link:"); - localized_strings::override("MENU_SYSINFO_DONATION_URL", "https://paypal.me/fedecek"); - utils::hook::jump(0x14033D550, get_build_number_stub, true); + ui_get_formatted_build_number_hook.create(0x1406057D0, ui_get_formatted_build_number_stub); } }; } diff --git a/src/client/component/command.cpp b/src/client/component/command.cpp index 4acdef6a..e833d724 100644 --- a/src/client/component/command.cpp +++ b/src/client/component/command.cpp @@ -8,7 +8,7 @@ #include "command.hpp" #include "scheduler.hpp" -#include "game_console.hpp" +#include "console.hpp" #include "fastfiles.hpp" #include @@ -44,7 +44,12 @@ namespace command return 0; } - const auto dvar = game::Dvar_FindVar(args[0]); + auto dvar = game::Dvar_FindVar(args[0]); + if (dvar == nullptr) + { + const auto hash = static_cast(std::strtoull(args[0], nullptr, 16)); + dvar = game::Dvar_FindMalleableVar(hash); + } if (dvar) { @@ -53,15 +58,25 @@ namespace command const auto current = game::Dvar_ValueToString(dvar, nullptr, &dvar->current); const auto reset = game::Dvar_ValueToString(dvar, nullptr, &dvar->reset); - game_console::print(game_console::con_type_info, "\"%s\" is: \"%s\" default: \"%s\" hash: 0x%08lX", - args[0], current, reset, dvar->name); + const auto info = dvars::get_dvar_info_from_hash(dvar->name); + std::string desc{}; + std::string name = args[0]; - game_console::print(game_console::con_type_info, " %s\n", - dvars::dvar_get_domain(dvar->type, dvar->domain).data()); + if (info.has_value()) + { + name = info.value().name; + desc = info.value().description; + } + + console::info("\"%s\" is: \"%s\" default: \"%s\" hash: 0x%08lX\n", + name.data(), current, reset, dvar->name); + + console::info("%s\n", desc.data()); + console::info(" %s\n", dvars::dvar_get_domain(dvar->type, dvar->domain).data()); } else { - char command[0x1000] = { 0 }; + char command[0x1000] = {0}; game::Dvar_GetCombinedString(command, 1); game::Dvar_SetCommand(dvar->name, "", command); } @@ -161,7 +176,7 @@ namespace command if (!exists) { - game_console::print(game_console::con_type_error, "map '%s' not found\n", map); + console::error("map '%s' not found\n", map); return; } @@ -173,11 +188,11 @@ namespace command { if (params.size() < 2) { - game_console::print(game_console::con_type_info, "listassetpool : list all the assets in the specified pool\n"); + console::info("listassetpool : list all the assets in the specified pool\n"); for (auto i = 0; i < game::XAssetType::ASSET_TYPE_COUNT; i++) { - game_console::print(game_console::con_type_info, "%d %s\n", i, game::g_assetNames[i]); + console::info("%d %s\n", i, game::g_assetNames[i]); } } else @@ -186,11 +201,11 @@ namespace command if (type < 0 || type >= game::XAssetType::ASSET_TYPE_COUNT) { - game_console::print(game_console::con_type_info, "Invalid pool passed must be between [%d, %d]\n", 0, game::XAssetType::ASSET_TYPE_COUNT - 1); + console::info("Invalid pool passed must be between [%d, %d]\n", 0, game::XAssetType::ASSET_TYPE_COUNT - 1); return; } - game_console::print(game_console::con_type_info, "Listing assets in pool %s\n", game::g_assetNames[type]); + console::info("Listing assets in pool %s\n", game::g_assetNames[type]); fastfiles::enum_assets(type, [type](const game::XAssetHeader header) { @@ -198,7 +213,7 @@ namespace command const auto* const asset_name = game::DB_GetXAssetName(&asset); //const auto entry = game::DB_FindXAssetEntry(type, asset_name); //TODO: display which zone the asset is from - game_console::print(game_console::con_type_info, "%s\n", asset_name); + console::info("%s\n", asset_name); }, true); } }); @@ -213,7 +228,7 @@ namespace command { if (cmd->name) { - game_console::print(game_console::con_type_info, "%s\n", cmd->name); + console::info("%s\n", cmd->name); } cmd = cmd->next; @@ -233,7 +248,7 @@ namespace command game::CG_GameMessage(0, utils::string::va("godmode %s", game::g_entities[0].flags & game::FL_GODMODE ? "^2on" - : "^1off")); + : "^1off"), 0); }); add("demigod", []() @@ -247,7 +262,7 @@ namespace command game::CG_GameMessage(0, utils::string::va("demigod mode %s", game::g_entities[0].flags & game::FL_DEMI_GODMODE ? "^2on" - : "^1off")); + : "^1off"), 0); }); add("notarget", []() @@ -261,7 +276,7 @@ namespace command game::CG_GameMessage(0, utils::string::va("notarget %s", game::g_entities[0].flags & game::FL_NOTARGET ? "^2on" - : "^1off")); + : "^1off"), 0); }); add("noclip", []() @@ -275,7 +290,7 @@ namespace command game::CG_GameMessage(0, utils::string::va("noclip %s", game::g_entities[0].client->flags & 1 ? "^2on" - : "^1off")); + : "^1off"), 0); }); add("ufo", []() @@ -287,7 +302,7 @@ namespace command game::g_entities[0].client->flags ^= 2; game::CG_GameMessage( - 0, utils::string::va("ufo %s", game::g_entities[0].client->flags & 2 ? "^2on" : "^1off")); + 0, utils::string::va("ufo %s", game::g_entities[0].client->flags & 2 ? "^2on" : "^1off"), 0); }); add("give", [](const params& params) @@ -299,7 +314,7 @@ namespace command if (params.size() < 2) { - game::CG_GameMessage(0, "You did not specify a weapon name"); + game::CG_GameMessage(0, "You did not specify a weapon name", 0); return; } @@ -309,8 +324,6 @@ namespace command scheduler::once([=]() { - printf("%i\n", game::Sys_IsMainThread()); - try { const scripting::entity player = scripting::call("getentbynum", {0}).as(); @@ -366,7 +379,7 @@ namespace command } else { - game::CG_GameMessage(0, "Weapon does not exist"); + game::CG_GameMessage(0, "Weapon does not exist", 0); } } } @@ -406,7 +419,7 @@ namespace command if (params.size() < 2) { - game::CG_GameMessage(0, "You did not specify a weapon name"); + game::CG_GameMessage(0, "You did not specify a weapon name", 0); return; } @@ -451,6 +464,60 @@ namespace command } }, scheduler::pipeline::server); }); + + add("setviewpos", [](const params& params) + { + if (!game::SV_Loaded()) + { + return; + } + + scripting::vector origin + ( + static_cast(std::atof(params.get(1))), + static_cast(std::atof(params.get(2))), + static_cast(std::atof(params.get(3))) + ); + + scheduler::once([=]() + { + try + { + const scripting::entity player{game::Scr_GetEntityId(0, 0)}; + player.call("setorigin", {origin}); + } + catch (...) + { + } + }, scheduler::pipeline::server); + }); + + add("setviewang", [](const params& params) + { + if (!game::SV_Loaded()) + { + return; + } + + scripting::vector angles + ( + static_cast(std::atof(params.get(1))), + static_cast(std::atof(params.get(2))), + static_cast(std::atof(params.get(3))) + ); + + scheduler::once([=]() + { + try + { + const scripting::entity player{game::Scr_GetEntityId(0, 0)}; + player.call("setplayerangles", {angles}); + } + catch (...) + { + } + }, scheduler::pipeline::server); + }); } }; } diff --git a/src/client/component/config.cpp b/src/client/component/config.cpp new file mode 100644 index 00000000..8d6d4ca8 --- /dev/null +++ b/src/client/component/config.cpp @@ -0,0 +1,149 @@ +#include +#include "loader/component_loader.hpp" + +#include "config.hpp" +#include "console.hpp" +#include "language.hpp" + +#include +#include +#include + +#define OLD_CONFIG_FILE "players2/default/h2_mod.json" + +namespace config +{ + namespace + { + using validate_callback_t = std::function; + + struct field_definition_t + { + field_type type; + field_value default_value; + std::optional validate_value = {}; + }; + + template + std::pair define_field(const std::string& name, Args&&... args) + { + return std::make_pair(name, field_definition_t{std::forward(args)...}); + } + + std::unordered_map field_definitions = + { + {define_field("disable_custom_fonts", field_type::boolean, false)}, + {define_field("language", field_type::string, language::get_default_language(), language::is_valid_language)}, + }; + + std::string get_config_file_path() + { + return (utils::properties::get_appdata_path() / "config.json").generic_string(); + } + } + + nlohmann::json validate_config_field(const std::string& key, const nlohmann::json& value) + { + const auto iter = field_definitions.find(key); + if (iter == field_definitions.end()) + { + return value; + } + + if (value.type() != iter->second.type) + { + return iter->second.default_value; + } + + if (iter->second.validate_value.has_value()) + { + const auto& validate_value = iter->second.validate_value.value(); + if (!validate_value(value)) + { + iter->second.default_value; + } + } + + return value; + } + + std::optional get_default_value(const std::string& key) + { + const auto iter = field_definitions.find(key); + if (iter == field_definitions.end()) + { + return {}; + } + + return {iter->second.default_value}; + } + + nlohmann::json get_raw(const std::string& key) + { + const auto cfg = read_config(); + if (!cfg.is_object() || !cfg.contains(key)) + { + const auto default_value = get_default_value(key); + if (default_value.has_value()) + { + return default_value.value(); + } + + return {}; + } + + return validate_config_field(key, cfg[key]); + } + + void write_config(const nlohmann::json& json) + { + try + { + const auto path = get_config_file_path(); + const auto str = json.dump(4); + utils::io::write_file(path, str, false); + } + catch (const std::exception& e) + { + console::error("Failed to write config file: %s\n", e.what()); + } + } + + nlohmann::json read_config() + { + const auto path = get_config_file_path(); + if (!utils::io::file_exists(path)) + { + return {}; + } + + try + { + const auto data = utils::io::read_file(path); + return nlohmann::json::parse(data); + } + catch (const std::exception& e) + { + console::error("Failed to parse config file: %s\n", e.what()); + utils::io::write_file(path, "{}", false); + } + + return {}; + } + + class component final : public component_interface + { + public: + void post_unpack() override + { + if (utils::io::file_exists(OLD_CONFIG_FILE)) + { + const auto data = utils::io::read_file(OLD_CONFIG_FILE); + utils::io::write_file(get_config_file_path(), data); + utils::io::remove_file(OLD_CONFIG_FILE); + } + } + }; +} + +REGISTER_COMPONENT(config::component) diff --git a/src/client/component/config.hpp b/src/client/component/config.hpp new file mode 100644 index 00000000..57cbb339 --- /dev/null +++ b/src/client/component/config.hpp @@ -0,0 +1,42 @@ +#pragma once + +namespace config +{ + typedef nlohmann::json::value_t field_type; + typedef nlohmann::json field_value; + + nlohmann::json read_config(); + void write_config(const nlohmann::json& json); + + nlohmann::json validate_config_field(const std::string& key, const field_value& value); + std::optional get_default_value(const std::string& key); + + template + std::optional get(const std::string& key) + { + const auto cfg = read_config(); + if (!cfg.is_object() || !cfg.contains(key)) + { + const auto default_value = get_default_value(key); + if (default_value.has_value()) + { + return {default_value.value()}; + } + + return {}; + } + + const auto value = validate_config_field(key, cfg[key]); + return {value.get()}; + } + + nlohmann::json get_raw(const std::string& key); + + template + void set(const std::string& key, const T& value) + { + auto cfg = read_config(); + cfg[key] = validate_config_field(key, value); + write_config(cfg); + } +} diff --git a/src/client/component/console.cpp b/src/client/component/console.cpp index 63bcaebd..422927f5 100644 --- a/src/client/component/console.cpp +++ b/src/client/component/console.cpp @@ -1,50 +1,417 @@ #include +#include "console.hpp" #include "loader/component_loader.hpp" +#include "game/game.hpp" + #include "command.hpp" #include "game_console.hpp" -#include "game/game.hpp" -#include "game/dvars.hpp" - #include #include +#define OUTPUT_HANDLE GetStdHandle(STD_OUTPUT_HANDLE) + +namespace game_console +{ + void print(int type, const std::string& data); +} + namespace console { namespace { - std::thread console_thread; - bool kill = false; + utils::hook::detour printf_hook; + std::recursive_mutex print_mutex; + + struct + { + bool kill; + std::thread thread; + HANDLE kill_event; + char buffer[512]{}; + int cursor; + std::deque history; + std::int32_t history_index = -1; + } con{}; + + void set_cursor_pos(int x) + { + CONSOLE_SCREEN_BUFFER_INFO info{}; + GetConsoleScreenBufferInfo(OUTPUT_HANDLE, &info); + info.dwCursorPosition.X = static_cast(x); + SetConsoleCursorPosition(OUTPUT_HANDLE, info.dwCursorPosition); + } + + void show_cursor(const bool show) + { + CONSOLE_CURSOR_INFO info{}; + GetConsoleCursorInfo(OUTPUT_HANDLE, &info); + info.bVisible = show; + SetConsoleCursorInfo(OUTPUT_HANDLE, &info); + } + + template + int invoke_printf(const char* fmt, Args&&... args) + { + if (printf_hook.get_original() == nullptr) + { + return printf(fmt, std::forward(args)...); + } + + return printf_hook.invoke(fmt, std::forward(args)...); + } + + std::string format(va_list* ap, const char* message) + { + static thread_local char buffer[0x1000]; + + const auto count = _vsnprintf_s(buffer, sizeof(buffer), sizeof(buffer), message, *ap); + if (count < 0) + { + return {}; + } + + return {buffer, static_cast(count)}; + } + + uint8_t get_attribute(const int type) + { + switch (type) + { + case con_type_info: + return 7; // white + case con_type_warning: + return 6; // yellow + case con_type_error: + return 4; // red + case con_type_debug: + return 3; // cyan + } + + return 7; + } + + void update() + { + std::lock_guard _0(print_mutex); + + show_cursor(false); + set_cursor_pos(0); + invoke_printf("%s", con.buffer); + set_cursor_pos(con.cursor); + show_cursor(true); + } + + void clear_output() + { + std::lock_guard _0(print_mutex); + + show_cursor(false); + set_cursor_pos(0); + + for (auto i = 0; i < std::strlen(con.buffer); i++) + { + invoke_printf(" "); + } + + set_cursor_pos(con.cursor); + show_cursor(true); + } + + int dispatch_message(const int type, const std::string& message) + { + std::lock_guard _0(print_mutex); + + clear_output(); + set_cursor_pos(0); + + SetConsoleTextAttribute(OUTPUT_HANDLE, get_attribute(type)); + const auto res = invoke_printf("%s", message.data()); + SetConsoleTextAttribute(OUTPUT_HANDLE, get_attribute(con_type_info)); + + game_console::print(type, message); + + if (message.size() <= 0 || message[message.size() - 1] != '\n') + { + invoke_printf("\n"); + } + + update(); + return res; + } + + void clear() + { + std::lock_guard _0(print_mutex); + + clear_output(); + strncpy_s(con.buffer, "", sizeof(con.buffer)); + + con.cursor = 0; + set_cursor_pos(0); + } + + size_t get_max_input_length() + { + CONSOLE_SCREEN_BUFFER_INFO info{}; + GetConsoleScreenBufferInfo(OUTPUT_HANDLE, &info); + const auto columns = static_cast(info.srWindow.Right - info.srWindow.Left - 1); + return std::max(size_t(0), std::min(columns, sizeof(con.buffer))); + } + + void handle_resize() + { + clear(); + update(); + } + + void handle_input(const INPUT_RECORD record) + { + if (record.EventType == WINDOW_BUFFER_SIZE_EVENT) + { + handle_resize(); + return; + } + + if (record.EventType != KEY_EVENT || !record.Event.KeyEvent.bKeyDown) + { + return; + } + + std::lock_guard _0(print_mutex); + + const auto key = record.Event.KeyEvent.wVirtualKeyCode; + switch (key) + { + case VK_UP: + { + if (++con.history_index >= con.history.size()) + { + con.history_index = static_cast(con.history.size()) - 1; + } + + clear(); + + if (con.history_index != -1) + { + strncpy_s(con.buffer, con.history.at(con.history_index).data(), sizeof(con.buffer)); + con.cursor = static_cast(strlen(con.buffer)); + } + + update(); + break; + } + case VK_DOWN: + { + if (--con.history_index < -1) + { + con.history_index = -1; + } + + clear(); + + if (con.history_index != -1) + { + strncpy_s(con.buffer, con.history.at(con.history_index).data(), sizeof(con.buffer)); + con.cursor = static_cast(strlen(con.buffer)); + } + + update(); + break; + } + case VK_LEFT: + { + if (con.cursor > 0) + { + con.cursor--; + set_cursor_pos(con.cursor); + } + + break; + } + case VK_RIGHT: + { + if (con.cursor < std::strlen(con.buffer)) + { + con.cursor++; + set_cursor_pos(con.cursor); + } + + break; + } + case VK_RETURN: + { + if (con.history_index != -1) + { + const auto itr = con.history.begin() + con.history_index; + + if (*itr == con.buffer) + { + con.history.erase(con.history.begin() + con.history_index); + } + } + + if (con.buffer[0]) + { + con.history.push_front(con.buffer); + } + + if (con.history.size() > 10) + { + con.history.erase(con.history.begin() + 10); + } + + con.history_index = -1; + + game_console::add(con.buffer); + + con.cursor = 0; + + clear_output(); + strncpy_s(con.buffer, "", sizeof(con.buffer)); + break; + } + case VK_BACK: + { + if (con.cursor <= 0) + { + break; + } + + clear_output(); + + std::memmove(con.buffer + con.cursor - 1, con.buffer + con.cursor, + strlen(con.buffer) + 1 - con.cursor); + con.cursor--; + + update(); + break; + } + default: + { + const auto c = record.Event.KeyEvent.uChar.AsciiChar; + if (!c) + { + break; + } + + if (std::strlen(con.buffer) + 1 >= get_max_input_length()) + { + break; + } + + std::memmove(con.buffer + con.cursor + 1, + con.buffer + con.cursor, std::strlen(con.buffer) + 1 - con.cursor); + con.buffer[con.cursor] = c; + con.cursor++; + + update(); + break; + } + } + } + + int __cdecl printf_stub(const char* fmt, ...) + { + va_list ap; + va_start(ap, fmt); + const auto result = format(&ap, fmt); + va_end(ap); + + return dispatch_message(con_type_info, result); + } + } + + void print(const int type, const char* fmt, ...) + { + va_list ap; + va_start(ap, fmt); + const auto result = format(&ap, fmt); + va_end(ap); + + dispatch_message(type, result); } class component final : public component_interface { public: + component() + { + ShowWindow(GetConsoleWindow(), SW_HIDE); + } + + void post_start() override + { + printf_hook.create(printf, printf_stub); + } + void post_unpack() override { ShowWindow(GetConsoleWindow(), SW_SHOW); SetConsoleTitle("H2-Mod"); - console_thread = utils::thread::create_named_thread("Console", []() - { - while (!kill) - { - // to do: get input without blocking the thread - std::this_thread::sleep_for(1ms); - } + con.kill_event = CreateEvent(NULL, TRUE, FALSE, NULL); - std::this_thread::yield(); + con.thread = utils::thread::create_named_thread("Console", []() + { + const auto handle = GetStdHandle(STD_INPUT_HANDLE); + HANDLE handles[2] = { handle, con.kill_event }; + MSG msg{}; + + INPUT_RECORD record{}; + DWORD num_events{}; + + while (!con.kill) + { + const auto result = MsgWaitForMultipleObjects(2, handles, FALSE, INFINITE, QS_ALLINPUT); + if (con.kill) + { + return; + } + + switch (result) + { + case WAIT_OBJECT_0: + { + if (!ReadConsoleInput(handle, &record, 1, &num_events) || num_events == 0) + { + break; + } + + handle_input(record); + break; + } + case WAIT_OBJECT_0 + 1: + { + if (!PeekMessageA(&msg, GetConsoleWindow(), NULL, NULL, PM_REMOVE)) + { + break; + } + + if (msg.message == WM_QUIT) + { + command::execute("quit", false); + break; + } + + TranslateMessage(&msg); + DispatchMessage(&msg); + break; + } + } + } }); } void pre_destroy() override { - kill = true; + con.kill = true; + SetEvent(con.kill_event); - if (console_thread.joinable()) + if (con.thread.joinable()) { - console_thread.join(); + con.thread.join(); } } }; diff --git a/src/client/component/console.hpp b/src/client/component/console.hpp new file mode 100644 index 00000000..bc154f0b --- /dev/null +++ b/src/client/component/console.hpp @@ -0,0 +1,40 @@ +#pragma once + +namespace console +{ + enum console_type + { + con_type_error = 1, + con_type_debug = 2, + con_type_warning = 3, + con_type_info = 7 + }; + + void print(int type, const char* fmt, ...); + + template + void error(const char* fmt, Args&&... args) + { + print(con_type_error, fmt, std::forward(args)...); + } + + template + void debug(const char* fmt, Args&&... args) + { +#ifdef DEBUG + print(con_type_debug, fmt, std::forward(args)...); +#endif + } + + template + void warn(const char* fmt, Args&&... args) + { + print(con_type_warning, fmt, std::forward(args)...); + } + + template + void info(const char* fmt, Args&&... args) + { + print(con_type_info, fmt, std::forward(args)...); + } +} \ No newline at end of file diff --git a/src/client/component/database.cpp b/src/client/component/database.cpp new file mode 100644 index 00000000..5bcadb97 --- /dev/null +++ b/src/client/component/database.cpp @@ -0,0 +1,473 @@ +#include +#include "loader/component_loader.hpp" + +#include "game/dvars.hpp" +#include "game/game.hpp" + +#include "filesystem.hpp" +#include "console.hpp" +#include "command.hpp" +#include "language.hpp" + +#include +#include +#include +#include + +namespace database +{ + namespace + { + struct bnet_file_handle_t + { + std::unique_ptr stream; + uint64_t offset{}; + std::string path; + }; + + std::unordered_map bnet_file_handles{}; + utils::hook::detour bnet_fs_open_file_hook; + utils::hook::detour bnet_fs_read_hook; + utils::hook::detour bnet_fs_tell_hook; + utils::hook::detour bnet_fs_size_hook; + utils::hook::detour bnet_fs_close_hook; + utils::hook::detour bnet_fs_exists_hook; + utils::hook::detour bink_io_read_hook; + utils::hook::detour bink_io_seek_hook; + + utils::hook::detour open_sound_handle_hook; + + utils::memory::allocator handle_allocator; + + using sound_file_t = std::unordered_map; + std::unordered_map sound_files = {}; + std::unordered_map sound_sizes = {}; + + game::dvar_t* db_filesysImpl = nullptr; + utils::hook::detour db_fs_initialize_hook; + + std::unordered_map file_search_folders = + { + {".flac", "sound/"}, + {".bik", "video/"}, + }; + + game::DB_FileSysInterface* db_fs_initialize_stub() + { + switch (db_filesysImpl->current.integer) + { + case 0: + return reinterpret_cast(0x140BE82F8); // ptr to vtable of BnetTACTVFSManager (implements DB_FileSysInterface) + case 1: + return reinterpret_cast(0x140BEFDC0); // ptr to vtable of DiskFS (implements DB_FileSysInterface) + default: + return nullptr; // this should not happen + } + } + + std::optional find_fastfile(const std::string& name) + { + std::string name_ = name; + + if (game::DB_IsLocalized(name.data())) + { + const auto language = game::SEH_GetCurrentLanguageName(); + if (filesystem::exists(name)) + { + return {name}; + } + + name_ = language + "/"s + name; + if (filesystem::exists(name_)) + { + return {name_}; + } + + name_ = "zone/" + name; + if (filesystem::exists(name_)) + { + return {name_}; + } + + name_ = "zone/"s + language + "/" + name; + if (filesystem::exists(name_)) + { + return {name_}; + } + } + else + { + if (filesystem::exists(name)) + { + return {name}; + } + + name_ = "zone/" + name; + if (filesystem::exists(name_)) + { + return {name_}; + } + } + + return {}; + } + + bool is_zone_file(const std::string& file) + { + return file.ends_with(".ff") || file.ends_with(".pak"); + } + + bool is_loc_folder(game::Sys_Folder folder) + { + return folder == game::SF_PAKFILE_LOC || folder == game::SF_ZONE_LOC || folder == game::SF_VIDEO_LOC; + } + + game::DB_IFileSysFile* bnet_fs_open_file_stub(game::DB_FileSysInterface* this_, + game::Sys_Folder folder, const char* file) + { + std::string name = file; + std::string file_ = file; + + const auto search_path = [&](const std::string& ext, const std::string& path) + { + if (name.ends_with(ext) && !filesystem::exists(name)) + { + name = path + name; + } + }; + + if (is_zone_file(name)) + { + if (is_loc_folder(folder)) + { + const auto loc = name.substr(0, 3); + const auto found = find_fastfile(name); + if (language::is_custom_language(loc) && !found.has_value()) + { + name = "eng" + name.substr(3); + file_ = name; + } + } + + const auto found = find_fastfile(name); + if (found.has_value()) + { + name = found.value(); + } + } + else + { + for (const auto& [ext, path] : file_search_folders) + { + search_path(ext, path); + } + } + + std::string path{}; + if (!filesystem::find_file(name, &path)) + { + return bnet_fs_open_file_hook.invoke(this_, folder, file_.data()); + } + + const auto handle = handle_allocator.allocate(); + + try + { +#ifdef DEBUG + console::info("[Database] Opening file %s\n", path.data()); +#endif + + auto stream = std::make_unique(); + stream->open(path, std::ios::binary); + + bnet_file_handle_t bnet_handle{}; + bnet_handle.stream = std::move(stream); + bnet_handle.path = path; + bnet_file_handles[handle] = std::move(bnet_handle); + return handle; + } + catch (const std::exception& e) + { + console::error("[Database] Error opening file %s: %s\n", path.data(), e.what()); + } + + return handle; + } + + game::FileSysResult bnet_fs_read_stub(game::DB_FileSysInterface* this_, game::DB_IFileSysFile* handle, + unsigned __int64 offset, unsigned __int64 size, void* dest) + { + if (bnet_file_handles.find(handle) == bnet_file_handles.end()) + { + return bnet_fs_read_hook.invoke(this_, handle, offset, size, dest); + } + else + { + auto& handle_ = bnet_file_handles[handle]; + if (!handle_.stream->is_open()) + { + return game::FILESYSRESULT_ERROR; + } + + try + { + const auto start_pos = offset - handle_.offset; + handle_.stream->seekg(0, std::ios::end); + const auto end_pos = static_cast(handle_.stream->tellg()); + handle_.stream->seekg(start_pos); + + const auto len = end_pos - start_pos; + const auto bytes_to_read = len <= size ? len : size; + + const auto& res = handle_.stream->read(reinterpret_cast(dest), bytes_to_read); + if (res.bad()) + { + return game::FILESYSRESULT_ERROR; + } + + const auto bytes_read = static_cast(res.gcount()); + handle->bytes_read += bytes_read; + handle->last_read = bytes_read; + + return game::FILESYSRESULT_SUCCESS; + } + catch (const std::exception& e) + { + console::error("[Database] bnet_fs_read_stub: %s\n", e.what()); + return game::FILESYSRESULT_ERROR; + } + } + } + + game::FileSysResult bnet_fs_tell_stub(game::DB_FileSysInterface* this_, game::DB_IFileSysFile* handle, uint64_t* bytes_read) + { + if (bnet_file_handles.find(handle) == bnet_file_handles.end()) + { + return bnet_fs_tell_hook.invoke(this_, handle, bytes_read); + } + else + { + auto& handle_ = bnet_file_handles[handle]; + if (!handle_.stream->is_open()) + { + return game::FILESYSRESULT_ERROR; + } + + try + { + *bytes_read = handle->last_read; + return game::FILESYSRESULT_SUCCESS; + } + catch (const std::exception& e) + { + console::error("[Database] bnet_fs_tell_stub: %s\n", e.what()); + return game::FILESYSRESULT_ERROR; + } + } + } + + uint64_t bnet_fs_size_stub(game::DB_FileSysInterface* this_, game::DB_IFileSysFile* handle) + { + if (bnet_file_handles.find(handle) == bnet_file_handles.end()) + { + return bnet_fs_size_hook.invoke(this_, handle); + } + else + { + auto& handle_ = bnet_file_handles[handle]; + try + { + handle_.stream->seekg(0, std::ios::end); + const std::streamsize size = handle_.stream->tellg(); + handle_.stream->seekg(0, std::ios::beg); + return static_cast(size); + } + catch (const std::exception& e) + { + console::error("[Database] bnet_fs_size_stub: %s\n", e.what()); + return 0; + } + } + } + + void bnet_fs_close_stub(game::DB_FileSysInterface* this_, game::DB_IFileSysFile* handle) + { + if (bnet_file_handles.find(handle) == bnet_file_handles.end()) + { + bnet_fs_close_hook.invoke(this_, handle); + } + else + { + handle_allocator.free(handle); + bnet_file_handles.erase(handle); + } + } + + bool bnet_fs_exists_stub(game::DB_FileSysInterface* this_, game::DB_IFileSysFile* handle, const char* filename) + { + std::string name = filename; + + const auto search_path = [&](const std::string& ext, const std::string& path) + { + if (!name.ends_with(ext)) + { + return false; + } + + return filesystem::exists(name) || filesystem::exists(path + name); + }; + + if (filesystem::exists(filename)) + { + return true; + } + + if (is_zone_file(name)) + { + const auto found = find_fastfile(name); + if (found.has_value()) + { + return true; + } + } + else + { + for (const auto& [ext, path] : file_search_folders) + { + if (search_path(ext, path)) + { + return true; + } + } + } + + return bnet_fs_exists_hook.invoke(this_, handle, filename); + } + + uint64_t bink_io_read_stub(game::DB_IFileSysFile** handle, void* dest, uint64_t bytes) + { + const auto handle_ptr = *handle; + if (bnet_file_handles.find(handle_ptr) == bnet_file_handles.end()) + { + return bink_io_read_hook.invoke(handle, dest, bytes); + } + else + { + auto& handle_ = bnet_file_handles[handle_ptr]; + if (!handle_.stream->is_open()) + { + return 0; + } + + try + { + const auto& res = handle_.stream->read(reinterpret_cast(dest), bytes); + return static_cast(res.gcount()); + } + catch (const std::exception& e) + { + console::error("[Database] bink_io_read_stub: %s\n", e.what()); + return 0; + } + } + } + + bool bink_io_seek_stub(game::DB_IFileSysFile** handle, uint64_t pos) + { + const auto handle_ptr = *handle; + if (bnet_file_handles.find(handle_ptr) == bnet_file_handles.end()) + { + return bink_io_seek_hook.invoke(handle, pos); + } + else + { + auto& handle_ = bnet_file_handles[handle_ptr]; + if (!handle_.stream->is_open()) + { + return false; + } + + try + { + const auto& res = handle_.stream->seekg(pos); + return !(res.fail() || res.bad()); + } + catch (const std::exception& e) + { + console::error("[Database] bink_io_seek_stub: %s\n", e.what()); + return 0; + } + } + } + + utils::hook::detour sys_set_folder_hook; + void sys_set_folder_stub(game::Sys_Folder folder, const char* path) + { + if (is_loc_folder(folder) && language::is_custom_language(path)) + { + path = "english"; + } + + sys_set_folder_hook.invoke(folder, path); + } + } + + void close_fastfile_handles() + { + for (const auto& handle : bnet_file_handles) + { + if (handle.second.path.ends_with(".ff")) + { + handle.second.stream->close(); + } + } + } + + class component final : public component_interface + { + public: + void post_unpack() override + { + static const char* values[] = + { + "BnetTACTVFSManager", // (load files from CASC) + "DiskFS", // (load files from disk) + nullptr + }; + + const auto default_value = static_cast(!utils::io::directory_exists("Data/data") + || !utils::io::directory_exists("Data/config") + || !utils::io::directory_exists("Data/indices")); + + db_filesysImpl = dvars::register_enum("db_filesysImpl", values, default_value, game::DVAR_FLAG_READ, "Filesystem implementation"); + + if (default_value == 1) + { + utils::hook::nop(0x1405A4868, 22); // TACT related stuff that's pointless if we're using DiskFS + utils::hook::nop(0x14071AF83, 45); // Skip setting Bink file OS callbacks (not necessary since we're loading from disk) + } + + db_fs_initialize_hook.create(game::DB_FSInitialize, db_fs_initialize_stub); + + // Allow bnet filesystem to also load files from disk + if (db_filesysImpl->current.integer == 0) + { + const auto bnet_interface = reinterpret_cast(0x140BE82F8); + + bnet_fs_open_file_hook.create(bnet_interface->vftbl->OpenFile, bnet_fs_open_file_stub); + bnet_fs_read_hook.create(bnet_interface->vftbl->Read, bnet_fs_read_stub); + bnet_fs_tell_hook.create(bnet_interface->vftbl->Tell, bnet_fs_tell_stub); + bnet_fs_size_hook.create(bnet_interface->vftbl->Size, bnet_fs_size_stub); + bnet_fs_close_hook.create(bnet_interface->vftbl->Close, bnet_fs_close_stub); + bnet_fs_exists_hook.create(bnet_interface->vftbl->Exists, bnet_fs_exists_stub); + + bink_io_read_hook.create(0x1407191B0, bink_io_read_stub); + bink_io_seek_hook.create(0x140719200, bink_io_seek_stub); + } + + sys_set_folder_hook.create(0x140623830, sys_set_folder_stub); + } + }; +} + +REGISTER_COMPONENT(database::component) diff --git a/src/client/component/database.hpp b/src/client/component/database.hpp new file mode 100644 index 00000000..12c5af6a --- /dev/null +++ b/src/client/component/database.hpp @@ -0,0 +1,6 @@ +#pragma once + +namespace database +{ + void close_fastfile_handles(); +} diff --git a/src/client/component/discord.cpp b/src/client/component/discord.cpp index dff5d22e..ca9a96a7 100644 --- a/src/client/component/discord.cpp +++ b/src/client/component/discord.cpp @@ -5,8 +5,10 @@ #include "scheduler.hpp" #include "command.hpp" +#include "console.hpp" #include +#include #include @@ -15,30 +17,86 @@ namespace discord namespace { DiscordRichPresence discord_presence; - std::string state; + + std::optional state{}; + std::optional details{}; void update_discord() { + static char details_buf[128] = {0}; + static char state_buf[128] = {0}; + static char image_key_buf[32] = {0}; + Discord_RunCallbacks(); if (!game::CL_IsCgameInitialized()) { - discord_presence.details = "Main Menu"; + state.reset(); + details.reset(); + + discord_presence.details = game::UI_SafeTranslateString("MENU_MAIN_MENU"); discord_presence.state = ""; discord_presence.startTimestamp = 0; const auto background_index = static_cast(game::Sys_Milliseconds() / 300000) % 10; - discord_presence.largeImageKey = utils::string::va("bg_%i", background_index); + strcpy_s(image_key_buf, sizeof(image_key_buf), utils::string::va("bg_%i", background_index)); + discord_presence.largeImageKey = image_key_buf; } else { - const auto map = game::Dvar_FindVar("mapname")->current.string; - const auto mapname = game::UI_SafeTranslateString(utils::string::va("PRESENCE_SP_%s", map)); + const char* base_mapname = nullptr; + auto* mapname = game::Dvar_FindVar("mapname")->current.string; + auto* map_image = game::Dvar_FindVar("mapname")->current.string; + auto* museum_mode = game::Dvar_FindVar("ui_char_museum_mode")->current.string; + + if (game::Com_IsAddonMap(mapname, &base_mapname)) + { + map_image = base_mapname; + } + + if (museum_mode == "free"s) + { + map_image = "museum"; + } + + const auto key = utils::string::va("PRESENCE_SP_%s", mapname); + if (game::DB_XAssetExists(game::ASSET_TYPE_LOCALIZE, key) && !game::DB_IsXAssetDefault(game::ASSET_TYPE_LOCALIZE, key)) + { + mapname = game::UI_SafeTranslateString(key); + } + + discord_presence.largeImageKey = map_image; + + if (details.has_value()) + { + const auto& details_ = details.value(); + if (details_.starts_with("@") && details_.size() > 1) + { + const auto value = game::UI_SafeTranslateString(details_.substr(1).data()); + discord_presence.details = value; + } + else + { + strcpy_s(details_buf, sizeof(details_buf), utils::string::va("%s", details_.data())); + discord_presence.details = details_buf; + } + } + else + { + discord_presence.details = mapname; + } + + if (state.has_value()) + { + strcpy_s(state_buf, sizeof(state_buf), state.value().data()); + discord_presence.state = state_buf; + } + else + { + discord_presence.state = ""; + } - discord_presence.largeImageKey = map; - discord_presence.details = mapname; - discord_presence.state = state.data(); if (!discord_presence.startTimestamp) { @@ -74,13 +132,22 @@ namespace discord command::add("setdiscordstate", [](const command::params& params) { const std::string _state = params.join(1); - - scheduler::once([_state]() + scheduler::once([=]() { state = _state; update_discord(); }, scheduler::pipeline::async); }); + + command::add("setdiscorddetails", [](const command::params& params) + { + const std::string details_ = params.join(1); + scheduler::once([=]() + { + details = details_; + update_discord(); + }, scheduler::pipeline::async); + }); } private: @@ -98,7 +165,7 @@ namespace discord static void errored(const int error_code, const char* message) { - printf("Discord: (%i) %s", error_code, message); + console::error("Discord: (%i) %s", error_code, message); } }; } diff --git a/src/client/component/exception.cpp b/src/client/component/exception.cpp index 91805379..7415c71d 100644 --- a/src/client/component/exception.cpp +++ b/src/client/component/exception.cpp @@ -234,7 +234,8 @@ namespace exception void post_unpack() override { - dvars::cg_legacyCrashHandling = dvars::register_bool("cg_legacyCrashHandling", false, game::DVAR_FLAG_SAVED); + dvars::cg_legacyCrashHandling = dvars::register_bool("cg_legacyCrashHandling", false, + game::DVAR_FLAG_SAVED, "Disable new crash handling"); } }; } diff --git a/src/client/component/fastfiles.cpp b/src/client/component/fastfiles.cpp index f0426f56..7045b502 100644 --- a/src/client/component/fastfiles.cpp +++ b/src/client/component/fastfiles.cpp @@ -1,12 +1,17 @@ #include #include "loader/component_loader.hpp" +#include "game/dvars.hpp" #include "fastfiles.hpp" #include "command.hpp" -#include "game_console.hpp" +#include "console.hpp" +#include "localized_strings.hpp" +#include "mods.hpp" #include #include +#include +#include namespace fastfiles { @@ -14,17 +19,550 @@ namespace fastfiles namespace { + game::dvar_t* db_print_default_assets = nullptr; + game::dvar_t* db_print_loaded_assets = nullptr; + + template + struct bit_array + { + char data[Bits / 8]{}; + }; + utils::hook::detour db_try_load_x_file_internal_hook; + utils::hook::detour db_find_xasset_header; + utils::hook::detour load_xasset_header_hook; void db_try_load_x_file_internal(const char* zone_name, const int flags) { - game_console::print(game_console::con_type_info, "Loading fastfile %s\n", zone_name); + console::info("Loading fastfile %s\n", zone_name); current_fastfile.access([&](std::string& fastfile) { fastfile = zone_name; }); return db_try_load_x_file_internal_hook.invoke(zone_name, flags); } + + game::XAssetHeader db_find_xasset_header_stub(game::XAssetType type, const char* name, int allow_create_default) + { + const auto start = game::Sys_Milliseconds(); + const auto result = db_find_xasset_header.invoke(type, name, allow_create_default); + const auto diff = game::Sys_Milliseconds() - start; + + if (db_print_default_assets->current.enabled && game::DB_IsXAssetDefault(type, name)) + { + console::warn("Waited %i msec for default asset \"%s\" of type \"%s\"\n", + diff, name, game::g_assetNames[type]); + } + + if (diff > 100) + { + const auto missing = result.data == nullptr; + console::print( + missing + ? console::con_type_error + : console::con_type_warning, + "Waited %i msec for %sasset \"%s\" of type \"%s\"\n", + diff, + missing + ? "missing " + : "", + name, + game::g_assetNames[type] + ); + } + + return result; + } + + void add_missing_localized_strings() + { + for (auto map = &game::maps[0]; map->unk; ++map) + { + const auto str = utils::string::va("LUA_MENU_SP_LOCATION_%s", + utils::string::to_upper(map->name).data()); + localized_strings::override(str, str); + } + } + + utils::hook::detour db_read_stream_file_hook; + void db_read_stream_file_stub(int a1, int a2) + { + // always use lz4 compressor type when reading stream files + *game::g_compressor = 4; + return db_read_stream_file_hook.invoke(a1, a2); + } + + void skip_extra_zones_stub(utils::hook::assembler& a) + { + const auto skip = a.newLabel(); + const auto original = a.newLabel(); + + a.pushad64(); + a.test(r15d, game::DB_ZONE_CUSTOM); // allocFlags + a.jnz(skip); + + a.bind(original); + a.popad64(); + a.mov(r8d, 9); + a.mov(rdx, 0x140933528); + a.jmp(0x140415E09); + + a.bind(skip); + a.popad64(); + a.mov(r14d, game::DB_ZONE_CUSTOM); + a.not_(r14d); + a.and_(r15d, r14d); + a.jmp(0x140415E29); + } + + bool try_load_zone(const std::string& name, bool localized, bool game = false) + { + if (localized) + { + const auto language = game::SEH_GetCurrentLanguageCode(); + try_load_zone(language + "_"s + name, false); + } + + if (!fastfiles::exists(name)) + { + return false; + } + + game::XZoneInfo info{}; + info.name = name.data(); + info.allocFlags = (game ? game::DB_ZONE_GAME : game::DB_ZONE_COMMON) | game::DB_ZONE_CUSTOM; + info.freeFlags = 0; + game::DB_LoadXAssets(&info, 1u, game::DBSyncMode::DB_LOAD_ASYNC); + return true; + } + + void load_mod_zones() + { + try_load_zone("mod", true); + const auto mod_zones = mods::get_mod_zones(); + for (const auto& zone : mod_zones) + { + if (zone.alloc_flags & game::DB_ZONE_COMMON) + { + try_load_zone(zone.name, true); + } + } + } + + void load_pre_gfx_zones(game::XZoneInfo* zoneInfo, + unsigned int zoneCount, game::DBSyncMode syncMode) + { + // code_pre_gfx + + try_load_zone("h2_mod_pre_gfx", true); + + game::DB_LoadXAssets(zoneInfo, zoneCount, syncMode); + } + + void load_post_gfx_and_ui_and_common_zones(game::XZoneInfo* zoneInfo, + unsigned int zoneCount, game::DBSyncMode syncMode) + { + // code_post_gfx_mp + // ui_mp + // common_mp + + try_load_zone("h2_mod_common", true); + + game::DB_LoadXAssets(zoneInfo, zoneCount, syncMode); + + load_mod_zones(); + } + + constexpr unsigned int get_asset_type_size(const game::XAssetType type) + { + constexpr int asset_type_sizes[] = + { + 96, 88, 128, 56, 40, 216, 56, 696, + 624, 32, 32, 32, 32, 32, 2112, 2032, + 104, 32, 24, 152, 152, 152, 16, 64, + 640, 40, 16, 136, 24, 296, 176, 2896, + 48, 0, 24, 200, 88, 16, 144, 3848, + 56, 72, 16, 16, 0, 0, 0, 0, 24, + 40, 24, 48, 40, 24, 16, 80, 128, + 2280, 136, 32, 72, 24, 64, 88, 48, + 32, 96, 120, 64, 32, 32 + }; + + return asset_type_sizes[type]; + } + + constexpr unsigned int get_pool_type_size(const game::XAssetType type) + { + constexpr int asset_pool_sizes[] = + { + 150, 1024, 16, 1, 128, 7000, 5248, 2560, + 10624, 256, 49152, 12288, 12288, 72864, + 512, 3072, 12000, 16000, 256, 64, 64, + 64, 64, 10000, 1, 1, 1, 1, 1, 2, 1, + 1, 32, 0, 128, 400, 0, 11500, 128, + 360, 1, 2048, 4, 6, 0, 0, 0, 0, 1024, + 768, 400, 128, 128, 24, 24, 24, 32, + 128, 2, 0, 64, 384, 128, 1, 128, 64, + 32, 32, 16, 32, 16 + }; + + return asset_pool_sizes[type]; + } + + template + char* reallocate_asset_pool() + { + constexpr auto element_size = get_asset_type_size(Type); + static char new_pool[element_size * Size] = {0}; + static_assert(element_size != 0); + assert(element_size == game::DB_GetXAssetTypeSize(Type)); + + std::memmove(new_pool, game::g_assetPool[Type], game::g_poolSize[Type] * element_size); + + game::g_assetPool[Type] = new_pool; + game::g_poolSize[Type] = Size; + + return new_pool; + } + + template + char* reallocate_asset_pool_multiplier() + { + constexpr auto pool_size = get_pool_type_size(Type); + return reallocate_asset_pool(); + } + +#define RVA(ptr) static_cast(reinterpret_cast(ptr) - 0x140000000) + + void reallocate_xmodel_pool() + { + // array used for DB_GetAllXAssetOfType, not big enough if many assets are added + static game::XAssetHeader assets[0x10000]{}; + utils::hook::inject(0x1403E2AB7, &assets); + utils::hook::inject(0x1403E2AC3, &assets); + utils::hook::inject(0x1403E2ACF, &assets); + + constexpr auto xmodel_pool_size = get_pool_type_size(game::ASSET_TYPE_XMODEL) * 2; + const auto xmodel_pool = reallocate_asset_pool(); + utils::hook::inject(0x140413D93, xmodel_pool + 8); + + utils::hook::set(0x1403E30E0 + 3, xmodel_pool_size); + + // not the actual struct + static struct + { + int array_1[xmodel_pool_size]; + int array_2[xmodel_pool_size]; + int array_3[xmodel_pool_size]; + int array_4[xmodel_pool_size]; + int array_5[xmodel_pool_size]; + bit_array bit_array_1; + bit_array bit_array_2; + bit_array bit_array_3; + int unk_array[xmodel_pool_size * 6]; + } xmodel_data{}; + + // array 1 + utils::hook::set(0x14041E0C2 + 4, RVA(&xmodel_data.array_1)); + utils::hook::inject(0x14041E7F6 + 3, &xmodel_data.array_1); + utils::hook::set(0x140420797 + 4, RVA(&xmodel_data.array_1)); + utils::hook::inject(0x1404228F6 + 3, &xmodel_data.array_1); + utils::hook::inject(0x14042290E + 3, &xmodel_data.array_1); + utils::hook::set(0x140710280 + 4, RVA(&xmodel_data.array_1)); + + // array 2 + utils::hook::set(0x14041E2FA + 4, RVA(&xmodel_data.array_2)); + utils::hook::set(0x1404207BC + 4, RVA(&xmodel_data.array_2)); + utils::hook::inject(0x140422AE1 + 3, &xmodel_data.array_2); + utils::hook::set(0x140422B20 + 4, RVA(&xmodel_data.array_2)); + utils::hook::inject(0x140422B8D + 3, &xmodel_data.array_2); + utils::hook::set(0x140422BC7 + 4, RVA(&xmodel_data.array_2)); + utils::hook::inject(0x140422C41 + 3, &xmodel_data.array_2); + utils::hook::set(0x140422CE0 + 4, RVA(&xmodel_data.array_2)); + utils::hook::set(0x140422D16 + 4, RVA(&xmodel_data.array_2)); + utils::hook::set(0x140723BAE + 6, RVA(&xmodel_data.array_2)); + utils::hook::set(0x140723BCC + 6, RVA(&xmodel_data.array_2)); + utils::hook::inject(0x140728332 + 3, &xmodel_data.array_2); + + // array 3 + utils::hook::set(0x1404207D4 + 4, RVA(&xmodel_data.array_3)); + utils::hook::set(0x140724BA3 + 5, RVA(&xmodel_data.array_3)); + utils::hook::set(0x140724BC1 + 5, RVA(&xmodel_data.array_3)); + + // array 4 + utils::hook::set(0x1404207C8 + 4, RVA(&xmodel_data.array_4)); + utils::hook::inject(0x140422888 + 3, &xmodel_data.array_4); + utils::hook::inject(0x14041EAC0 + 3, reinterpret_cast(reinterpret_cast(&xmodel_data.array_4) + 0x10)); + + // array 5 + utils::hook::set(0x1404205BC + 4, RVA(&xmodel_data.array_5)); + utils::hook::set(0x14042062D + 4, RVA(&xmodel_data.array_5)); + utils::hook::inject(0x140420A35 + 3, &xmodel_data.array_5); + + // bit array 1 + utils::hook::set(0x1404207AA + 4, RVA(&xmodel_data.bit_array_1)); + utils::hook::inject(0x1404208DE + 3, &xmodel_data.bit_array_1); + utils::hook::inject(0x140422535 + 2, &xmodel_data.bit_array_1); + + // bit array 2 + utils::hook::inject(0x1403E2A8E + 3, &xmodel_data.bit_array_2); + utils::hook::inject(0x1403E2FD9 + 3, &xmodel_data.bit_array_2); + utils::hook::inject(0x1403E37C5 + 3, &xmodel_data.bit_array_2); + + // bit array 3 + utils::hook::set(0x1404207B4 + 4, RVA(&xmodel_data.bit_array_3)); + utils::hook::inject(0x140422AD7 + 3, &xmodel_data.bit_array_3); + utils::hook::set(0x140422B18 + 4, RVA(&xmodel_data.bit_array_3)); + utils::hook::inject(0x140422B83 + 3, &xmodel_data.bit_array_3); + utils::hook::set(0x140422BBF + 4, RVA(&xmodel_data.bit_array_3)); + utils::hook::inject(0x140422C37 + 3, &xmodel_data.bit_array_3); + utils::hook::inject(0x140422C97 + 3, &xmodel_data.bit_array_3); + utils::hook::set(0x140422CD8 + 4, RVA(&xmodel_data.bit_array_3)); + utils::hook::set(0x140422D0E + 4, RVA(&xmodel_data.bit_array_3)); + + // unk arrays + utils::hook::set(0x1404205AF + 3, RVA(&xmodel_data.unk_array)); + utils::hook::set(0x140420752 + 4, RVA(&xmodel_data.unk_array)); + + utils::hook::set(0x1404205A7 + 4, RVA(&xmodel_data.unk_array) + 8); + utils::hook::set(0x14042065B + 4, RVA(&xmodel_data.unk_array) + 8); + utils::hook::set(0x14042068D + 4, RVA(&xmodel_data.unk_array) + 8); + utils::hook::set(0x1404206AF + 4, RVA(&xmodel_data.unk_array) + 8); + utils::hook::set(0x1404206F0 + 4, RVA(&xmodel_data.unk_array) + 8); + utils::hook::set(0x140420720 + 4, RVA(&xmodel_data.unk_array) + 8); + utils::hook::set(0x14042075F + 4, RVA(&xmodel_data.unk_array) + 8); + + utils::hook::set(0x14041EE9B + 4, RVA(&xmodel_data.unk_array) + 0x10); + utils::hook::set(0x1404205A0 + 3, RVA(&xmodel_data.unk_array) + 0x10); + utils::hook::set(0x14042060D + 5, RVA(&xmodel_data.unk_array) + 0x10); + utils::hook::set(0x140420618 + 3, RVA(&xmodel_data.unk_array) + 0x10); + + // replace indirect refs + + const auto xmodel_unk_ptr = 0x14417B980; + const auto replace_offset = [](const size_t ptr, const void* arr, const int64_t off = 0) + { + const auto offset = reinterpret_cast(arr) - xmodel_unk_ptr + off; + utils::hook::set(ptr, static_cast(offset)); + }; + + // array 1 -> no refs + + // 0xAEB80 -> array 2 + replace_offset(0x14041E530 + 6, &xmodel_data.array_2); + replace_offset(0x14041E50D + 6, &xmodel_data.array_2); + replace_offset(0x140422F15 + 4, &xmodel_data.array_2); + replace_offset(0x1404CBE64 + 6, &xmodel_data.array_2); + replace_offset(0x1404CBE7B + 6, &xmodel_data.array_2); + replace_offset(0x140723075 + 5, &xmodel_data.array_2); + replace_offset(0x140723062 + 5, &xmodel_data.array_2); + replace_offset(0x1404225E2 + 6, &xmodel_data.array_2); + replace_offset(0x140422607 + 4, &xmodel_data.array_2); + + // 0xA8380 -> array 3 + replace_offset(0x1404225EC + 6, &xmodel_data.array_3); + replace_offset(0x140422613 + 4, &xmodel_data.array_3); + + // array 4 -> no refs + + // 0xA5B80 -> array 5 + replace_offset(0x140420351 + 4, &xmodel_data.array_5); + replace_offset(0x140420359 + 6, &xmodel_data.array_5); + replace_offset(0x140420363 + 4, &xmodel_data.array_5); + replace_offset(0x14042036E + 6, &xmodel_data.array_5); + replace_offset(0x1404203F7 + 4, &xmodel_data.array_5); + replace_offset(0x1404203FF + 4, &xmodel_data.array_5); + + // 0xA5A00 -> bit array 1 + replace_offset(0x1404203A7 + 4, &xmodel_data.bit_array_2); + replace_offset(0x1404203BC + 4, &xmodel_data.bit_array_2); + replace_offset(0x140420880 + 3, &xmodel_data.bit_array_2); + replace_offset(0x14042258D + 4, &xmodel_data.bit_array_2); + + // bit array 2 -> no refs + + // 0xE1800 -> bit array 3 + replace_offset(0x140422F0B + 4, &xmodel_data.bit_array_3); + replace_offset(0x140422659 + 4, &xmodel_data.bit_array_3); + replace_offset(0x140422669 + 4, &xmodel_data.bit_array_3); + + // 0x96A00 -> unk_array + 0 + replace_offset(0x140420301 + 5, &xmodel_data.unk_array); + replace_offset(0x14042030E + 5, &xmodel_data.unk_array); + replace_offset(0x140420321 + 5, &xmodel_data.unk_array); + replace_offset(0x14042033E + 5, &xmodel_data.unk_array); + replace_offset(0x1404203D1 + 5, &xmodel_data.unk_array); + replace_offset(0x1404203DA + 5, &xmodel_data.unk_array); + replace_offset(0x14042089C + 3, &xmodel_data.unk_array); + replace_offset(0x1404225C8 + 4, &xmodel_data.unk_array); + replace_offset(0x1403E309A + 4, &xmodel_data.unk_array); + + // 0x96A08 -> unk_array + 8 + replace_offset(0x1404208A3 + 4, &xmodel_data.unk_array, 8); + replace_offset(0x1403E30A6 + 4, &xmodel_data.unk_array, 8); + replace_offset(0x1404225D5 + 4, &xmodel_data.unk_array, 8); + + // 0x96A10 -> unk_array + 0x10 + replace_offset(0x140420317 + 6, &xmodel_data.unk_array, 0x10); + replace_offset(0x14042032A + 6, &xmodel_data.unk_array, 0x10); + replace_offset(0x140420334 + 6, &xmodel_data.unk_array, 0x10); + replace_offset(0x140420347 + 6, &xmodel_data.unk_array, 0x10); + replace_offset(0x1404203E3 + 6, &xmodel_data.unk_array, 0x10); + replace_offset(0x1404203ED + 6, &xmodel_data.unk_array, 0x10); + replace_offset(0x14042261F + 4, &xmodel_data.unk_array, 0x10); + replace_offset(0x140422649 + 6, &xmodel_data.unk_array, 0x10); + } + + void reallocate_asset_pools() + { + reallocate_xmodel_pool(); + reallocate_asset_pool_multiplier(); + reallocate_asset_pool_multiplier(); + reallocate_asset_pool_multiplier(); + reallocate_asset_pool_multiplier(); + reallocate_asset_pool_multiplier(); + reallocate_asset_pool_multiplier(); + } + + void add_custom_level_load_zone(game::LevelLoad* load, const std::string& name, const size_t size_est) + { + const auto language = game::SEH_GetCurrentLanguageCode(); + const auto lang_name = language + "_"s + name; + + if (fastfiles::exists(lang_name)) + { + game::DB_LevelLoadAddZone(load, lang_name.data(), game::DB_ZONE_GAME | game::DB_ZONE_CUSTOM, size_est); + } + + game::DB_LevelLoadAddZone(load, name.data(), game::DB_ZONE_GAME | game::DB_ZONE_CUSTOM, size_est); + } + + void db_load_level_add_custom_zone_stub(game::LevelLoad* load, const char* name, const unsigned int alloc_flags, + const size_t size_est) + { + add_custom_level_load_zone(load, name, size_est); + } + + void add_mod_zones(game::LevelLoad* load) + { + const auto mod_zones = mods::get_mod_zones(); + for (const auto& zone : mod_zones) + { + if (zone.alloc_flags & game::DB_ZONE_GAME) + { + add_custom_level_load_zone(load, zone.name.data(), 0x40000); + } + } + } + + void db_decide_level_load_stub(utils::hook::assembler& a) + { + const auto loc_140412859 = a.newLabel(); + + a.pushad64(); + a.mov(rcx, rbx); + a.call_aligned(add_mod_zones); + a.popad64(); + + a.mov(rcx, rdi); + a.call_aligned(0x140609650); + a.test(al, al); + a.jz(loc_140412859); + a.jmp(0x140412817); + + a.bind(loc_140412859); + a.jmp(0x140412859); + } + + void db_load_level_add_map_zone_stub(game::LevelLoad* load, const char* name, const unsigned int alloc_flags, + const size_t size_est) + { + auto is_builtin_map = false; + for (auto map = &game::maps[0]; map->unk; ++map) + { + if (!std::strcmp(map->name, name)) + { + is_builtin_map = true; + break; + } + } + + const std::string mapname = name; + + if (mapname.starts_with("mp_") && fastfiles::exists("common_mp")) + { + add_custom_level_load_zone(load, "common_mp", 0x40000); + } + + const auto path_fastfile = mapname + "_path"s; + if (fastfiles::exists(path_fastfile)) + { + add_custom_level_load_zone(load, path_fastfile, 0x40000); + } + + if (is_builtin_map) + { + const auto name_ = "h2_mod_patch_"s + name; + if (fastfiles::exists(name_)) + { + add_custom_level_load_zone(load, name_, size_est); + } + + game::DB_LevelLoadAddZone(load, name, alloc_flags, size_est); + } + else + { + add_custom_level_load_zone(load, name, size_est); + } + } + + void db_load_xassets_stub(game::XZoneInfo* info, unsigned int zone_count, game::DBSyncMode sync_mode) + { + game::DB_LoadXAssets(info, zone_count, game::DB_LOAD_ASYNC); + } + + void db_find_aipaths_stub(game::XAssetType type, const char* name, int allow_create_default) + { + if (game::DB_XAssetExists(type, name)) + { + game::DB_FindXAssetHeader(type, name, allow_create_default); + } + else + { + console::warn("No aipaths found for this map\n"); + } + } + + void load_xasset_header_stub(void* a1) + { + if (db_print_loaded_assets->current.enabled) + { + const auto type = **reinterpret_cast(0x14224F608); + const auto type_name = game::g_assetNames[type]; + console::info("Loading asset type \"%s\"\n", type_name); + } + + load_xasset_header_hook.invoke(a1); + } + } + + bool exists(const std::string& zone) + { + const auto is_localized = game::DB_IsLocalized(zone.data()); + const auto db_fs = game::DB_FSInitialize(); + + auto handle = db_fs->vftbl->OpenFile(db_fs, + (is_localized ? game::SF_ZONE_LOC : game::SF_ZONE), utils::string::va("%s.ff", zone.data())); + const auto _0 = gsl::finally([&] + { + if (handle != nullptr) + { + db_fs->vftbl->Close(db_fs, handle); + } + + }); + + return handle != nullptr; } void enum_assets(const game::XAssetType type, const std::function& callback, const bool includeOverride) @@ -39,11 +577,10 @@ namespace fastfiles std::string get_current_fastfile() { std::string fastfile_copy; - current_fastfile.access([&](std::string& fastfile) + return current_fastfile.access([&](std::string& fastfile) { - fastfile_copy = fastfile; + return fastfile; }); - return fastfile_copy; } class component final : public component_interface @@ -51,30 +588,122 @@ namespace fastfiles public: void post_unpack() override { - db_try_load_x_file_internal_hook.create(0x1404173B0, &db_try_load_x_file_internal); + db_print_default_assets = dvars::register_bool("db_printDefaultAssets", + false, game::DVAR_FLAG_SAVED, "Print default asset usage"); + + db_print_loaded_assets = dvars::register_bool("db_printLoadedAssets", + false, game::DVAR_FLAG_NONE, "Print asset types being loaded"); + + db_try_load_x_file_internal_hook.create(0x1404173B0, db_try_load_x_file_internal); + db_find_xasset_header.create(game::DB_FindXAssetHeader, db_find_xasset_header_stub); + + add_missing_localized_strings(); + + // Allow loading of mixed compressor types + utils::hook::nop(0x1403E66A7, 2); + + // Fix compressor type on streamed file load + db_read_stream_file_hook.create(0x14041D710, db_read_stream_file_stub); + + // Don't load extra zones with loadzone + utils::hook::nop(0x140415DFC, 13); + utils::hook::jump(0x140415DFC, utils::hook::assemble(skip_extra_zones_stub), true); + + // load our custom ui and common zones + utils::hook::call(0x14074E22A, load_post_gfx_and_ui_and_common_zones); + utils::hook::call(0x1405A46FD, load_pre_gfx_zones); + utils::hook::call(0x1405A4959, load_pre_gfx_zones); + + reallocate_asset_pools(); + + // only load extra zones with addon maps & common_specialops & common_survival & custom maps if they exist + utils::hook::call(0x1404128B0, db_load_level_add_map_zone_stub); + utils::hook::call(0x14041282D, db_load_level_add_custom_zone_stub); + utils::hook::call(0x140412854, db_load_level_add_custom_zone_stub); + utils::hook::call(0x14041287C, db_load_level_add_custom_zone_stub); + + // Load custom mod zones with DB_ZONE_GAME alloc flag + utils::hook::jump(0x14041280B, utils::hook::assemble(db_decide_level_load_stub), true); + + // Load assets from 2nd phase (common_specialops, addon map) with DB_LOAD_SYNC + utils::hook::call(0x140414EA1, db_load_xassets_stub); + + // Allow loading mp maps + utils::hook::set(0x140609630, 0xC300B0); + // Don't sys_error if aipaths are missing + utils::hook::call(0x140522299, db_find_aipaths_stub); + + load_xasset_header_hook.create(0x140400790, load_xasset_header_stub); command::add("loadzone", [](const command::params& params) { if (params.size() < 2) { - game_console::print(game_console::con_type_info, "usage: loadzone \n"); + console::info("usage: loadzone \n"); return; } - game::XZoneInfo info{}; - info.name = params.get(1); - info.allocFlags = 1; - info.freeFlags = 0; - game::DB_LoadXAssets(&info, 1u, game::DBSyncMode::DB_LOAD_SYNC); + const auto name = params.get(1); + if (!try_load_zone(name, false)) + { + console::warn("loadzone: zone \"%s\" could not be found!\n", name); + } }); command::add("g_poolSizes", []() { for (auto i = 0; i < game::ASSET_TYPE_COUNT; i++) { - game_console::print(game_console::con_type_info, "g_poolSize[%i]: %i // %s\n", i, game::g_poolSize[i], game::g_assetNames[i]); + console::info("g_poolSize[%i]: %i // %s\n", i, game::g_poolSize[i], game::g_assetNames[i]); } }); + + command::add("poolUsages", []() + { + for (auto i = 0; i < game::ASSET_TYPE_COUNT; i++) + { + auto count = 0; + enum_assets(static_cast(i), [&](game::XAssetHeader header) + { + count++; + }, true); + + console::info("%i %s: %i / %i\n", i, game::g_assetNames[i], count, game::g_poolSize[i]); + } + }); + + command::add("poolUsage", [](const command::params& params) + { + if (params.size() < 2) + { + console::info("Usage: poolUsage \n"); + return; + } + + const auto type = static_cast(std::atoi(params.get(1))); + + auto count = 0; + enum_assets(type, [&](game::XAssetHeader header) + { + count++; + }, true); + + console::info("%i %s: %i / %i\n", type, game::g_assetNames[type], count, game::g_poolSize[type]); + }); + + command::add("assetCount", [](const command::params& params) + { + auto count = 0; + for (auto i = 0; i < game::ASSET_TYPE_COUNT; i++) + { + enum_assets(static_cast(i), [&](game::XAssetHeader header) + { + count++; + }, true); + } + + console::info("assets: %i / %i\n", count, 155000); + }); } }; } diff --git a/src/client/component/fastfiles.hpp b/src/client/component/fastfiles.hpp index 09e4767b..be2a072c 100644 --- a/src/client/component/fastfiles.hpp +++ b/src/client/component/fastfiles.hpp @@ -6,4 +6,6 @@ namespace fastfiles { void enum_assets(const game::XAssetType type, const std::function& callback, const bool includeOverride); std::string get_current_fastfile(); + + bool exists(const std::string& zone); } diff --git a/src/client/component/filesystem.cpp b/src/client/component/filesystem.cpp index 321364a5..0c128583 100644 --- a/src/client/component/filesystem.cpp +++ b/src/client/component/filesystem.cpp @@ -2,25 +2,104 @@ #include "loader/component_loader.hpp" #include "filesystem.hpp" +#include "console.hpp" +#include "localized_strings.hpp" +#include "mods.hpp" +#include "language.hpp" + +#include "game/game.hpp" #include +#include +#include +#include namespace filesystem { - std::unordered_set& get_search_paths() + namespace { - static std::unordered_set search_paths{}; - return search_paths; + bool initialized = false; + + std::deque& get_search_paths_internal() + { + static std::deque search_paths{}; + return search_paths; + } + + void fs_startup_stub(const char* name) + { + console::info("[FS] Startup\n"); + + initialized = true; + + filesystem::register_path(utils::properties::get_appdata_path() / CLIENT_DATA_FOLDER); + filesystem::register_path(L"."); + filesystem::register_path(L"h2-mod"); + + const auto mod_path = utils::flags::get_flag("mod"); + if (mod_path.has_value()) + { + mods::set_mod(mod_path.value()); + } + + localized_strings::clear(); + + utils::hook::invoke(0x14060BF50, name); + } + + std::vector get_paths(const std::filesystem::path& path) + { + std::vector paths{}; + + const auto code = game::SEH_GetCurrentLanguageName(); + + paths.push_back(path); + paths.push_back(path / code); + + return paths; + } + + bool can_insert_path(const std::filesystem::path& path) + { + const auto& paths = get_search_paths_internal(); + return std::ranges::none_of(paths.cbegin(), paths.cend(), [path](const auto& elem) + { + return elem == path; + }); + } + + const char* sys_default_install_path_stub() + { + static auto current_path = std::filesystem::current_path().string(); + return current_path.data(); + } + + bool is_parent_path(const std::filesystem::path& parent, const std::filesystem::path& child) + { + std::filesystem::path iter = child; + + while (iter != iter.parent_path()) + { + if (iter == parent) + { + return true; + } + + iter = iter.parent_path(); + } + + return false; + } } std::string read_file(const std::string& path) { - for (const auto& search_path : get_search_paths()) + for (const auto& search_path : get_search_paths_internal()) { - const auto path_ = search_path + "/" + path; - if (utils::io::file_exists(path_)) + const auto path_ = search_path / path; + if (utils::io::file_exists(path_.generic_string())) { - return utils::io::read_file(path_); + return utils::io::read_file(path_.generic_string()); } } @@ -29,14 +108,14 @@ namespace filesystem bool read_file(const std::string& path, std::string* data, std::string* real_path) { - for (const auto& search_path : get_search_paths()) + for (const auto& search_path : get_search_paths_internal()) { - const auto path_ = search_path + "/" + path; - if (utils::io::read_file(path_, data)) + const auto path_ = search_path / path; + if (utils::io::read_file(path_.generic_string(), data)) { if (real_path != nullptr) { - *real_path = path_; + *real_path = path_.generic_string(); } return true; @@ -46,16 +125,157 @@ namespace filesystem return false; } + bool find_file(const std::string& path, std::string* real_path) + { + for (const auto& search_path : get_search_paths_internal()) + { + const auto path_ = search_path / path; + if (utils::io::file_exists(path_.generic_string())) + { + *real_path = path_.generic_string(); + return true; + } + } + + return false; + } + + bool exists(const std::string& path) + { + for (const auto& search_path : get_search_paths_internal()) + { + const auto path_ = search_path / path; + if (utils::io::file_exists(path_.generic_string())) + { + return true; + } + } + + return false; + } + + void register_path(const std::filesystem::path& path) + { + if (!initialized) + { + return; + } + + const auto paths = get_paths(path); + for (const auto& path_ : paths) + { + if (can_insert_path(path_)) + { + console::info("[FS] Registering path '%s'\n", path_.generic_string().data()); + get_search_paths_internal().push_front(path_); + } + } + } + + void unregister_path(const std::filesystem::path& path) + { + if (!initialized) + { + return; + } + + const auto paths = get_paths(path); + for (const auto& path_ : paths) + { + auto& search_paths = get_search_paths_internal(); + for (auto i = search_paths.begin(); i != search_paths.end();) + { + if (*i == path_) + { + console::info("[FS] Unregistering path '%s'\n", path_.generic_string().data()); + i = search_paths.erase(i); + } + else + { + ++i; + } + } + } + } + + std::vector get_search_paths() + { + std::vector paths{}; + + for (const auto& path : get_search_paths_internal()) + { + paths.push_back(path.generic_string()); + } + + return paths; + } + + std::vector get_search_paths_rev() + { + std::vector paths{}; + const auto& search_paths = get_search_paths_internal(); + + for (auto i = search_paths.rbegin(); i != search_paths.rend(); ++i) + { + paths.push_back(i->generic_string()); + } + + return paths; + } + + void check_path(const std::filesystem::path& path) + { + if (path.generic_string().find("..") != std::string::npos) + { + throw std::runtime_error("directory traversal is not allowed"); + } + } + + std::string get_safe_path(const std::filesystem::path& path) + { + check_path(path); + const auto absolute = std::filesystem::weakly_canonical(path); + + static std::vector allowed_directories = + { + {std::filesystem::weakly_canonical("mods")}, + {std::filesystem::weakly_canonical("h2-mod")}, + {std::filesystem::weakly_canonical("players2/default")}, + }; + + auto is_allowed = false; + for (const auto& dir : allowed_directories) + { + if (is_parent_path(dir, absolute)) + { + is_allowed = true; + break; + } + } + + if (!is_allowed) + { + throw std::runtime_error(std::format("Disallowed access to directory \"{}\"", path.generic_string())); + } + + return path.generic_string(); + } + + bool safe_write_file(const std::string& file, const std::string& data, bool append) + { + const auto path = filesystem::get_safe_path(file); + return utils::io::write_file(path, data, append); + } + class component final : public component_interface { public: void post_unpack() override { - get_search_paths().insert("."); - get_search_paths().insert("h2-mod"); - get_search_paths().insert("data"); + utils::hook::call(0x14060B052, fs_startup_stub); + utils::hook::jump(0x140624050, sys_default_install_path_stub); } }; } -REGISTER_COMPONENT(filesystem::component) +REGISTER_COMPONENT(filesystem::component) \ No newline at end of file diff --git a/src/client/component/filesystem.hpp b/src/client/component/filesystem.hpp index 3e9c5b02..bdc9f506 100644 --- a/src/client/component/filesystem.hpp +++ b/src/client/component/filesystem.hpp @@ -1,8 +1,31 @@ #pragma once +#include "updater.hpp" + namespace filesystem { - std::unordered_set& get_search_paths(); std::string read_file(const std::string& path); bool read_file(const std::string& path, std::string* data, std::string* real_path = nullptr); -} \ No newline at end of file + bool find_file(const std::string& path, std::string* real_path); + bool exists(const std::string& path); + + void register_path(const std::filesystem::path& path); + void unregister_path(const std::filesystem::path& path); + + std::vector get_search_paths(); + std::vector get_search_paths_rev(); + + std::string get_safe_path(const std::filesystem::path& path); + bool safe_write_file(const std::string& file, const std::string& data, bool append = false); + + template + std::function + safe_io_func(const std::function& func) + { + return [func](const std::string& path) + { + const auto safe_path = filesystem::get_safe_path(path); + return func(safe_path); + }; + } +} diff --git a/src/client/component/fonts.cpp b/src/client/component/fonts.cpp index bdd16e53..097241e8 100644 --- a/src/client/component/fonts.cpp +++ b/src/client/component/fonts.cpp @@ -2,8 +2,11 @@ #include "loader/component_loader.hpp" #include "fonts.hpp" -#include "game_console.hpp" +#include "console.hpp" #include "filesystem.hpp" +#include "command.hpp" +#include "language.hpp" +#include "config.hpp" #include "game/game.hpp" #include "game/dvars.hpp" @@ -19,12 +22,116 @@ namespace fonts { namespace { + const char* hudelem_fonts[] = + { + "", + "bigfixed", + "smallfixed", + "objective", + "big", + "small", + "hudbig", + "hudsmall", + "buttomprompt", + "subtitle", + "timer", + "nameplate", + "bank", + "bankshadow", + "bankshadowmore", + }; + struct font_data_t { std::unordered_map fonts; std::unordered_map raw_fonts; }; + utils::memory::allocator font_allocator; + + game::StringTable* get_font_replacements_table() + { + if (!game::DB_XAssetExists(game::ASSET_TYPE_STRINGTABLE, "font_replacements.csv")) + { + return nullptr; + } + + return game::DB_FindXAssetHeader(game::ASSET_TYPE_STRINGTABLE, "font_replacements.csv", false).stringTable; + } + + struct font_replacement + { + const char* target_font; + const char* new_font; + }; + + std::vector& get_font_replacements() + { + static std::vector replacements = {}; + return replacements; + } + + void load_font_replacements() + { + static auto loaded = false; + if (loaded) + { + return; + } + + loaded = true; + auto& replacements = get_font_replacements(); + + const auto disabled = config::get("disable_custom_fonts"); + if (disabled.has_value() && disabled.value() && language::current() != game::LANGUAGE_CZECH) + { + return; + } + + const auto table = get_font_replacements_table(); + if (table == nullptr) + { + return; + } + + const auto current_language = language::current(); + + for (auto row = 0; row < table->rowCount; row++) + { + if (table->columnCount < 3) + { + continue; + } + + const auto row_values = &table->values[(row * table->columnCount)]; + const auto lang = row_values[0].string; + if (std::strcmp(lang, game::languages[current_language].name)) + { + continue; + } + + const auto font = utils::memory::get_allocator()->duplicate_string(row_values[1].string); + const auto replacement = utils::memory::get_allocator()->duplicate_string(row_values[2].string); + replacements.emplace_back(font, replacement); + } + + return; + } + + const char* get_font_replacement(const char* name) + { + const auto& replacements = get_font_replacements(); + for (const auto& replacement : replacements) + { + if (!std::strcmp(name, replacement.target_font)) + { + return replacement.new_font; + } + } + + return name; + } + utils::concurrency::container font_data; game::TTF* create_font(const std::string& name, const std::string& data) @@ -39,9 +146,9 @@ namespace fonts void free_font(game::TTF* font) { - utils::memory::get_allocator()->free(font->buffer); - utils::memory::get_allocator()->free(font->name); - utils::memory::get_allocator()->free(font); + font_allocator.free(font->buffer); + font_allocator.free(font->name); + font_allocator.free(font); } game::TTF* load_font(const std::string& name) @@ -79,7 +186,7 @@ namespace fonts } catch (const std::exception& e) { - game_console::print(game_console::con_type_error, "Failed to load font %s: %s\n", name.data(), e.what()); + console::error("Failed to load font %s: %s\n", name.data(), e.what()); } return nullptr; @@ -92,8 +199,141 @@ namespace fonts { result = game::DB_FindXAssetHeader(type, name, create_default).ttf; } + return result; } + + utils::hook::detour r_register_font_hook; + void* r_register_font_stub(const char* name, int size) + { + const auto name_ = get_font_replacement(name); + return r_register_font_hook.invoke(name_, size); + } + + utils::hook::detour cl_init_renderer_hook; + void* cl_init_renderer_stub() + { + load_font_replacements(); + return cl_init_renderer_hook.invoke(); + } + + game::Font_s* bank_font = nullptr; + + utils::hook::detour ui_get_font_handle_hook; + utils::hook::detour ui_asset_cache_hook; + + game::Font_s* ui_get_font_handle_stub(void* a1, int font_index) + { + if (font_index < 12 || bank_font == nullptr) + { + return ui_get_font_handle_hook.invoke(a1, font_index); + } + + switch (font_index) + { + case 12: + case 13: + case 14: + return bank_font; + } + + return ui_get_font_handle_hook.invoke(a1, font_index); + } + + game::Font_s* get_bank_font() + { + if (language::is_asian()) + { + return game::R_RegisterFont("fonts/defaultBold.otf", 32); + } + else + { + return game::R_RegisterFont("fonts/bank.ttf", 32); + } + } + + void* ui_asset_cache_stub() + { + bank_font = get_bank_font(); + return ui_asset_cache_hook.invoke(); + } + + int get_font_handle_index(int hudelem_font_index, int current) + { + switch (hudelem_font_index) + { + case 12: + case 13: + case 14: + return hudelem_font_index; + } + + return current; + } + + void get_hud_elem_info_stub(utils::hook::assembler& a) + { + a.push(ebx); + a.pushad64(); + a.mov(edx, ebx); + a.mov(ecx, dword_ptr(rsi, 4)); + a.call_aligned(get_font_handle_index); + a.mov(dword_ptr(rsp, 0x80), eax); + a.popad64(); + a.pop(ebx); + + a.mov(edx, dword_ptr(rdi, 0x240)); + a.lea(r8, qword_ptr(rsp, 0x98)); + + a.jmp(0x14037B39E); + } + + int get_font_style(int font_index) + { + switch (font_index) + { + case 12: + return 0; // none + case 13: + return 2; // shadowed + case 14: + return 4; // shadowed more + } + + return 0; + } + + void get_hud_elem_text_style_stub(utils::hook::assembler& a) + { + const auto original = a.newLabel(); + const auto loc_14037AF98 = a.newLabel(); + + a.mov(eax, dword_ptr(rdi, 4)); + a.cmp(eax, 12); + a.jl(original); + + a.push(edx); + a.pushad64(); + + a.mov(ecx, eax); + a.call_aligned(get_font_style); + a.mov(dword_ptr(rsp, 0x80), eax); + + a.popad64(); + a.pop(edx); + + a.jmp(0x14037AFA5); + + a.bind(original); + + a.cmp(eax, 9); + a.jnz(loc_14037AF98); + a.mov(edx, 0x400); + a.jmp(0x14037AFA5); + + a.bind(loc_14037AF98); + a.jmp(0x14037AF98); + } } void add(const std::string& name, const std::string& data) @@ -113,8 +353,9 @@ namespace fonts free_font(font.second); } + font_allocator.clear(); data_.fonts.clear(); - utils::hook::set(0x14EE3ACB8, 0); // reset registered font count + *reinterpret_cast(0x14EE3ACB8) = 0; // reset registered font count }); } @@ -124,6 +365,41 @@ namespace fonts void post_unpack() override { utils::hook::call(0x140747096, db_find_xasset_header_stub); + r_register_font_hook.create(0x140746FE0, r_register_font_stub); + cl_init_renderer_hook.create(0x1403D5AA0, cl_init_renderer_stub); + + // add custom fonts to hud elem fonts + ui_asset_cache_hook.create(0x140606090, ui_asset_cache_stub); + ui_get_font_handle_hook.create(0x1406058F0, ui_get_font_handle_stub); + + // change hudelem font array + utils::hook::inject(0x1404C17A6, hudelem_fonts); + utils::hook::set(0x1404C17B7, static_cast(ARRAYSIZE(hudelem_fonts))); + + // handle custom fonts + utils::hook::jump(0x14037B390, utils::hook::assemble(get_hud_elem_info_stub), true); + // handle custom font styles + utils::hook::jump(0x14037AF89, utils::hook::assemble(get_hud_elem_text_style_stub), true); + + command::add("dumpFont", [](const command::params& params) + { + if (params.size() < 2) + { + return; + } + + const auto name = params.get(1); + const auto ttf = game::DB_FindXAssetHeader(game::XAssetType::ASSET_TYPE_TTF, name, false).ttf; + if (ttf == nullptr) + { + console::error("Font does not exist\n"); + return; + } + + const auto path = utils::string::va("dumps/%s", ttf->name); + utils::io::write_file(path, std::string(ttf->buffer, ttf->len), false); + console::info("Dumped to %s", path); + }); } }; } diff --git a/src/client/component/fps.cpp b/src/client/component/fps.cpp index 8233908e..c2f5e353 100644 --- a/src/client/component/fps.cpp +++ b/src/client/component/fps.cpp @@ -29,6 +29,9 @@ namespace fps game::dvar_t* cg_speedGraphY; game::dvar_t* cg_speedGraphWidth; game::dvar_t* cg_speedGraphHeight; + game::dvar_t* cg_speedGraphIncludeZAxis; + + game::dvar_t* cg_drawGameTime; float fps_color_good[4] = {0.6f, 1.0f, 0.0f, 1.0f}; float fps_color_ok[4] = {1.0f, 0.7f, 0.3f, 1.0f}; @@ -141,9 +144,9 @@ namespace fps } const auto speed = static_cast(sqrt( - pow(game::g_entities[0].client->velocity[0], 2) + - pow(game::g_entities[0].client->velocity[1], 2) + - pow(game::g_entities[0].client->velocity[2], 2) + pow(game::g_clients[0].velocity[0], 2) + + pow(game::g_clients[0].velocity[1], 2) + + pow(game::g_clients[0].velocity[2], 2) )); const auto font = speed_font; @@ -164,7 +167,7 @@ namespace fps void draw_box(const float x, const float y, const float w, const float h, float* color) { - game::vec4_t dark_color; + game::vec4_t dark_color{}; dark_color[0] = color[0] * 0.5f; dark_color[1] = color[1] * 0.5f; @@ -188,9 +191,9 @@ namespace fps } const auto speed = static_cast(sqrt( - pow(game::g_entities[0].client->velocity[0], 2) + - pow(game::g_entities[0].client->velocity[1], 2) + - pow(game::g_entities[0].client->velocity[2], 2) + pow(game::g_clients[0].velocity[0], 2) + + pow(game::g_clients[0].velocity[1], 2) + + (cg_speedGraphIncludeZAxis->current.enabled ? pow(game::g_clients[0].velocity[2], 2) : 0) )); const auto base_width = relative(cg_speedGraphWidth->current.integer); @@ -209,30 +212,40 @@ namespace fps speed_history.push_back(speed); } + auto max_speed = 0.f; + for (const auto& value : speed_history) + { + if (value > max_speed) + { + max_speed = value; + } + } + const auto base_x = relative(cg_speedGraphX->current.integer); const auto base_y = screen_max[1] - relative(cg_speedGraphY->current.integer); const auto width = 1.f; - draw_box(base_x, base_y - base_height - 4.f, base_width + 4.f, + draw_box(base_x, base_y - base_height - 4.f, base_width + 5.f, base_height + 4.f, cg_speedGraphBackgroundColor->current.vector); const auto diff = max - static_cast(speed_history.size()); for (auto i = 0; i < speed_history.size(); i++) { - const auto percentage = std::min(speed_history[i] / 1000.f, 1.f); + const auto percentage = std::min(speed_history[i] / std::max(500.f, max_speed), 1.f); const auto height = percentage * base_height; const auto x = base_x + static_cast(diff + i) * width + 2.f; const auto y = base_y - height - 2.f; - draw_line(x, y, width, height); + draw_line(x + 1.f, y, width, height); } - const auto speed_string = utils::string::va("%i\n", static_cast(speed)); + const auto speed_string = utils::string::va("%i (%i)\n", + static_cast(speed), static_cast(max_speed)); - const auto font_height = relative(20); - const auto font = game::R_RegisterFont("fonts/fira_mono_regular.ttf", static_cast(font_height)); + const auto font_height = relative(15); + const auto font = game::R_RegisterFont("fonts/default.otf", static_cast(font_height)); const auto text_x = base_x + relative(5); const auto text_y = base_y - (base_height / 2.f) + (font_height / 2.f); @@ -252,11 +265,12 @@ namespace fps average)) + 9.313225746154785e-10); + const auto font = fps_font; const auto fps_string = utils::string::va("%i", fps); - const auto x = screen_max[0] - 15.f - game::R_TextWidth(fps_string, 0x7FFFFFFF, fps_font); + const auto x = screen_max[0] - 10.f - game::R_TextWidth(fps_string, 0x7FFFFFFF, font); + const auto color = fps >= 60 ? fps_color_good : (fps >= 30 ? fps_color_ok : fps_color_bad); - game::R_AddCmdDrawText(fps_string, 0x7FFFFFFF, fps_font, x, 35.f, 1.0f, 1.0f, 0.0f, - fps >= 60 ? fps_color_good : (fps >= 30 ? fps_color_ok : fps_color_bad), 1); + game::R_AddCmdDrawText(fps_string, 0x7FFFFFFF, font, x, 30.f, 1.0f, 1.0f, 0.0f, color, 1); } void draw_pos() @@ -279,12 +293,58 @@ namespace fps 60.f, 1.0f, 1.0f, 0.0f, fps_color_ok, 0); } + void draw_game_time() + { + if (!cg_drawGameTime->current.enabled) + { + return; + } + + auto msec = *game::gameTime; + + // remove first frames + if (msec >= 300) + { + msec -= 300; + } + + const auto ms = static_cast((msec % 1000) / 10); + const auto s = static_cast(msec / 1000) % 60; + const auto m = static_cast(msec / 1000 / 60); + const auto text = utils::string::va("%d:%02d.%02d", m, s, ms); + + const auto height = relative(24); + const auto base_width = relative(cg_speedGraphWidth->current.integer); + const auto base_height = cg_speedGraph->current.enabled ? relative(cg_speedGraphHeight->current.integer) : 0; + + const auto base_x = relative(cg_speedGraphX->current.integer); + const auto base_y = screen_max[1] - relative(cg_speedGraphY->current.integer) - base_height - height + - (cg_speedGraph->current.enabled ? 2.f : 0.f); + + const auto font_height = relative(20); + const auto font = game::R_RegisterFont("fonts/default.otf", static_cast(font_height)); + const auto text_width = game::R_TextWidth(text, 0x7FFFFFFF, font); + + draw_box(base_x, base_y, base_width + 5.f, + height, cg_speedGraphBackgroundColor->current.vector); + + const auto text_y = base_y + (height / 2.f) + ((font_height + relative(5)) / 2.f); + + game::R_AddCmdDrawText(text, 0x7FFFFFFF, font, base_x + base_width - text_width, + text_y, 1.0f, 1.0f, 0.0f, cg_speedGraphFontColor->current.vector, 0); + } + void draw() { + if (*dvars::cg_draw_2d && !(*dvars::cg_draw_2d)->current.enabled) + { + return; + } + check_resize(); draw_fps(); - if (!game::CL_IsCgameInitialized() || !game::g_entities[0].client) + if (!game::CL_IsCgameInitialized() || game::g_entities[0].client == nullptr) { return; } @@ -292,6 +352,7 @@ namespace fps draw_pos(); draw_speed(); draw_speed_graph(); + draw_game_time(); } } @@ -304,20 +365,28 @@ namespace fps sub_7C55D0_hook.create(0x1407C55D0, perf_update); - cg_drawSpeed = dvars::register_bool("cg_drawSpeed", 0, game::DVAR_FLAG_SAVED); - cg_drawFps = dvars::register_int("cg_drawFPS", 0, 0, 4, game::DVAR_FLAG_SAVED); + cg_drawSpeed = dvars::register_bool("cg_drawSpeed", 0, game::DVAR_FLAG_SAVED, "Draw speed"); + cg_drawFps = dvars::register_int("cg_drawFPS", 0, 0, 4, game::DVAR_FLAG_SAVED, "Draw fps"); - cg_speedGraph = dvars::register_bool("cg_speedGraph", 0, game::DVAR_FLAG_SAVED); + cg_speedGraph = dvars::register_bool("cg_speedGraph", 0, game::DVAR_FLAG_SAVED, "Enable speed graph"); - cg_speedGraphColor = dvars::register_vec4("cg_speedGraphColor", 1.f, 0.f, 0.f, 1.0f, 0.f, 1.f, game::DVAR_FLAG_SAVED); - cg_speedGraphFontColor = dvars::register_vec4("cg_speedGraphFontColor", 1.f, 1.f, 1.f, 1.f, 0.f, 1.f, game::DVAR_FLAG_SAVED); - cg_speedGraphBackgroundColor = dvars::register_vec4("cg_speedGraphBackgroundColor", 0.f, 0.f, 0.f, 0.8f, 0.f, 1.f, game::DVAR_FLAG_SAVED); + cg_speedGraphColor = dvars::register_vec4("cg_speedGraphColor", + 1.f, 0.f, 0.f, 1.0f, 0.f, 1.f, game::DVAR_FLAG_SAVED, "Speed graph color"); + cg_speedGraphFontColor = dvars::register_vec4("cg_speedGraphFontColor", + 1.f, 1.f, 1.f, 1.f, 0.f, 1.f, game::DVAR_FLAG_SAVED, "Speed graph font color"); + cg_speedGraphBackgroundColor = dvars::register_vec4("cg_speedGraphBackgroundColor", + 0.f, 0.f, 0.f, 0.8f, 0.f, 1.f, game::DVAR_FLAG_SAVED, "Speed graph background color"); - cg_speedGraphX = dvars::register_int("cg_speedGraphX", 15, 0, 1000, game::DVAR_FLAG_SAVED); - cg_speedGraphY = dvars::register_int("cg_speedGraphY", 15, 0, 1000, game::DVAR_FLAG_SAVED); + cg_speedGraphX = dvars::register_int("cg_speedGraphX", 15, 0, 1000, game::DVAR_FLAG_SAVED, "Speed graph x position"); + cg_speedGraphY = dvars::register_int("cg_speedGraphY", 15, 0, 1000, game::DVAR_FLAG_SAVED, "Speed graph y position"); - cg_speedGraphWidth = dvars::register_int("cg_speedGraphWidth", 200, 0, 1000, game::DVAR_FLAG_SAVED); - cg_speedGraphHeight = dvars::register_int("cg_speedGraphHeight", 80, 0, 1000, game::DVAR_FLAG_SAVED); + cg_speedGraphWidth = dvars::register_int("cg_speedGraphWidth", 200, 0, 1000, game::DVAR_FLAG_SAVED, "Speed graph width"); + cg_speedGraphHeight = dvars::register_int("cg_speedGraphHeight", 80, 0, 1000, game::DVAR_FLAG_SAVED, "Speed graph height"); + + cg_speedGraphIncludeZAxis = dvars::register_bool("cg_speedGraphIncludeZAxis", false, game::DVAR_FLAG_SAVED, + "Include velocity on the z axis when calculating the speed"); + + cg_drawGameTime = dvars::register_bool("cg_drawGameTime", false, game::DVAR_FLAG_SAVED, "Draw game time"); } }; } diff --git a/src/client/component/game_console.cpp b/src/client/component/game_console.cpp index 3e1a6a6c..a3bf435d 100644 --- a/src/client/component/game_console.cpp +++ b/src/client/component/game_console.cpp @@ -2,10 +2,10 @@ #include "loader/component_loader.hpp" #include "game/game.hpp" -#include "game/dvars.hpp" #include "game_console.hpp" #include "command.hpp" +#include "console.hpp" #include "scheduler.hpp" #include "game/scripting/event.hpp" @@ -14,6 +14,7 @@ #include #include +#include #define console_font game::R_RegisterFont("fonts/fira_mono_regular.ttf", 18) #define material_white game::Material_RegisterHandle("white") @@ -33,6 +34,8 @@ namespace game_console int info_line_count; }; + using output_queue = std::deque; + struct ingame_console { char buffer[256]; @@ -46,7 +49,7 @@ namespace game_console bool output_visible; int display_line_offset; int line_count; - std::deque output; + utils::concurrency::container output{}; }; ingame_console con; @@ -55,7 +58,7 @@ namespace game_console std::deque history; std::string fixed_input; - std::unordered_set matches; + std::vector matches; float color_white[4] = {1.0f, 1.0f, 1.0f, 1.0f}; float color_h2[4] = {0.9f, 0.9f, 0.5f, 1.0f}; @@ -69,24 +72,22 @@ namespace game_console matches.clear(); } - void print(const std::string& data, bool print_ = true) + void print(const std::string& data) { - if (con.visible_line_count > 0 && con.display_line_offset == (con.output.size() - con.visible_line_count)) + con.output.access([&](output_queue& output) { - con.display_line_offset++; - } + if (con.visible_line_count > 0 + && con.display_line_offset == (output.size() - con.visible_line_count)) + { + con.display_line_offset++; + } - con.output.push_back(data); - - if (print_) - { - printf("%s\n", data.data()); - } - - if (con.output.size() > 1024) - { - con.output.pop_front(); - } + output.push_back(data); + if (output.size() > 512) + { + output.pop_front(); + } + }); } void toggle_console() @@ -161,21 +162,22 @@ namespace game_console con.globals.x = game::R_TextWidth(str, 0, console_font) + con.globals.x + 6.0f; } - void draw_hint_box(const int lines, float* color, [[maybe_unused]] float offset_x = 0.0f, + float draw_hint_box(const int lines, float* color, [[maybe_unused]] float offset_x = 0.0f, [[maybe_unused]] float offset_y = 0.0f) { const auto _h = lines * con.globals.font_height + 12.0f; - const auto _y = con.globals.y - 3.0f + con.globals.font_height + 12.0f; + const auto _y = con.globals.y - 3.0f + con.globals.font_height + 12.0f + offset_y; const auto _w = (con.screen_max[0] - con.screen_min[0]) - ((con.globals.x - 6.0f) - con.screen_min[0]); draw_box(con.globals.x - 6.0f, _y, _w, _h, color); + return _h; } - void draw_hint_text(const int line, const char* text, float* color, const float offset = 0.0f) + void draw_hint_text(const int line, const char* text, float* color, const float offset_x = 0.0f, const float offset_y = 0.0f) { - const auto _y = con.globals.font_height + con.globals.y + (con.globals.font_height * (line + 1)) + 15.0f; + const auto _y = con.globals.font_height + con.globals.y + (con.globals.font_height * (line + 1)) + 15.0f + offset_y; - game::R_AddCmdDrawText(text, 0x7FFFFFFF, console_font, con.globals.x + offset, _y, 1.0f, 1.0f, 0.0f, color, 0); + game::R_AddCmdDrawText(text, 0x7FFFFFFF, console_font, con.globals.x + offset_x, _y, 1.0f, 1.0f, 0.0f, color, 0); } bool match_compare(const std::string& input, const std::string& text, const bool exact) @@ -198,14 +200,8 @@ namespace game_console con.globals.left_x = con.globals.x; con.globals.auto_complete_choice[0] = 0; - /* game::R_AddCmdDrawTextWithCursor(con.buffer, 0x7FFFFFFF, console_font, 18, con.globals.x, - con.globals.y + con.globals.font_height, 1.0f, 1.0f, 0, color_white, 0, - con.cursor, '|'); - */ - - game::R_AddCmdDrawText(con.buffer, 0x7FFF, console_font, con.globals.x, - con.globals.y + con.globals.font_height, 1.0f, 1.0f, 0.0f, color_white, 0); + con.globals.y + con.globals.font_height, 1.0f, 1.0f, 0, color_white, nullptr, con.cursor, '|'); // check if using a prefixed '/' or not const auto input = con.buffer[1] && (con.buffer[0] == '/' || con.buffer[0] == '\\') @@ -242,73 +238,85 @@ namespace game_console } else if (matches.size() == 1) { - const auto first = *matches.begin(); - auto* const dvar = game::Dvar_FindVar(first.data()); - const auto line_count = dvar ? 2 : 1; + auto* const dvar = game::Dvar_FindVar(matches[0].name.data()); + const auto line_count = dvar ? 3 : 1; - draw_hint_box(line_count, dvars::con_inputHintBoxColor->current.vector); - draw_hint_text(0, first.data(), - dvar - ? dvars::con_inputDvarMatchColor->current.vector - : dvars::con_inputCmdMatchColor->current.vector); + const auto height = draw_hint_box(line_count, dvars::con_inputHintBoxColor->current.vector); + draw_hint_text(0, matches[0].name.data(), dvar + ? dvars::con_inputDvarMatchColor->current.vector + : dvars::con_inputCmdMatchColor->current.vector); if (dvar) { - const auto offset = (con.screen_max[0] - con.globals.x) / 2.5f; + const auto offset = (con.screen_max[0] - con.globals.x) / 4.f; draw_hint_text(0, game::Dvar_ValueToString(dvar, nullptr, &dvar->current), dvars::con_inputDvarValueColor->current.vector, offset); draw_hint_text(1, " default", dvars::con_inputDvarInactiveValueColor->current.vector); draw_hint_text(1, game::Dvar_ValueToString(dvar, nullptr, &dvar->reset), dvars::con_inputDvarInactiveValueColor->current.vector, offset); + draw_hint_text(2, matches[0].description.data(), + color_white, 0); + + const auto offset_y = height + 3.f; + const auto line_count_ = dvar->type == game::dvar_type::enumeration + ? dvar->domain.enumeration.stringCount + 1 + : 1; + + draw_hint_box(line_count_, dvars::con_inputHintBoxColor->current.vector, 0, offset_y); + draw_hint_text(0, dvars::dvar_get_domain(dvar->type, dvar->domain).data(), + dvars::con_inputCmdMatchColor->current.vector, 0, offset_y); } - strncpy_s(con.globals.auto_complete_choice, first.data(), 64); + strncpy_s(con.globals.auto_complete_choice, matches[0].name.data(), 64); con.globals.may_auto_complete = true; } else if (matches.size() > 1) { draw_hint_box(static_cast(matches.size()), dvars::con_inputHintBoxColor->current.vector); - const auto offset = (con.screen_max[0] - con.globals.x) / 2.5f; + const auto offset = (con.screen_max[0] - con.globals.x) / 4.f; - auto index = 0; - for (const auto& match : matches) + for (size_t i = 0; i < matches.size(); i++) { - auto* const dvar = game::Dvar_FindVar(match.data()); + auto* const dvar = game::Dvar_FindVar(matches[i].name.data()); - draw_hint_text(static_cast(index), match.data(), - dvar - ? dvars::con_inputDvarMatchColor->current.vector - : dvars::con_inputCmdMatchColor->current.vector); + draw_hint_text(static_cast(i), matches[i].name.data(), + dvar + ? dvars::con_inputDvarMatchColor->current.vector + : dvars::con_inputCmdMatchColor->current.vector); if (dvar) { - draw_hint_text(static_cast(index), game::Dvar_ValueToString(dvar, nullptr, &dvar->current), - dvars::con_inputDvarValueColor->current.vector, offset); - } + const auto value = game::Dvar_ValueToString(dvar, nullptr, &dvar->current); + const auto truncated = utils::string::truncate(value, 34, "..."); - index++; + draw_hint_text(static_cast(i), truncated.data(), + dvars::con_inputDvarValueColor->current.vector, offset); + + draw_hint_text(static_cast(i), matches[i].description.data(), + dvars::con_inputDvarValueColor->current.vector, offset * 1.5f); + } } - strncpy_s(con.globals.auto_complete_choice, matches.begin()->data(), 64); + strncpy_s(con.globals.auto_complete_choice, matches[0].name.data(), 64); con.globals.may_auto_complete = true; } } - void draw_output_scrollbar(const float x, float y, const float width, const float height) + void draw_output_scrollbar(const float x, float y, const float width, const float height, output_queue& output) { const auto _x = (x + width) - 10.0f; draw_box(_x, y, 10.0f, height, dvars::con_outputBarColor->current.vector); auto _height = height; - if (con.output.size() > con.visible_line_count) + if (output.size() > con.visible_line_count) { - const auto percentage = static_cast(con.visible_line_count) / con.output.size(); + const auto percentage = static_cast(con.visible_line_count) / output.size(); _height *= percentage; const auto remainingSpace = height - _height; - const auto percentageAbove = static_cast(con.display_line_offset) / (con.output.size() - con. + const auto percentageAbove = static_cast(con.display_line_offset) / (output.size() - con. visible_line_count); y = y + (remainingSpace * percentageAbove); @@ -317,42 +325,45 @@ namespace game_console draw_box(_x, y, 10.0f, _height, dvars::con_outputSliderColor->current.vector); } - void draw_output_text(const float x, float y) + void draw_output_text(const float x, float y, output_queue& output) { - const auto offset = con.output.size() >= con.visible_line_count + const auto offset = output.size() >= con.visible_line_count ? 0.0f - : (con.font_height * (con.visible_line_count - con.output.size())); + : (con.font_height * (con.visible_line_count - output.size())); for (auto i = 0; i < con.visible_line_count; i++) { y = console_font->pixelHeight + y; const auto index = i + con.display_line_offset; - if (index >= con.output.size()) + if (index >= output.size()) { break; } - game::R_AddCmdDrawText(con.output.at(index).data(), 0x7FFF, console_font, x, y + offset, 1.0f, 1.0f, + game::R_AddCmdDrawText(output.at(index).data(), 0x7FFF, console_font, x, y + offset, 1.0f, 1.0f, 0.0f, color_white, 0); } } void draw_output_window() { - draw_box(con.screen_min[0], con.screen_min[1] + 32.0f, con.screen_max[0] - con.screen_min[0], - (con.screen_max[1] - con.screen_min[1]) - 32.0f, dvars::con_outputWindowColor->current.vector); + con.output.access([](output_queue& output) + { + draw_box(con.screen_min[0], con.screen_min[1] + 32.0f, con.screen_max[0] - con.screen_min[0], + (con.screen_max[1] - con.screen_min[1]) - 32.0f, dvars::con_outputWindowColor->current.vector); - const auto x = con.screen_min[0] + 6.0f; - const auto y = (con.screen_min[1] + 32.0f) + 6.0f; - const auto width = (con.screen_max[0] - con.screen_min[0]) - 12.0f; - const auto height = ((con.screen_max[1] - con.screen_min[1]) - 32.0f) - 12.0f; + const auto x = con.screen_min[0] + 6.0f; + const auto y = (con.screen_min[1] + 32.0f) + 6.0f; + const auto width = (con.screen_max[0] - con.screen_min[0]) - 12.0f; + const auto height = ((con.screen_max[1] - con.screen_min[1]) - 32.0f) - 12.0f; - game::R_AddCmdDrawText("h2-mod", 0x7FFFFFFF, console_font, x, - ((height - 16.0f) + y) + console_font->pixelHeight, 1.0f, 1.0f, 0.0f, color_h2, 0); + game::R_AddCmdDrawText("h2-mod", 0x7FFFFFFF, console_font, x, + ((height - 16.0f) + y) + console_font->pixelHeight, 1.0f, 1.0f, 0.0f, color_h2, 0); - draw_output_scrollbar(x, y, width, height); - draw_output_text(x, y); + draw_output_scrollbar(x, y, width, height, output); + draw_output_text(x, y, output); + }); } void draw_console() @@ -392,7 +403,28 @@ namespace game_console for (auto& line : lines) { - print(type == con_type_info ? line : "^"s.append(std::to_string(type)).append(line), false); + print(type == console::con_type_info ? line : "^"s.append(std::to_string(type)).append(line)); + } + } + + void print(const int type, const std::string& data) + { + try + { + if (game::environment::is_dedi()) + { + return; + } + } + catch (std::exception&) + { + return; + } + + const auto lines = utils::string::split(data, '\n'); + for (const auto& line : lines) + { + print(type == console::con_type_info ? line : "^"s.append(std::to_string(type)).append(line)); } } @@ -414,13 +446,13 @@ namespace game_console { if (con.globals.may_auto_complete) { - const auto firstChar = con.buffer[0]; + const auto first_char = con.buffer[0]; clear(); - if (firstChar == '\\' || firstChar == '/') + if (first_char == '\\' || first_char == '/') { - con.buffer[0] = firstChar; + con.buffer[0] = first_char; con.buffer[1] = '\0'; } @@ -455,7 +487,10 @@ namespace game_console { clear(); con.line_count = 0; - con.output.clear(); + con.output.access([](output_queue& output) + { + output.clear(); + }); history_index = -1; history.clear(); @@ -511,7 +546,7 @@ namespace game_console game::Cbuf_AddText(0, utils::string::va("%s \n", cmd)); } - void add(const std::string& cmd, bool print_) + void add(const std::string& cmd) { execute(cmd.data()); @@ -521,7 +556,7 @@ namespace game_console history.erase(history.begin() + 10); } - print(cmd, print_); + printf("]%s", cmd.data()); } bool console_key_event(const int localClientNum, const int key, const int down) @@ -605,19 +640,24 @@ namespace game_console //scroll through output if (key == game::keyNum_t::K_MWHEELUP || key == game::keyNum_t::K_PGUP) { - if (con.output.size() > con.visible_line_count && con.display_line_offset > 0) + con.output.access([](output_queue& output) { - con.display_line_offset--; - } + if (output.size() > con.visible_line_count && con.display_line_offset > 0) + { + con.display_line_offset--; + } + }); } else if (key == game::keyNum_t::K_MWHEELDOWN || key == game::keyNum_t::K_PGDN) { - if (con.output.size() > con.visible_line_count && con.display_line_offset < (con.output.size() - - con. - visible_line_count)) + con.output.access([](output_queue& output) { - con.display_line_offset++; - } + if (output.size() > con.visible_line_count + && con.display_line_offset < (output.size() - con.visible_line_count)) + { + con.display_line_offset++; + } + }); } if (key == game::keyNum_t::K_ENTER) @@ -636,7 +676,7 @@ namespace game_console history.push_front(con.buffer); - print(""s.append(con.buffer)); + printf("]%s", con.buffer); if (history.size() > 10) { @@ -653,16 +693,16 @@ namespace game_console return true; } - void find_matches(std::string input, std::unordered_set& suggestions, const bool exact) + void find_matches(std::string input, std::vector& suggestions, const bool exact) { input = utils::string::to_lower(input); for (const auto& dvar : dvars::dvar_list) { - auto name = utils::string::to_lower(dvar); + auto name = utils::string::to_lower(dvar.name); if (game::Dvar_FindVar(name.data()) && match_compare(input, name, exact)) { - suggestions.insert(dvar); + suggestions.push_back(dvar); } if (exact && suggestions.size() > 1) @@ -673,7 +713,7 @@ namespace game_console if (suggestions.size() == 0 && game::Dvar_FindVar(input.data())) { - suggestions.insert(input.data()); + suggestions.push_back({ input, "" }); } game::cmd_function_s* cmd = (*game::cmd_functions); @@ -685,7 +725,7 @@ namespace game_console if (match_compare(input, name, exact)) { - suggestions.insert(cmd->name); + suggestions.push_back({cmd->name, ""}); } if (exact && suggestions.size() > 1) @@ -693,25 +733,19 @@ namespace game_console return; } } + cmd = cmd->next; } } - std::deque& get_output() - { - return con.output; - } - - std::deque& get_history() - { - return history; - } - void clear_console() { clear(); con.line_count = 0; - con.output.clear(); + con.output.access([](output_queue& output) + { + output.clear(); + }); history_index = -1; history.clear(); } @@ -743,58 +777,59 @@ namespace game_console // add our dvars dvars::con_inputBoxColor = dvars::register_vec4( - "con_inputBoxColor", - 0.2f, 0.2f, 0.2f, 0.9f, - 0.0f, 1.0f, - game::DVAR_FLAG_SAVED); - + "con_inputBoxColor", + 0.2f, 0.2f, 0.2f, 0.9f, 0.0f, 1.0f, + game::DVAR_FLAG_SAVED, + "color of console input box" + ); dvars::con_inputHintBoxColor = dvars::register_vec4( - "con_inputHintBoxColor", - 0.3f, 0.3f, 0.3f, 1.0f, - 0.0f, 1.0f, - game::DVAR_FLAG_SAVED); - + "con_inputHintBoxColor", + 0.3f, 0.3f, 0.3f, 1.0f, 0.0f, 1.0f, + game::DVAR_FLAG_SAVED, + "color of console input hint box" + ); dvars::con_outputBarColor = dvars::register_vec4( - "con_outputBarColor", - 0.5f, 0.5f, 0.5f, 0.6f, - 0.0f, 1.0f, - game::DVAR_FLAG_SAVED); - + "con_outputBarColor", + 0.5f, 0.5f, 0.5f, 0.6f, 0.0f, 1.0f, + game::DVAR_FLAG_SAVED, + "color of console output bar" + ); dvars::con_outputSliderColor = dvars::register_vec4( - "con_outputSliderColor", - 0.9f, 0.9f, 0.5f, 1.00f, - 0.0f, 1.0f, - game::DVAR_FLAG_SAVED); - + "con_outputSliderColor", + 0.9f, 0.9f, 0.5f, 1.0f, 0.0f, 1.0f, + game::DVAR_FLAG_SAVED, + "color of console output slider" + ); dvars::con_outputWindowColor = dvars::register_vec4( - "con_outputWindowColor", - 0.25f, 0.25f, 0.25f, 0.85f, - 0.0f, 1.0f, - game::DVAR_FLAG_SAVED); - + "con_outputWindowColor", + 0.25f, 0.25f, 0.25f, 0.85f, 0.0f, 1.0f, + game::DVAR_FLAG_SAVED, + "color of console output window" + ); dvars::con_inputDvarMatchColor = dvars::register_vec4( - "con_inputDvarMatchColor", - 1.0f, 1.0f, 0.8f, 1.0f, - 0.0f, 1.0f, - game::DVAR_FLAG_SAVED); - + "con_inputDvarMatchColor", + 1.0f, 1.0f, 0.8f, 1.0f, 0.0f, 1.0f, + game::DVAR_FLAG_SAVED, + "color of console matched dvar" + ); dvars::con_inputDvarValueColor = dvars::register_vec4( - "con_inputDvarValueColor", - 1.0f, 1.0f, 0.8f, 1.0f, - 0.0f, 1.0f, - game::DVAR_FLAG_SAVED); - + "con_inputDvarValueColor", + 1.0f, 1.0f, 0.8f, 1.0f, 0.0f, 1.0f, + game::DVAR_FLAG_SAVED, + "color of console matched dvar value" + ); dvars::con_inputDvarInactiveValueColor = dvars::register_vec4( - "con_inputDvarInactiveValueColor", - 0.8f, 0.8f, 0.8f, 1.0f, - 0.0f, 1.0f, - game::DVAR_FLAG_SAVED); - + "con_inputDvarInactiveValueColor", + 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f, + game::DVAR_FLAG_SAVED, + "color of console inactive dvar value" + ); dvars::con_inputCmdMatchColor = dvars::register_vec4( - "con_inputCmdMatchColor", - 0.80f, 0.80f, 1.0f, 1.0f, - 0.0f, 1.0f, - game::DVAR_FLAG_SAVED); + "con_inputCmdMatchColor", + 0.80f, 0.80f, 1.0f, 1.0f, 0.0f, 1.0f, + game::DVAR_FLAG_SAVED, + "color of console matched command" + ); } }; } diff --git a/src/client/component/game_console.hpp b/src/client/component/game_console.hpp index 9506da40..41e3e75e 100644 --- a/src/client/component/game_console.hpp +++ b/src/client/component/game_console.hpp @@ -1,24 +1,16 @@ #pragma once +#include "game/dvars.hpp" + namespace game_console { - enum console_type - { - con_type_error = 1, - con_type_warning = 3, - con_type_info = 7 - }; - void print(int type, const char* fmt, ...); bool console_char_event(int local_client_num, int key); bool console_key_event(int local_client_num, int key, int down); - void find_matches(std::string input, std::unordered_set& suggestions, const bool exact); + void find_matches(std::string input, std::vector& suggestions, const bool exact); void execute(const char* cmd); void clear_console(); - void add(const std::string& cmd, bool print_ = true); - - std::deque& get_output(); - std::deque& get_history(); + void add(const std::string& cmd); } \ No newline at end of file diff --git a/src/client/component/gameplay.cpp b/src/client/component/gameplay.cpp index d727335b..18728c4f 100644 --- a/src/client/component/gameplay.cpp +++ b/src/client/component/gameplay.cpp @@ -13,15 +13,15 @@ namespace gameplay utils::hook::detour pm_player_trace_hook; utils::hook::detour pm_crashland_hook; - void pm_player_trace_stub(game::pmove_t* pm, game::trace_t* trace, const float* f3, - const float* f4, const game::Bounds* bounds, int a6, int a7) + void pm_player_trace_stub(game::pmove_t* pm, game::trace_t* results, const float* start, + const float* end, const game::Bounds* bounds, int passEntityNum, int contentMask) { - pm_player_trace_hook.invoke(pm, trace, f3, f4, bounds, a6, a7); + pm_player_trace_hook.invoke(pm, results, start, end, bounds, passEntityNum, contentMask); // By setting startsolid to false we allow the player to clip through solid objects above their head if (dvars::g_enableElevators->current.enabled) { - trace->startsolid = false; + results->startsolid = false; } } @@ -59,6 +59,58 @@ namespace gameplay pm_crashland_hook.invoke(ps, pm); } } + + void jump_pushoffladder_stub(utils::hook::assembler& a) + { + a.push(rax); + + a.mov(rax, qword_ptr(reinterpret_cast(&dvars::jump_ladderPushVel))); + a.mulss(xmm7, dword_ptr(rax, 0x10)); + a.mulss(xmm6, dword_ptr(rax, 0x10)); + + a.pop(rax); + + a.jmp(0x14067AC7C); + } + + void jump_start_stub(utils::hook::assembler& a) + { + // Game code hook skipped + a.movss(xmm0, dword_ptr(rbx, 0x3D4)); + a.and_(dword_ptr(rbx, 0x54), ~(game::PMF_TIME_HARDLANDING | game::PMF_TIME_KNOCKBACK)); + + a.push(rax); + a.mov(rax, qword_ptr(reinterpret_cast(&dvars::jump_spreadAdd))); + a.addss(xmm0, dword_ptr(rax, 0x10)); + a.pop(rax); + + a.jmp(0x14067AE1A); + + } + + void pm_bouncing_stub_mp(utils::hook::assembler& a) + { + const auto no_bounce = a.newLabel(); + const auto loc_140691518 = a.newLabel(); + + a.push(rax); + + a.mov(rax, qword_ptr(reinterpret_cast(&dvars::pm_bouncing))); + a.mov(al, byte_ptr(rax, 0x10)); + a.cmp(byte_ptr(rbp, -0x5D), al); + + a.pop(rax); + a.jz(no_bounce); + a.jmp(0x140691481); + + a.bind(no_bounce); + a.cmp(dword_ptr(rsp, 0x44), 0); + a.jnz(loc_140691518); + a.jmp(0x14069146F); + + a.bind(loc_140691518); + a.jmp(0x140691518); + } } class component final : public component_interface @@ -66,8 +118,18 @@ namespace gameplay public: void post_unpack() override { - dvars::g_enableElevators = dvars::register_bool("g_enableElevators", false, game::DvarFlags::DVAR_FLAG_NONE); - dvars::jump_enableFallDamage = dvars::register_bool("jump_enableFallDamage", true, game::DVAR_FLAG_REPLICATED); + dvars::g_enableElevators = dvars::register_bool("g_enableElevators", false, + game::DVAR_FLAG_REPLICATED, "Enable elevators"); + dvars::jump_enableFallDamage = dvars::register_bool("jump_enableFallDamage", true, + game::DVAR_FLAG_REPLICATED, "Enable fall damage"); + dvars::jump_ladderPushVel = dvars::register_float("jump_ladderPushVel", 128.0f, 0.0f, 1024.0f, + game::DVAR_FLAG_REPLICATED, "The velocity of a jump off of a ladder"); + dvars::jump_spreadAdd = dvars::register_float("jump_spreadAdd", 64.0f, 0.0f, 512.0f, + game::DVAR_FLAG_REPLICATED, "The amount of spread scale to add as a side effect of jumping"); + + dvars::pm_bouncing = dvars::register_bool("pm_bouncing", false, + game::DVAR_FLAG_REPLICATED, "Enable bouncing"); + utils::hook::jump(0x14069145E, utils::hook::assemble(pm_bouncing_stub_mp), true); // Influence PM_JitterPoint code flow so the trace->startsolid checks are 'ignored' pm_player_trace_hook.create(0x14068F0A0, &pm_player_trace_stub); @@ -75,11 +137,23 @@ namespace gameplay // If g_enableElevators is 1 the 'ducked' flag will always be removed from the player state utils::hook::jump(0x1406878C1, utils::hook::assemble(pm_trace_stub), true); - pm_crashland_hook.create(0x140688A20, pm_crashland_stub); + pm_crashland_hook.create(0x140688A20, &pm_crashland_stub); - dvars::register_float("jump_height", 39, 0, 1000, game::DVAR_FLAG_REPLICATED); - dvars::register_float("g_gravity", 800, 1, 1000, game::DVAR_FLAG_REPLICATED); - dvars::register_int("g_speed", 190, 0, 1000, game::DVAR_FLAG_REPLICATED); + utils::hook::jump(0x14067AC6C, utils::hook::assemble(jump_pushoffladder_stub), true); + utils::hook::nop(0x14067AC78, 4); + + utils::hook::jump(0x14067AE03, utils::hook::assemble(jump_start_stub), true); + utils::hook::nop(0x14067AE0F, 4); + + // Dvars already present in-game + dvars::register_float("jump_height", 39.0f, 0.0f, 1000.0f, + game::DVAR_FLAG_REPLICATED, "The maximum height of a player\'s jump"); + dvars::register_float("jump_stepSize", 18.0f, 0.0f, 64.0f, + game::DVAR_FLAG_REPLICATED, "The maximum step up to the top of a jump arc"); + dvars::register_float("g_gravity", 800.0f, 1.0f, 1000.0f, + game::DVAR_FLAG_REPLICATED, "Game gravity in inches per second squared"); + dvars::register_int("g_speed", 190, 0, 1000, + game::DVAR_FLAG_REPLICATED, "Player speed"); } }; } diff --git a/src/client/component/gsc.cpp b/src/client/component/gsc.cpp new file mode 100644 index 00000000..15878fad --- /dev/null +++ b/src/client/component/gsc.cpp @@ -0,0 +1,787 @@ +#include +#include "loader/component_loader.hpp" + +#include "game/game.hpp" +#include "game/dvars.hpp" + +#include "console.hpp" +#include "filesystem.hpp" +#include "scripting.hpp" +#include "gsc.hpp" +#include "scheduler.hpp" +#include "fastfiles.hpp" +#include "command.hpp" + +#include "game/scripting/execution.hpp" +#include "game/scripting/functions.hpp" +#include "game/scripting/lua/error.hpp" + +#include "notifies.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +namespace gsc +{ + void* func_table[0x1000]{}; + + namespace + { + game::dvar_t* developer_script = nullptr; + + auto compiler = ::gsc::compiler(); + auto decompiler = ::gsc::decompiler(); + auto assembler = ::gsc::assembler(); + auto disassembler = ::gsc::disassembler(); + + std::unordered_map main_handles; + std::unordered_map init_handles; + + std::unordered_map functions; + std::optional gsc_error; + + utils::memory::allocator scriptfile_allocator; + std::unordered_map loaded_scripts; + + struct + { + char* buf = nullptr; + char* pos = nullptr; + unsigned int size = 0x1000000; + } script_memory; + + char* allocate_buffer(size_t size) + { + if (script_memory.buf == nullptr) + { + script_memory.buf = game::PMem_AllocFromSource_NoDebug(script_memory.size, 4, 1, game::PMEM_SOURCE_SCRIPT); + script_memory.pos = script_memory.buf; + } + + if (script_memory.pos + size > script_memory.buf + script_memory.size) + { + game::Com_Error(game::ERR_FATAL, "Out of custom script memory"); + } + + const auto pos = script_memory.pos; + script_memory.pos += size; + return pos; + } + + void free_script_memory() + { + game::PMem_PopFromSource_NoDebug(script_memory.buf, script_memory.size, 4, 1, game::PMEM_SOURCE_SCRIPT); + script_memory.buf = nullptr; + script_memory.pos = nullptr; + } + + void clear() + { + main_handles.clear(); + init_handles.clear(); + loaded_scripts.clear(); + scriptfile_allocator.clear(); + free_script_memory(); + } + + bool read_scriptfile(const std::string& name, std::string* data) + { + if (filesystem::read_file(name, data)) + { + return true; + } + + const auto name_str = name.data(); + if (game::DB_XAssetExists(game::ASSET_TYPE_RAWFILE, name_str) && + !game::DB_IsXAssetDefault(game::ASSET_TYPE_RAWFILE, name_str)) + { + const auto asset = game::DB_FindXAssetHeader(game::ASSET_TYPE_RAWFILE, name.data(), false); + const auto len = game::DB_GetRawFileLen(asset.rawfile); + data->resize(len); + game::DB_GetRawBuffer(asset.rawfile, data->data(), len); + if (len > 0) + { + data->pop_back(); + } + + return true; + } + + return false; + } + + game::ScriptFile* load_custom_script(const char* file_name, const std::string& real_name) + { + if (loaded_scripts.find(real_name) != loaded_scripts.end()) + { + return loaded_scripts[real_name]; + } + + std::string source_buffer{}; + if (!read_scriptfile(real_name + ".gsc", &source_buffer)) + { + return nullptr; + } + + auto data = std::vector{source_buffer.begin(), source_buffer.end()}; + + try + { + compiler->compile(real_name, data); + } + catch (const std::exception& e) + { + + console::error("*********** script compile error *************\n"); + console::error("failed to compile '%s':\n%s", real_name.data(), e.what()); + console::error("**********************************************\n"); + return nullptr; + } + + auto assembly = compiler->output(); + + try + { + assembler->assemble(real_name, assembly); + } + catch (const std::exception& e) + { + console::error("*********** script compile error *************\n"); + console::error("failed to assemble '%s':\n%s", real_name.data(), e.what()); + console::error("**********************************************\n"); + return nullptr; + } + + const auto script_file_ptr = scriptfile_allocator.allocate(); + script_file_ptr->name = file_name; + + const auto stack = assembler->output_stack(); + script_file_ptr->len = static_cast(stack.size()); + + const auto script = assembler->output_script(); + script_file_ptr->bytecodeLen = static_cast(script.size()); + + script_file_ptr->buffer = scriptfile_allocator.allocate_array(stack.size() + 1); + std::memcpy(script_file_ptr->buffer, stack.data(), stack.size()); + + script_file_ptr->bytecode = allocate_buffer(script.size() + 1); + std::memcpy(script_file_ptr->bytecode, script.data(), script.size()); + + script_file_ptr->compressedLen = 0; + + loaded_scripts[real_name] = script_file_ptr; + + return script_file_ptr; + } + + void load_script(const std::string& name) + { + if (!game::Scr_LoadScript(name.data())) + { + return; + } + + const auto main_handle = game::Scr_GetFunctionHandle(name.data(), + xsk::gsc::h2::resolver::token_id("main")); + const auto init_handle = game::Scr_GetFunctionHandle(name.data(), + xsk::gsc::h2::resolver::token_id("init")); + + if (main_handle) + { + console::info("Loaded '%s::main'\n", name.data()); + main_handles[name] = main_handle; + } + + if (init_handle) + { + console::info("Loaded '%s::init'\n", name.data()); + init_handles[name] = init_handle; + } + } + + void load_scripts(const std::filesystem::path& root_dir) + { + std::filesystem::path script_dir = root_dir / "scripts"; + if (!utils::io::directory_exists(script_dir.generic_string())) + { + return; + } + + const auto scripts = utils::io::list_files(script_dir.generic_string()); + for (const auto& script : scripts) + { + if (!script.ends_with(".gsc")) + { + continue; + } + + std::filesystem::path path(script); + const auto relative = path.lexically_relative(root_dir).generic_string(); + const auto base_name = relative.substr(0, relative.size() - 4); + + load_script(base_name); + } + } + + void load_gametype_script_stub(void* a1, void* a2) + { + utils::hook::invoke(0x1404E1400, a1, a2); + + fastfiles::enum_assets(game::ASSET_TYPE_RAWFILE, [](game::XAssetHeader header) + { + std::string name = header.rawfile->name; + + if (name.ends_with(".gsc") && name.starts_with("scripts/")) + { + const auto base_name = name.substr(0, name.size() - 4); + load_script(base_name); + } + }, true); + + for (const auto& path : filesystem::get_search_paths()) + { + load_scripts(path); + } + } + + void g_load_structs_stub() + { + for (auto& function_handle : main_handles) + { + console::info("Executing '%s::main'\n", function_handle.first.data()); + const auto thread = game::Scr_ExecThread(function_handle.second, 0); + game::RemoveRefToObject(thread); + } + + utils::hook::invoke(0x140510B40); + } + + void scr_load_level_stub() + { + utils::hook::invoke(0x1404FD130); + + for (auto& function_handle : init_handles) + { + console::info("Executing '%s::init'\n", function_handle.first.data()); + const auto thread = game::Scr_ExecThread(function_handle.second, 0); + game::RemoveRefToObject(thread); + } + } + + int db_is_xasset_default(int type, const char* name) + { + if (loaded_scripts.find(name) != loaded_scripts.end()) + { + return 0; + } + + return utils::hook::invoke(0x1404143C0, type, name); + } + + void db_get_raw_buffer_stub(const game::RawFile* rawfile, char* buf, const int size) + { + if (rawfile->len > 0 && rawfile->compressedLen == 0) + { + std::memset(buf, 0, size); + std::memcpy(buf, rawfile->buffer, std::min(rawfile->len, size)); + return; + } + + utils::hook::invoke(0x140413C40, rawfile, buf, size); + } + + std::optional> find_function(const char* pos) + { + for (const auto& file : scripting::script_function_table_sort) + { + for (auto i = file.second.begin(); i != file.second.end() && std::next(i) != file.second.end(); ++i) + { + const auto next = std::next(i); + if (pos >= i->second && pos < next->second) + { + return {std::make_pair(i->first, file.first)}; + } + } + } + + return {}; + } + + void print_callstack() + { + for (auto frame = game::scr_VmPub->function_frame; frame != game::scr_VmPub->function_frame_start; --frame) + { + const auto pos = frame == game::scr_VmPub->function_frame + ? game::scr_function_stack->pos + : frame->fs.pos; + const auto function = find_function(frame->fs.pos); + + if (function.has_value()) + { + console::warn("\tat function \"%s\" in file \"%s.gsc\"", + function.value().first.data(), function.value().second.data()); + } + else + { + console::warn("\tat unknown location %p", pos); + } + } + } + + std::optional get_opcode_name(const std::uint8_t opcode) + { + try + { + return {xsk::gsc::h2::resolver::opcode_name(opcode)}; + } + catch (...) + { + return {}; + } + } + + void builtin_call_error(const std::string& error) + { + const auto pos = game::scr_function_stack->pos; + const auto function_id = *reinterpret_cast( + reinterpret_cast(pos - 2)); + + if (function_id > 0x1000) + { + console::warn("in call to builtin method \"%s\"%s", + xsk::gsc::h2::resolver::method_name(function_id).data(), error.data()); + } + else + { + console::warn("in call to builtin function \"%s\"%s", + xsk::gsc::h2::resolver::function_name(function_id).data(), error.data()); + } + } + + bool force_error_print = false; + void* vm_error_stub(void* a1) + { + if (!developer_script->current.enabled && !force_error_print) + { + return utils::hook::invoke(0x140614670, a1); + } + + console::warn("*********** script runtime error *************\n"); + + const auto opcode_id = *reinterpret_cast(0x14BAA93E8); + const std::string error = gsc_error.has_value() + ? utils::string::va(": %s", gsc_error.value().data()) + : ""; + + if ((opcode_id >= 0x1A && opcode_id <= 0x20) || (opcode_id >= 0xA9 && opcode_id <= 0xAF)) + { + builtin_call_error(error); + } + else + { + const auto opcode = get_opcode_name(opcode_id); + if (opcode.has_value()) + { + console::warn("while processing instruction %s%s\n", + opcode.value().data(), error.data()); + } + else + { + console::warn("while processing instruction 0x%X%s\n", + opcode_id, error.data()); + } + } + + force_error_print = false; + gsc_error = {}; + + print_callstack(); + console::warn("**********************************************\n"); + return utils::hook::invoke(0x140614670, a1); + } + + std::string unknown_function_error{}; + void get_unknown_function_error(const char* code_pos) + { + const auto function = find_function(code_pos); + if (function.has_value()) + { + const auto& pos = function.value(); + unknown_function_error = utils::string::va( + "while processing function '%s' in script '%s':\nunknown script '%s'", + pos.first.data(), pos.second.data(), scripting::current_file.data() + ); + } + else + { + unknown_function_error = utils::string::va( + "unknown script '%s'", + scripting::current_file.data() + ); + } + } + + unsigned int current_filename{}; + std::string get_filename_name() + { + const auto filename_str = game::SL_ConvertToString( + static_cast(current_filename)); + const auto id = std::atoi(filename_str); + if (id == 0) + { + return filename_str; + } + + return scripting::get_token_single(id); + } + + + void get_unknown_function_error(unsigned int thread_name) + { + const auto filename = get_filename_name(); + const auto name = scripting::get_token_single(thread_name); + + unknown_function_error = utils::string::va( + "while processing script '%s':\nunknown function '%s::%s'", + scripting::current_file.data(), filename.data(), name.data() + ); + } + + void unknown_function_stub(const char* code_pos) + { + get_unknown_function_error(code_pos); + game::Com_Error(game::ERR_DROP, "script link error\n%s", + unknown_function_error.data()); + } + + unsigned int find_variable_stub(unsigned int parent_id, unsigned int thread_name) + { + const auto res = game::FindVariable(parent_id, thread_name); + if (!res) + { + get_unknown_function_error(thread_name); + game::Com_Error(game::ERR_DROP, "script link error\n%s", + unknown_function_error.data()); + } + return res; + } + + void register_gsc_functions_stub(void* a1, void* a2) + { + utils::hook::invoke(0x140509F20, a1, a2); + for (const auto& func : functions) + { + game::Scr_RegisterFunction(func.first, 0, func.second); + } + } + + scripting::script_value get_argument(int index) + { + if (index >= static_cast(game::scr_VmPub->outparamcount)) + { + return {}; + } + + return game::scr_VmPub->top[-index]; + } + + auto function_id_start = 0x320; + void add_function(const std::string& name, scripting::script_function function) + { + if (xsk::gsc::h2::resolver::find_function(name)) + { + const auto id = xsk::gsc::h2::resolver::function_id(name); + functions[function] = id; + } + else + { + const auto id = ++function_id_start; + xsk::gsc::h2::resolver::add_function(name, static_cast(id)); + functions[function] = id; + } + } + + void execute_custom_function(scripting::script_function function) + { + auto error = false; + + try + { + function({}); + } + catch (const std::exception& e) + { + error = true; + force_error_print = true; + gsc_error = e.what(); + } + + if (error) + { + game::Scr_ErrorInternal(); + } + } + + void vm_call_builtin_stub(scripting::script_function function) + { + auto custom = false; + { + custom = functions.find(function) != functions.end(); + } + + if (!custom) + { + function({}); + } + else + { + execute_custom_function(function); + } + } + + utils::hook::detour scr_emit_function_hook; + void scr_emit_function_stub(unsigned int filename, unsigned int thread_name, char* code_pos) + { + current_filename = filename; + scr_emit_function_hook.invoke(filename, thread_name, code_pos); + } + + std::string get_script_file_name(const std::string& name) + { + const auto id = xsk::gsc::h2::resolver::token_id(name); + if (id == 0) + { + return name; + } + + return std::to_string(id); + } + + std::vector decompile_scriptfile(const std::string& name, const std::string& real_name) + { + const auto* scriptfile = game::DB_FindXAssetHeader(game::ASSET_TYPE_SCRIPTFILE, name.data(), false).scriptfile; + if (scriptfile == nullptr) + { + throw std::runtime_error(std::format("couldn't load scriptfile '{}'", real_name)); + } + + console::info("Decompiling scriptfile '%s'\n", real_name.data()); + + std::vector stack{scriptfile->buffer, scriptfile->buffer + scriptfile->len}; + std::vector bytecode{scriptfile->bytecode, scriptfile->bytecode + scriptfile->bytecodeLen}; + + auto decompressed_stack = xsk::utils::zlib::decompress(stack, static_cast(stack.size())); + + disassembler->disassemble(name, bytecode, decompressed_stack); + auto output = disassembler->output(); + + decompiler->decompile(name, output); + + return decompiler->output(); + } + + void pmem_init_stub() + { + utils::hook::invoke(0x14061EC80); + + const auto type_0 = &game::g_scriptmem[0]; + const auto type_1 = &game::g_scriptmem[1]; + + const auto size_0 = 0x200000; // default size + const auto size_1 = 0x200000 + script_memory.size; + + const auto block = reinterpret_cast(VirtualAlloc(NULL, size_0 + size_1, MEM_RESERVE, PAGE_READWRITE)); + + type_0->buf = block; + type_0->size = size_0; + + type_1->buf = block + size_0; + type_1->size = size_1; + + utils::hook::set(0x14061EC72, size_0 + size_1); + } + } + + game::ScriptFile* find_script(game::XAssetType /*type*/, const char* name, int /*allow_create_default*/) + { + std::string real_name = name; + const auto id = static_cast(std::atoi(name)); + if (id) + { + real_name = xsk::gsc::h2::resolver::token_name(id); + } + + const auto script = load_custom_script(name, real_name); + if (script) + { + return script; + } + + return game::DB_FindXAssetHeader(game::ASSET_TYPE_SCRIPTFILE, name, 1).scriptfile; + } + + class component final : public component_interface + { + public: + void post_unpack() override + { + developer_script = dvars::register_bool("developer_script", false, 0, "Print GSC errors"); + + // Allow custom scripts to include other custom scripts + xsk::gsc::h2::resolver::init([](const auto& include_name) + { + const auto real_name = include_name + ".gsc"; + + std::string file_buffer; + if (!read_scriptfile(real_name, &file_buffer) || file_buffer.empty()) + { + const auto name = get_script_file_name(include_name); + if (game::DB_XAssetExists(game::ASSET_TYPE_SCRIPTFILE, name.data())) + { + return decompile_scriptfile(name, real_name); + } + else + { + throw std::runtime_error(std::format("couldn't load gsc file '{}'", real_name)); + } + } + + std::vector result; + result.assign(file_buffer.begin(), file_buffer.end()); + + return result; + }); + + utils::hook::call(0x1405C6177, find_script); + utils::hook::call(0x1405C6187, db_is_xasset_default); + + // Loads scripts with an uncompressed stack + utils::hook::call(0x1405C61E0, db_get_raw_buffer_stub); + + // load handles + utils::hook::call(0x1404E17B2, load_gametype_script_stub); + + // execute handles + utils::hook::call(0x1404C8F71, g_load_structs_stub); + utils::hook::call(0x1404C8F80, scr_load_level_stub); + + utils::hook::call(0x1405CB94F, vm_error_stub); + + utils::hook::call(0x1405BC583, unknown_function_stub); + utils::hook::call(0x1405BC5CF, unknown_function_stub); + utils::hook::call(0x1405BC6BA, find_variable_stub); + scr_emit_function_hook.create(0x1405BC5E0, scr_emit_function_stub); + + utils::hook::call(0x1405BCBAB, register_gsc_functions_stub); + utils::hook::set(0x1405BC7BC, 0x1000); // change builtin func count + +#define RVA(ptr) static_cast(reinterpret_cast(ptr) - 0x140000000) + utils::hook::set(0x1405BC7C2 + 4, RVA(&func_table)); + utils::hook::inject(0x1405BCB78 + 3, &func_table); + utils::hook::set(0x1405CA678 + 4, RVA(&func_table)); + + utils::hook::nop(0x1405CA683, 8); + utils::hook::call(0x1405CA683, vm_call_builtin_stub); + + // Increase script memory + utils::hook::call(0x1405A4798, pmem_init_stub); + + add_function("print", [](const game::scr_entref_t ref) + { + const auto num = game::Scr_GetNumParam(); + std::string buffer{}; + + for (auto i = 0; i < num; i++) + { + const auto str = game::Scr_GetString(i); + buffer.append(str); + buffer.append("\t"); + } + + printf("%s\n", buffer.data()); + }); + + add_function("assert", [](const game::scr_entref_t ref) + { + const auto expr = get_argument(0).as(); + if (!expr) + { + throw std::runtime_error("assert fail"); + } + }); + + add_function("assertex", [](const game::scr_entref_t ref) + { + const auto expr = get_argument(0).as(); + if (!expr) + { + const auto error = get_argument(1).as(); + throw std::runtime_error(error); + } + }); + + add_function("replacefunc", [](const game::scr_entref_t ref) + { + const auto what = get_argument(0).get_raw(); + const auto with = get_argument(1).get_raw(); + + if (what.type != game::SCRIPT_FUNCTION) + { + throw std::runtime_error("parameter 1 must be a function"); + } + + if (with.type != game::SCRIPT_FUNCTION) + { + throw std::runtime_error("parameter 2 must be a function"); + } + + notifies::set_gsc_hook(what.u.codePosValue, with.u.codePosValue); + }); + + add_function("getsoundlength", [](const game::scr_entref_t ref) + { + const auto name = get_argument(0); + if (!name.is()) + { + throw std::runtime_error("parameter 1 must be a string"); + } + + const auto name_str = name.as(); + const auto sound = game::DB_FindXAssetHeader(game::ASSET_TYPE_SOUND, name_str.data(), false).sound; + if (!sound || !sound->count || !sound->head->soundFile || sound->head->soundFile->type != game::SAT_STREAMED) + { + return game::Scr_AddInt(-1); + } + + return game::Scr_AddInt(sound->head->soundFile->u.streamSnd.totalMsec); + }); + + add_function("executecommand", [](const game::scr_entref_t ref) + { + const auto cmd = get_argument(0).as(); + command::execute(cmd); + }); + + scripting::on_shutdown([](bool free_scripts, bool post_shutdown) + { + if (free_scripts && post_shutdown) + { + xsk::gsc::h2::resolver::cleanup(); + clear(); + } + }); + } + }; +} + +REGISTER_COMPONENT(gsc::component) diff --git a/src/client/component/gsc.hpp b/src/client/component/gsc.hpp new file mode 100644 index 00000000..12277297 --- /dev/null +++ b/src/client/component/gsc.hpp @@ -0,0 +1,8 @@ +#pragma once + +namespace gsc +{ + extern void* func_table[0x1000]; + + game::ScriptFile* find_script(game::XAssetType /*type*/, const char* name, int /*allow_create_default*/); +} diff --git a/src/client/component/gui.cpp b/src/client/component/gui.cpp index 1cba1a67..c421ecf7 100644 --- a/src/client/component/gui.cpp +++ b/src/client/component/gui.cpp @@ -6,6 +6,7 @@ #include "scheduler.hpp" #include "gui.hpp" +#include "console.hpp" #include #include @@ -175,8 +176,14 @@ namespace gui void gui_on_frame() { + if (!game::Sys_IsDatabaseReady2()) + { + return; + } + if (!initialized) { + console::info("[ImGui] Initializing\n"); initialize_gui_context(); } else @@ -212,7 +219,7 @@ namespace gui a.mov(r8d, esi); a.mov(edx, r15d); a.mov(rcx, rdi); - a.call_aligned(rbx); + a.call(rbx); a.mov(ecx, eax); a.jmp(0x1407A14D1); @@ -308,7 +315,8 @@ namespace gui void post_unpack() override { - utils::hook::jump(0x1407A14C4, utils::hook::assemble(dxgi_swap_chain_present_stub), true); + utils::hook::nop(0x1407A14BB, 9); + utils::hook::call(0x1407A14BE, gui_on_frame); wnd_proc_hook.create(0x140650F10, wnd_proc_stub); on_frame([]() diff --git a/src/client/component/gui_asset_list.cpp b/src/client/component/gui_asset_list.cpp index c4989191..d94241cb 100644 --- a/src/client/component/gui_asset_list.cpp +++ b/src/client/component/gui_asset_list.cpp @@ -38,7 +38,7 @@ namespace asset_list const auto name = game::g_assetNames[i]; const auto type = static_cast(i); - if (utils::string::find_lower(name, asset_type_filter)) + if (utils::string::strstr_lower(name, asset_type_filter.data())) { ImGui::Checkbox(name, &shown_assets[type]); } @@ -63,17 +63,22 @@ namespace asset_list ImGui::InputText("asset name", &assets_name_filter[type]); ImGui::BeginChild("assets list"); - const auto lowercase_filter = utils::string::to_lower(assets_name_filter[type]); - - fastfiles::enum_assets(type, [&lowercase_filter, type](const game::XAssetHeader header) + size_t asset_num{}; + fastfiles::enum_assets(type, [type, &asset_num](const game::XAssetHeader header) { const auto asset = game::XAsset{type, header}; - const auto* const asset_name = game::DB_GetXAssetName(&asset); + auto asset_name = game::DB_GetXAssetName(&asset); + if (asset_name[0] == '\0') + { + asset_name = utils::string::va("__%i", asset_num); + } - if (strstr(asset_name, lowercase_filter.data()) && ImGui::Button(asset_name)) + if (utils::string::strstr_lower(asset_name, assets_name_filter[type].data()) && ImGui::Button(asset_name)) { gui::copy_to_clipboard(asset_name); } + + asset_num++; }, true); ImGui::EndChild(); diff --git a/src/client/component/gui_console.cpp b/src/client/component/gui_console.cpp deleted file mode 100644 index 60b425cb..00000000 --- a/src/client/component/gui_console.cpp +++ /dev/null @@ -1,213 +0,0 @@ -#include -#include "loader/component_loader.hpp" - -#include "game/game.hpp" -#include "game/dvars.hpp" - -#include "scheduler.hpp" -#include "command.hpp" -#include "game_console.hpp" -#include "gui.hpp" - -#include -#include -#include - -namespace gui::console -{ - namespace - { - bool auto_scroll = true; - int history_index = -1; - std::string input; - std::string filter; - std::unordered_set matches; - - int input_text_edit(ImGuiInputTextCallbackData* data) - { - switch (data->EventFlag) - { - case ImGuiInputTextFlags_CallbackCompletion: - { - matches.clear(); - const std::string text = data->Buf; - - if (text.find(" ") != std::string::npos) - { - game_console::find_matches(text.substr(0, text.find(" ")), matches, true); - } - else - { - game_console::find_matches(text, matches, false); - } - - if (matches.size() < 24 && matches.size() > 0) - { - const auto match = matches.begin()->data(); - data->DeleteChars(0, data->BufTextLen); - data->InsertChars(0, match, match + strlen(match)); - } - - break; - } - case ImGuiInputTextFlags_CallbackHistory: - { - const auto& history = game_console::get_history(); - - if (data->EventKey == ImGuiKey_UpArrow) - { - if (++history_index >= history.size()) - { - history_index = static_cast(history.size()) - 1; - } - - data->DeleteChars(0, data->BufTextLen); - - if (history_index != -1) - { - const auto text = history.at(history_index).data(); - data->InsertChars(0, text, text + strlen(text)); - } - } - else if (data->EventKey == ImGuiKey_DownArrow) - { - if (--history_index < -1) - { - history_index = -1; - } - - data->DeleteChars(0, data->BufTextLen); - - if (history_index != -1) - { - const auto text = history.at(history_index).data(); - data->InsertChars(0, text, text + strlen(text)); - } - } - - break; - } - } - - return 0; - } - - std::string get_filtered_text() - { - std::string text{}; - - const auto& output = game_console::get_output(); - for (const auto& line : output) - { - if (utils::string::find_lower(line, filter)) - { - text.append(line.data()); - text.append("\n"); - } - } - - if (!text.empty() && text[text.size() - 1] == '\n') - { - text.pop_back(); - } - - return text; - } - - void on_frame() - { - static auto* enabled = &gui::enabled_menus["console"]; - if (!*enabled) - { - return; - } - - const auto filtered_text = get_filtered_text(); - const float footer_height_to_reserve = ImGui::GetStyle().ItemSpacing.y + ImGui::GetFrameHeightWithSpacing(); - static const auto input_text_flags = ImGuiInputTextFlags_EnterReturnsTrue | ImGuiInputTextFlags_CallbackCompletion | - ImGuiInputTextFlags_CallbackHistory; - - ImGui::Begin("Console", enabled); - - if (ImGui::BeginPopup("Options")) - { - ImGui::Checkbox("Auto-scroll", &auto_scroll); - ImGui::EndPopup(); - } - - if (ImGui::Button("Clear")) - { - game_console::clear_console(); - } - - ImGui::SameLine(); - - if (ImGui::Button("Copy")) - { - utils::string::set_clipboard_data(filtered_text); - gui::notification("Console", "Text copied to clipboard"); - } - - ImGui::Separator(); - - if (ImGui::Button("Options")) - { - ImGui::OpenPopup("Options"); - } - - ImGui::SameLine(); - ImGui::InputText("Filter", &filter); - - ImGui::BeginChild("console_scroll", ImVec2(0, -footer_height_to_reserve), false); - - const auto& output = game_console::get_output(); - for (const auto& line : output) - { - if (utils::string::find_lower(line, filter)) - { - ImGui::Text(line.data(), ImVec2(-1, -1)); - } - } - - if (auto_scroll && ImGui::GetScrollY() >= ImGui::GetScrollMaxY()) - { - ImGui::SetScrollHereY(1.0f); - } - - ImGui::EndChild(); - - if (ImGui::InputText("Input", &input, input_text_flags, input_text_edit)) - { - auto& history = game_console::get_history(); - - if (history_index != -1) - { - const auto itr = history.begin() + history_index; - - if (*itr == input) - { - history.erase(history.begin() + history_index); - } - } - - ImGui::SetKeyboardFocusHere(-1); - game_console::add(input.data()); - history_index = -1; - input.clear(); - } - - ImGui::End(); - } - } - - class component final : public component_interface - { - public: - void post_unpack() override - { - gui::on_frame(on_frame); - } - }; -} - -REGISTER_COMPONENT(gui::console::component) diff --git a/src/client/component/gui_debug.cpp b/src/client/component/gui_debug.cpp index 80233264..d41cabdb 100644 --- a/src/client/component/gui_debug.cpp +++ b/src/client/component/gui_debug.cpp @@ -505,19 +505,19 @@ namespace gui::debug void get_pathnode_origin(game::pathnode_t* node, float* out) { - out[0] = node->vLocalOrigin[0]; - out[1] = node->vLocalOrigin[1]; - out[2] = node->vLocalOrigin[2]; + out[0] = node->constant.vLocalOrigin[0]; + out[1] = node->constant.vLocalOrigin[1]; + out[2] = node->constant.vLocalOrigin[2]; game::PathNode_WorldifyPosFromParent(node, out); } void draw_node_links(game::pathnode_t* node, float* origin) { - for (unsigned int i = 0; i < node->totalLinkCount; i++) + for (unsigned int i = 0; i < node->constant.totalLinkCount; i++) { float linked_origin[3] = {}; - const auto num = node->Links[i].nodeNum; + const auto num = node->constant.Links[i].nodeNum; const auto linked = &game::pathData->nodes[num]; get_pathnode_origin(linked, linked_origin); diff --git a/src/client/component/gui_script_console.cpp b/src/client/component/gui_script_console.cpp index 4d667de5..2c036934 100644 --- a/src/client/component/gui_script_console.cpp +++ b/src/client/component/gui_script_console.cpp @@ -176,7 +176,7 @@ namespace gui::script_console bool execute = false; if (multi_line_input) { - ImGui::InputTextMultiline("", &input, ImVec2(0, 100), + ImGui::InputTextMultiline("Input", &input, ImVec2(0, 100), ImGuiInputTextFlags_CallbackCompletion, multi_line_input_text_edit); ImGui::SameLine(); execute = ImGui::Button("Execute", ImVec2(100, 100)); @@ -202,9 +202,9 @@ namespace gui::script_console } history.push_front(input); - if (history.size() > 10) + if (history.size() > 50) { - history.erase(history.begin() + 10); + history.erase(history.begin() + 50); } ImGui::SetKeyboardFocusHere(-1); diff --git a/src/client/component/imagefiles.cpp b/src/client/component/imagefiles.cpp new file mode 100644 index 00000000..ea2e0782 --- /dev/null +++ b/src/client/component/imagefiles.cpp @@ -0,0 +1,145 @@ +#include +#include "loader/component_loader.hpp" + +#include "images.hpp" +#include "console.hpp" +#include "filesystem.hpp" +#include "fastfiles.hpp" +#include "scheduler.hpp" + +#include "game/game.hpp" + +#include +#include +#include +#include +#include + +#define CUSTOM_IMAGE_FILE_INDEX 96 + +namespace imagefiles +{ + namespace + { + struct image_file_unk + { + char __pad0[88]; + }; + + std::unordered_map image_file_unk_map; + std::unordered_map image_file_handles; + + std::string get_image_file_name() + { + return fastfiles::get_current_fastfile(); + } + + image_file_unk* get_image_file_unk(unsigned int index) + { + if (index != CUSTOM_IMAGE_FILE_INDEX) + { + return &reinterpret_cast(0x144379510)[index]; + } + + const auto name = get_image_file_name(); + if (image_file_unk_map.find(name) == image_file_unk_map.end()) + { + const auto unk = utils::memory::get_allocator()->allocate(); + image_file_unk_map[name] = unk; + return unk; + } + + return image_file_unk_map[name]; + } + + game::DB_IFileSysFile* get_image_file_handle(unsigned int index) + { + if (index != CUSTOM_IMAGE_FILE_INDEX) + { + return reinterpret_cast(0x14417B500)[index]; + } + + const auto name = get_image_file_name(); + return image_file_handles[name]; + } + + void db_create_gfx_image_stream_stub(utils::hook::assembler& a) + { + const auto check_image_file_handle = a.newLabel(); + const auto handle_is_open = a.newLabel(); + + a.movzx(eax, cx); + a.push(rax); + a.push(rax); + a.pushad64(); + a.mov(rcx, rax); + a.call_aligned(get_image_file_unk); + a.mov(qword_ptr(rsp, 0x80), rax); + a.popad64(); + a.pop(rax); + a.mov(r14, rax); + a.pop(rax); + + a.push(rax); + a.push(rax); + a.pushad64(); + a.mov(rcx, rax); + a.call_aligned(get_image_file_handle); + a.mov(qword_ptr(rsp, 0x80), rax); + a.popad64(); + a.pop(rax); + a.mov(r12, rax); + a.pop(rax); + + a.cmp(r12, r13); + a.jnz(handle_is_open); + a.jmp(0x14041CA91); + + a.bind(handle_is_open); + a.jmp(0x14041CAE1); + } + + void* pakfile_open_stub(void* /*handles*/, unsigned int count, int is_imagefile, + unsigned int index, int is_localized) + { + if (index != CUSTOM_IMAGE_FILE_INDEX) + { + return utils::hook::invoke(0x140622E80, 0x14417B500, count, is_imagefile, index, is_localized); + } + + const auto name = get_image_file_name(); + const auto db_fs = game::DB_FSInitialize(); + const auto handle = db_fs->vftbl->OpenFile(db_fs, game::SF_PAKFILE, utils::string::va("%s.pak", name.data())); + if (handle != nullptr) + { + image_file_handles[name] = handle; + } + return handle; + } + + void com_sprintf_stub(char* buffer, const size_t len, const char* fmt, unsigned int index) + { + if (index != CUSTOM_IMAGE_FILE_INDEX) + { + return utils::hook::invoke(0x140620480, buffer, len, fmt, index); + } + + const auto name = get_image_file_name(); + utils::hook::invoke(0x140620480, buffer, len, "%s.pak", name.data()); + } + } + + class component final : public component_interface + { + public: + void post_unpack() override + { + utils::hook::jump(0x14041CA81, + utils::hook::assemble(db_create_gfx_image_stream_stub), true); + utils::hook::call(0x14041CAC3, pakfile_open_stub); + utils::hook::call(0x14041CAA5, com_sprintf_stub); + } + }; +} + +REGISTER_COMPONENT(imagefiles::component) diff --git a/src/client/component/images.cpp b/src/client/component/images.cpp index ff7bcf8e..bc17b9d2 100644 --- a/src/client/component/images.cpp +++ b/src/client/component/images.cpp @@ -2,7 +2,7 @@ #include "loader/component_loader.hpp" #include "images.hpp" -#include "game_console.hpp" +#include "console.hpp" #include "filesystem.hpp" #include "game/game.hpp" @@ -84,7 +84,7 @@ namespace images } catch (std::exception& e) { - game_console::print(game_console::con_type_error, "Failed to load image %s: %s\n", image->name, e.what()); + console::error("Failed to load image %s: %s\n", image->name, e.what()); } load_texture_hook.invoke(image, a2, a3); @@ -114,8 +114,8 @@ namespace images public: void post_unpack() override { - setup_texture_hook.create(0x14074A390, setup_texture_stub); - load_texture_hook.create(0x1402A7940, load_texture_stub); + setup_texture_hook.create(0x1402A7940, setup_texture_stub); + load_texture_hook.create(0x1402A6690, load_texture_stub); } }; } diff --git a/src/client/component/input.cpp b/src/client/component/input.cpp index 3f34bf2e..6ce036bd 100644 --- a/src/client/component/input.cpp +++ b/src/client/component/input.cpp @@ -22,6 +22,7 @@ namespace input utils::hook::detour cl_char_event_hook; utils::hook::detour cl_key_event_hook; utils::hook::detour cl_mouse_move_hook; + utils::hook::detour lui_cod_key_event_hook; void cl_char_event_stub(const int local_client_num, const int key) { @@ -35,12 +36,6 @@ namespace input return; } - ui_scripting::notify("keypress", - { - {"keynum", key}, - {"key", game::Key_KeynumToString(key, 0, 1)}, - }); - cl_char_event_hook.invoke(local_client_num, key); } @@ -56,16 +51,22 @@ namespace input return; } - if (!(*game::keyCatchers & 1) && !(*game::keyCatchers & 0x10)) + cl_key_event_hook.invoke(local_client_num, key, down); + } + + void lui_cod_key_event_stub(const int local_client_num, const int a2, const int key, const int down, void* a5, void* a6) + { + const auto state = *game::hks::lua_state; + if (game::LUI_BeginCachedEvent(local_client_num, down ? 3 : 4, state)) { - ui_scripting::notify(down ? "keydown" : "keyup", - { - {"keynum", key}, - {"key", game::Key_KeynumToString(key, 0, 1)}, - }); + const auto key_str = game::Key_KeynumToString(key, 0, 1); + game::LUI_SetTableInt("keynum", key, state); + game::LUI_SetTableString("key", key_str, state); + game::LUI_SetTableString("name", down ? "keydown" : "keyup", state); + game::LUI_EndEvent(state); } - cl_key_event_hook.invoke(local_client_num, key, down); + lui_cod_key_event_hook.invoke(local_client_num, a2, key, down, a5, a6); } void cl_mouse_move_stub(const int local_client_num, int x, int y) @@ -84,9 +85,21 @@ namespace input public: void post_unpack() override { + static const char* lui_cached_events[5] = + { + "process_events", + "gamepad_button", + "transition_complete", + "keydown", + "keyup", + }; + + utils::hook::inject(0x14031EB8B, lui_cached_events); + cl_char_event_hook.create(0x1403D27B0, cl_char_event_stub); cl_key_event_hook.create(0x1403D2AE0, cl_key_event_stub); cl_mouse_move_hook.create(0x1403296F0, cl_mouse_move_stub); + lui_cod_key_event_hook.create(0x140328F50, lui_cod_key_event_stub); } }; } diff --git a/src/client/component/language.cpp b/src/client/component/language.cpp new file mode 100644 index 00000000..576525b1 --- /dev/null +++ b/src/client/component/language.cpp @@ -0,0 +1,171 @@ +#include +#include "loader/component_loader.hpp" + +#include "language.hpp" +#include "config.hpp" + +#include "localized_strings.hpp" + +#include +#include +#include + +#define OLD_LANGUAGE_FILE "players2/default/language" + +namespace language +{ + namespace + { + std::unordered_set non_latin_languages = + { + {game::LANGUAGE_RUSSIAN}, + {game::LANGUAGE_POLISH}, + {game::LANGUAGE_JAPANESE_FULL}, + {game::LANGUAGE_JAPANESE_PARTIAL}, + {game::LANGUAGE_TRADITIONAL_CHINESE}, + {game::LANGUAGE_SIMPLIFIED_CHINESE}, + {game::LANGUAGE_ARABIC}, + {game::LANGUAGE_CZECH}, + {game::LANGUAGE_KOREAN}, + {game::LANGUAGE_RUSSIAN_PARTIAL}, + }; + + std::unordered_set slavic_languages = + { + {game::LANGUAGE_RUSSIAN}, + {game::LANGUAGE_POLISH}, + {game::LANGUAGE_CZECH}, + {game::LANGUAGE_RUSSIAN_PARTIAL}, + }; + + std::unordered_set asian_languages = + { + {game::LANGUAGE_JAPANESE_FULL}, + {game::LANGUAGE_JAPANESE_PARTIAL}, + {game::LANGUAGE_TRADITIONAL_CHINESE}, + {game::LANGUAGE_SIMPLIFIED_CHINESE}, + {game::LANGUAGE_KOREAN}, + }; + + std::unordered_set custom_languages = + { + {game::LANGUAGE_CZECH}, + }; + + const char* get_loc_language_string() + { + const auto data = config::get("language"); + if (!data.has_value()) + { + return nullptr; + } + + static char language[0x200] = {0}; + const auto& value = data.value(); + strcpy_s(language, value.data()); + return language; + } + } + + std::string get_default_language() + { + return "english"; + } + + bool is_valid_language(const std::string& name) + { + const auto lower = utils::string::to_lower(name); + for (auto i = 0; i < game::LANGUAGE_COUNT; i++) + { + if (game::languages[i].name == lower) + { + return true; + } + } + + return false; + } + + bool is_custom_language(const std::string& name) + { + for (const auto& language : custom_languages) + { + if (game::languages[language].name == name || game::languages[language].shortname == name) + { + return true; + } + } + + return false; + } + + game::language_t current() + { + static auto* loc_language = game::Dvar_FindVar("loc_language"); + return static_cast(loc_language->current.integer); + } + + bool is_non_latin() + { + return non_latin_languages.contains(current()); + } + + bool is_slavic() + { + return slavic_languages.contains(current()); + } + + bool is_arabic() + { + return current() == game::LANGUAGE_ARABIC; + } + + bool is_asian() + { + return asian_languages.contains(current()); + } + + bool is_custom() + { + return custom_languages.contains(current()); + } + + void set(const std::string& lang) + { + config::set("language", lang); + } + + void set_from_index(const int index) + { + if (index < 0 || index >= game::LANGUAGE_COUNT) + { + return; + } + + const auto language = game::languages[index]; + set(language.name); + } + + class component final : public component_interface + { + public: + void post_unpack() override + { + utils::hook::call(0x14060AFFB, get_loc_language_string); + + if (utils::io::file_exists(OLD_LANGUAGE_FILE)) + { + const auto lang = utils::io::read_file(OLD_LANGUAGE_FILE); + config::set("language", lang); + utils::io::remove_file(OLD_LANGUAGE_FILE); + } + + for (const auto& language : custom_languages) + { + game::languages[language].is_supported = 1; + } + } + }; +} + +REGISTER_COMPONENT(language::component) diff --git a/src/client/component/language.hpp b/src/client/component/language.hpp new file mode 100644 index 00000000..5cc74dac --- /dev/null +++ b/src/client/component/language.hpp @@ -0,0 +1,20 @@ +#pragma once +#include "game/game.hpp" +#include "game/dvars.hpp" + +namespace language +{ + std::string get_default_language(); + bool is_valid_language(const std::string& name); + bool is_custom_language(const std::string& name); + + void set(const std::string& language); + void set_from_index(const int index); + + game::language_t current(); + bool is_non_latin(); + bool is_slavic(); + bool is_arabic(); + bool is_asian(); + bool is_custom(); +} diff --git a/src/client/component/loadscreen.cpp b/src/client/component/loadscreen.cpp new file mode 100644 index 00000000..206f85d7 --- /dev/null +++ b/src/client/component/loadscreen.cpp @@ -0,0 +1,277 @@ +#include +#include "loader/component_loader.hpp" + +#include "game/game.hpp" +#include "game/dvars.hpp" + +#include "scheduler.hpp" +#include "loadscreen.hpp" + +#include +#include + +namespace loadscreen +{ + namespace + { + game::dvar_t* cl_disable_map_movies = nullptr; + game::dvar_t* cl_loadscreen_image = nullptr; + game::dvar_t* cl_loadscreen_title = nullptr; + game::dvar_t* cl_loadscreen_desc = nullptr; + game::dvar_t* cl_loadscreen_obj = nullptr; + game::dvar_t* cl_loadscreen_obj_icon = nullptr; + game::dvar_t* cl_enable_custom_loadscreen = nullptr; + + utils::hook::detour ui_draw_loadbar_hook; + + float white_color[4] = {0.8f, 0.8f, 0.8f, 1.f}; + float text_color[4] = {0.65f, 0.65f, 0.65f, 1.f}; + float gray_color[4] = {0.2f, 0.2f, 0.2f, 1.f}; + float icon_yellow_color[4] = {0.86f, 0.81f, 0.34f, 1.f}; + float icon_grey_color[4] = {0.6f, 0.6f, 0.6f, 1.f}; + + void draw_loadscreen_gradient() + { + const auto placement = game::ScrPlace_GetViewPlacement(); + const auto gradient = game::Material_RegisterHandle("gradient"); + const auto black = game::Material_RegisterHandle("black"); + + game::CL_DrawStretchPic(placement, -750, -200, 600, 800, 2, 1, 0.0f, 0.0f, 1.0f, 1.0f, white_color, black); + game::CL_DrawStretchPic(placement, -150, -200, 300, 800, 2, 1, 0.0f, 0.0f, 1.0f, 1.0f, white_color, gradient); + } + + void draw_image(const float x, const float y, const float w, const float h, + game::Material* mat) + { + game::rectangle rect{}; + rect.p0.x = x; + rect.p0.y = 0; + rect.p0.f2 = 0.f; + rect.p0.f3 = 1.f; + + rect.p1.x = x + w; + rect.p1.y = 0; + rect.p1.f2 = 0.f; + rect.p1.f3 = 1.f; + + rect.p2.x = x + w; + rect.p2.y = 0 + h; + rect.p2.f2 = 0.f; + rect.p2.f3 = 1.f; + + rect.p3.x = x; + rect.p3.y = 0 + h; + rect.p3.f2 = 0.f; + rect.p3.f3 = 1.f; + + game::R_DrawRectangle(&rect, 0.f, 0.f, 1.f, 1.f, + white_color, mat); + } + + void draw_loadscreen_image() + { + if (*cl_loadscreen_image->current.string == 0) + { + return; + } + + const auto material = game::Material_RegisterHandle(cl_loadscreen_image->current.string); + const auto black = game::Material_RegisterHandle("black"); + const auto placement = game::ScrPlace_GetViewPlacement(); + + const auto h = placement->realViewportSize[1]; + const auto real_w = placement->realViewportSize[0]; + const auto w = h * 16 / 9; + const auto x = real_w / 2 - w / 2; + + draw_image(0, 0, real_w, h, black); + draw_image(x, 0, w, h, material); + } + + void draw_loadscreen_progress_bar() + { + const auto fraction = utils::hook::invoke(0x140287E30); + + const auto w = 290.f; + const auto w_progress = w * fraction; + + const auto material = game::Material_RegisterHandle("white"); + const auto placement = game::ScrPlace_GetViewPlacement(); + + game::CL_DrawStretchPic(placement, -20, 290, w, 3, 0, 0, 0.0f, 0.0f, 1.0f, 1.0f, gray_color, material); + game::CL_DrawStretchPic(placement, -20, 290, w_progress, 3, 0, 0, 0.0f, 0.0f, 1.0f, 1.0f, white_color, material); + } + + void draw_loadscreen_title() + { + auto x = -20.f; + auto y = 288.f; + auto h = 24.f; + auto w = 0.f; + + const auto placement = game::ScrPlace_GetViewPlacement(); + game::ScrPlace_ApplyRect(placement, &x, &y, &w, &h, 0, 0); + + const auto font = game::R_RegisterFont("fonts/default.otf", static_cast(h)); + game::R_AddCmdDrawText(cl_loadscreen_title->current.string, 0x7FFFFFFF, font, x, y, 1.f, 1.f, 0.f, text_color, 0); + } + + void draw_loadscreen_desc() + { + const auto font = game::R_RegisterFont("fonts/default.otf", 20); + const auto placement = game::ScrPlace_GetViewPlacement(); + const auto text = cl_loadscreen_desc->current.string; + + game::rectDef_s rect{}; + rect.x = 0; + rect.y = 0; + rect.w = 290; + rect.horzAlign = 0; + rect.vertAlign = 0; + + game::rectDef_s text_rect{}; + + game::UI_DrawWrappedText(placement, text, &rect, font, -20, 310, 0.25f, text_color, 0, 0, &text_rect, 0); + } + + void draw_loadscreen_objective_icons() + { + if (*cl_loadscreen_obj_icon->current.string == 0) + { + return; + } + + const auto material = game::Material_RegisterHandle(cl_loadscreen_obj_icon->current.string); + const auto placement = game::ScrPlace_GetViewPlacement(); + + const auto w = 15.f; + const auto base_y = 365.f; + const auto base_x = -20.f; + + for (auto row = 0; row < 3; row++) + { + for (auto column = 0; column < 3; column++) + { + auto x = base_x + column * w; + auto y = base_y + row * w + 2; + + const auto color = column <= row ? icon_yellow_color : icon_grey_color; + game::CL_DrawStretchPic(placement, x, y, w, w, 0, 0, 0.f, 0.f, 1.f, 1.f, color, material); + } + } + } + + void draw_loadscreen_objective() + { + if (*cl_loadscreen_obj->current.string == 0) + { + return; + } + + draw_loadscreen_objective_icons(); + + const auto font = game::R_RegisterFont("fonts/default.otf", 20); + const auto placement = game::ScrPlace_GetViewPlacement(); + const auto text = cl_loadscreen_obj->current.string; + + game::rectDef_s rect{}; + rect.x = 0; + rect.y = 0; + rect.w = 290.f; + rect.horzAlign = 0; + rect.vertAlign = 0; + + game::rectDef_s text_rect{}; + + game::UI_DrawWrappedText(placement, text, &rect, font, 30.f, 365.f + 17.5f, 0.25f, text_color, 0, 0, &text_rect, 0); + } + + void draw_loadscreen() + { + if (cl_loadscreen_image == nullptr || cl_loadscreen_title == nullptr || + cl_loadscreen_desc == nullptr || !cl_enable_custom_loadscreen->current.enabled) + { + return; + } + + draw_loadscreen_image(); + draw_loadscreen_gradient(); + draw_loadscreen_progress_bar(); + draw_loadscreen_title(); + draw_loadscreen_desc(); + draw_loadscreen_objective(); + } + + bool in_loadscreen() + { + return *reinterpret_cast(0x14203F3C4) == 4; + } + + void ui_set_active_menu_stub(utils::hook::assembler& a) + { + const auto player_start = a.newLabel(); + + a.mov(rax, qword_ptr(reinterpret_cast(&cl_disable_map_movies))); + a.mov(al, byte_ptr(rax, 0x10)); + a.cmp(al, 1); + a.jz(player_start); + + a.mov(rax, qword_ptr(static_cast(0x14BE6EA10))); + a.mov(al, byte_ptr(rax, 0x10)); + a.cmp(al, 1); + a.jz(player_start); + + a.jmp(0x1405F4701); + + a.bind(player_start); + a.call(0x1405F1B00); + a.jmp(0x1405F44F2); + } + } + + void clear() + { + game::Dvar_Reset(cl_enable_custom_loadscreen, game::DVAR_SOURCE_INTERNAL); + game::Dvar_Reset(cl_disable_map_movies, game::DVAR_SOURCE_INTERNAL); + game::Dvar_Reset(cl_loadscreen_image, game::DVAR_SOURCE_INTERNAL); + game::Dvar_Reset(cl_loadscreen_title, game::DVAR_SOURCE_INTERNAL); + game::Dvar_Reset(cl_loadscreen_desc, game::DVAR_SOURCE_INTERNAL); + } + + class component final : public component_interface + { + public: + void post_start() override + { + scheduler::loop([]() + { + if (in_loadscreen()) + { + draw_loadscreen(); + } + }, scheduler::pipeline::renderer); + } + + void post_unpack() override + { + // not registered, used in CL_StartLoading + cl_disable_map_movies = dvars::register_bool("cl_disableMapMovies", false, 0, "Disable map loading videos"); + + cl_enable_custom_loadscreen = dvars::register_bool("cl_enableCustomLoadscreen", false, 0, "Use custom loadscreen dvars"); + + // auto start the game if cl_disableMapMovies is enabled + utils::hook::jump(0x1405F46EA, utils::hook::assemble(ui_set_active_menu_stub), true); + + scheduler::once([]() + { + cl_loadscreen_image = dvars::register_string("cl_loadscreenImage", "", 0, "Loadscreen background image"); + cl_loadscreen_title = dvars::register_string("cl_loadscreenTitle", "", 0, "Loadscreen mission title"); + cl_loadscreen_desc = dvars::register_string("cl_loadscreenDesc", "", 0, "Loadscreen mission description"); + cl_loadscreen_obj = dvars::register_string("cl_loadscreenObj", "", 0, "Loadscreen mission objective"); + cl_loadscreen_obj_icon = dvars::register_string("cl_loadscreenObjIcon", "", 0, "Loadscreen mission objective icon"); + }, scheduler::pipeline::main); + } + }; +} + +REGISTER_COMPONENT(loadscreen::component) diff --git a/src/client/component/loadscreen.hpp b/src/client/component/loadscreen.hpp new file mode 100644 index 00000000..02b1aed1 --- /dev/null +++ b/src/client/component/loadscreen.hpp @@ -0,0 +1,6 @@ +#pragma once + +namespace loadscreen +{ + void clear(); +} diff --git a/src/client/component/localized_strings.cpp b/src/client/component/localized_strings.cpp index b968d498..12182ecf 100644 --- a/src/client/component/localized_strings.cpp +++ b/src/client/component/localized_strings.cpp @@ -1,12 +1,17 @@ #include #include "loader/component_loader.hpp" + #include "localized_strings.hpp" +#include "game_console.hpp" +#include "filesystem.hpp" +#include "console.hpp" + +#include "game/game.hpp" + #include #include #include -#include "game/game.hpp" - -#include "game_console.hpp" +#include namespace localized_strings { @@ -14,7 +19,13 @@ namespace localized_strings { utils::hook::detour seh_string_ed_get_string_hook; - using localized_map = std::unordered_map; + struct localize_entry + { + std::string value{}; + bool volatile_{}; + }; + + using localized_map = std::unordered_map; utils::concurrency::container localized_overrides; const char* seh_string_ed_get_string(const char* reference) @@ -24,22 +35,155 @@ namespace localized_strings const auto entry = map.find(reference); if (entry != map.end()) { - return utils::string::va("%s", entry->second.data()); + return utils::string::va("%s", entry->second.value.data()); } return seh_string_ed_get_string_hook.invoke(reference); }); } + + game::XAssetHeader db_find_localize_entry_stub(game::XAssetType type, const char* name, int allow_create_default) + { + const auto value = localized_overrides.access([&](const localized_map& map) + -> const char* + { + const auto entry = map.find(name); + if (entry != map.end()) + { + return utils::string::va("%s", entry->second.value.data()); + } + + return nullptr; + }); + + if (value == nullptr) + { + return game::DB_FindXAssetHeader(type, name, allow_create_default); + } + + static game::LocalizeEntry entry{}; + entry.value = value; + entry.name = name; + + return static_cast(&entry); + } + + bool parse_localized_strings_file(const std::string& data) + { + rapidjson::Document j; + j.Parse(data.data()); + + if (!j.IsObject()) + { + return false; + } + + localized_overrides.access([&](localized_map& map) + { + const auto obj = j.GetObj(); + for (const auto& [key, value] : obj) + { + if (!key.IsString() || !value.IsString()) + { + continue; + } + + const auto name = key.GetString(); + const auto str = value.GetString(); + + const auto entry = map.find(name); + if (entry == map.end() || entry->second.volatile_) + { + map[name] = {str, true}; + } + } + }); + + return true; + } + + bool try_load_file(const std::string& path, const std::string& language) + { + const auto file = utils::string::va("%s/localizedstrings/%s.json", path.data(), language.data()); + if (!utils::io::file_exists(file)) + { + return false; + } + + console::info("[Localized strings] Parsing %s\n", file); + const auto data = utils::io::read_file(file); + if (!parse_localized_strings_file(data)) + { + console::error("[Localized strings] Invalid language json file\n"); + return false; + } + + return true; + } + + void load_localized_strings() + { + bool found = false; + + const auto search_paths = filesystem::get_search_paths_rev(); + const auto language = game::SEH_GetCurrentLanguageName(); + + for (const auto& path : search_paths) + { + bool found_in_current_path = false; + + if (try_load_file(path, "english")) + { + found_in_current_path = true; + found = true; + } + + if (language != "english"s && !try_load_file(path, language) && found_in_current_path) + { + console::warn("[Localized strings] No valid language file found for '%s' in '%s/localizedstrings/', falling back to 'english'\n", + language, path.data()); + } + else + { + found = true; + } + } + + if (!found) + { + console::warn("[Localized strings] No valid language file found!\n"); + } + } } - void override(const std::string& key, const std::string& value) + void override(const std::string& key, const std::string& value, bool volatile_) { localized_overrides.access([&](localized_map& map) { - map[key] = value; + map[key] = {value, volatile_}; }); } + void clear() + { + localized_overrides.access([&](localized_map& map) + { + for (auto i = map.begin(); i != map.end();) + { + if (i->second.volatile_) + { + i = map.erase(i); + } + else + { + ++i; + } + } + }); + + load_localized_strings(); + } + class component final : public component_interface { public: @@ -47,6 +191,7 @@ namespace localized_strings { // Change some localized strings seh_string_ed_get_string_hook.create(0x1405E5FD0, &seh_string_ed_get_string); + utils::hook::call(0x1405E5AB9, db_find_localize_entry_stub); } }; } diff --git a/src/client/component/localized_strings.hpp b/src/client/component/localized_strings.hpp index 01d15907..7a0d8f07 100644 --- a/src/client/component/localized_strings.hpp +++ b/src/client/component/localized_strings.hpp @@ -2,5 +2,6 @@ namespace localized_strings { - void override(const std::string& key, const std::string& value); + void override(const std::string& key, const std::string& value, bool volatile_ = false); + void clear(); } \ No newline at end of file diff --git a/src/client/component/logger.cpp b/src/client/component/logger.cpp index 5d0a5f8c..5f5fe60b 100644 --- a/src/client/component/logger.cpp +++ b/src/client/component/logger.cpp @@ -1,8 +1,10 @@ #include #include "loader/component_loader.hpp" +#include "console.hpp" +#include "loadscreen.hpp" + #include "game/game.hpp" -#include "game_console.hpp" #include "game/dvars.hpp" #include @@ -15,6 +17,8 @@ namespace logger utils::hook::detour nullsub_48_hook; utils::hook::detour sub_32AEF0; + game::dvar_t* logger_dev = nullptr; + void print_error(const char* msg, ...) { char buffer[2048]; @@ -26,7 +30,7 @@ namespace logger va_end(ap); - game_console::print(game_console::con_type_error, buffer); + console::error("%s", buffer); } void print_com_error(int, const char* msg, ...) @@ -40,7 +44,7 @@ namespace logger va_end(ap); - game_console::print(game_console::con_type_error, buffer); + console::error("%s", buffer); } void com_error_stub(const int error, const char* msg, ...) @@ -55,9 +59,11 @@ namespace logger va_end(ap); - game_console::print(game_console::con_type_error, "Error: %s\n", buffer); + console::error("Error: %s\n", buffer); } + loadscreen::clear(); + com_error_hook.invoke(error, "%s", buffer); } @@ -72,7 +78,7 @@ namespace logger va_end(ap); - game_console::print(game_console::con_type_warning, buffer); + console::warn("%s", buffer); } void print(const char* msg, ...) @@ -86,13 +92,12 @@ namespace logger va_end(ap); - game_console::print(game_console::con_type_info, buffer); + console::info("%s", buffer); } void print_dev(const char* msg, ...) { - static auto* enabled = dvars::register_bool("logger_dev", false, game::DVAR_FLAG_SAVED); - if (!enabled->current.enabled) + if (!logger_dev->current.enabled) { return; } @@ -106,7 +111,7 @@ namespace logger va_end(ap); - game_console::print(game_console::con_type_info, buffer); + console::info("%s", buffer); } void lui_print(const char* msg, ...) @@ -122,19 +127,25 @@ namespace logger if (strstr(msg, "LUI WARNING:")) { - game_console::print(game_console::con_type_warning, buffer); + console::warn("%s", buffer); } else { - static auto* enabled = dvars::register_bool("logger_dev", false, game::DVAR_FLAG_SAVED); - if (!enabled->current.enabled) + if (!logger_dev->current.enabled) { return; } - game_console::print(game_console::con_type_info, buffer); + console::info("%s", buffer); } } + + + void r_warn_once_per_frame_vsnprintf_stub(char* buffer, size_t buffer_length, char* msg, va_list va) + { + vsnprintf(buffer, buffer_length, msg, va); + console::warn(buffer); + } } class component final : public component_interface @@ -144,9 +155,15 @@ namespace logger { utils::hook::jump(0x14032C620, print_warning, true); utils::hook::jump(0x14032C630, print_warning, true); + utils::hook::jump(0x14032AEF0, lui_print, true); com_error_hook.create(0x1405A2D80, com_error_stub); + utils::hook::jump(0x14013A98C, print); + + utils::hook::call(0x140791A01, r_warn_once_per_frame_vsnprintf_stub); + + logger_dev = dvars::register_bool("logger_dev", false, game::DVAR_FLAG_SAVED, "Print dev stuff"); } }; } diff --git a/src/client/component/lui.cpp b/src/client/component/lui.cpp index a1d9988d..bcc46177 100644 --- a/src/client/component/lui.cpp +++ b/src/client/component/lui.cpp @@ -4,7 +4,7 @@ #include "game/game.hpp" #include "command.hpp" -#include "game_console.hpp" +#include "console.hpp" #include @@ -19,7 +19,7 @@ namespace lui { if (params.size() <= 1) { - game_console::print(game_console::con_type_info, "usage: lui_open \n"); + console::info("usage: lui_open \n"); return; } @@ -30,7 +30,7 @@ namespace lui { if (params.size() <= 1) { - game_console::print(game_console::con_type_info, "usage: lui_open_popup \n"); + console::info("usage: lui_open_popup \n"); return; } diff --git a/src/client/component/mapents.cpp b/src/client/component/mapents.cpp new file mode 100644 index 00000000..bf9988ef --- /dev/null +++ b/src/client/component/mapents.cpp @@ -0,0 +1,96 @@ +#include +#include "loader/component_loader.hpp" + +#include "game/dvars.hpp" + +#include "fastfiles.hpp" +#include "console.hpp" +#include "command.hpp" +#include "game/scripting/functions.hpp" + +#include +#include + +#include +#include +#include + +namespace mapents +{ + namespace + { + std::string replace_mapents_keys(const std::string& data) + { + std::string buffer{}; + const auto lines = utils::string::split(data, '\n'); + + for (const auto& line : lines) + { + const auto _0 = gsl::finally([&] + { + buffer.append("\n"); + }); + + if (line.starts_with("{") || line.starts_with("}")) + { + buffer.append(line); + continue; + } + + const auto first_space = line.find_first_of(' '); + if (first_space == std::string::npos) + { + continue; + } + + const auto id = static_cast(std::atoi(line.substr(0, first_space).data())); + if (id == 0) // 0 "key" "value" + { + buffer.append(line); + continue; + } + + const auto token = xsk::gsc::h2::resolver::token_name(static_cast(id)); + const auto key = "\"" + token + "\""; + + const auto new_line = key + line.substr(first_space); + buffer.append(new_line); + } + + return buffer; + } + } + + class component final : public component_interface + { + public: + void post_unpack() override + { + command::add("dumpMapEnts", []() + { + if (!game::SV_Loaded()) + { + console::info("Not in game\n"); + return; + } + + fastfiles::enum_assets(game::ASSET_TYPE_MAP_ENTS, [](game::XAssetHeader header) + { + if (header.mapents == nullptr) + { + console::info("Failed to dump mapents\n"); + return; + } + + const auto dest = utils::string::va("dumps/%s.ents", header.mapents->name); + const auto str = std::string(header.mapents->entityString, header.mapents->numEntityChars); + const auto data = replace_mapents_keys(str); + utils::io::write_file(dest, data, false); + console::info("Mapents dumped to %s\n", dest); + }, true); + }); + } + }; +} + +REGISTER_COMPONENT(mapents::component) diff --git a/src/client/component/materials.cpp b/src/client/component/materials.cpp deleted file mode 100644 index d84a6b93..00000000 --- a/src/client/component/materials.cpp +++ /dev/null @@ -1,200 +0,0 @@ -#include -#include "loader/component_loader.hpp" - -#include "materials.hpp" -#include "game_console.hpp" -#include "filesystem.hpp" - -#include "game/game.hpp" -#include "game/dvars.hpp" - -#include -#include -#include -#include -#include -#include - -namespace materials -{ - namespace - { - utils::hook::detour db_material_streaming_fail_hook; - utils::hook::detour material_register_handle_hook; - utils::hook::detour db_get_material_index_hook; - - struct material_data_t - { - std::unordered_map materials; - std::unordered_map images; - }; - - char constant_table[0x20] = {}; - - utils::concurrency::container material_data; - - game::GfxImage* setup_image(game::GfxImage* image, const utils::image& raw_image) - { - image->imageFormat = 0x1000003; - image->resourceSize = -1; - - D3D11_SUBRESOURCE_DATA data{}; - data.SysMemPitch = raw_image.get_width() * 4; - data.SysMemSlicePitch = data.SysMemPitch * raw_image.get_height(); - data.pSysMem = raw_image.get_buffer(); - - game::Image_Setup(image, raw_image.get_width(), raw_image.get_height(), image->depth, image->numElements, - image->imageFormat, DXGI_FORMAT_R8G8B8A8_UNORM, 0, image->name, &data); - - return image; - } - - game::Material* create_material(const std::string& name, const std::string& data) - { - const auto white = *reinterpret_cast(0x141B09208); - - const auto material = utils::memory::get_allocator()->allocate(); - const auto texture_table = utils::memory::get_allocator()->allocate(); - const auto image = utils::memory::get_allocator()->allocate(); - - std::memcpy(material, white, sizeof(game::Material)); - std::memcpy(texture_table, white->textureTable, sizeof(game::MaterialTextureDef)); - std::memcpy(image, white->textureTable->u.image, sizeof(game::GfxImage)); - - material->constantTable = &constant_table; - material->name = utils::memory::get_allocator()->duplicate_string(name); - image->name = material->name; - - material->textureTable = texture_table; - material->textureTable->u.image = setup_image(image, data); - - return material; - } - - void free_material(game::Material* material) - { - material->textureTable->u.image->textures.___u0.map->Release(); - material->textureTable->u.image->textures.shaderView->Release(); - utils::memory::get_allocator()->free(material->textureTable->u.image); - utils::memory::get_allocator()->free(material->textureTable); - utils::memory::get_allocator()->free(material->name); - utils::memory::get_allocator()->free(material); - } - - game::Material* load_material(const std::string& name) - { - return material_data.access([&](material_data_t& data_) -> game::Material* - { - if (const auto i = data_.materials.find(name); i != data_.materials.end()) - { - return i->second; - } - - std::string data{}; - if (const auto i = data_.images.find(name); i != data_.images.end()) - { - data = i->second; - } - - if (data.empty() && !filesystem::read_file(utils::string::va("materials/%s.png", name.data()), &data)) - { - data_.materials[name] = nullptr; - return nullptr; - } - - const auto material = create_material(name, data); - data_.materials[name] = material; - - return material; - }); - } - - game::Material* try_load_material(const std::string& name) - { - if (name == "white") - { - return nullptr; - } - - try - { - return load_material(name); - } - catch (const std::exception& e) - { - game_console::print(game_console::con_type_error, "Failed to load material %s: %s\n", name.data(), e.what()); - } - - return nullptr; - } - - game::Material* material_register_handle_stub(const char* name) - { - auto result = try_load_material(name); - if (result == nullptr) - { - result = material_register_handle_hook.invoke(name); - } - return result; - } - - int db_material_streaming_fail_stub(game::Material* material) - { - if (material->constantTable == &constant_table) - { - return 0; - } - - return db_material_streaming_fail_hook.invoke(material); - } - - unsigned int db_get_material_index_stub(game::Material* material) - { - if (material->constantTable == &constant_table) - { - return 0; - } - - return db_get_material_index_hook.invoke(material); - } - } - - void add(const std::string& name, const std::string& data) - { - material_data.access([&](material_data_t& data_) - { - data_.images[name] = data; - }); - } - - void clear() - { - material_data.access([&](material_data_t& data_) - { - for (auto& material : data_.materials) - { - if (material.second == nullptr) - { - continue; - } - - free_material(material.second); - } - - data_.materials.clear(); - }); - } - - class component final : public component_interface - { - public: - void post_unpack() override - { - material_register_handle_hook.create(game::Material_RegisterHandle.get(), material_register_handle_stub); - db_material_streaming_fail_hook.create(0x14041D140, db_material_streaming_fail_stub); - db_get_material_index_hook.create(0x140413BC0, db_get_material_index_stub); - } - }; -} - -REGISTER_COMPONENT(materials::component) diff --git a/src/client/component/materials.hpp b/src/client/component/materials.hpp deleted file mode 100644 index 3a548548..00000000 --- a/src/client/component/materials.hpp +++ /dev/null @@ -1,7 +0,0 @@ -#pragma once - -namespace materials -{ - void add(const std::string& name, const std::string& data); - void clear(); -} diff --git a/src/client/component/mods.cpp b/src/client/component/mods.cpp index dd5404bb..7056e6be 100644 --- a/src/client/component/mods.cpp +++ b/src/client/component/mods.cpp @@ -4,22 +4,54 @@ #include "game/game.hpp" #include "command.hpp" -#include "game_console.hpp" +#include "console.hpp" #include "scheduler.hpp" #include "filesystem.hpp" -#include "materials.hpp" #include "fonts.hpp" #include "mods.hpp" +#include "localized_strings.hpp" +#include "loadscreen.hpp" #include #include +#include + +#define MOD_FOLDER "mods" +#define MOD_STATS_FOLDER "players2/modstats" namespace mods { - std::string mod_path{}; - namespace { + struct mod_zone_info + { + bool has_common_zones; + std::vector zones; + }; + + struct + { + std::optional path; + mod_zone_info zone_info; + } mod_info; + + std::unordered_map alloc_flags_map = + { + {"common", game::DB_ZONE_COMMON}, + {"game", game::DB_ZONE_GAME}, + }; + + unsigned int get_alloc_flag(const std::string& name) + { + const auto lower = utils::string::to_lower(name); + if (alloc_flags_map.find(lower) != alloc_flags_map.end()) + { + return alloc_flags_map[lower]; + } + + return game::DB_ZONE_COMMON; + } + utils::hook::detour db_release_xassets_hook; bool release_assets = false; @@ -27,10 +59,12 @@ namespace mods { if (release_assets) { - materials::clear(); fonts::clear(); + loadscreen::clear(); } + localized_strings::clear(); + db_release_xassets_hook.invoke(); } @@ -39,10 +73,236 @@ namespace mods scheduler::once([]() { release_assets = true; + const auto _0 = gsl::finally([]() + { + release_assets = false; + }); + game::Com_Shutdown(""); - release_assets = false; }, scheduler::pipeline::main); } + + void full_restart(const std::string& arg) + { + utils::nt::relaunch_self(" -singleplayer "s.append(arg), true); + utils::nt::terminate(); + } + + void clear_mod_zones() + { + mod_info.zone_info = {}; + } + + void parse_mod_zones() + { + clear_mod_zones(); + if (!mod_info.path.has_value()) + { + return; + } + + const auto path = mod_info.path.value() + "/zones.csv"; + std::string data{}; + if (!utils::io::read_file(path, &data)) + { + return; + } + + const auto lines = utils::string::split_lines(data); + for (const auto& line : lines) + { + const auto values = utils::string::split(line, ','); + if (values.size() < 2) + { + continue; + } + + const auto alloc_flags = get_alloc_flag(values[0]) | game::DB_ZONE_CUSTOM; + if (alloc_flags & game::DB_ZONE_COMMON) + { + mod_info.zone_info.has_common_zones = true; + } + + mod_info.zone_info.zones.emplace_back(values[1], alloc_flags); + } + } + + std::optional get_mod_basename() + { + const auto mod = get_mod(); + if (!mod.has_value()) + { + return {}; + } + + const auto& value = mod.value(); + const auto last_index = value.find_last_of('/'); + const auto basename = value.substr(last_index + 1); + return {basename}; + } + + nlohmann::json default_mod_stats() + { + nlohmann::json json; + json["maps"] = {}; + return json; + } + + nlohmann::json verify_mod_stats(nlohmann::json& json) + { + if (!json.is_object()) + { + json = {}; + } + + if (!json.contains("maps") || !json["maps"].is_object()) + { + json["maps"] = {}; + } + + return json; + } + + nlohmann::json parse_mod_stats() + { + const auto name = get_mod_basename(); + if (!name.has_value()) + { + return default_mod_stats(); + } + + const auto& name_value = name.value(); + const auto stat_file = MOD_STATS_FOLDER "/" + name_value + ".json"; + if (!utils::io::file_exists(stat_file)) + { + return default_mod_stats(); + } + + const auto data = utils::io::read_file(stat_file); + try + { + auto json = nlohmann::json::parse(data); + return verify_mod_stats(json); + } + catch (const std::exception& e) + { + console::error("Failed to parse json mod stat file \"%s.json\": %s", + name_value.data(), e.what()); + } + + return default_mod_stats(); + } + + void initialize_stats() + { + get_current_stats() = parse_mod_stats(); + } + } + + nlohmann::json& get_current_stats() + { + static nlohmann::json stats; + stats = verify_mod_stats(stats); + return stats; + } + + void write_mod_stats() + { + const auto name = get_mod_basename(); + if (!name.has_value()) + { + return; + } + + const auto& name_value = name.value(); + const auto stat_file = MOD_STATS_FOLDER "/" + name_value + ".json"; + utils::io::write_file(stat_file, get_current_stats().dump(), false); + } + + bool mod_requires_restart(const std::string& path) + { + return mod_info.zone_info.has_common_zones || + utils::io::file_exists(path + "/mod.ff") || + utils::io::file_exists(path + "/zone/mod.ff"); + } + + void set_mod(const std::string& path) + { + if (mod_info.path.has_value()) + { + filesystem::unregister_path(mod_info.path.value()); + } + + write_mod_stats(); + initialize_stats(); + mod_info.path = path; + filesystem::register_path(path); + parse_mod_zones(); + } + + void clear_mod() + { + if (mod_info.path.has_value()) + { + filesystem::unregister_path(mod_info.path.value()); + } + + mod_info.path.reset(); + clear_mod_zones(); + } + + std::vector get_mod_zones() + { + return mod_info.zone_info.zones; + } + + std::optional get_mod() + { + return mod_info.path; + } + + std::vector get_mod_list() + { + if (!utils::io::directory_exists(MOD_FOLDER)) + { + return {}; + } + + std::vector mod_list; + + const auto files = utils::io::list_files(MOD_FOLDER); + for (const auto& file : files) + { + if (!utils::io::directory_exists(file) || utils::io::directory_is_empty(file)) + { + continue; + } + + mod_list.push_back(file); + } + + return mod_list; + } + + std::optional get_mod_info(const std::string& name) + { + const auto info_file = name + "/info.json"; + if (!utils::io::directory_exists(name) || !utils::io::file_exists(info_file)) + { + return {}; + } + + std::unordered_map info; + const auto data = utils::io::read_file(info_file); + try + { + return {nlohmann::json::parse(data)}; + } + catch (const std::exception&) + { + } + + return {}; } class component final : public component_interface @@ -50,9 +310,14 @@ namespace mods public: void post_unpack() override { - if (!utils::io::directory_exists("mods")) + if (!utils::io::directory_exists(MOD_FOLDER)) { - utils::io::create_directory("mods"); + utils::io::create_directory(MOD_FOLDER); + } + + if (!utils::io::directory_exists(MOD_STATS_FOLDER)) + { + utils::io::create_directory(MOD_STATS_FOLDER); } db_release_xassets_hook.create(0x140416A80, db_release_xassets_stub); @@ -61,49 +326,76 @@ namespace mods { if (params.size() < 2) { - game_console::print(game_console::con_type_info, "Usage: loadmod mods/"); + console::info("Usage: loadmod mods/"); return; } if (!game::Com_InFrontend()) { - game_console::print(game_console::con_type_error, "Cannot load mod while in-game!\n"); - game::CG_GameMessage(0, "^1Cannot unload mod while in-game!"); + console::error("Cannot load mod while in-game!\n"); + game::CG_GameMessage(0, "^1Cannot unload mod while in-game!", 0); return; } const auto path = params.get(1); if (!utils::io::directory_exists(path)) { - game_console::print(game_console::con_type_error, "Mod %s not found!\n", path); + console::error("Mod %s not found!\n", path); return; } - game_console::print(game_console::con_type_info, "Loading mod %s\n", path); - filesystem::get_search_paths().erase(mod_path); - filesystem::get_search_paths().insert(path); - mod_path = path; - restart(); + console::info("Loading mod %s\n", path); + set_mod(path); + + if ((mod_info.path.has_value() && mod_requires_restart(mod_info.path.value())) || + mod_requires_restart(path)) + { + // vid_restart is still broken :( + console::info("Restarting...\n"); + full_restart("-mod "s + path); + } + else + { + restart(); + } }); command::add("unloadmod", [](const command::params& params) { - if (mod_path.empty()) + if (!mod_info.path.has_value()) { - game_console::print(game_console::con_type_info, "No mod loaded\n"); + console::info("No mod loaded\n"); return; } if (!game::Com_InFrontend()) { - game_console::print(game_console::con_type_error, "Cannot unload mod while in-game!\n"); - game::CG_GameMessage(0, "^1Cannot unload mod while in-game!"); + console::error("Cannot unload mod while in-game!\n"); + game::CG_GameMessage(0, "^1Cannot unload mod while in-game!", 0); + return; + } + + console::info("Unloading mod %s\n", mod_info.path.value().data()); + + if (mod_requires_restart(mod_info.path.value())) + { + console::info("Restarting...\n"); + full_restart(""); + } + else + { + clear_mod(); + restart(); + } + }); + + command::add("com_restart", []() + { + if (!game::Com_InFrontend()) + { return; } - game_console::print(game_console::con_type_info, "Unloading mod %s\n", mod_path.data()); - filesystem::get_search_paths().erase(mod_path); - mod_path.clear(); restart(); }); } diff --git a/src/client/component/mods.hpp b/src/client/component/mods.hpp index 364a2f11..bc2a523d 100644 --- a/src/client/component/mods.hpp +++ b/src/client/component/mods.hpp @@ -2,5 +2,20 @@ namespace mods { - extern std::string mod_path; + struct mod_zone + { + std::string name; + unsigned int alloc_flags; + }; + + bool mod_requires_restart(const std::string& path); + void set_mod(const std::string& path); + std::optional get_mod(); + std::vector get_mod_zones(); + + std::vector get_mod_list(); + std::optional get_mod_info(const std::string& mod); + + nlohmann::json& get_current_stats(); + void write_mod_stats(); } \ No newline at end of file diff --git a/src/client/component/notifies.cpp b/src/client/component/notifies.cpp index d2ecb7f3..376915d9 100644 --- a/src/client/component/notifies.cpp +++ b/src/client/component/notifies.cpp @@ -7,20 +7,29 @@ #include "game/scripting/lua/value_conversion.hpp" #include "game/scripting/lua/error.hpp" #include "notifies.hpp" +#include "scripting.hpp" #include namespace notifies { - std::unordered_map vm_execute_hooks; bool hook_enabled = true; namespace { + struct gsc_hook_t + { + bool is_lua_hook{}; + const char* target_pos{}; + sol::protected_function lua_function; + }; + + std::unordered_map vm_execute_hooks; utils::hook::detour scr_entity_damage_hook; std::vector entity_damage_callbacks; char empty_function[2] = {0x32, 0x34}; // CHECK_CLEAR_PARAMS, END + const char* target_function = nullptr; unsigned int local_id_to_entity(unsigned int local_id) { @@ -43,21 +52,30 @@ namespace notifies } const auto& hook = vm_execute_hooks[pos]; - const auto state = hook.lua_state(); - - const scripting::entity self = local_id_to_entity(game::scr_VmPub->function_frame->fs.localId); - - std::vector args; - - const auto top = game::scr_function_stack->top; - - for (auto* value = top; value->type != game::SCRIPT_END; --value) + if (hook.is_lua_hook) { - args.push_back(scripting::lua::convert(state, *value)); - } + const auto& function = hook.lua_function; + const auto state = function.lua_state(); - const auto result = hook(self, sol::as_args(args)); - scripting::lua::handle_error(result); + const scripting::entity self = local_id_to_entity(game::scr_VmPub->function_frame->fs.localId); + + std::vector args; + + const auto top = game::scr_function_stack->top; + + for (auto* value = top; value->type != game::SCRIPT_END; --value) + { + args.push_back(scripting::lua::convert(state, *value)); + } + + const auto result = function(self, sol::as_args(args)); + scripting::lua::handle_error(result); + target_function = empty_function; + } + else + { + target_function = hook.target_pos; + } return true; } @@ -89,7 +107,8 @@ namespace notifies a.bind(replace); a.popad64(); - a.mov(r14, reinterpret_cast(empty_function)); + a.mov(rax, qword_ptr(reinterpret_cast(&target_function))); + a.mov(r14, rax); a.jmp(end); } @@ -134,7 +153,7 @@ namespace notifies } void scr_entity_damage_stub(game::gentity_s* self, game::gentity_s* inflictor, game::gentity_s* attacker, const float* vDir, const float* vPoint, - int damage, int dflags, const unsigned int hitLoc, const unsigned int weapon, bool isAlternate, unsigned int a11, const int meansOfDeath, unsigned int a13, unsigned int a14) + int damage, int dflags, const unsigned int meansOfDeath, const unsigned int weapon, bool isAlternate, unsigned int a11, const int hitLoc, unsigned int a13, unsigned int a14) { { const std::string _hitLoc = reinterpret_cast(0x140BF4AA0)[hitLoc]; @@ -169,7 +188,8 @@ namespace notifies } } - scr_entity_damage_hook.invoke(self, inflictor, attacker, vDir, vPoint, damage, dflags, hitLoc, weapon, isAlternate, a11, meansOfDeath, a13, a14); + scr_entity_damage_hook.invoke(self,inflictor, attacker, vDir, vPoint, damage, dflags, + meansOfDeath, weapon, isAlternate, a11, hitLoc, a13, a14); } } @@ -180,10 +200,47 @@ namespace notifies void clear_callbacks() { - vm_execute_hooks.clear(); + for (auto i = vm_execute_hooks.begin(); i != vm_execute_hooks.end();) + { + if (i->second.is_lua_hook) + { + i = vm_execute_hooks.erase(i); + } + else + { + ++i; + } + } + entity_damage_callbacks.clear(); } + void set_lua_hook(const char* pos, const sol::protected_function& callback) + { + gsc_hook_t hook; + hook.is_lua_hook = true; + hook.lua_function = callback; + vm_execute_hooks[pos] = hook; + } + + void set_gsc_hook(const char* source, const char* target) + { + gsc_hook_t hook; + hook.is_lua_hook = false; + hook.target_pos = target; + vm_execute_hooks[source] = hook; + } + + void clear_hook(const char* pos) + { + vm_execute_hooks.erase(pos); + } + + size_t get_hook_count() + { + return vm_execute_hooks.size(); + } + class component final : public component_interface { public: @@ -192,6 +249,14 @@ namespace notifies utils::hook::jump(0x1405C90A5, utils::hook::assemble(vm_execute_stub), true); scr_entity_damage_hook.create(0x1404BD2E0, scr_entity_damage_stub); + + scripting::on_shutdown([](bool free_scripts, bool post_shutdown) + { + if (free_scripts && !post_shutdown) + { + vm_execute_hooks.clear(); + } + }); } }; } diff --git a/src/client/component/notifies.hpp b/src/client/component/notifies.hpp index 61a1dd29..9ea66a9c 100644 --- a/src/client/component/notifies.hpp +++ b/src/client/component/notifies.hpp @@ -2,9 +2,13 @@ namespace notifies { - extern std::unordered_map vm_execute_hooks; extern bool hook_enabled; + void set_lua_hook(const char* pos, const sol::protected_function&); + void set_gsc_hook(const char* source, const char* target); + void clear_hook(const char* pos); + size_t get_hook_count(); + void add_entity_damage_callback(const sol::protected_function&); void clear_callbacks(); } \ No newline at end of file diff --git a/src/client/component/patches.cpp b/src/client/component/patches.cpp index c569b84a..1bd87202 100644 --- a/src/client/component/patches.cpp +++ b/src/client/component/patches.cpp @@ -57,6 +57,53 @@ namespace patches return dvar_register_float_hook.invoke(hash, dvarName, value, min, max, flags); } + + void free_lui_memory() + { + utils::hook::invoke(0x14032A540); // properly free lui memory + } + + void vid_restart_stub_1() + { + free_lui_memory(); + utils::hook::invoke(0x1405A6480); + } + + void vid_restart_stub_2() + { + free_lui_memory(); + utils::hook::invoke(0x1406B5290); + } + + game::dvar_t* register_snd_music_stub(int hash, const char* name, bool value, unsigned int /*flags*/) + { + return game::Dvar_RegisterBool(hash, name, value, game::DVAR_FLAG_SAVED); + } + + void gscr_cinematic_ingame_loop_resident_stub() + { + auto arg2 = 1.f; + auto arg1 = 1; + + const auto num_params = game::Scr_GetNumParam(); + if (!num_params) + { + game::Scr_ErrorInternal(); + } + + if (num_params >= 2) + { + arg2 = game::Scr_GetFloat(1); + } + + if (num_params >= 3) + { + arg1 = game::Scr_GetInt(2); + } + + const auto video = game::Scr_GetString(0); + utils::hook::invoke(0x14071B740, video, arg1, arg2); + } } class component final : public component_interface @@ -67,9 +114,9 @@ namespace patches // Fix startup crashes utils::hook::set(0x140633080, 0xC301B0); utils::hook::set(0x140272F70, 0xC301B0); - utils::hook::jump(0x140046148, sub_46148, true); + utils::hook::jump(0x140046148, sub_46148); - utils::hook::jump(0x14064EF10, quit_stub, true); + utils::hook::jump(0x1408B1CD0, quit_stub); // Unlock fps in main menu utils::hook::set(0x1403D8E1B, 0xEB); @@ -85,11 +132,22 @@ namespace patches gscr_set_save_dvar_hook.create(0x140504C60, &gscr_set_save_dvar_stub); // Make cg_fov and cg_fovscale saved dvars - - cg_fov = dvars::register_float("cg_fov", 65.f, 40.f, 200.f, game::DvarFlags::DVAR_FLAG_SAVED); - cg_fovScale = dvars::register_float("cg_fovScale", 1.f, 0.1f, 2.f, game::DvarFlags::DVAR_FLAG_SAVED); + cg_fov = dvars::register_float("cg_fov", 65.f, 40.f, 200.f, + game::DVAR_FLAG_SAVED, "The field of view angle in degrees for client 0"); + cg_fovScale = dvars::register_float("cg_fovScale", 1.f, 0.1f, 2.f, + game::DVAR_FLAG_SAVED, "Scale applied to the field of view"); dvar_register_float_hook.create(game::Dvar_RegisterFloat.get(), dvar_register_float_stub); + + // fix vid_restart crashing + utils::hook::call(0x1403D7413, vid_restart_stub_1); + utils::hook::jump(0x1403D7402, vid_restart_stub_2); + + // make snd_musicDisabledForCustomSoundtrack saved + utils::hook::call(0x1405D05FB, register_snd_music_stub); + + // Fix broken function + utils::hook::jump(0x140502140, gscr_cinematic_ingame_loop_resident_stub); } }; } diff --git a/src/client/component/pathnodes.cpp b/src/client/component/pathnodes.cpp new file mode 100644 index 00000000..74bad445 --- /dev/null +++ b/src/client/component/pathnodes.cpp @@ -0,0 +1,554 @@ +#include +#include "loader/component_loader.hpp" + +#include "scheduler.hpp" +#include "command.hpp" +#include "console.hpp" + +#include "game/game.hpp" +#include "game/dvars.hpp" + +#include +#include +#include + +namespace pathnodes +{ + namespace + { + game::dvar_t* g_connect_paths; + + utils::hook::detour path_init_paths_hook; + + utils::memory::allocator allocator; + + game::pathnode_tree_t* allocate_tree() + { + ++game::pathData->nodeTreeCount; + return reinterpret_cast( + game::Hunk_AllocAlignInternal(sizeof(game::pathnode_tree_t), 4)); + } + + game::pathnode_tree_t* build_node_tree(unsigned short* node_indexes, unsigned int num_nodes) + { + if (num_nodes < 4) + { + const auto result = allocate_tree(); + result->axis = -1; + result->u.s.nodeCount = num_nodes; + result->u.s.nodes = node_indexes; + return result; + } + + game::vec2_t maxs{}; + game::vec2_t mins{}; + + const auto start_node = &game::pathData->nodes[*node_indexes]; + maxs[0] = start_node->constant.vLocalOrigin[0]; + mins[0] = maxs[0]; + maxs[1] = start_node->constant.vLocalOrigin[1]; + mins[1] = maxs[1]; + + for (auto i = 1u; i < num_nodes; i++) + { + for (auto axis = 0; axis < 2; axis++) + { + const auto node = &game::pathData->nodes[node_indexes[i]]; + const auto value = node->constant.vLocalOrigin[axis]; + if (mins[axis] <= value) + { + if (value > maxs[axis]) + { + maxs[axis] = value; + } + } + else + { + mins[axis] = value; + } + } + + } + + const auto axis = (maxs[1] - mins[1]) > (maxs[0] - mins[0]); + if ((maxs[axis] - mins[axis]) > 192.f) + { + const auto dist = (maxs[axis] + mins[axis]) * 0.5f; + auto left = 0u; + + for (auto right = num_nodes - 1; ; --right) + { + while (dist > game::pathData->nodes[node_indexes[left]].constant.vLocalOrigin[axis]) + { + ++left; + } + + while (game::pathData->nodes[node_indexes[right]].constant.vLocalOrigin[axis] > dist) + { + --right; + } + + if (left >= right) + { + break; + } + + const auto swap_node = node_indexes[left]; + node_indexes[left] = node_indexes[right]; + node_indexes[right] = swap_node; + ++left; + } + + while (2 * left < num_nodes && + game::pathData->nodes[node_indexes[left]].constant.vLocalOrigin[axis] == dist) + { + ++left; + } + + while (2 * left < num_nodes && + game::pathData->nodes[node_indexes[left - 1]].constant.vLocalOrigin[axis] == dist) + { + --left; + } + + game::pathnode_tree_t* child[2]{}; + child[0] = build_node_tree(node_indexes, left); + child[1] = build_node_tree(&node_indexes[left], num_nodes - left); + const auto result = allocate_tree(); + result->axis = axis; + result->dist = dist; + result->u.child[0] = child[0]; + result->u.child[1] = child[1]; + return result; + } + else + { + const auto result = allocate_tree(); + result->axis = -1; + result->u.s.nodeCount = num_nodes; + result->u.s.nodes = node_indexes; + return result; + } + } + + bool is_negotation_link(game::pathnode_t* from, game::pathnode_t* to) + { + return from->constant.type == game::NODE_NEGOTIATION_BEGIN && + to->constant.type == game::NODE_NEGOTIATION_END && + from->constant.target == to->constant.targetname; + } + + float vec2_normalize(float* v) + { + const auto len = std::sqrt(v[0] * v[0] + v[1] * v[1]); + + v[0] /= len; + v[1] /= len; + + return len; + } + + float vec2_length(const float* v) + { + return std::sqrt(v[0] * v[0] + v[1] * v[1]); + } + + float vec3_normalize(float* v) + { + const auto len = std::sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]); + + v[0] /= len; + v[1] /= len; + v[2] /= len; + + return len; + } + + void vector_scale(float* v, const int size, const float scale) + { + for (auto i = 0; i < size; i++) + { + v[i] *= scale; + } + } + + bool is_deflection_ok(const float* start, const float* origin, const float* move_dir) + { + game::vec2_t deflection{}; + deflection[0] = origin[0] - start[0]; + deflection[1] = origin[1] - start[1]; + const auto value = ((deflection[0] * move_dir[0]) + (deflection[1] * move_dir[1])) * -1.f; + const auto d = ( + ((value * move_dir[0]) + deflection[0]) * ((value * move_dir[0]) + deflection[0]) + + ((value * move_dir[1]) + deflection[1]) * ((value * move_dir[1]) + deflection[1]) + ); + return 0.3f > d; + } + + void vector_copy(const float* a, float* b, const int size) + { + for (auto i = 0; i < size; i++) + { + b[i] = a[i]; + } + } + + bool vector_cmp(const float* a, const float* b, const int size) + { + for (auto i = 0; i < size; i++) + { + if (a[i] != b[i]) + { + return false; + } + } + + return true; + } + + float distance_squared(const float* a, const float* b) + { + return ((a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1])); + } + + void actor_physics(game::pmove_t* pm, game::pml_t* pml) + { + pml->previous_velocity[0] = pm->ps->velocity[0]; + pml->previous_velocity[1] = pm->ps->velocity[1]; + pml->previous_velocity[2] = pm->ps->velocity[2]; + + pml->previous_origin[0] = pm->ps->origin[0]; + pml->previous_origin[1] = pm->ps->origin[1]; + pml->previous_origin[2] = pm->ps->origin[2]; + + pml->groundTrace.hitId = 3998; + + game::PM_GroundTrace(pm, pml); + if (pml->walking) + { + game::PM_WalkMove(pm, pml); + } + else + { + game::PM_AirMove(pm, pml); + } + } + + void vector_cross(const float* a, const float* b, float* out) + { + out[0] = (a[1] * b[2]) - (a[2] * b[1]); + out[1] = (a[0] * b[2]) - (a[2] * b[0]); + out[2] = (a[0] * b[1]) - (a[1] * b[0]); + } + + bool phys_trace_passed(const float* from, const float* to, float* dist) + { + game::pml_t pml{}; + game::pmove_t pm{}; + + pm.tracemask = 0x281C011; + pm.bounds = *reinterpret_cast(0x140984950); + + pm.ps = reinterpret_cast(&game::g_entities[0].client); + pm.ps->origin[0] = from[0]; + pm.ps->origin[1] = from[1]; + pm.ps->origin[2] = from[2]; + pm.ps->gravity = 800; + + pm.ps->velocity[0] = 0.f; + pm.ps->velocity[1] = 0.f; + pm.ps->velocity[2] = 0.f; + + pml.previous_origin[0] = from[0]; + pml.previous_origin[1] = from[1]; + pml.previous_origin[2] = from[2]; + + pml.msec = 50; + pml.frametime = static_cast(pml.msec) * 0.001f; + + game::vec3_t move_dir{}; + move_dir[0] = to[0] - from[0]; + move_dir[1] = to[1] - from[1]; + + game::Vec2Normalize(move_dir); + + pml.forward[0] = move_dir[0]; + pml.forward[1] = move_dir[1]; + pml.forward[2] = move_dir[2]; + + pml.up[0] = 0.f; + pml.up[1] = 0.f; + pml.up[2] = 1.f; + + vector_cross(pml.forward, pml.up, pml.right); + + pm.cmd.forwardmove = 127; + pm.cmd.rightmove = 0; + pm.cmd.unk_float = 1.f; + + auto dist_squared = 100000.f; + auto last_ground_plane_altitude = -3.4028235e38f; + + for (auto i = 0; i < 96; i++) + { + dist_squared = ( + ((to[0] - pm.ps->origin[0]) * (to[0] - pm.ps->origin[0])) + + ((to[1] - pm.ps->origin[1]) * (to[1] - pm.ps->origin[1])) + ); + + if (dist_squared <= 16.f) + { + break; + } + + game::vec3_t start{}; + vector_copy(pm.ps->origin, start, 3); + + actor_physics(&pm, &pml); + if (vector_cmp(start, pm.ps->origin, 3) || + distance_squared(pm.ps->origin, to) > 65536.f) + { + return false; + } + + const auto has_ground_plane = pml.groundPlane && pml.groundTrace.normal[2] >= 0.3f; + if (has_ground_plane) + { + last_ground_plane_altitude = pm.ps->origin[2]; + } + + if ((last_ground_plane_altitude - pm.ps->origin[2]) > 32.f) + { + return false; + } + + if (pml.groundTrace.hitId != 3998 && !is_deflection_ok(from, pm.ps->origin, move_dir)) + { + return false; + } + } + + if ((last_ground_plane_altitude - to[2]) > 32.f) + { + return false; + } + + *dist = std::sqrtf(dist_squared); + return dist_squared <= 16.f && std::abs(pm.ps->origin[2] - to[2]) <= 18.f; + } + + bool can_link_nodes(game::pathnode_t* from, game::pathnode_t* to, float* dist, bool* negotiation_link) + { + if (is_negotation_link(from, to)) + { + *negotiation_link = true; + *dist = 15.f; + return true; + } + else + { + game::vec3_t delta{}; + delta[0] = to->constant.vLocalOrigin[0] - from->constant.vLocalOrigin[0]; + delta[1] = to->constant.vLocalOrigin[1] - from->constant.vLocalOrigin[1]; + delta[2] = to->constant.vLocalOrigin[2] - from->constant.vLocalOrigin[2]; + + if (std::abs(delta[2]) > 128.f) + { + return false; + } + + if ((delta[0] * delta[0] + delta[1] * delta[1]) > 65536.f) + { + return false; + } + + game::vec2_t move_dir{}; + move_dir[0] = to->constant.vLocalOrigin[0] - from->constant.vLocalOrigin[0]; + move_dir[1] = to->constant.vLocalOrigin[1] - from->constant.vLocalOrigin[1]; + + *dist = game::Vec2Normalize(move_dir); + *negotiation_link = false; + + return phys_trace_passed(from->constant.vLocalOrigin, to->constant.vLocalOrigin, dist); + } + } + + bool try_link_nodes(game::pathnode_t* from, game::pathnode_t* to, + game::pathlink_s* links, int max_links) + { + float dist{}; + bool negotiation_link{}; + + if (max_links <= 0) + { + console::error("[Connect paths] Out of available links, increase link buffer size\n"); + return false; + } + + if (!can_link_nodes(from, to, &dist, &negotiation_link)) + { + return false; + } + + const auto link = &links[from->constant.totalLinkCount++]; + link->nodeNum = static_cast(to - game::pathData->nodes); + link->fDist = dist; + link->disconnectCount = 0; + link->negotiationLink = negotiation_link; + return true; + } + + void link_pathnodes() + { + constexpr auto max_links = 0x80000; + const auto links_buffer = allocator.allocate_array(max_links); + auto total_link_count = 0; + + for (auto i = 0u; i < game::pathData->nodeCount; i++) + { + const auto node = &game::pathData->nodes[i]; + if ((node->constant.spawnflags & 1) || !node->constant.type) + { + continue; + } + + for (auto o = 0u; o < game::pathData->nodeCount; o++) + { + const auto other = &game::pathData->nodes[o]; + if (o == i || (other->constant.spawnflags & 1) || !other->constant.type) + { + continue; + } + + try_link_nodes(node, other, &links_buffer[total_link_count], max_links - total_link_count); + } + + total_link_count += node->constant.totalLinkCount; + if (node->constant.totalLinkCount == 0) + { + console::info("[Connect paths] Pathnode at (%f %f %f) has no links\n", + node->constant.vLocalOrigin[0], + node->constant.vLocalOrigin[1], + node->constant.vLocalOrigin[2] + ); + } + } + + console::info("[Connect paths] Total links: %i\n", total_link_count); + + auto accounted_links = 0; + for (auto i = 0u; i < game::pathData->nodeCount; i++) + { + if (game::pathData->nodes[i].constant.totalLinkCount) + { + game::pathData->nodes[i].constant.Links = &links_buffer[accounted_links]; + accounted_links += game::pathData->nodes[i].constant.totalLinkCount; + } + } + } + + float distance(float* a, float* b) + { + return std::sqrtf((a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1])); + } + + void connect_paths() + { + console::info("[Connect paths] Node count: %i\n", game::pathData->nodeCount); + + auto original_link_count = 0; + for (auto i = 0u; i < game::pathData->nodeCount; i++) + { + original_link_count += game::pathData->nodes[i].constant.totalLinkCount; + } + + console::info("[Connect paths] Original link count: %i\n", original_link_count); + + for (auto i = 0u; i < game::pathData->nodeCount; i++) + { + if (game::pathData->nodes[i].constant.Links != nullptr) + { + console::warn("[Connect paths] Path nodes already linked\n"); + return; + } + } + + game::pathData->dynamicNodeGroupCount = 0; + game::pathData->visBytes = 0; + + link_pathnodes(); + + const auto node_indexes = allocator.allocate_array(game::pathData->nodeCount); + for (auto i = 0u; i < game::pathData->nodeCount; i++) + { + node_indexes[i] = static_cast(i); + } + + console::info("[Connect paths] Building pathnode trees...\n"); + game::pathData->nodeTreeCount = 0; + game::pathData->nodeTree = build_node_tree(node_indexes, game::pathData->nodeCount); + console::info("[Connect paths] Total trees: %i\n", game::pathData->nodeTreeCount); + } + + float pm_cmd_scale_walk_stub(void*, void*, void*) + { + return 1.f; + } + + char patch_bytes[2][5]{}; + + void patch_functions() + { + std::memcpy(&patch_bytes[0], reinterpret_cast(0x1406887D0), 5); + std::memcpy(&patch_bytes[1], reinterpret_cast(0x1403C8414), 5); + + utils::hook::jump(0x1406887D0, pm_cmd_scale_walk_stub); + utils::hook::nop(0x1403C8414, 5); + } + + void restore_code(const size_t ptr, char* data, const size_t size) + { + const auto ptr_ = reinterpret_cast(ptr); + DWORD old_protect; + VirtualProtect(ptr_, size, PAGE_EXECUTE_READWRITE, &old_protect); + + for (auto i = 0; i < size; i++) + { + ptr_[i] = data[i]; + } + + VirtualProtect(ptr_, size, old_protect, &old_protect); + FlushInstructionCache(GetCurrentProcess(), ptr_, size); + } + + void restore_functions() + { + restore_code(0x1406887D0, patch_bytes[0], 5); + restore_code(0x1403C8414, patch_bytes[1], 5); + } + + void path_init_paths_stub(void* a1, void* a2, void* a3, void* a4) + { + path_init_paths_hook.invoke(a1, a2, a3, a4); + + if (g_connect_paths->current.enabled) + { + patch_functions(); + const auto _0 = gsl::finally(restore_functions); + connect_paths(); + } + } + } + + class component final : public component_interface + { + public: + void post_unpack() override + { + g_connect_paths = dvars::register_bool("g_connectPaths", false, 0, "Connect paths"); + path_init_paths_hook.create(0x140522250, path_init_paths_stub); + } + }; +} + +REGISTER_COMPONENT(pathnodes::component) diff --git a/src/client/component/renderer.cpp b/src/client/component/renderer.cpp index 236f8a45..5332f293 100644 --- a/src/client/component/renderer.cpp +++ b/src/client/component/renderer.cpp @@ -20,8 +20,10 @@ namespace renderer { switch (dvars::r_fullbright->current.integer) { + case 4: + return 53; // wireframe case 3: - return 3; + return 3; // debug case 2: return 13; default: @@ -32,9 +34,9 @@ namespace renderer void gfxdrawmethod() { game::gfxDrawMethod->drawScene = game::GFX_DRAW_SCENE_STANDARD; - game::gfxDrawMethod->baseTechType = dvars::r_fullbright->current.enabled ? get_fullbright_technique() : game::TECHNIQUE_LIT; - game::gfxDrawMethod->emissiveTechType = dvars::r_fullbright->current.enabled ? get_fullbright_technique() : game::TECHNIQUE_EMISSIVE; - game::gfxDrawMethod->forceTechType = dvars::r_fullbright->current.enabled ? get_fullbright_technique() : 254; + game::gfxDrawMethod->baseTechType = dvars::r_fullbright->current.integer ? get_fullbright_technique() : game::TECHNIQUE_LIT; + game::gfxDrawMethod->emissiveTechType = dvars::r_fullbright->current.integer ? get_fullbright_technique() : game::TECHNIQUE_EMISSIVE; + game::gfxDrawMethod->forceTechType = dvars::r_fullbright->current.integer ? get_fullbright_technique() : 254; } void r_init_draw_method_stub() @@ -61,7 +63,7 @@ namespace renderer public: void post_unpack() override { - dvars::r_fullbright = dvars::register_int("r_fullbright", 0, 0, 3, game::DVAR_FLAG_SAVED); + dvars::r_fullbright = dvars::register_int("r_fullbright", 0, 0, 4, game::DVAR_FLAG_SAVED, "Fullbright method"); r_init_draw_method_hook.create(0x14072F950, &r_init_draw_method_stub); r_update_front_end_dvar_options_hook.create(0x14076EE70, &r_update_front_end_dvar_options_stub); diff --git a/src/client/component/scripting.cpp b/src/client/component/scripting.cpp index 491341d6..03a1a214 100644 --- a/src/client/component/scripting.cpp +++ b/src/client/component/scripting.cpp @@ -2,10 +2,12 @@ #include "loader/component_loader.hpp" #include "game/game.hpp" +#include "game/dvars.hpp" -#include "command.hpp" #include "scheduler.hpp" #include "scripting.hpp" +#include "gsc.hpp" +#include "console.hpp" #include "game/scripting/event.hpp" #include "game/scripting/functions.hpp" @@ -13,13 +15,19 @@ #include "game/scripting/lua/engine.hpp" #include +#include namespace scripting { std::unordered_map> fields_table; std::unordered_map> script_function_table; + std::unordered_map>> script_function_table_sort; utils::concurrency::container shared_table; + std::unordered_map get_dvar_int_overrides; + + std::string current_file; + namespace { utils::hook::detour vm_notify_hook; @@ -33,7 +41,25 @@ namespace scripting utils::hook::detour scr_set_thread_position_hook; utils::hook::detour process_script_hook; - std::string current_file; + utils::hook::detour sl_get_canonical_string_hook; + + utils::hook::detour respawn_hook; + + utils::hook::detour scr_run_current_threads_hook; + + utils::hook::detour scr_delete_hook; + + game::dvar_t* scr_auto_respawn = nullptr; + + std::string current_scriptfile; + unsigned int current_file_id{}; + + std::vector> shutdown_callbacks; + + std::unordered_map canonical_string_table; + + using notify_list = std::vector; + utils::concurrency::container scheduled_notifies; void vm_notify_stub(const unsigned int notify_list_owner_id, const game::scr_string_t string_value, game::VariableValue* top) @@ -50,22 +76,56 @@ namespace scripting e.arguments.emplace_back(*value); } - lua::engine::notify(e); + lua::engine::handle_endon_conditions(e); + + scheduled_notifies.access([&](notify_list& list) + { + list.push_back(e); + }); } vm_notify_hook.invoke(notify_list_owner_id, string_value, top); } + void clear_scheduled_notifies() + { + get_dvar_int_overrides.clear(); + scheduled_notifies.access([](notify_list& list) + { + list.clear(); + }); + } + void client_spawn_stub(const game::gentity_s* client) { client_spawn_hook.invoke(client); + scr_auto_respawn->current.enabled = true; + clear_scheduled_notifies(); lua::engine::start(); } void g_shutdown_game_stub(const int free_scripts) { + if (free_scripts) + { + script_function_table_sort.clear(); + script_function_table.clear(); + canonical_string_table.clear(); + } + + for (const auto& callback : shutdown_callbacks) + { + callback(free_scripts, false); + } + + clear_scheduled_notifies(); lua::engine::stop(); g_shutdown_game_hook.invoke(free_scripts); + + for (const auto& callback : shutdown_callbacks) + { + callback(free_scripts, true); + } } void scr_add_class_field_stub(unsigned int classnum, game::scr_string_t name, unsigned int canonicalString, unsigned int offset) @@ -82,33 +142,193 @@ namespace scripting void process_script_stub(const char* filename) { - current_file = filename; + current_scriptfile = filename; const auto file_id = atoi(filename); if (file_id) { - current_file = scripting::find_token(file_id); + current_file_id = file_id; + } + else + { + current_file_id = 0; + current_file = filename; } process_script_hook.invoke(filename); } - void scr_set_thread_position_stub(unsigned int threadName, const char* codePos) + std::vector get_token_names(unsigned int id) { - const auto function_name = scripting::find_token(threadName); - script_function_table[current_file][function_name] = codePos; - scr_set_thread_position_hook.invoke(threadName, codePos); + auto result = scripting::find_token(id); + + if (canonical_string_table.find(id) != canonical_string_table.end()) + { + result.push_back(canonical_string_table[id]); + } + + return result; } + void add_function_sort(unsigned int id, const char* pos) + { + std::string filename = current_file; + if (current_file_id) + { + filename = scripting::get_token_single(current_file_id); + } + + if (script_function_table_sort.find(filename) == script_function_table_sort.end()) + { + const auto script = gsc::find_script(game::ASSET_TYPE_SCRIPTFILE, current_scriptfile.data(), false); + if (script) + { + const auto end = &script->bytecode[script->bytecodeLen]; + script_function_table_sort[filename].emplace_back("__end__", end); + } + } + + const auto name = get_token_single(id); + auto& itr = script_function_table_sort[filename]; + itr.insert(itr.end() - 1, {name, pos}); + } + + void add_function(const std::string& file, unsigned int id, const char* pos) + { + const auto function_names = scripting::get_token_names(id); + for (const auto& name : function_names) + { + script_function_table[file][name] = pos; + } + } + + void scr_set_thread_position_stub(unsigned int thread_name, const char* code_pos) + { + add_function_sort(thread_name, code_pos); + + if (current_file_id) + { + const auto names = scripting::get_token_names(current_file_id); + for (const auto& name : names) + { + add_function(name, thread_name, code_pos); + } + } + else + { + add_function(current_file, thread_name, code_pos); + } + + scr_set_thread_position_hook.invoke(thread_name, code_pos); + } + + char sv_check_load_level_stub(void* save_game) { const auto result = sv_check_load_level_hook.invoke(save_game); if (save_game != nullptr) { + scr_auto_respawn->current.enabled = true; + clear_scheduled_notifies(); lua::engine::start(); } return result; } + + unsigned int sl_get_canonical_string_stub(const char* str) + { + const auto result = sl_get_canonical_string_hook.invoke(str); + canonical_string_table[result] = str; + return result; + } + + void respawn_stub() + { + if (!scr_auto_respawn->current.enabled) + { + return; + } + + respawn_hook.invoke(); + } + + void scr_run_current_threads_stub() + { + notify_list list_copy{}; + scheduled_notifies.access([&](notify_list& list) + { + list_copy = list; + list.clear(); + }); + + for (const auto& e : list_copy) + { + lua::engine::notify(e); + } + + scr_run_current_threads_hook.invoke(); + } + + utils::hook::detour scr_get_dvar_int_hook; + void scr_get_dvar_int_stub() + { + const auto dvar = game::Scr_GetString(0); + + if (get_dvar_int_overrides.find(dvar) != get_dvar_int_overrides.end()) + { + game::Scr_AddInt(get_dvar_int_overrides[dvar]); + return; + } + + scr_get_dvar_int_hook.invoke(); + } + + void* get_spawn_point_stub() + { + const auto spawn_point = utils::hook::invoke(0x1404B1670); + if (spawn_point == nullptr) + { + console::warn("No spawnpoint found for this map, using (0, 0, 0)\n"); + return &game::g_entities[0]; + } + return spawn_point; + } + + void scr_delete_stub(game::scr_entref_t ref) + { + if (ref.entnum == 0 && ref.classnum == 0) + { + console::warn("Script tried to delete entity 0\n"); + return; + } + + scr_delete_hook.invoke(ref); + } + } + + std::string get_token_single(unsigned int id) + { + if (canonical_string_table.find(id) != canonical_string_table.end()) + { + return canonical_string_table[id]; + } + + return scripting::find_token_single(id); + } + + void on_shutdown(const std::function& callback) + { + shutdown_callbacks.push_back(callback); + } + + std::optional get_canonical_string(const unsigned int id) + { + if (canonical_string_table.find(id) == canonical_string_table.end()) + { + return {}; + } + + return {canonical_string_table[id]}; } class component final : public component_interface @@ -125,6 +345,18 @@ namespace scripting scr_add_class_field_hook.create(0x1405C2C30, scr_add_class_field_stub); scr_set_thread_position_hook.create(0x1405BC7E0, scr_set_thread_position_stub); process_script_hook.create(0x1405C6160, process_script_stub); + sl_get_canonical_string_hook.create(game::SL_GetCanonicalString, sl_get_canonical_string_stub); + + scr_auto_respawn = dvars::register_bool("scr_autoRespawn", true, 0, "Automatically respawn player on death"); + respawn_hook.create(0x1404B1E00, respawn_stub); + + scr_run_current_threads_hook.create(0x1405C8370, scr_run_current_threads_stub); + + scr_get_dvar_int_hook.create(0x1404F0730, scr_get_dvar_int_stub); + + scr_delete_hook.create(0x1404F0460, scr_delete_stub); + + utils::hook::call(0x1404B07D2, get_spawn_point_stub); scheduler::loop([]() { diff --git a/src/client/component/scripting.hpp b/src/client/component/scripting.hpp index 5794bff2..3f0d5b64 100644 --- a/src/client/component/scripting.hpp +++ b/src/client/component/scripting.hpp @@ -7,5 +7,14 @@ namespace scripting extern std::unordered_map> fields_table; extern std::unordered_map> script_function_table; + extern std::unordered_map>> script_function_table_sort; extern utils::concurrency::container shared_table; + + extern std::unordered_map get_dvar_int_overrides; + + extern std::string current_file; + + void on_shutdown(const std::function& callback); + std::optional get_canonical_string(const unsigned int id); + std::string get_token_single(unsigned int id); } \ No newline at end of file diff --git a/src/client/component/sound.cpp b/src/client/component/sound.cpp new file mode 100644 index 00000000..03b7d752 --- /dev/null +++ b/src/client/component/sound.cpp @@ -0,0 +1,55 @@ +#include +#include "loader/component_loader.hpp" + +#include "game/game.hpp" +#include "game/dvars.hpp" + +#include "console.hpp" + +#include +#include + +namespace sound +{ + namespace + { + void com_sprintf_raw_sound_localized_stub(char* buffer, int size, const char* fmt, + const char* lang, const char* name, const char* extension) + { + sprintf_s(buffer, size, "%s%s", name, extension); + } + + void com_sprintf_raw_sound_stub(char* buffer, int size, const char* fmt, + const char* name, const char* extension) + { + sprintf_s(buffer, size, "%s%s", name, extension); + } + + utils::hook::detour snd_is_music_playing_hook; + bool snd_is_music_playing_stub(void* a1) + { + if (a1 == nullptr) + { + return true; // dont play music + } + + return snd_is_music_playing_hook.invoke(a1); + } + } + + class component final : public component_interface + { + public: + void post_unpack() override + { + // remove raw/sound or raw/language/sound prefix when loading raw sounds + utils::hook::call(0x140622FEF, com_sprintf_raw_sound_localized_stub); + utils::hook::call(0x14062306C, com_sprintf_raw_sound_stub); + + // fix playing non-existing music crashing + snd_is_music_playing_hook.create(0x1407C58A0, snd_is_music_playing_stub); + } + }; +} + +REGISTER_COMPONENT(sound::component) diff --git a/src/client/component/ui_scripting.cpp b/src/client/component/ui_scripting.cpp index a5594c0a..70024b53 100644 --- a/src/client/component/ui_scripting.cpp +++ b/src/client/component/ui_scripting.cpp @@ -13,7 +13,9 @@ #include "fastfiles.hpp" #include "mods.hpp" #include "updater.hpp" -#include "game_console.hpp" +#include "console.hpp" +#include "language.hpp" +#include "config.hpp" #include "game/ui_scripting/execution.hpp" #include "game/scripting/execution.hpp" @@ -38,16 +40,10 @@ namespace ui_scripting utils::hook::detour hks_shutdown_hook; utils::hook::detour hks_package_require_hook; - struct script - { - std::string name; - std::string root; - }; - struct globals_t { std::string in_require_script; - std::vector