From 4e7f99ed92e2022f0793372f617511b60147daa8 Mon Sep 17 00:00:00 2001 From: past-due <30942300+past-due@users.noreply.github.com> Date: Fri, 25 Oct 2024 13:54:44 -0400 Subject: [PATCH 01/38] Refactor admin status, initial support for admins changing settings via UI Store admin status as a per-player flag --- lib/netplay/netplay.cpp | 6 +++++ lib/netplay/netplay.h | 2 ++ src/multiint.cpp | 47 ++++++++++++++++++++++++++------------ src/multilobbycommands.cpp | 17 +++++++------- src/multilobbycommands.h | 2 ++ src/multiplay.cpp | 11 +++++++-- src/multistat.cpp | 15 ++++++++++++ src/multisync.cpp | 13 +++++++++++ 8 files changed, 88 insertions(+), 25 deletions(-) diff --git a/lib/netplay/netplay.cpp b/lib/netplay/netplay.cpp index fa2cd4a5432..b4f18602371 100644 --- a/lib/netplay/netplay.cpp +++ b/lib/netplay/netplay.cpp @@ -33,6 +33,7 @@ #include "src/console.h" #include "src/component.h" // FIXME: we need to handle this better #include "src/modding.h" // FIXME: we need to handle this better +#include "src/multilobbycommands.h" #include // for stats #include @@ -668,6 +669,7 @@ void NET_InitPlayer(uint32_t i, bool initPosition, bool initTeams, bool initSpec { NetPlay.players[i].isSpectator = false; } + NetPlay.players[i].isAdmin = false; } uint8_t NET_numHumanPlayers(void) @@ -736,6 +738,7 @@ static void NETSendNPlayerInfoTo(uint32_t *index, uint32_t indexLen, unsigned to NETint8_t(reinterpret_cast(&NetPlay.players[index[n]].difficulty)); NETuint8_t(reinterpret_cast(&NetPlay.players[index[n]].faction)); NETbool(&NetPlay.players[index[n]].isSpectator); + NETbool(&NetPlay.players[index[n]].isAdmin); } NETend(); ActivityManager::instance().updateMultiplayGameData(game, ingame, NETGameIsLocked()); @@ -2533,6 +2536,7 @@ static bool NETprocessSystemMessage(NETQUEUE playerQueue, uint8_t *type) int8_t difficulty = 0; uint8_t faction = FACTION_NORMAL; bool isSpectator = false; + bool isAdmin = false; bool error = false; NETbeginDecode(playerQueue, NET_PLAYER_INFO); @@ -2577,6 +2581,7 @@ static bool NETprocessSystemMessage(NETQUEUE playerQueue, uint8_t *type) NETint8_t(&difficulty); NETuint8_t(&faction); NETbool(&isSpectator); + NETbool(&isAdmin); auto newFactionId = uintToFactionID(faction); if (!newFactionId.has_value()) @@ -2596,6 +2601,7 @@ static bool NETprocessSystemMessage(NETQUEUE playerQueue, uint8_t *type) NetPlay.players[index].difficulty = static_cast(difficulty); NetPlay.players[index].faction = newFactionId.value(); NetPlay.players[index].isSpectator = isSpectator; + NetPlay.players[index].isAdmin = isAdmin; } debug(LOG_NET, "%s for player %u (%s)", n == 0 ? "Receiving MSG_PLAYER_INFO" : " and", (unsigned int)index, NetPlay.players[index].allocated ? "human" : "AI"); diff --git a/lib/netplay/netplay.h b/lib/netplay/netplay.h index e16e5d21b34..04c56310fc6 100644 --- a/lib/netplay/netplay.h +++ b/lib/netplay/netplay.h @@ -275,6 +275,7 @@ struct PLAYER bool autoGame; ///< if we are running a autogame (AI controls us) FactionID faction; ///< which faction the player has bool isSpectator; ///< whether this slot is a spectator slot + bool isAdmin; ///< whether this slot has admin privs // used on host-ONLY (not transmitted to other clients): std::shared_ptr> wzFiles = std::make_shared>(); ///< for each player, we keep track of map/mod download progress @@ -302,6 +303,7 @@ struct PLAYER IPtextAddress[0] = '\0'; faction = FACTION_NORMAL; isSpectator = false; + isAdmin = false; } }; diff --git a/src/multiint.cpp b/src/multiint.cpp index 86258b9b6ea..ee83bd73a69 100644 --- a/src/multiint.cpp +++ b/src/multiint.cpp @@ -1443,13 +1443,18 @@ static void addGameOptions() updateLimitIcons(); } +static bool isHostOrAdmin() +{ + return NetPlay.isHost || NetPlay.players[selectedPlayer].isAdmin; +} + // //////////////////////////////////////////////////////////////////////////// // Colour functions static bool safeToUseColour(unsigned player, unsigned otherPlayer) { - // Player wants to take the colour from otherPlayer. May not take from a human otherPlayer, unless we're the host. - return player == otherPlayer || NetPlay.isHost || !isHumanPlayer(otherPlayer); + // Player wants to take the colour from otherPlayer. May not take from a human otherPlayer, unless we're the host/admin. + return player == otherPlayer || isHostOrAdmin() || !isHumanPlayer(otherPlayer); } static int getPlayerTeam(int i) @@ -1982,7 +1987,7 @@ static std::set validPlayerIdxTargetsForPlayerPositionMove(uint32_t pl for (uint32_t i = 0; i < game.maxPlayers; i++) { if (player != i - && (NetPlay.isHost || !isHumanPlayer(i)) // host can move a player to any slot, player can only move to empty slots + && (isHostOrAdmin() || !isHumanPlayer(i)) // host/admin can move a player to any slot, player can only move to empty slots && !isSpectatorOnlySlot(i)) // target cannot be a spectator only slot (for player position changes) { validTargetPlayerIdx.insert(i); @@ -2114,9 +2119,9 @@ void WzMultiplayerOptionsTitleUI::openTeamChooser(uint32_t player) UDWORD i; int disallow = allPlayersOnSameTeam(player); - if (bIsTrueMultiplayerGame && NetPlay.isHost) + if (bIsTrueMultiplayerGame && isHostOrAdmin()) { - // allow configuration of all teams in true multiplayer mode (by host), even if they would block the game starting + // allow configuration of all teams in true multiplayer mode (by host/admin), even if they would block the game starting // (i.e. even if all players would be configured to be on the same team) disallow = -1; } @@ -2513,7 +2518,7 @@ bool recvTeamRequest(NETQUEUE queue) return false; } - if (whosResponsible(player) != queue.index) + if (whosResponsible(player) != queue.index && !NetPlay.players[queue.index].isAdmin) { HandleBadParam("NET_TEAMREQUEST given incorrect params.", player, queue.index); return false; @@ -2616,6 +2621,7 @@ bool changeReadyStatus(UBYTE player, bool bReady) static bool changePosition(UBYTE player, UBYTE position) { + ASSERT_HOST_ONLY(return false); ASSERT(player < MAX_PLAYERS, "Invalid player idx: %" PRIu8, player); int i; @@ -2767,7 +2773,7 @@ bool recvFactionRequest(NETQUEUE queue) return false; } - if (whosResponsible(player) != queue.index) + if (whosResponsible(player) != queue.index && !NetPlay.players[queue.index].isAdmin) { HandleBadParam("NET_FACTIONREQUEST given incorrect params.", player, queue.index); return false; @@ -2805,7 +2811,7 @@ bool recvColourRequest(NETQUEUE queue) return false; } - if (whosResponsible(player) != queue.index) + if (whosResponsible(player) != queue.index && !NetPlay.players[queue.index].isAdmin) { HandleBadParam("NET_COLOURREQUEST given incorrect params.", player, queue.index); return false; @@ -2813,7 +2819,7 @@ bool recvColourRequest(NETQUEUE queue) resetReadyStatus(false, true); - return changeColour(player, col, false); + return changeColour(player, col, NetPlay.players[queue.index].isAdmin); } bool recvPositionRequest(NETQUEUE queue) @@ -2835,7 +2841,7 @@ bool recvPositionRequest(NETQUEUE queue) return false; } - if (whosResponsible(player) != queue.index) + if (whosResponsible(player) != queue.index && !NetPlay.players[queue.index].isAdmin) { HandleBadParam("NET_POSITIONREQUEST given incorrect params.", player, queue.index); return false; @@ -3269,7 +3275,7 @@ static SwapPlayerIndexesResult recvSwapPlayerIndexes(NETQUEUE queue, const std:: static bool canChooseTeamFor(int i) { - return (i == selectedPlayer || NetPlay.isHost); + return (i == selectedPlayer || isHostOrAdmin()); } // //////////////////////////////////////////////////////////////////////////// @@ -3996,7 +4002,7 @@ class WzPlayerRow : public WIDGET widget->colorButton->addOnClickHandler([playerIdx, titleUI](W_BUTTON& button){ auto strongTitleUI = titleUI.lock(); ASSERT_OR_RETURN(, strongTitleUI != nullptr, "Title UI is gone?"); - if (playerIdx == selectedPlayer || NetPlay.isHost) + if (playerIdx == selectedPlayer || isHostOrAdmin()) { if (!NetPlay.players[playerIdx].isSpectator) // not a spectator { @@ -4031,11 +4037,12 @@ class WzPlayerRow : public WIDGET widget->playerInfo->addOnClickHandler([playerIdx, titleUI](W_BUTTON& button){ auto strongTitleUI = titleUI.lock(); ASSERT_OR_RETURN(, strongTitleUI != nullptr, "Title UI is gone?"); - if (playerIdx == selectedPlayer || NetPlay.isHost) + if (playerIdx == selectedPlayer || isHostOrAdmin()) { uint32_t player = playerIdx; - // host can move any player, clients can request to move themselves if there are available slots - if (((player == selectedPlayer && validPlayerIdxTargetsForPlayerPositionMove(player).size() > 0) || (NetPlay.players[player].allocated && NetPlay.isHost)) + // host/admin can move any player, clients can request to move themselves if there are available slots + if (((player == selectedPlayer && validPlayerIdxTargetsForPlayerPositionMove(player).size() > 0) || + (NetPlay.players[player].allocated && isHostOrAdmin())) && !locked.position && player < MAX_PLAYERS && !isSpectatorOnlySlot(player)) @@ -8827,6 +8834,7 @@ inline void to_json(nlohmann::json& j, const PLAYER& p) { // Do not persist IPtextAddress j["faction"] = static_cast(p.faction); j["isSpectator"] = p.isSpectator; + j["isAdmin"] = p.isAdmin; } inline void from_json(const nlohmann::json& j, PLAYER& p) { @@ -8857,6 +8865,15 @@ inline void from_json(const nlohmann::json& j, PLAYER& p) { auto factionUint = j.at("faction").get(); p.faction = static_cast(factionUint); // TODO CHECK p.isSpectator = j.at("isSpectator").get(); + if (j.contains("isAdmin")) + { + p.isAdmin = j.at("isAdmin").get(); + } + else + { + // default to the old (pre-4.5.4) default value of false + p.isAdmin = false; + } } static nlohmann::json DataHashToJSON() diff --git a/src/multilobbycommands.cpp b/src/multilobbycommands.cpp index 57f735007a1..3f312871973 100644 --- a/src/multilobbycommands.cpp +++ b/src/multilobbycommands.cpp @@ -57,6 +57,14 @@ bool removeLobbyAdminPublicKey(const std::string& publicKeyB64Str) return lobbyAdminPublicKeys.erase(publicKeyB64Str) > 0; } +// checks for specific identity being an admin +bool identityMatchesAdmin(const EcKey& identity) +{ + std::string senderIdentityHash = identity.publicHashString(); + std::string senderPublicKeyB64 = base64Encode(identity.toBytes(EcKey::Public)); + return lobbyAdminPublicKeys.count(senderPublicKeyB64) != 0 || lobbyAdminPublicHashStrings.count(senderIdentityHash) != 0; +} + // NOTE: **IMPORTANT** this should *NOT* be used for determining whether a sender has permission to execute admin commands // (Use senderHasLobbyCommandAdminPrivs instead) static bool senderApparentlyMatchesAdmin(uint32_t playerIdx) @@ -75,14 +83,7 @@ static bool senderApparentlyMatchesAdmin(uint32_t playerIdx) { return false; } - std::string senderIdentityHash = identity.publicHashString(); - std::string senderPublicKeyB64 = base64Encode(identity.toBytes(EcKey::Public)); - if (lobbyAdminPublicKeys.count(senderPublicKeyB64) == 0 && lobbyAdminPublicHashStrings.count(senderIdentityHash) == 0) - { - return false; // identity hash is not in permitted lists - } - - return true; + return identityMatchesAdmin(identity); } // **THIS** is the function that should be used to determine whether a sender currently has permission to execute admin commands diff --git a/src/multilobbycommands.h b/src/multilobbycommands.h index 112bab5d0bf..b7ba7b00177 100644 --- a/src/multilobbycommands.h +++ b/src/multilobbycommands.h @@ -52,6 +52,8 @@ void cmdInterfaceLogChatMsg(const NetworkTextMessage& message, const char* log_p bool processChatLobbySlashCommands(const NetworkTextMessage& message, HostLobbyOperationsInterface& cmdInterface); +bool identityMatchesAdmin(const EcKey& identity); + bool addLobbyAdminIdentityHash(const std::string& playerIdentityHash); bool removeLobbyAdminIdentityHash(const std::string& playerIdentityHash); diff --git a/src/multiplay.cpp b/src/multiplay.cpp index 932937c6bb9..5e363449435 100644 --- a/src/multiplay.cpp +++ b/src/multiplay.cpp @@ -1031,6 +1031,7 @@ HandleMessageAction getMessageHandlingAction(NETQUEUE& queue, uint8_t type) } bool senderIsSpectator = NetPlay.players[queue.index].isSpectator; + bool senderIsAdmin = NetPlay.players[queue.index].isAdmin; if (type > NET_MIN_TYPE && type < NET_MAX_TYPE) { @@ -1049,10 +1050,16 @@ HandleMessageAction getMessageHandlingAction(NETQUEUE& queue, uint8_t type) } break; case NET_KICK: - case NET_AITEXTMSG: - case NET_BEACONMSG: case NET_TEAMREQUEST: // spectators should not be allowed to request a team / non-spectator slot status + case NET_FACTIONREQUEST: case NET_POSITIONREQUEST: + if (senderIsSpectator && !senderIsAdmin) + { + return HandleMessageAction::Disallow_And_Kick_Sender; + } + break; + case NET_AITEXTMSG: + case NET_BEACONMSG: if (senderIsSpectator) { return HandleMessageAction::Disallow_And_Kick_Sender; diff --git a/src/multistat.cpp b/src/multistat.cpp index d0b172304f4..10a661ed75b 100644 --- a/src/multistat.cpp +++ b/src/multistat.cpp @@ -40,6 +40,7 @@ #include "multistat.h" #include "urlrequest.h" #include "stdinreader.h" +#include "multilobbycommands.h" #include #include @@ -377,12 +378,26 @@ bool multiStatsSetIdentity(uint32_t playerIndex, const EcKey::Key &identity, boo { // Record that the identity has been verified ingame.VerifiedIdentity[playerIndex] = true; + if (NetPlay.isHost) + { + NetPlay.players[playerIndex].isAdmin = identityMatchesAdmin(playerStats[playerIndex].identity); + // Do not broadcast player info here, as it's assumed caller will do it + } // Do *not* output to stdinterface here - the join event is still being processed } else { ingame.VerifiedIdentity[playerIndex] = false; + if (NetPlay.isHost) + { + // when verified identity is cleared, so is admin status (until new identity is verified) + if (NetPlay.players[playerIndex].isAdmin) + { + NetPlay.players[playerIndex].isAdmin = false; + NETBroadcastPlayerInfo(playerIndex); + } + } // Output to stdinterface, if enabled if (!identity.empty()) diff --git a/src/multisync.cpp b/src/multisync.cpp index 3ca72cf608d..d1233f90e89 100644 --- a/src/multisync.cpp +++ b/src/multisync.cpp @@ -38,6 +38,7 @@ #include "multistat.h" #include "multirecv.h" #include "stdinreader.h" +#include "multilobbycommands.h" #include @@ -330,6 +331,18 @@ bool recvPing(NETQUEUE queue) // Record that they've verified the identity ingame.VerifiedIdentity[sender] = true; + if (NetPlay.isHost) + { + // check if verified identity is an admin, and handle changes to admin status + bool oldIsAdminStatus = NetPlay.players[sender].isAdmin; + NetPlay.players[sender].isAdmin = identityMatchesAdmin(senderIdentity); + if (oldIsAdminStatus != NetPlay.players[sender].isAdmin) + { + // then send info about admin status changes to all players + NETBroadcastPlayerInfo(sender); + } + } + // Output to stdinterface, if enabled std::string senderPublicKeyB64 = base64Encode(senderIdentity.toBytes(EcKey::Public)); std::string senderIdentityHash = senderIdentity.publicHashString(); From 24c8691d81fe1b56109128cb425c9d23de17095b Mon Sep 17 00:00:00 2001 From: past-due <30942300+past-due@users.noreply.github.com> Date: Fri, 25 Oct 2024 21:52:13 -0400 Subject: [PATCH 02/38] Add quick chat support for localized admin action messages --- lib/netplay/netplay.cpp | 4 +- src/hci/quickchat.cpp | 250 +++++++++++++++++++++++++++++++------ src/hci/quickchat.h | 35 +++++- src/multiint.cpp | 184 ++++++++++++++++++++++----- src/multiint.h | 2 +- src/multilobbycommands.cpp | 6 +- src/multilobbycommands.h | 6 +- 7 files changed, 404 insertions(+), 83 deletions(-) diff --git a/lib/netplay/netplay.cpp b/lib/netplay/netplay.cpp index b4f18602371..83f0d929429 100644 --- a/lib/netplay/netplay.cpp +++ b/lib/netplay/netplay.cpp @@ -4483,7 +4483,7 @@ bool NEThostGame(const char *SessionName, const char *PlayerName, bool spectator // Now switch player color of the host to what they normally use for MP games if (war_getMPcolour() >= 0) { - changeColour(NetPlay.hostPlayer, war_getMPcolour(), true); + changeColour(NetPlay.hostPlayer, war_getMPcolour(), realSelectedPlayer); } return true; } @@ -4541,7 +4541,7 @@ bool NEThostGame(const char *SessionName, const char *PlayerName, bool spectator // Now switch player color of the host to what they normally use for SP games if (NetPlay.hostPlayer < MAX_PLAYERS && war_getMPcolour() >= 0) { - changeColour(NetPlay.hostPlayer, war_getMPcolour(), true); + changeColour(NetPlay.hostPlayer, war_getMPcolour(), realSelectedPlayer); } NETregisterServer(WZ_SERVER_DISCONNECT); diff --git a/src/hci/quickchat.cpp b/src/hci/quickchat.cpp index 5627e81a7f9..79a8469f8d3 100644 --- a/src/hci/quickchat.cpp +++ b/src/hci/quickchat.cpp @@ -46,6 +46,7 @@ #include "../stats.h" #include "../qtscript.h" #include "../main.h" +#include "../faction.h" #include #include @@ -119,7 +120,7 @@ static bool isInternalMessage(WzQuickChatMessage msg) // MARK: - Helper functions -const char* to_output_string(WzQuickChatMessage msg); +std::string to_output_string(WzQuickChatMessage msg, const optional& messageData); static optional numberButtonPressed() { @@ -766,6 +767,13 @@ bool WzQuickChatTargeting::noTargets() const return !all && !humanTeammates && !aiTeammates && specificPlayers.empty(); } +WzQuickChatTargeting WzQuickChatTargeting::targetAll() +{ + WzQuickChatTargeting targeting; + targeting.all = true; + return targeting; +} + // MARK: - WzQuickChatSendToSelector std::shared_ptr WzQuickChatSendToSelector::make(bool teamOnly, const WzQuickChatTargeting& initialTargeting) @@ -2414,9 +2422,95 @@ std::shared_ptr WzQuickChatForm::createInGameEndGamePanel() return panel; } +// MARK: - + +namespace WzQuickChatDataContexts { + +// - INTERNAL_ADMIN_ACTION_NOTICE +namespace INTERNAL_ADMIN_ACTION_NOTICE { + WzQuickChatMessageData constructMessageData(Context ctx, uint32_t responsiblePlayerIdx, uint32_t targetPlayerIdx) + { + return WzQuickChatMessageData { static_cast(ctx), responsiblePlayerIdx, targetPlayerIdx }; + } + + std::string to_output_string(WzQuickChatMessageData messageData) + { + uint32_t responsiblePlayerIdx = messageData.dataA; + uint32_t targetPlayerIdx = messageData.dataB; + + if (responsiblePlayerIdx >= MAX_CONNECTED_PLAYERS) + { + return std::string(); + } + if (targetPlayerIdx >= MAX_CONNECTED_PLAYERS) + { + return std::string(); + } + + const char* responsiblePlayerName = NetPlay.players[responsiblePlayerIdx].name; + const char* targetPlayerName = NetPlay.players[targetPlayerIdx].name; + + const char* responsiblePlayerType = _("Player"); + if (responsiblePlayerIdx == NetPlay.hostPlayer) + { + responsiblePlayerType = _("Host"); + } + else if (NetPlay.players[responsiblePlayerIdx].isAdmin) + { + responsiblePlayerType = _("Admin"); + } + + switch (messageData.dataContext) + { + case static_cast(Context::Invalid): + return ""; + case static_cast(Context::Team): + return astringf(_("%s (%s) changed team of player (%s) to: %d"), responsiblePlayerType, responsiblePlayerName, targetPlayerName, NetPlay.players[targetPlayerIdx].team); + case static_cast(Context::Position): + return astringf(_("%s (%s) changed position of player (%s) to: %d"), responsiblePlayerType, responsiblePlayerName, targetPlayerName, NetPlay.players[targetPlayerIdx].position); + case static_cast(Context::Color): + return astringf(_("%s (%s) changed color of player (%s) to: %s"), responsiblePlayerType, responsiblePlayerName, targetPlayerName, getPlayerColourName(targetPlayerIdx)); + case static_cast(Context::Faction): + return astringf(_("%s (%s) changed faction of player (%s) to: %s"), responsiblePlayerType, responsiblePlayerName, targetPlayerName, to_localized_string(static_cast(NetPlay.players[targetPlayerIdx].faction))); + } + + return ""; // Silence compiler warning + } +} // namespace INTERNAL_ADMIN_ACTION_NOTICE + +} // namespace WzQuickChatDataContexts + // MARK: - Public functions -const char* to_output_string(WzQuickChatMessage msg) +bool quickChatMessageExpectsExtraData(WzQuickChatMessage msg) +{ + switch (msg) + { + // WZ-generated internal messages which require extra data + case WzQuickChatMessage::INTERNAL_ADMIN_ACTION_NOTICE: + return true; + + default: + return false; + } +} + +int32_t to_output_sender(WzQuickChatMessage msg, uint32_t sender) +{ + // Certain internal messages override the sender for display purposes + switch (msg) + { + // WZ-generated internal messages - not for users to deliberately send + case WzQuickChatMessage::INTERNAL_ADMIN_ACTION_NOTICE: + // override the "sender" to SYSTEM_MESSAGE type + return SYSTEM_MESSAGE; + + default: + return sender; + } +} + +std::string to_output_string(WzQuickChatMessage msg, const optional& messageData) { switch (msg) { @@ -2459,6 +2553,11 @@ const char* to_output_string(WzQuickChatMessage msg) case WzQuickChatMessage::TEAM_SUGGESTION_BUILD_CAPTURE_OILS: // TRANSLATORS: A suggestion to other player(s) return _("I suggest: Capturing oil resources"); + + // WZ-generated internal messages - not for users to deliberately send + case WzQuickChatMessage::INTERNAL_ADMIN_ACTION_NOTICE: + return WzQuickChatDataContexts::INTERNAL_ADMIN_ACTION_NOTICE::to_output_string(messageData.value()); + default: return to_display_string(msg); } @@ -2622,6 +2721,8 @@ const char* to_display_string(WzQuickChatMessage msg) return _("Message delivery failure - try again"); case WzQuickChatMessage::INTERNAL_LOBBY_NOTICE_MAP_DOWNLOADED: return _("Map Downloaded"); + case WzQuickChatMessage::INTERNAL_ADMIN_ACTION_NOTICE: + return _("Admin modified a setting"); // not a valid message case WzQuickChatMessage::MESSAGE_COUNT: @@ -2788,23 +2889,43 @@ static std::string formatReceivers(uint32_t senderIdx, const WzQuickChatTargetin return ss.str(); } -void addQuickChatMessageToConsole(WzQuickChatMessage message, uint32_t sender, const WzQuickChatTargeting& targeting) +void addQuickChatMessageToConsole(WzQuickChatMessage message, uint32_t sender, const WzQuickChatTargeting& targeting, const optional& messageData) { char formatted[MAX_CONSOLE_STRING_LENGTH]; - ssprintf(formatted, "[%s] %s (%s): %s", formatLocalDateTime("%H:%M").c_str(), getPlayerName(sender), formatReceivers(sender, targeting).c_str(), to_output_string(message)); + ssprintf(formatted, "[%s] %s (%s): %s", formatLocalDateTime("%H:%M").c_str(), getPlayerName(sender), formatReceivers(sender, targeting).c_str(), to_output_string(message, messageData).c_str()); bool teamSpecific = !targeting.all && (targeting.humanTeammates || targeting.aiTeammates); - addConsoleMessage(formatted, DEFAULT_JUSTIFY, sender, teamSpecific); + addConsoleMessage(formatted, DEFAULT_JUSTIFY, to_output_sender(message, sender), teamSpecific); } -void addLobbyQuickChatMessageToConsole(WzQuickChatMessage message, uint32_t sender, const WzQuickChatTargeting& targeting) +void addLobbyQuickChatMessageToConsole(WzQuickChatMessage message, uint32_t sender, const WzQuickChatTargeting& targeting, const optional& messageData) { bool teamSpecific = !targeting.all && (targeting.humanTeammates || targeting.aiTeammates); - addConsoleMessage(to_output_string(message), DEFAULT_JUSTIFY, sender, teamSpecific); + addConsoleMessage(to_output_string(message, messageData).c_str(), DEFAULT_JUSTIFY, to_output_sender(message, sender), teamSpecific); } -void sendQuickChat(WzQuickChatMessage message, uint32_t fromPlayer, WzQuickChatTargeting targeting) +bool shouldHideQuickChatMessageFromLocalDisplay(WzQuickChatMessage message) +{ + if (!isInternalMessage(message)) + { + return false; + } + // special cases for internal messages that should be displayed locally + switch (message) + { + case WzQuickChatMessage::INTERNAL_ADMIN_ACTION_NOTICE: + return false; + default: + break; + } + + // hide local display of this message + return true; +} + +void sendQuickChat(WzQuickChatMessage message, uint32_t fromPlayer, WzQuickChatTargeting targeting, optional messageData /*= nullopt*/) { ASSERT_OR_RETURN(, myResponsibility(fromPlayer), "We are not responsible for player: %" PRIu32, fromPlayer); + ASSERT_OR_RETURN(, quickChatMessageExpectsExtraData(message) == messageData.has_value(), "Message [%d] unexpectedly %s", static_cast(message), messageData.has_value() ? "has message data" : "lacks message data"); bool internalMessage = isInternalMessage(message); @@ -2907,7 +3028,7 @@ void sendQuickChat(WzQuickChatMessage message, uint32_t fromPlayer, WzQuickChatT if (recipient == selectedPlayer) { // Targetted at us - Output to console - addQuickChatMessageToConsole(message, fromPlayer, targeting); + addQuickChatMessageToConsole(message, fromPlayer, targeting, messageData); } else { @@ -2951,18 +3072,27 @@ void sendQuickChat(WzQuickChatMessage message, uint32_t fromPlayer, WzQuickChatT { NETuint32_t(&playerIdx); } + if (quickChatMessageExpectsExtraData(message)) + { + if (messageData.has_value()) + { + NETuint32_t(&messageData.value().dataContext); + NETuint32_t(&messageData.value().dataA); + NETuint32_t(&messageData.value().dataB); + } + } NETend(); } - if (fromPlayer == selectedPlayer && (!recipients.empty() || !isInGame) && !internalMessage) + if (fromPlayer == selectedPlayer && (!recipients.empty() || !isInGame) && !shouldHideQuickChatMessageFromLocalDisplay(message)) { if (isInGame) { - addQuickChatMessageToConsole(message, fromPlayer, targeting); + addQuickChatMessageToConsole(message, fromPlayer, targeting, messageData); } else { - addLobbyQuickChatMessageToConsole(message, fromPlayer, targeting); + addLobbyQuickChatMessageToConsole(message, fromPlayer, targeting, messageData); } } @@ -2972,6 +3102,59 @@ void sendQuickChat(WzQuickChatMessage message, uint32_t fromPlayer, WzQuickChatT } } +bool shouldProcessQuickChatMessage(const NETQUEUE& queue, bool isInGame, WzQuickChatMessage message, uint32_t sender, uint32_t recipient, const WzQuickChatTargeting& targeting, const optional& messageData) +{ + bool internalMessage = isInternalMessage(message); + + if (sender >= MAX_CONNECTED_PLAYERS || recipient >= MAX_CONNECTED_PLAYERS) + { + return false; + } + + if (whosResponsible(sender) != queue.index) + { + return false; + } + + if (!myResponsibility(recipient)) + { + return false; + } + + bool senderIsSpectator = NetPlay.players[sender].isSpectator; + if (isInGame && senderIsSpectator && !NetPlay.players[recipient].isSpectator) + { + // spectators can't talk to players in-game + return false; + } + + auto senderSpamMute = playerSpamMutedUntil(sender); + if (senderSpamMute.has_value() && !internalMessage) + { + // ignore message sent while player send was throttled + return false; + } + + // begin: message-specific checks + switch (message) + { + case WzQuickChatMessage::INTERNAL_ADMIN_ACTION_NOTICE: + // should only ever be sent by the host + if (queue.index != NetPlay.hostPlayer) + { + return false; + } + break; + default: + // no special handling + break; + } + // end: message-specific checks + + // passes checks + return true; +} + bool recvQuickChat(NETQUEUE queue) { bool isInGame = (GetGameMode() == GS_NORMAL); @@ -2982,6 +3165,9 @@ bool recvQuickChat(NETQUEUE queue) uint32_t recipient = MAX_CONNECTED_PLAYERS; uint32_t messageValue = static_cast(WzQuickChatMessage::MESSAGE_COUNT); WzQuickChatTargeting targeting; + optional messageData; + + WzQuickChatMessage msgEnumVal; if (expectingSecuredMessage) { @@ -3012,45 +3198,27 @@ bool recvQuickChat(NETQUEUE queue) targeting.specificPlayers.insert(tmp_playerIdx); } } - NETend(); - - if (sender >= MAX_CONNECTED_PLAYERS || recipient >= MAX_CONNECTED_PLAYERS) - { - return false; - } - - if (whosResponsible(sender) != queue.index) + bool validMessageEnumValue = to_WzQuickChatMessage(messageValue, msgEnumVal); + if (validMessageEnumValue && quickChatMessageExpectsExtraData(msgEnumVal)) { - return false; + messageData = WzQuickChatMessageData(); + NETuint32_t(&messageData.value().dataContext); + NETuint32_t(&messageData.value().dataA); + NETuint32_t(&messageData.value().dataB); } + NETend(); - if (!myResponsibility(recipient)) + if (!validMessageEnumValue) { return false; } - bool senderIsSpectator = NetPlay.players[sender].isSpectator; - if (isInGame && senderIsSpectator && !NetPlay.players[recipient].isSpectator) + if (!shouldProcessQuickChatMessage(queue, isInGame, msgEnumVal, sender, recipient, targeting, messageData)) { - // spectators can't talk to players in-game return false; } - WzQuickChatMessage msgEnumVal; - if (!to_WzQuickChatMessage(messageValue, msgEnumVal)) - { - // invalid message enum value - return false; - } bool internalMessage = isInternalMessage(msgEnumVal); - - auto senderSpamMute = playerSpamMutedUntil(sender); - if (senderSpamMute.has_value() && !internalMessage) - { - // ignore message sent while player send was throttled - return false; - } - if (!internalMessage && recipient == selectedPlayer) { recordPlayerMessageSent(sender); @@ -3061,12 +3229,12 @@ bool recvQuickChat(NETQUEUE queue) // Output to the console if (isInGame) { - addQuickChatMessageToConsole(msgEnumVal, sender, targeting); + addQuickChatMessageToConsole(msgEnumVal, sender, targeting, messageData); audio_PlayTrack(ID_SOUND_MESSAGEEND); } else { - addLobbyQuickChatMessageToConsole(msgEnumVal, sender, targeting); + addLobbyQuickChatMessageToConsole(msgEnumVal, sender, targeting, messageData); audio_PlayTrack(FE_AUDIO_MESSAGEEND); } } diff --git a/src/hci/quickchat.h b/src/hci/quickchat.h index bce20f2edc2..9cb3c8b399c 100644 --- a/src/hci/quickchat.h +++ b/src/hci/quickchat.h @@ -105,11 +105,12 @@ /* FROM THIS POINT ON - ONLY INTERNAL MESSAGES! */ \ /* WZ-generated internal messages - not for users to deliberately send */ \ MSG(INTERNAL_MSG_DELIVERY_FAILURE_TRY_AGAIN) /* This should always be the first internal message! */ \ - MSG(INTERNAL_LOBBY_NOTICE_MAP_DOWNLOADED) + MSG(INTERNAL_LOBBY_NOTICE_MAP_DOWNLOADED) \ + MSG(INTERNAL_ADMIN_ACTION_NOTICE) #define GENERATE_ENUM(ENUM) ENUM, -enum class WzQuickChatMessage : uint32_t +enum class WzQuickChatMessage : uint32_t { FOREACH_QUICKCHATMSG(GENERATE_ENUM) // Always last @@ -144,15 +145,43 @@ struct WzQuickChatTargeting bool aiTeammates = false; std::unordered_set specificPlayers; +public: + static WzQuickChatTargeting targetAll(); + public: void reset(); bool noTargets() const; }; +struct WzQuickChatMessageData +{ + uint32_t dataContext = 0; + uint32_t dataA = 0; + uint32_t dataB = 0; +}; + +// Begin: DataContext Enums for specific messages +namespace WzQuickChatDataContexts { + +// - INTERNAL_ADMIN_ACTION_NOTICE +namespace INTERNAL_ADMIN_ACTION_NOTICE { + enum class Context : uint32_t + { + Invalid = 0, + Team, + Position, + Color, + Faction + }; + WzQuickChatMessageData constructMessageData(Context ctx, uint32_t responsiblePlayerIdx, uint32_t targetPlayerIdx); +} // namespace INTERNAL_ADMIN_ACTION_NOTICE + +} // namespace WzQuickChatDataContexts + std::shared_ptr createQuickChatForm(WzQuickChatContext context, const std::function& onQuickChatSent, optional startingPanel = nullopt); void quickChatInitInGame(); struct NETQUEUE; -void sendQuickChat(WzQuickChatMessage message, uint32_t fromPlayer, WzQuickChatTargeting targeting); +void sendQuickChat(WzQuickChatMessage message, uint32_t fromPlayer, WzQuickChatTargeting targeting, optional messageData = nullopt); bool recvQuickChat(NETQUEUE queue); diff --git a/src/multiint.cpp b/src/multiint.cpp index ee83bd73a69..83bd31dfe34 100644 --- a/src/multiint.cpp +++ b/src/multiint.cpp @@ -1448,6 +1448,34 @@ static bool isHostOrAdmin() return NetPlay.isHost || NetPlay.players[selectedPlayer].isAdmin; } +static bool isPlayerHostOrAdmin(uint32_t playerIdx) +{ + ASSERT_OR_RETURN(false, playerIdx < MAX_CONNECTED_PLAYERS, "Invalid player idx: %" PRIu32, playerIdx); + return (playerIdx == NetPlay.hostPlayer) || NetPlay.players[playerIdx].isAdmin; +} + +static bool shouldInformOfAdminAction(uint32_t targetPlayerIdx, uint32_t responsibleIdx) +{ + ASSERT_OR_RETURN(false, targetPlayerIdx < MAX_CONNECTED_PLAYERS, "Invalid targetPlayerIdx: %" PRIu32, targetPlayerIdx); + ASSERT_OR_RETURN(false, responsibleIdx < MAX_CONNECTED_PLAYERS, "Invalid responsibleIdx: %" PRIu32, responsibleIdx); + + if (responsibleIdx == targetPlayerIdx) + { + return false; // do not inform about self-action + } + if (!isPlayerHostOrAdmin(responsibleIdx)) + { + return false; + } + if (!NetPlay.players[targetPlayerIdx].allocated) + { + return false; // do not inform if target isn't a human player + } + + return true; +} + + // //////////////////////////////////////////////////////////////////////////// // Colour functions @@ -2472,19 +2500,51 @@ void WzMultiplayerOptionsTitleUI::closePositionChooser() closeAllChoosers(); } -static void changeTeam(UBYTE player, UBYTE team) +static void informIfAdminChangedOtherTeam(uint32_t targetPlayerIdx, uint32_t responsibleIdx) +{ + if (!shouldInformOfAdminAction(targetPlayerIdx, responsibleIdx)) + { + return; + } + + sendQuickChat(WzQuickChatMessage::INTERNAL_ADMIN_ACTION_NOTICE, realSelectedPlayer, WzQuickChatTargeting::targetAll(), WzQuickChatDataContexts::INTERNAL_ADMIN_ACTION_NOTICE::constructMessageData(WzQuickChatDataContexts::INTERNAL_ADMIN_ACTION_NOTICE::Context::Team, responsibleIdx, targetPlayerIdx)); + + std::string senderPublicKeyB64 = base64Encode(getMultiStats(responsibleIdx).identity.toBytes(EcKey::Public)); + debug(LOG_INFO, "Admin %s (%s) changed team of player ([%u] %s) to: %d", NetPlay.players[responsibleIdx].name, senderPublicKeyB64.c_str(), NetPlay.players[targetPlayerIdx].position, NetPlay.players[targetPlayerIdx].name, NetPlay.players[targetPlayerIdx].team); +} + +static bool changeTeam(UBYTE player, UBYTE team, uint32_t responsibleIdx) { + if (team >= MAX_CONNECTED_PLAYERS) + { + return false; + } + + if (player >= MAX_CONNECTED_PLAYERS) + { + return false; + } + + if (NetPlay.players[player].team == team) + { + NETBroadcastPlayerInfo(player); // we do this regardless, in case of sync issues // FUTURE TODO: Doublecheck if this is still needed? + return false; // Nothing to do. + } + NetPlay.players[player].team = team; debug(LOG_WZ, "set %d as new team for player %d", team, player); NETBroadcastPlayerInfo(player); + informIfAdminChangedOtherTeam(player, responsibleIdx); + netPlayersUpdated = true; + return true; } static bool SendTeamRequest(UBYTE player, UBYTE chosenTeam) { if (NetPlay.isHost) // do or request the change. { - changeTeam(player, chosenTeam); // do the change, remember only the host can do this to avoid confusion. + changeTeam(player, chosenTeam, realSelectedPlayer); // do the change, remember only the host can do this to avoid confusion. } else { @@ -2539,9 +2599,7 @@ bool recvTeamRequest(NETQUEUE queue) resetReadyStatus(false); } debug(LOG_NET, "%s is now part of team: %d", NetPlay.players[player].name, (int) team); - changeTeam(player, team); // we do this regardless, in case of sync issues - - return true; + return changeTeam(player, team, queue.index); // we do this regardless, in case of sync issues } static bool SendReadyRequest(UBYTE player, bool bReady) @@ -2619,12 +2677,31 @@ bool changeReadyStatus(UBYTE player, bool bReady) return true; } -static bool changePosition(UBYTE player, UBYTE position) +static void informIfAdminChangedOtherPosition(uint32_t targetPlayerIdx, uint32_t responsibleIdx) +{ + if (!shouldInformOfAdminAction(targetPlayerIdx, responsibleIdx)) + { + return; + } + + sendQuickChat(WzQuickChatMessage::INTERNAL_ADMIN_ACTION_NOTICE, realSelectedPlayer, WzQuickChatTargeting::targetAll(), WzQuickChatDataContexts::INTERNAL_ADMIN_ACTION_NOTICE::constructMessageData(WzQuickChatDataContexts::INTERNAL_ADMIN_ACTION_NOTICE::Context::Position, responsibleIdx, targetPlayerIdx)); + + std::string senderPublicKeyB64 = base64Encode(getMultiStats(responsibleIdx).identity.toBytes(EcKey::Public)); + debug(LOG_INFO, "Admin %s (%s) changed position of player (%s) to: %d", NetPlay.players[responsibleIdx].name, senderPublicKeyB64.c_str(), NetPlay.players[targetPlayerIdx].name, NetPlay.players[targetPlayerIdx].position); +} + +static bool changePosition(UBYTE player, UBYTE position, uint32_t responsibleIdx) { ASSERT_HOST_ONLY(return false); - ASSERT(player < MAX_PLAYERS, "Invalid player idx: %" PRIu8, player); + ASSERT_OR_RETURN(false, player < MAX_PLAYERS, "Invalid player idx: %" PRIu8, player); int i; + if (NetPlay.players[player].position == position) + { + // nothing to do + return false; + } + for (i = 0; i < MAX_PLAYERS; i++) { if (NetPlay.players[i].position == position) @@ -2634,6 +2711,7 @@ static bool changePosition(UBYTE player, UBYTE position) std::swap(NetPlay.players[i].position, NetPlay.players[player].position); std::swap(NetPlay.players[i].team, NetPlay.players[player].team); NETBroadcastTwoPlayerInfo(player, i); + informIfAdminChangedOtherPosition(player, responsibleIdx); netPlayersUpdated = true; return true; } @@ -2645,36 +2723,50 @@ static bool changePosition(UBYTE player, UBYTE position) // Positions were corrupted. Attempt to fix. NetPlay.players[player].position = position; NETBroadcastPlayerInfo(player); + informIfAdminChangedOtherPosition(player, responsibleIdx); netPlayersUpdated = true; return true; } return false; } -bool changeColour(unsigned player, int col, bool isHost) +static void informIfAdminChangedOtherColor(uint32_t targetPlayerIdx, uint32_t responsibleIdx) +{ + if (!shouldInformOfAdminAction(targetPlayerIdx, responsibleIdx)) + { + return; + } + + sendQuickChat(WzQuickChatMessage::INTERNAL_ADMIN_ACTION_NOTICE, realSelectedPlayer, WzQuickChatTargeting::targetAll(), WzQuickChatDataContexts::INTERNAL_ADMIN_ACTION_NOTICE::constructMessageData(WzQuickChatDataContexts::INTERNAL_ADMIN_ACTION_NOTICE::Context::Color, responsibleIdx, targetPlayerIdx)); + + std::string senderPublicKeyB64 = base64Encode(getMultiStats(responsibleIdx).identity.toBytes(EcKey::Public)); + debug(LOG_INFO, "Admin %s (%s) changed color of player ([%u] %s) to: [%d] %s", NetPlay.players[responsibleIdx].name, senderPublicKeyB64.c_str(), NetPlay.players[targetPlayerIdx].position, NetPlay.players[targetPlayerIdx].name, NetPlay.players[targetPlayerIdx].colour, getPlayerColourName(targetPlayerIdx)); +} + +bool changeColour(unsigned player, int col, uint32_t responsibleIdx) { if (col < 0 || col >= MAX_PLAYERS_IN_GUI) { - return true; + return false; } if (player >= MAX_PLAYERS) { - return true; + return false; } if (getPlayerColour(player) == col) { - return true; // Nothing to do. + return false; // Nothing to do. } for (unsigned i = 0; i < MAX_PLAYERS; ++i) { if (getPlayerColour(i) == col) { - if (!isHost && NetPlay.players[i].allocated) + if (!isPlayerHostOrAdmin(responsibleIdx) && NetPlay.players[i].allocated) { - return true; // May not swap. + return false; // May not swap. } debug(LOG_NET, "Swapping colours between players %d(%d) and %d(%d)", @@ -2682,6 +2774,7 @@ bool changeColour(unsigned player, int col, bool isHost) setPlayerColour(i, getPlayerColour(player)); setPlayerColour(player, col); NETBroadcastTwoPlayerInfo(player, i); + informIfAdminChangedOtherColor(player, responsibleIdx); netPlayersUpdated = true; return true; } @@ -2693,6 +2786,7 @@ bool changeColour(unsigned player, int col, bool isHost) debug(LOG_NET, "corrupted colours: player (%u) new colour (%u) old colour (%d)", player, col, NetPlay.players[player].colour); setPlayerColour(player, col); NETBroadcastPlayerInfo(player); + informIfAdminChangedOtherColor(player, responsibleIdx); netPlayersUpdated = true; return true; } @@ -2703,7 +2797,7 @@ bool SendColourRequest(UBYTE player, UBYTE col) { if (NetPlay.isHost) // do or request the change { - return changeColour(player, col, true); + return changeColour(player, col, realSelectedPlayer); } else { @@ -2716,14 +2810,46 @@ bool SendColourRequest(UBYTE player, UBYTE col) return true; } +static void informIfAdminChangedOtherFaction(uint32_t targetPlayerIdx, uint32_t responsibleIdx) +{ + if (!shouldInformOfAdminAction(targetPlayerIdx, responsibleIdx)) + { + return; + } + + sendQuickChat(WzQuickChatMessage::INTERNAL_ADMIN_ACTION_NOTICE, realSelectedPlayer, WzQuickChatTargeting::targetAll(), WzQuickChatDataContexts::INTERNAL_ADMIN_ACTION_NOTICE::constructMessageData(WzQuickChatDataContexts::INTERNAL_ADMIN_ACTION_NOTICE::Context::Faction, responsibleIdx, targetPlayerIdx)); + + std::string senderPublicKeyB64 = base64Encode(getMultiStats(responsibleIdx).identity.toBytes(EcKey::Public)); + debug(LOG_INFO, "Admin %s (%s) changed faction of player ([%u] %s) to: %s", NetPlay.players[responsibleIdx].name, senderPublicKeyB64.c_str(), NetPlay.players[targetPlayerIdx].position, NetPlay.players[targetPlayerIdx].name, to_localized_string(static_cast(NetPlay.players[targetPlayerIdx].faction))); +} + +bool changeFaction(unsigned player, FactionID faction, uint32_t responsibleIdx) +{ + if (player >= MAX_PLAYERS) + { + return false; + } + + if (NetPlay.players[player].faction == faction) + { + return false; // Nothing to do. + } + + NetPlay.players[player].faction = static_cast(faction); + NETBroadcastPlayerInfo(player); + + informIfAdminChangedOtherFaction(player, responsibleIdx); + + return true; +} + static bool SendFactionRequest(UBYTE player, UBYTE faction) { // TODO: needs to be rewritten from scratch ASSERT_OR_RETURN(false, faction <= static_cast(MAX_FACTION_ID), "Invalid faction: %u", (unsigned int)faction); if (NetPlay.isHost) // do or request the change { - NetPlay.players[player].faction = static_cast(faction); - NETBroadcastPlayerInfo(player); + changeFaction(player, static_cast(faction), realSelectedPlayer); return true; } else @@ -2741,7 +2867,7 @@ static bool SendPositionRequest(UBYTE player, UBYTE position) { if (NetPlay.isHost) // do or request the change { - return changePosition(player, position); + return changePosition(player, position, realSelectedPlayer); } else { @@ -2788,9 +2914,7 @@ bool recvFactionRequest(NETQUEUE queue) resetReadyStatus(false, true); - NetPlay.players[player].faction = newFactionId.value(); - NETBroadcastPlayerInfo(player); - return true; + return changeFaction(player, newFactionId.value(), queue.index); } bool recvColourRequest(NETQUEUE queue) @@ -2819,7 +2943,7 @@ bool recvColourRequest(NETQUEUE queue) resetReadyStatus(false, true); - return changeColour(player, col, NetPlay.players[queue.index].isAdmin); + return changeColour(player, col, queue.index); } bool recvPositionRequest(NETQUEUE queue) @@ -2854,7 +2978,7 @@ bool recvPositionRequest(NETQUEUE queue) resetReadyStatus(false); - return changePosition(player, position); + return changePosition(player, position, queue.index); } static bool SendPlayerSlotTypeRequest(uint32_t player, bool isSpectator) @@ -6621,7 +6745,7 @@ class WzHostLobbyOperationsInterface : public HostLobbyOperationsInterface virtual ~WzHostLobbyOperationsInterface() { } public: - virtual bool changeTeam(uint32_t player, uint8_t team) override + virtual bool changeTeam(uint32_t player, uint8_t team, uint32_t responsibleIdx) override { ASSERT_HOST_ONLY(return false); ASSERT_OR_RETURN(false, player < MAX_PLAYERS, "Invalid player: %" PRIu32, player); @@ -6636,11 +6760,11 @@ class WzHostLobbyOperationsInterface : public HostLobbyOperationsInterface // no-op - nothing to do return true; } - ::changeTeam(player, team); + ::changeTeam(player, team, responsibleIdx); resetReadyStatus(false); return true; } - virtual bool changePosition(uint32_t player, uint8_t position) override + virtual bool changePosition(uint32_t player, uint8_t position, uint32_t responsibleIdx) override { ASSERT_HOST_ONLY(return false); ASSERT_OR_RETURN(false, player < MAX_PLAYERS, "Invalid player: %" PRIu32, player); @@ -6655,7 +6779,7 @@ class WzHostLobbyOperationsInterface : public HostLobbyOperationsInterface // no-op request - nothing to do return true; } - if (!::changePosition(player, position)) + if (!::changePosition(player, position, responsibleIdx)) { return false; } @@ -6818,7 +6942,7 @@ class WzHostLobbyOperationsInterface : public HostLobbyOperationsInterface resetReadyStatus(true); //reset and send notification to all clients return true; } - virtual bool autoBalancePlayers() override + virtual bool autoBalancePlayers(uint32_t responsibleIdx) override { ASSERT_HOST_ONLY(return false); if (!getAutoratingEnable()) @@ -6869,7 +6993,7 @@ class WzHostLobbyOperationsInterface : public HostLobbyOperationsInterface } sendRoomSystemMessage(astringf("Moving [%d]\"%s\" <%s> to pos %d", id, pl[i].name.c_str(), pl[i].elo.c_str(), toslot).c_str()); - changePosition(id, toslot); + changePosition(id, toslot, responsibleIdx); } sendRoomSystemMessage("Autobalance done"); return true; @@ -7554,7 +7678,7 @@ TITLECODE WzMultiplayerOptionsTitleUI::run() for (uint8_t slotInc = 0; slotInc < game.maxPlayers && playerInc < humans.size(); ++slotInc) { - changePosition(humans[playerInc], slotInc); + changePosition(humans[playerInc], slotInc, realSelectedPlayer); ++playerInc; } } @@ -8673,7 +8797,7 @@ static inline bool isSpectatorOnlySlot(UDWORD playerIdx) bool autoBalancePlayersCmd() { - return cmdInterface.autoBalancePlayers(); + return cmdInterface.autoBalancePlayers(realSelectedPlayer); } //// NOTE: Pass in NetPlay.players[i].position diff --git a/src/multiint.h b/src/multiint.h index 17036101f5c..cd721d2bd8a 100644 --- a/src/multiint.h +++ b/src/multiint.h @@ -85,7 +85,7 @@ std::shared_ptr addMultiBut(const std::shared_ptr &screen, U std::shared_ptr makeMultiBut(UDWORD id, UDWORD width, UDWORD height, const char *tipres, UDWORD norm, UDWORD down, UDWORD hi, unsigned tc, uint8_t alpha = 255); AtlasImage mpwidgetGetFrontHighlightImage(AtlasImage image); -bool changeColour(unsigned player, int col, bool isHost); +bool changeColour(unsigned player, int col, uint32_t responsibleIdx); extern char sPlayer[128]; extern bool multiintDisableLobbyRefresh; // gamefind diff --git a/src/multilobbycommands.cpp b/src/multilobbycommands.cpp index 3f312871973..34ed59e297f 100644 --- a/src/multilobbycommands.cpp +++ b/src/multilobbycommands.cpp @@ -295,7 +295,7 @@ bool processChatLobbySlashCommands(const NetworkTextMessage& message, HostLobbyO sendRoomNotifyMessage("Usage: " LOBBY_COMMAND_PREFIX "team "); return false; } - if (!cmdInterface.changeTeam(posToNetPlayer(s1), s2)) + if (!cmdInterface.changeTeam(posToNetPlayer(s1), s2, message.sender)) { std::string msg = astringf("Unable to change player %u team to %u", s1, s2); sendRoomNotifyMessage(msg.c_str()); @@ -387,7 +387,7 @@ bool processChatLobbySlashCommands(const NetworkTextMessage& message, HostLobbyO return false; } - if (!cmdInterface.changePosition(playerIdxA, s2)) + if (!cmdInterface.changePosition(playerIdxA, s2, message.sender)) { std::string msg = astringf("Unable to swap players %" PRIu8 " and %" PRIu8, s1, s2); sendRoomNotifyMessage(msg.c_str()); @@ -554,7 +554,7 @@ bool processChatLobbySlashCommands(const NetworkTextMessage& message, HostLobbyO sendRoomSystemMessage("Autobalance is available only for even player count."); return false; } - if (!cmdInterface.autoBalancePlayers()) + if (!cmdInterface.autoBalancePlayers(message.sender)) { // failure message logged by autoBalancePlayers() return false; diff --git a/src/multilobbycommands.h b/src/multilobbycommands.h index b7ba7b00177..944663c9f5c 100644 --- a/src/multilobbycommands.h +++ b/src/multilobbycommands.h @@ -35,8 +35,8 @@ class HostLobbyOperationsInterface virtual ~HostLobbyOperationsInterface(); public: - virtual bool changeTeam(uint32_t player, uint8_t team) = 0; - virtual bool changePosition(uint32_t player, uint8_t position) = 0; + virtual bool changeTeam(uint32_t player, uint8_t team, uint32_t responsibleIdx) = 0; + virtual bool changePosition(uint32_t player, uint8_t position, uint32_t responsibleIdx) = 0; virtual bool changeBase(uint8_t baseValue) = 0; virtual bool changeAlliances(uint8_t allianceValue) = 0; virtual bool changeScavengers(uint8_t scavsValue) = 0; @@ -44,7 +44,7 @@ class HostLobbyOperationsInterface virtual bool changeHostChatPermissions(uint32_t player_id, bool freeChatEnabled) = 0; virtual bool movePlayerToSpectators(uint32_t player_id) = 0; virtual bool requestMoveSpectatorToPlayers(uint32_t player_id) = 0; - virtual bool autoBalancePlayers() = 0; + virtual bool autoBalancePlayers(uint32_t responsibleIdx) = 0; virtual void quitGame(int exitCode) = 0; }; From cc6a1f30d6625e56d2d67305dbf198990cfd522c Mon Sep 17 00:00:00 2001 From: past-due <30942300+past-due@users.noreply.github.com> Date: Sun, 27 Oct 2024 17:01:10 -0400 Subject: [PATCH 03/38] joiningscreen: Display and log connection state on timeout --- src/screens/joiningscreen.cpp | 75 ++++++++++++++++++++++++++++++++--- 1 file changed, 70 insertions(+), 5 deletions(-) diff --git a/src/screens/joiningscreen.cpp b/src/screens/joiningscreen.cpp index d249fe76c90..c3ad785edb4 100644 --- a/src/screens/joiningscreen.cpp +++ b/src/screens/joiningscreen.cpp @@ -419,7 +419,7 @@ int32_t WzJoiningStatusForm::calculateNeededHeight(bool withDetailsParagraph) } else { - result += statusDetails->height(); + result += statusDetails->idealHeight(); } result += InternalPadding; if (passwordPrompt && passwordPrompt->visible()) @@ -521,7 +521,7 @@ void WzJoiningStatusForm::recalcLayout() int statusDetailsX0 = InternalPadding; int statusDetailsWidth = usableWidth; - statusDetails->setGeometry(statusDetailsX0, lastLineY1 + DetailsLabelParagraphPadding, statusDetailsWidth, statusDetails->height()); + statusDetails->setGeometry(statusDetailsX0, lastLineY1 + DetailsLabelParagraphPadding, statusDetailsWidth, statusDetails->idealHeight()); int paragraphHeight = usableHeight - DetailsLabelParagraphPadding; scrollableParagraphContainer->setGeometry(InternalPadding, lastLineY1 + DetailsLabelParagraphPadding, usableWidth, paragraphHeight); @@ -546,7 +546,7 @@ void WzJoiningStatusForm::displayStatus(const WzString &statusDescription) } scrollableParagraphContainer->hide(); - statusDetails->setString(statusDescription); + statusDetails->setFormattedString(statusDescription, std::numeric_limits::max(), font_regular); statusDetails->show(); } @@ -780,6 +780,10 @@ class WzJoiningGameScreen_HandlerRoot : public W_CLICKFORM }; JoiningState currentJoiningState = JoiningState::AwaitingConnection; + const char* to_string(JoiningState s); + const char* to_display_str(JoiningState s); + const char* to_localized_state_fail_desc(JoiningState s); + // state when handling initial connection join uint32_t startTime = 0; Socket* client_transient_socket = nullptr; @@ -956,12 +960,73 @@ void WzJoiningGameScreen_HandlerRoot::updateJoiningStatus(const WzString& status joiningProgressForm->displayProgressStatus(statusDescription); } +const char* WzJoiningGameScreen_HandlerRoot::to_string(JoiningState s) +{ + switch (s) { + case JoiningState::NeedsPassword: return "NeedsPassword"; + case JoiningState::AwaitingConnection: return "AwaitingConnection"; + case JoiningState::AwaitingInitialNetcodeHandshakeAck: return "AwaitingInitialNetcodeHandshakeAck"; + case JoiningState::ProcessingJoinMessages: return "ProcessingJoinMessages"; + case JoiningState::Failure: return "Failure"; + case JoiningState::SuccessPendingClose: return "SuccessPendingClose"; + case JoiningState::Success: return "Success"; + } + return ""; // silence compiler warning +} + +const char* WzJoiningGameScreen_HandlerRoot::to_display_str(JoiningState s) +{ + switch (s) { + case JoiningState::NeedsPassword: return "NeedsPassword"; + case JoiningState::AwaitingConnection: return "PendingConnect"; + case JoiningState::AwaitingInitialNetcodeHandshakeAck: return "NetcodeHandshake"; + case JoiningState::ProcessingJoinMessages: return "ProcessingJoin"; + case JoiningState::Failure: return "Failure"; + case JoiningState::SuccessPendingClose: return "SuccessPendingClose"; + case JoiningState::Success: return "Success"; + } + return ""; // silence compiler warning +} + +const char* WzJoiningGameScreen_HandlerRoot::to_localized_state_fail_desc(JoiningState s) +{ + switch (s) { + case JoiningState::NeedsPassword: + return _("Waiting for correct join password"); + case JoiningState::AwaitingConnection: + return _("Attempting to connect"); + case JoiningState::AwaitingInitialNetcodeHandshakeAck: + return _("Establishing connection handshake"); + case JoiningState::ProcessingJoinMessages: + return _("Coordinating join with host"); + case JoiningState::Failure: + return _("Join attempt failed"); + case JoiningState::SuccessPendingClose: + case JoiningState::Success: + return ""; + } + return ""; // silence compiler warning +} + void WzJoiningGameScreen_HandlerRoot::handleJoinTimeoutError() { + debug(LOG_INFO, "Failed to join with timeout, state: %s", to_string(currentJoiningState)); + + WzString timeoutErrorDetails = _("Host did not respond before timeout"); + timeoutErrorDetails += "\n"; + WzString localizedJoinStateDesc = to_localized_state_fail_desc(currentJoiningState); + if (!localizedJoinStateDesc.isEmpty()) + { + timeoutErrorDetails += WzString::fromUtf8(astringf(_("Failed at: [%s] - %s"), to_display_str(currentJoiningState), localizedJoinStateDesc.toUtf8().c_str())); + } + else + { + timeoutErrorDetails += WzString::fromUtf8(astringf(_("Failed at: [%s]"), to_display_str(currentJoiningState))); + } + currentJoiningState = JoiningState::Failure; - debug(LOG_INFO, "Failed to join with timeout"); - joiningProgressForm->displayUnableToJoinError(_("Host did not respond before timeout")); + joiningProgressForm->displayUnableToJoinError(timeoutErrorDetails); joiningProgressForm->callCalcLayout(); if (onFailureFunc) From f8ec4d844335ac70004861202db217f46f2cfab7 Mon Sep 17 00:00:00 2001 From: past-due <30942300+past-due@users.noreply.github.com> Date: Sun, 27 Oct 2024 18:43:20 -0400 Subject: [PATCH 04/38] Add host auto kick on sustained desync Defaults to kicking if a player remains in desync status for 10 seconds --- lib/netplay/netplay.cpp | 1 + src/configuration.cpp | 2 + src/multiint.cpp | 1 + src/multijoin.cpp | 3 ++ src/multiopt.cpp | 1 + src/multiplay.cpp | 104 +++++++++++++++++++++++++++++++++++++--- src/multiplay.h | 2 + src/warzoneconfig.cpp | 16 +++++++ src/warzoneconfig.h | 2 + 9 files changed, 126 insertions(+), 6 deletions(-) diff --git a/lib/netplay/netplay.cpp b/lib/netplay/netplay.cpp index 83f0d929429..d3e3e1d1dd7 100644 --- a/lib/netplay/netplay.cpp +++ b/lib/netplay/netplay.cpp @@ -1933,6 +1933,7 @@ static bool swapPlayerIndexes(uint32_t playerIndexA, uint32_t playerIndexB) // Swap certain ingame player-associated entries std::swap(ingame.PingTimes[playerIndexA], ingame.PingTimes[playerIndexB]); std::swap(ingame.LagCounter[playerIndexA], ingame.LagCounter[playerIndexB]); + std::swap(ingame.DesyncCounter[playerIndexA], ingame.DesyncCounter[playerIndexB]); std::swap(ingame.VerifiedIdentity[playerIndexA], ingame.VerifiedIdentity[playerIndexB]); std::swap(ingame.JoiningInProgress[playerIndexA], ingame.JoiningInProgress[playerIndexB]); std::swap(ingame.PendingDisconnect[playerIndexA], ingame.PendingDisconnect[playerIndexB]); diff --git a/src/configuration.cpp b/src/configuration.cpp index 9e80090bbff..8b0d1176eab 100644 --- a/src/configuration.cpp +++ b/src/configuration.cpp @@ -582,6 +582,7 @@ bool loadConfig() pie_EnableFog(false); } war_setAutoLagKickSeconds(iniGetInteger("hostAutoLagKickSeconds", war_getAutoLagKickSeconds()).value()); + war_setAutoDesyncKickSeconds(iniGetInteger("hostAutoDesyncKickSeconds", war_getAutoDesyncKickSeconds()).value()); war_setDisableReplayRecording(iniGetBool("disableReplayRecord", war_getDisableReplayRecording()).value()); war_setMaxReplaysSaved(iniGetInteger("maxReplaysSaved", war_getMaxReplaysSaved()).value()); war_setOldLogsLimit(iniGetInteger("oldLogsLimit", war_getOldLogsLimit()).value()); @@ -773,6 +774,7 @@ bool saveConfig() iniSetBool("autosaveEnabled", autosaveEnabled); iniSetBool("fog", pie_GetFogEnabled()); iniSetInteger("hostAutoLagKickSeconds", war_getAutoLagKickSeconds()); + iniSetInteger("hostAutoDesyncKickSeconds", war_getAutoDesyncKickSeconds()); iniSetBool("disableReplayRecord", war_getDisableReplayRecording()); iniSetInteger("maxReplaysSaved", war_getMaxReplaysSaved()); iniSetInteger("oldLogsLimit", war_getOldLogsLimit()); diff --git a/src/multiint.cpp b/src/multiint.cpp index 83bd31dfe34..69d84621be2 100644 --- a/src/multiint.cpp +++ b/src/multiint.cpp @@ -6329,6 +6329,7 @@ bool WzMultiplayerOptionsTitleUI::startHost() ingame.PingTimes[i] = 0; ingame.VerifiedIdentity[i] = false; ingame.LagCounter[i] = 0; + ingame.DesyncCounter[i] = 0; ingame.lastSentPlayerDataCheck2[i].reset(); ingame.muteChat[i] = false; } diff --git a/src/multijoin.cpp b/src/multijoin.cpp index 1d011c64a27..cabcad22a17 100644 --- a/src/multijoin.cpp +++ b/src/multijoin.cpp @@ -99,6 +99,7 @@ void clearPlayer(UDWORD player, bool quietly) debug(LOG_NET, "R.I.P. %s (%u). quietly is %s", getPlayerName(player), player, quietly ? "true" : "false"); ingame.LagCounter[player] = 0; + ingame.DesyncCounter[player] = 0; ingame.JoiningInProgress[player] = false; // if they never joined, reset the flag ingame.DataIntegrity[player] = false; ingame.hostChatPermissions[player] = false; @@ -332,6 +333,7 @@ void handlePlayerLeftInGame(UDWORD player) debug(LOG_NET, "R.I.P. %s (%u).", getPlayerName(player), player); ingame.LagCounter[player] = 0; + ingame.DesyncCounter[player] = 0; ingame.JoiningInProgress[player] = false; // if they never joined, reset the flag ingame.PendingDisconnect[player] = false; ingame.DataIntegrity[player] = false; @@ -671,6 +673,7 @@ void setupNewPlayer(UDWORD player) ingame.PingTimes[player] = 0; // Reset ping time ingame.LagCounter[player] = 0; + ingame.DesyncCounter[player] = 0; ingame.VerifiedIdentity[player] = false; ingame.JoiningInProgress[player] = true; // Note that player is now joining ingame.PendingDisconnect[player] = false; diff --git a/src/multiopt.cpp b/src/multiopt.cpp index 960471921f3..023f47d4bd8 100644 --- a/src/multiopt.cpp +++ b/src/multiopt.cpp @@ -724,6 +724,7 @@ bool multiGameShutdown() ingame.startTime = std::chrono::steady_clock::time_point(); ingame.endTime = nullopt; ingame.lastLagCheck = std::chrono::steady_clock::time_point(); + ingame.lastDesyncCheck = std::chrono::steady_clock::time_point(); ingame.lastPlayerDataCheck2 = std::chrono::steady_clock::time_point(); NetPlay.isHost = false; bMultiPlayer = false; // Back to single player mode diff --git a/src/multiplay.cpp b/src/multiplay.cpp index 5e363449435..dda732db93d 100644 --- a/src/multiplay.cpp +++ b/src/multiplay.cpp @@ -116,13 +116,13 @@ static bool sendDataCheck2(); void startMultiplayerGame(); // //////////////////////////////////////////////////////////////////////////// -// Auto Lag Kick Handling +// Auto Bad Connection Kick Handling #define LAG_INITIAL_LOAD_GRACEPERIOD 60 #define LAG_CHECK_INTERVAL 1000 const std::chrono::milliseconds LagCheckInterval(LAG_CHECK_INTERVAL); -void autoLagKickRoutine() +void autoLagKickRoutine(std::chrono::steady_clock::time_point now) { if (!bMultiPlayer || !NetPlay.bComms || !NetPlay.isHost) { @@ -135,7 +135,6 @@ void autoLagKickRoutine() return; } - const std::chrono::steady_clock::time_point now = std::chrono::steady_clock::now(); if (std::chrono::duration_cast(now - ingame.lastLagCheck) < LagCheckInterval) { return; @@ -225,12 +224,103 @@ void autoLagKickRoutine() ingame.LagCounter[i] = 0; } else if (ingame.LagCounter[i] >= (LagAutoKickSeconds - 3)) { - std::string msg = astringf("Auto-kicking player %" PRIu32 " (\"%s\") in %u seconds.", i, getPlayerName(i), (LagAutoKickSeconds - ingame.LagCounter[i])); + std::string msg = astringf("Auto-kicking player %" PRIu32 " (\"%s\") in %u seconds. (lag)", i, getPlayerName(i), (LagAutoKickSeconds - ingame.LagCounter[i])); debug(LOG_INFO, "%s", msg.c_str()); sendInGameSystemMessage(msg.c_str()); } else if (ingame.LagCounter[i] % 15 == 0) { // every 15 seconds - std::string msg = astringf("Auto-kicking player %" PRIu32 " (\"%s\") in %u seconds.", i, getPlayerName(i), (LagAutoKickSeconds - ingame.LagCounter[i])); + std::string msg = astringf("Auto-kicking player %" PRIu32 " (\"%s\") in %u seconds. (lag)", i, getPlayerName(i), (LagAutoKickSeconds - ingame.LagCounter[i])); + debug(LOG_INFO, "%s", msg.c_str()); + sendInGameSystemMessage(msg.c_str()); + } + } +} + +void autoLagKickRoutine() +{ + if (!bMultiPlayer || !NetPlay.bComms || !NetPlay.isHost) + { + return; + } + + const std::chrono::steady_clock::time_point now = std::chrono::steady_clock::now(); + autoLagKickRoutine(now); +} + +#define DESYNC_CHECK_INTERVAL 1000 +const std::chrono::milliseconds DesyncCheckInterval(DESYNC_CHECK_INTERVAL); + +void autoDesyncKickRoutine(std::chrono::steady_clock::time_point now) +{ + if (!bMultiPlayer || !NetPlay.bComms || !NetPlay.isHost) + { + return; + } + + int DesyncAutoKickSeconds = war_getAutoDesyncKickSeconds(); + if (DesyncAutoKickSeconds <= 0) + { + return; + } + + if (std::chrono::duration_cast(now - ingame.lastDesyncCheck) < DesyncCheckInterval) + { + return; + } + + if (ingame.endTime.has_value()) + { + // game ended - skip desync check / kick + return; + } + + ingame.lastDesyncCheck = now; + uint32_t playerCheckLimit = MAX_PLAYERS; + for (uint32_t i = 0; i < playerCheckLimit; ++i) + { + if (!isHumanPlayer(i)) + { + continue; + } + if (i == NetPlay.hostPlayer) + { + continue; + } + if (i > MAX_PLAYERS && !gtimeShouldWaitForPlayer(i)) + { + continue; + } + + bool isDesynced = NETcheckPlayerConnectionStatus(CONNECTIONSTATUS_DESYNC, i); + + if (!isDesynced) + { + ingame.DesyncCounter[i] = 0; + continue; + } + + if (ingame.PendingDisconnect[i]) + { + // player already technically left, but we're still in the "pre-game" phase so the GAME_PLAYER_LEFT hasn't been processed yet + continue; + } + + ingame.DesyncCounter[i]++; + if (ingame.DesyncCounter[i] >= DesyncAutoKickSeconds) { + std::string msg = astringf("Auto-kicking player %" PRIu32 " (\"%s\") because of desync. (Timeout: %u seconds)", i, getPlayerName(i), DesyncAutoKickSeconds); + debug(LOG_INFO, "%s", msg.c_str()); + sendInGameSystemMessage(msg.c_str()); + wz_command_interface_output("WZEVENT: desync-kick: %u %s\n", i, NetPlay.players[i].IPtextAddress); + kickPlayer(i, "Your game simulation deviated too far from the host - desync.", ERROR_CONNECTION, false); + ingame.DesyncCounter[i] = 0; + } + else if (ingame.DesyncCounter[i] >= (DesyncAutoKickSeconds - 3)) { + std::string msg = astringf("Auto-kicking player %" PRIu32 " (\"%s\") in %u seconds. (desync)", i, getPlayerName(i), (DesyncAutoKickSeconds - ingame.DesyncCounter[i])); + debug(LOG_INFO, "%s", msg.c_str()); + sendInGameSystemMessage(msg.c_str()); + } + else if (ingame.DesyncCounter[i] % 2 == 0) { // every 2 seconds + std::string msg = astringf("Auto-kicking player %" PRIu32 " (\"%s\") in %u seconds. (desync)", i, getPlayerName(i), (DesyncAutoKickSeconds - ingame.DesyncCounter[i])); debug(LOG_INFO, "%s", msg.c_str()); sendInGameSystemMessage(msg.c_str()); } @@ -414,7 +504,9 @@ bool multiPlayerLoop() if (NetPlay.isHost) { - autoLagKickRoutine(); + const std::chrono::steady_clock::time_point now = std::chrono::steady_clock::now(); + autoLagKickRoutine(now); + autoDesyncKickRoutine(now); processPendingKickVotes(); } diff --git a/src/multiplay.h b/src/multiplay.h index efcec425ded..e359cb062cf 100644 --- a/src/multiplay.h +++ b/src/multiplay.h @@ -107,6 +107,7 @@ struct MULTIPLAYERINGAME { UDWORD PingTimes[MAX_CONNECTED_PLAYERS]; // store for pings. int LagCounter[MAX_CONNECTED_PLAYERS]; + int DesyncCounter[MAX_CONNECTED_PLAYERS]; bool VerifiedIdentity[MAX_CONNECTED_PLAYERS]; // if the multistats identity has been verified. bool localOptionsReceived; // used to show if we have game options yet.. bool localJoiningInProgress; // used before we know our player number. @@ -120,6 +121,7 @@ struct MULTIPLAYERINGAME std::chrono::steady_clock::time_point startTime; optional endTime; std::chrono::steady_clock::time_point lastLagCheck; + std::chrono::steady_clock::time_point lastDesyncCheck; optional lastSentPlayerDataCheck2[MAX_CONNECTED_PLAYERS] = {}; std::chrono::steady_clock::time_point lastPlayerDataCheck2; bool muteChat[MAX_CONNECTED_PLAYERS] = {false}; // the local client-set mute status for this player diff --git a/src/warzoneconfig.cpp b/src/warzoneconfig.cpp index 779cae71373..de95984cae8 100644 --- a/src/warzoneconfig.cpp +++ b/src/warzoneconfig.cpp @@ -74,6 +74,7 @@ struct WARZONE_GLOBALS JS_BACKEND jsBackend = (JS_BACKEND)0; bool autoAdjustDisplayScale = true; int autoLagKickSeconds = 60; + int autoDesyncKickSeconds = 10; bool disableReplayRecording = false; int maxReplaysSaved = MAX_REPLAY_FILES; int oldLogsLimit = MAX_OLD_LOGS; @@ -486,6 +487,21 @@ void war_setAutoLagKickSeconds(int seconds) warGlobs.autoLagKickSeconds = seconds; } +int war_getAutoDesyncKickSeconds() +{ + return warGlobs.autoDesyncKickSeconds; +} + +void war_setAutoDesyncKickSeconds(int seconds) +{ + seconds = std::max(seconds, 0); + if (seconds > 0) + { + seconds = std::max(seconds, 10); + } + warGlobs.autoDesyncKickSeconds = seconds; +} + bool war_getDisableReplayRecording() { return warGlobs.disableReplayRecording; diff --git a/src/warzoneconfig.h b/src/warzoneconfig.h index 91b00d5cff7..6ebb79189c7 100644 --- a/src/warzoneconfig.h +++ b/src/warzoneconfig.h @@ -132,6 +132,8 @@ bool war_getAutoAdjustDisplayScale(); void war_setAutoAdjustDisplayScale(bool autoAdjustDisplayScale); int war_getAutoLagKickSeconds(); void war_setAutoLagKickSeconds(int seconds); +int war_getAutoDesyncKickSeconds(); +void war_setAutoDesyncKickSeconds(int seconds); bool war_getDisableReplayRecording(); void war_setDisableReplayRecording(bool disable); int war_getMaxReplaysSaved(); From b9c37598bc48ca1eb9017ea2e740a91e09b098dc Mon Sep 17 00:00:00 2001 From: past-due <30942300+past-due@users.noreply.github.com> Date: Sun, 27 Oct 2024 19:50:02 -0400 Subject: [PATCH 05/38] Fix: Only play "Player is exiting" audio when player slot drops (ignore spectators) --- src/multijoin.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/multijoin.cpp b/src/multijoin.cpp index cabcad22a17..8ee450cd032 100644 --- a/src/multijoin.cpp +++ b/src/multijoin.cpp @@ -517,7 +517,10 @@ bool MultiPlayerLeave(UDWORD playerIndex) if (widgGetFromID(psWScreen, IDRET_FORM)) { - audio_QueueTrack(ID_CLAN_EXIT); + if (playerIndex < MAX_PLAYERS) // only play audio when *player* slots drop (ignore spectator slots) + { + audio_QueueTrack(ID_CLAN_EXIT); + } } // fire script callback to reassign skirmish players. From b4e00db6dc3778d82db650c970fad981e376958c Mon Sep 17 00:00:00 2001 From: past-due <30942300+past-due@users.noreply.github.com> Date: Mon, 28 Oct 2024 12:15:35 -0400 Subject: [PATCH 06/38] WIDGET::getState() should be const --- lib/widget/button.cpp | 2 +- lib/widget/button.h | 2 +- lib/widget/form.cpp | 2 +- lib/widget/form.h | 2 +- lib/widget/widgbase.h | 2 +- lib/widget/widget.cpp | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/widget/button.cpp b/lib/widget/button.cpp index ecf5fc6bc44..e1bbe66f394 100644 --- a/lib/widget/button.cpp +++ b/lib/widget/button.cpp @@ -58,7 +58,7 @@ W_BUTTON::W_BUTTON() , FontID(font_regular) {} -unsigned W_BUTTON::getState() +unsigned W_BUTTON::getState() const { return state & (WBUT_DISABLE | WBUT_LOCK | WBUT_CLICKLOCK | WBUT_FLASH | WBUT_DOWN | WBUT_HIGHLIGHT); } diff --git a/lib/widget/button.h b/lib/widget/button.h index 2628ea11657..7640e219c59 100644 --- a/lib/widget/button.h +++ b/lib/widget/button.h @@ -61,7 +61,7 @@ class W_BUTTON : public WIDGET void display(int xOffset, int yOffset) override; void displayRecursive(WidgetGraphicsContext const &context) override; // for handling progress border overlay - unsigned getState() override; + unsigned getState() const override; void setState(unsigned state) override; void setFlash(bool enable) override; WzString getString() const override; diff --git a/lib/widget/form.cpp b/lib/widget/form.cpp index b2546dddeaa..6072332d2f0 100644 --- a/lib/widget/form.cpp +++ b/lib/widget/form.cpp @@ -73,7 +73,7 @@ W_CLICKFORM::W_CLICKFORM() , AudioCallback(WidgGetAudioCallback()) {} -unsigned W_CLICKFORM::getState() +unsigned W_CLICKFORM::getState() const { return state & (WBUT_DISABLE | WBUT_LOCK | WBUT_CLICKLOCK | WBUT_FLASH | WBUT_DOWN | WBUT_HIGHLIGHT); } diff --git a/lib/widget/form.h b/lib/widget/form.h index 8ba1dae2202..9c4e27b7faa 100644 --- a/lib/widget/form.h +++ b/lib/widget/form.h @@ -109,7 +109,7 @@ class W_CLICKFORM : public W_FORM return &(help.value()); } - unsigned getState() override; + unsigned getState() const override; void setState(unsigned state) override; void setFlash(bool enable) override; void setTip(std::string string) override; diff --git a/lib/widget/widgbase.h b/lib/widget/widgbase.h index 8d2e300cb63..67ecb8d40a5 100644 --- a/lib/widget/widgbase.h +++ b/lib/widget/widgbase.h @@ -234,7 +234,7 @@ class WIDGET: public std::enable_shared_from_this virtual void mouseDragged(WIDGET_KEY, W_CONTEXT *start, W_CONTEXT *current) {} public: - virtual unsigned getState(); + virtual unsigned getState() const; virtual void setState(unsigned state); virtual void setFlash(bool enable); virtual WzString getString() const; diff --git a/lib/widget/widget.cpp b/lib/widget/widget.cpp index e7d822788bd..3d6a7e5a02a 100644 --- a/lib/widget/widget.cpp +++ b/lib/widget/widget.cpp @@ -1024,7 +1024,7 @@ UDWORD widgGetButtonKey_DEPRECATED(const std::shared_ptr &psScreen) return lastReleasedKey_DEPRECATED; } -unsigned WIDGET::getState() +unsigned WIDGET::getState() const { ASSERT(false, "Can't get widget type %u's state.", type); return 0; From 0c7d8bdad498555628ac0ba3cc1c3aa5538645a0 Mon Sep 17 00:00:00 2001 From: past-due <30942300+past-due@users.noreply.github.com> Date: Mon, 28 Oct 2024 12:45:40 -0400 Subject: [PATCH 07/38] Add in-game options button visibility configuration Default available options are:"On", "Opacity: 50%", and "Off" (hides the button entirely) --- src/configuration.cpp | 2 ++ src/frontend.cpp | 52 ++++++++++++++++++++++++++++++++++++++++++ src/frontend.h | 2 ++ src/hci.cpp | 53 ++++++++++++++++++++++++++++++++++++------- src/warzoneconfig.cpp | 20 ++++++++++++++-- src/warzoneconfig.h | 4 +++- 6 files changed, 122 insertions(+), 11 deletions(-) diff --git a/src/configuration.cpp b/src/configuration.cpp index 8b0d1176eab..82576ebfc61 100644 --- a/src/configuration.cpp +++ b/src/configuration.cpp @@ -387,6 +387,7 @@ bool loadConfig() setShakeStatus(iniGetBool("shake", false).value()); war_setGroupsMenuEnabled(iniGetBool("groupmenu", true).value()); setGroupButtonEnabled(war_getGroupsMenuEnabled()); + war_setOptionsButtonVisibility(iniGetInteger("optionsButtonVisibility", war_getOptionsButtonVisibility()).value()); setCameraAccel(iniGetBool("cameraAccel", true).value()); setDrawShadows(iniGetBool("shadows", true).value()); war_setSoundEnabled(iniGetBool("sound", true).value()); @@ -687,6 +688,7 @@ bool saveConfig() iniSetBool("cameraAccel", getCameraAccel()); // camera acceleration iniSetInteger("shake", (int)getShakeStatus()); // screenshake iniSetInteger("groupmenu", (int)war_getGroupsMenuEnabled()); // groups menu + iniSetInteger("optionsButtonVisibility", (int)war_getOptionsButtonVisibility()); iniSetInteger("mouseflip", (int)(getInvertMouseStatus())); // flipmouse iniSetInteger("nomousewarp", (int)getMouseWarp()); // mouse warp iniSetInteger("coloredCursor", (int)war_GetColouredCursor()); diff --git a/src/frontend.cpp b/src/frontend.cpp index 99feb92db89..606dfb341fb 100644 --- a/src/frontend.cpp +++ b/src/frontend.cpp @@ -1062,6 +1062,53 @@ static std::shared_ptr makeShadowFilterSizeDropdown() return Margin(0, 10).wrap(dropdown); } +static std::shared_ptr makeOptionsButtonDropdown() +{ + std::vector> dropDownChoices = { + {WzString::fromUtf8(_("On")), 100}, + {WzString::fromUtf8(_("Opacity: 50%")), 50}, + {WzString::fromUtf8(_("Off")), 0} + }; + + // If current value (from config) is not one of the presets in dropDownChoices, add a "Custom" entry + size_t currentSettingIdx = 0; + uint8_t currValue = war_getOptionsButtonVisibility(); + auto it = std::find_if(dropDownChoices.begin(), dropDownChoices.end(), [currValue](const std::tuple& item) -> bool { + return std::get<1>(item) == currValue; + }); + if (it != dropDownChoices.end()) + { + currentSettingIdx = it - dropDownChoices.begin(); + } + else + { + dropDownChoices.push_back({WzString::fromUtf8(astringf("(Custom: %u)", currValue)), currValue}); + currentSettingIdx = dropDownChoices.size() - 1; + } + + auto dropdown = std::make_shared(); + dropdown->id = FRONTEND_INGAMEOPTIONS_BUTTON_DROPDOWN; + dropdown->setListHeight(FRONTEND_BUTHEIGHT * std::min(5, dropDownChoices.size())); + const auto paddingSize = 10; + + for (const auto& option : dropDownChoices) + { + auto item = makeTextButton(0, std::get<0>(option).toUtf8(), 0); + dropdown->addItem(Margin(0, paddingSize).wrap(item)); + } + + dropdown->setSelectedIndex(currentSettingIdx); + + dropdown->setCanChange([dropDownChoices](DropdownWidget &widget, size_t newIndex, std::shared_ptr newSelectedWidget) -> bool { + ASSERT_OR_RETURN(false, newIndex < dropDownChoices.size(), "Invalid index"); + auto newValue = std::get<1>(dropDownChoices.at(newIndex)); + war_setOptionsButtonVisibility(newValue); + return true; + }); + + return Margin(0, 10).wrap(dropdown); +} + // //////////////////////////////////////////////////////////////////////////// // Graphics Options void startGraphicsOptionsMenu() @@ -1163,6 +1210,11 @@ void startGraphicsOptionsMenu() grid->place({1, 1, false}, row, addMargin(makeTextButton(FRONTEND_GROUPS_R, graphicsOptionsGroupsMenuEnabled(), WBUT_SECONDARY))); row.start++; + // In-Game Options button + grid->place({0}, row, addMargin(makeTextButton(FRONTEND_INGAMEOPTIONS_BUTTON, _("Options Button"), WBUT_SECONDARY))); + grid->place({1, 1, false}, row, makeOptionsButtonDropdown()); + row.start++; + grid->setGeometry(0, 0, FRONTEND_BUTWIDTH, grid->idealHeight()); auto scrollableList = ScrollableListWidget::make(); diff --git a/src/frontend.h b/src/frontend.h index 18719feca5c..2a1e27562b4 100644 --- a/src/frontend.h +++ b/src/frontend.h @@ -310,6 +310,8 @@ enum FRONTEND_TERRAIN_SHADING_QUALITY_R, FRONTEND_GROUPS, FRONTEND_GROUPS_R, + FRONTEND_INGAMEOPTIONS_BUTTON, + FRONTEND_INGAMEOPTIONS_BUTTON_DROPDOWN, FRONTEND_AUDIO_AND_ZOOMOPTIONS = 23000, // Audio and Zoom Options Menu FRONTEND_3D_FX, // 3d sound volume diff --git a/src/hci.cpp b/src/hci.cpp index 490ebf68765..bb4f0aeed91 100644 --- a/src/hci.cpp +++ b/src/hci.cpp @@ -1,7 +1,7 @@ /* This file is part of Warzone 2100. Copyright (C) 1999-2004 Eidos Interactive - Copyright (C) 2005-2020 Warzone 2100 Project + Copyright (C) 2005-2024 Warzone 2100 Project Warzone 2100 is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -85,6 +85,7 @@ #include "screens/chatscreen.h" #include "screens/guidescreen.h" #include "hci/quickchat.h" +#include "warzoneconfig.h" // Empty edit window static bool secondaryWindowUp = false; @@ -2159,6 +2160,10 @@ class W_INGAMEOPTIONS_BUTTON : public W_BUTTON void display(int xOffset, int yOffset) override; std::string getTip() override; + +private: + uint8_t currentAlphaValue() const; + bool isHighlighted() const; }; std::shared_ptr W_INGAMEOPTIONS_BUTTON::make() @@ -2175,32 +2180,50 @@ void W_INGAMEOPTIONS_BUTTON::initialize() setGeometry(0, 0, RET_BUTWIDTH, RET_BUTHEIGHT); } +uint8_t W_INGAMEOPTIONS_BUTTON::currentAlphaValue() const +{ + uint32_t alphaPercentage = war_getOptionsButtonVisibility(); + + if (isHighlighted()) + { + alphaPercentage = 100; + } + + return static_cast((alphaPercentage * 255) / 100); +} + +bool W_INGAMEOPTIONS_BUTTON::isHighlighted() const +{ + return ((getState() & WBUT_HIGHLIGHT) != 0) || InGameOpUp; +} + void W_INGAMEOPTIONS_BUTTON::display(int xOffset, int yOffset) { const int x0 = xOffset + x(); const int y0 = yOffset + y(); bool butDisabled = getState() & WBUT_DISABLE; + uint8_t alphaValue = currentAlphaValue(); + if (butDisabled) { - iV_DrawImage2("image_reticule_grey.png", x0, y0, width(), height()); + iV_DrawImageTint(IntImages, IMAGE_RETICULE_GREY, x0, y0, pal_RGBA(255,255,255,alphaValue), Vector2f{width(), height()}); return; } bool Down = getState() & (WBUT_DOWN | WBUT_CLICKLOCK); if (Down) { - iV_DrawImage2("image_ingameoptions_down.png", x0, y0, width(), height()); + iV_DrawImageTint(IntImages, IMAGE_INGAMEOPTIONS_DOWN, x0, y0, pal_RGBA(255,255,255,alphaValue), Vector2f{width(), height()}); } else { - iV_DrawImage2("image_ingameoptions_up.png", x0, y0, width(), height()); + iV_DrawImageTint(IntImages, IMAGE_INGAMEOPTIONS_UP, x0, y0, pal_RGBA(255,255,255,alphaValue), Vector2f{width(), height()}); } - bool highlighted = ((getState() & WBUT_HIGHLIGHT) != 0) || InGameOpUp; - if (highlighted) + if (isHighlighted()) { - iV_DrawImage2("image_reticule_hilight.png", x0, y0, width(), height()); + iV_DrawImageTint(IntImages, IMAGE_RETICULE_HILIGHT, x0, y0, pal_RGBA(255,255,255,alphaValue), Vector2f{width(), height()}); } } @@ -2218,10 +2241,19 @@ std::string W_INGAMEOPTIONS_BUTTON::getTip() bool intAddInGameOptionsButton() { + bool hiddenOptionsButton = war_getOptionsButtonVisibility() == 0; + auto psExistingBut = widgGetFromID(psWScreen, IDRET_OPTIONS); if (psExistingBut != nullptr) { - psExistingBut->show(); + if (!hiddenOptionsButton) + { + psExistingBut->show(); + } + else + { + psExistingBut->hide(); + } return false; } @@ -2246,6 +2278,11 @@ bool intAddInGameOptionsButton() kf_addInGameOptions(); }); }); + + if (hiddenOptionsButton) + { + button->hide(); + } } return true; diff --git a/src/warzoneconfig.cpp b/src/warzoneconfig.cpp index de95984cae8..b2f4b3fe64a 100644 --- a/src/warzoneconfig.cpp +++ b/src/warzoneconfig.cpp @@ -1,7 +1,7 @@ /* This file is part of Warzone 2100. Copyright (C) 1999-2004 Eidos Interactive - Copyright (C) 2005-2020 Warzone 2100 Project + Copyright (C) 2005-2024 Warzone 2100 Project Warzone 2100 is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -97,8 +97,9 @@ struct WARZONE_GLOBALS uint32_t shadowFilterSize = 5; uint32_t shadowMapResolution = 0; // this defaults to 0, which causes the gfx backend to figure out a recommended default based on the system properties bool pointLightLighting = false; - // groups UI + // UI config bool groupsMenuEnabled = true; + uint8_t optionsButtonVisibility = 100; // run-time only settings (not persisted to config!) bool allowVulkanImplicitLayers = false; @@ -698,6 +699,21 @@ void war_runtimeOnlySetAllowVulkanImplicitLayers(bool allowed) // not persisted warGlobs.allowVulkanImplicitLayers = allowed; } +uint8_t war_getOptionsButtonVisibility() +{ + return warGlobs.optionsButtonVisibility; +} + +void war_setOptionsButtonVisibility(uint8_t val) +{ + val = std::min(val, 100); + if (val > 0) + { + val = std::max(val, 50); + } + warGlobs.optionsButtonVisibility = val; +} + bool war_getAllowVulkanImplicitLayers() { return warGlobs.allowVulkanImplicitLayers; diff --git a/src/warzoneconfig.h b/src/warzoneconfig.h index 6ebb79189c7..e302439d538 100644 --- a/src/warzoneconfig.h +++ b/src/warzoneconfig.h @@ -1,7 +1,7 @@ /* This file is part of Warzone 2100. Copyright (C) 1999-2004 Eidos Interactive - Copyright (C) 2005-2020 Warzone 2100 Project + Copyright (C) 2005-2024 Warzone 2100 Project Warzone 2100 is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -169,6 +169,8 @@ void war_setPointLightPerPixelLighting(bool perPixelEnabled); bool war_getGroupsMenuEnabled(); void war_setGroupsMenuEnabled(bool enabled); +uint8_t war_getOptionsButtonVisibility(); +void war_setOptionsButtonVisibility(uint8_t val); void war_runtimeOnlySetAllowVulkanImplicitLayers(bool allowed); // not persisted to config bool war_getAllowVulkanImplicitLayers(); From 98f1a4801b60388685c8bd610b9b33048c0eb6e4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 7 Oct 2024 02:29:49 +0000 Subject: [PATCH 08/38] New Crowdin translations --- po/guide/hu.po | 18 +- po/guide/pt_BR.po | 420 +++++++++++++++++++++++----------------------- po/guide/zh_CN.po | 8 +- po/hu.po | 32 ++-- po/pt.po | 82 ++++----- po/pt_BR.po | 340 ++++++++++++++++++------------------- po/ru.po | 8 +- po/sk.po | 98 +++++------ po/zh_CN.po | 56 +++---- 9 files changed, 533 insertions(+), 529 deletions(-) diff --git a/po/guide/hu.po b/po/guide/hu.po index 69c01de50ff..0391ea921a1 100644 --- a/po/guide/hu.po +++ b/po/guide/hu.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" "POT-Creation-Date: 2024-06-12 03:55+0000\n" -"PO-Revision-Date: 2024-06-12 05:00\n" +"PO-Revision-Date: 2024-09-13 02:24\n" "Last-Translator: \n" "Language-Team: Hungarian\n" "Language: hu_HU\n" @@ -66,7 +66,7 @@ msgid "The Project dispatches three teams with the objective of reclaiming artif msgstr "" msgid "- Team Alpha is sent to an Arizona desert location southeast of Project HQ" -msgstr "" +msgstr "- Az Alfa csapat egy arizonai sivatagi helyszínre lett küldve, a Terv főhadiszállásától délkeletre" msgid "- Beta team is sent to the remains of Chicago" msgstr "" @@ -219,19 +219,19 @@ msgid "Note: The base Factory is only able to produce units with Light bodies. F msgstr "" msgid "Command Center" -msgstr "" +msgstr "Parancsnoki központ" msgid "The Command Center is the headquarters of your base." -msgstr "A Parancsnokság a bázis főhadiszállása." +msgstr "A Parancsnoki központ a bázis főhadiszállása." msgid "It provides access to the mini-map / radar, and the ability to design units." -msgstr "" +msgstr "Hozzáférést biztosít a kistérképhez/radarhoz, és lehetővé teszi az egységek tervezését." msgid "To build a Command Center, click the \"Build\" button on the command panel and select the Command Center structure." -msgstr "" +msgstr "Parancsnoki központ építéséhez kattintson az „Építés” gombra a parancsnoki panelen, és válassza a Parancsnoki központ épületet." msgid "Then, click where you want your builders to construct it." -msgstr "" +msgstr "Ezután kattintson oda, ahová az építői megépítsék." msgid "Structure Modules" msgstr "" @@ -417,7 +417,7 @@ msgid "- Retreat at Heavy Damage: Your unit will retreat at heavy (red) damage" msgstr "" msgid "Retreating units will return to the nearest repair facility, repair unit, HQ, or LZ." -msgstr "" +msgstr "A visszavonuló egységek visszatérnek a legközelebbi javítóműhelybe, javítóegységhez, főhadiszálláshoz vagy LZ-hez." msgid "Return To" msgstr "" @@ -429,7 +429,7 @@ msgid "- Return for Repair: Unit will return to a Repair Facility" msgstr "" msgid "- Return to HQ: Unit will return to Command Center or LZ (campaign)" -msgstr "" +msgstr "- Visszatérés a főhadiszállásra: az egység visszatér a parancsnoki központhoz vagy LZ-hez (hadjárat)" msgid "- Go To Transport: Unit will go to and board transport" msgstr "" diff --git a/po/guide/pt_BR.po b/po/guide/pt_BR.po index 93555484730..155195369aa 100644 --- a/po/guide/pt_BR.po +++ b/po/guide/pt_BR.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" "POT-Creation-Date: 2024-06-12 03:55+0000\n" -"PO-Revision-Date: 2024-08-30 02:22\n" +"PO-Revision-Date: 2024-10-07 02:29\n" "Last-Translator: \n" "Language-Team: Portuguese, Brazilian\n" "Language: pt_BR\n" @@ -69,655 +69,655 @@ msgid "- Team Alpha is sent to an Arizona desert location southeast of Project H msgstr "— Time Alpha é enviado para um deserto no Arizona ao sudoeste do QG do Projeto" msgid "- Beta team is sent to the remains of Chicago" -msgstr "" +msgstr "— Equipe Beta é enviada para os restos de Chicago" msgid "- Gamma team is sent into the northern Rockies in Colorado" -msgstr "" +msgstr "— A equipe Gama é enviada para as montanhas do norte do Colorado" msgid "Command Panel" -msgstr "" +msgstr "Painel de Controle" msgid "There are six different command panel interfaces, plus a central button. You open up a command interface by pressing the appropriate button." -msgstr "" +msgstr "Existem seis diferentes ‘interfaces’ de painel de comando, além de um botão central. Você abre uma ‘interface’ de comando pressionando o botão apropriado." msgid "The middle / central button closes any open command interface." -msgstr "" +msgstr "O botão do meio/ central fecha qualquer ‘interface’ de comando aberto." msgid "Intelligence Display" -msgstr "" +msgstr "Exibição de Inteligência" msgid "The Intelligence Display is where you can find your current mission objectives, replay your current mission briefing, and read more about completed research projects." msgstr "A Exibição de Inteligência é onde você pode encontrar seus objetivos atuais da missão, reproduzir o briefing da missão atual e ler mais sobre os projetos de pesquisa concluídos." msgid "When you open the Intelligence Display, two rows of icons appear on the bottom of the screen." -msgstr "" +msgstr "Quando você abre a Tela de Inteligência, duas linhas de ícones aparecem na parte inferior da tela." msgid "Selecting an icon will display information about that research or mission objective in the middle of the screen." -msgstr "" +msgstr "Selecionando um ícone mostrará informações sobre esse objetivo de pesquisa ou missão no meio da tela." msgid "Using the Mission Timer" -msgstr "" +msgstr "Usando o Temporizador da Missão" msgid "Much of the time, you'll be on the clock. Sometimes, you'll find yourself wishing you had more time. Other times you might think you have too much." -msgstr "" +msgstr "Muito do tempo, você estará no horário. Às vezes, você se encontrará desejando ter mais tempo. Outras vezes você pode pensar que tem tempo demais." msgid "There are always smart ways to make use of extra time to prepare for battles ahead." -msgstr "" +msgstr "Há sempre maneiras inteligentes de se usar o tempo extra para se preparar para batalhas à frente." msgid "Whether it's completing new research, building defenses, or recycling & replacing units with new weapons and technologies... don't let good time go to waste." -msgstr "" +msgstr "Seja completando novas pesquisas, construindo defesas ou reciclando e substituindo unidades com novas armas e tecnologias... não deixe que o tempo bom seja desperdiçado." msgid "(If you have the Timer Power Bonus tweak enabled - which is the default - you don't need to wait out the timer to grant power. You'll automatically be granted the power you would have gained if you'd let the timer run. But the rest of the uses still apply!)" -msgstr "" +msgstr "(Se você tiver o ajuste de bônus de poder do temporizador ativado — que é padrão — você não precisa esperar o temporizador para conseguir poder. Automaticamente será concedido poder que você teria ganhado se esperasse o temporizador terminar. Mas o restante dos usos ainda de aplicam!)" msgid "Power" -msgstr "" +msgstr "Energia" msgid "In Warzone 2100, power is your key resource." -msgstr "" +msgstr "No Warzone 2100, a energia é seu principal recurso." msgid "You spend power to build structures, manufacture units, and research upgrades / new technology." -msgstr "" +msgstr "Você gasta energia para construir estruturas, fabricar unidades e pesquisar melhorias / novas tecnologias." msgid "Power is generated by Power Generators that are fed by Oil Derricks." -msgstr "" +msgstr "Energia é gerada por Geradores de Energia que são alimentados por Torres de Perfuração de Petróleo." msgid "Researching Technology" -msgstr "" +msgstr "Pesquisando tecnologia" msgid "Researching technologies is accomplished using Research Facilities." msgstr "A pesquisa de tecnologias é realizada utilizando Instalações de Pesquisa." msgid "When a Research Facility is selected, all available options are displayed on the left side of the screen." -msgstr "" +msgstr "Quando um Centro de Pesquisas é selecionado, todas as opções disponíveis são exibidas no lado esquerdo da tela." msgid "Each research project requires a certain amount of power and time to complete. The power investment is non-refundable." -msgstr "" +msgstr "Cada projeto de pesquisa requer um certo poder e tempo para completar. O investimento de energia não é reembolsável." msgid "But research progress is never lost, even if the Research Facility is destroyed - the project only needs to be re-assigned to another facility." -msgstr "" +msgstr "Mas o progresso da pesquisa nunca se perde, mesmo que o Mecanismo de Investigação seja destruído - o projeto só precisa de ser atribuido a outra instalação." msgid "Completing research of a new technology may:" -msgstr "" +msgstr "Completando a pesquisa de uma nova tecnologia pode:" msgid "- Make available new weapons, structures, unit bodies, propulsion, etc" -msgstr "" +msgstr "- Disponibilizar novas armas, estruturas, quantia de unidades, propulsão, etc" msgid "- Upgrade the effectiveness of existing weapons, structures, unit bodies, etc" -msgstr "" +msgstr "- Aprimorar a eficiência das armas existentes, estruturas, unidades, etc" msgid "- Enable the research of additional technologies" -msgstr "" +msgstr "- Habilita a pesquisa de tecnologias adicionais" msgid "General" -msgstr "" +msgstr "Geral" msgid "In Warzone 2100, you command the forces of \"The Project\" in a battle to rebuild the world, after mankind has been nearly destroyed by nuclear missiles." -msgstr "" +msgstr "No Warzone 2100, você comanda as forças do \"Projeto\" em uma batalha para reconstruir o mundo, depois de a humanidade ter sido quase destruída por mísseis nucleares." msgid "This guide will help walk you through key facets of the game." -msgstr "" +msgstr "Este guia ajudará a guiá-lo através das principais aspectos do jogo." msgid "(If you are playing the campaign, new guide topics may be unlocked as you progress through the game.)" -msgstr "" +msgstr "(Se você está jogando a campanha, novos tópicos de orientação podem ser desbloqueados ao progredir no jogo.)" msgid "Building Structures" -msgstr "" +msgstr "Construindo estruturas" msgid "Click the \"Build\" button on the Command Panel." -msgstr "" +msgstr "Clique no botão \"Construir\" no painel de comando." msgid "This will open the Structures menu on the left side of screen, with a button for each structure you can build." -msgstr "" +msgstr "Isto abrirá o menu Estruturas no lado esquerdo da tela, com um botão para cada estrutura que você pode construir." msgid "Select the desired structure button. A silhouette will appear in the game world - this is where your structure will be placed once you confirm." -msgstr "" +msgstr "Selecione o botão de estrutura desejado. Uma silhueta aparecerá no mundo - é aqui que sua estrutura será colocada depois de confirmar." msgid "Move the silhouette by moving the input device." -msgstr "" +msgstr "Mova a silhueta movendo o dispositivo de entrada." msgid "- If a structure is buildable in a location, the silhouette will be colored green when you hover over a location." -msgstr "" +msgstr "- Se uma estrutura for construível em um local, a silhueta será colorida verde quando você passar o mouse sobre uma localização." msgid "- If a structure is not buildable in a location, the silhouette will be colored red." -msgstr "" +msgstr "- Se uma estrutura não for construível em um local, a silhueta será vermelha." msgid "Once you've chosen a viable location, select to confirm the placement of the build site. A truck will move to the location and begin construction." -msgstr "" +msgstr "Uma vez escolhido um local viável, selecione confirmar a colocação no local de construção. Um caminhão se moverá para o local e começará a construção." msgid "You can order additional trucks to help out (and build the structure faster) by selecting them and ordering them to target the structure under construction." -msgstr "" +msgstr "Você pode pedir caminhões adicionais para ajudar (e construir a estrutura mais rápido), selecionando-os e ordenando-os para direcionar a estrutura em construção." msgid "Tip: To build \"walls\" (once they are available), you can click and drag to draw a wall in a line." -msgstr "" +msgstr "Dica: Para construir \"paredes\" (assim que estiverem disponíveis), clique e arraste para desenhar uma parede em uma linha." msgid "Demolishing Structures" -msgstr "" +msgstr "Demolindo estruturas" msgid "Demolishing a building is almost as simple as building one." -msgstr "" +msgstr "Demolir um edifício é quase tão simples quanto construir um." msgid "Select \"Demolish Structure\" in the Structures menu and click a building to demolish." -msgstr "" +msgstr "Selecione \"Demolir Estrutura\" no menu Estruturas e clique em um edifício para demolir." msgid "A unit will move to the building and destroy it." -msgstr "" +msgstr "Uma unidade se moverá para o prédio e o destruirá." msgid "Demolished structures return half the power used to build the structure." -msgstr "" +msgstr "Estruturas demolidas retornam metade do poder usado para construir a estrutura." msgid "Factory" -msgstr "" +msgstr "Fábrica" msgid "A Factory is used to build units. Each Factory can build one unit at a time, but you can queue multiple units for production." -msgstr "" +msgstr "Uma Fábrica é usada para construir unidades. Cada Fábrica pode construir uma unidade de cada vez, mas você pode colocar várias unidades em fila para produção." msgid "When a unit is produced, it receives the Factory’s Unit Orders and proceeds to the Factory's Rally Point." -msgstr "" +msgstr "Quando uma unidade é produzida, ela recebe as Ordens das Unidades da Fábrica e segue para o Ponto de Mobilização da Fábrica." msgid "Note: The base Factory is only able to produce units with Light bodies. Factory modules must be discovered and built to upgrade Factory production capabilities." -msgstr "" +msgstr "Nota: A Fábrica Base só pode produzir unidades com corpos leves. Os módulos de fábrica devem ser descobertos e construídos para atualizar as capacidades de produção da Fábrica." msgid "Command Center" -msgstr "" +msgstr "Centro de Comando" msgid "The Command Center is the headquarters of your base." msgstr "O Centro de Comando é a sede de sua base." msgid "It provides access to the mini-map / radar, and the ability to design units." -msgstr "" +msgstr "Fornece acesso ao mini-mapa / radar, e a habilidade de projetar unidades." msgid "To build a Command Center, click the \"Build\" button on the command panel and select the Command Center structure." -msgstr "" +msgstr "Para construir um Centro de Comando, clique no botão \"Construir\" no painel de comando e selecione a estrutura do Centro de Comando." msgid "Then, click where you want your builders to construct it." -msgstr "" +msgstr "Então, clique onde deseja que seus construtores o construam." msgid "Structure Modules" -msgstr "" +msgstr "Módulos de Estrutura" msgid "Power Generators, Factories, and Research Facilities can be upgraded with their respective structure modules." -msgstr "" +msgstr "Geradores de Energia, Fábricas, e Instalações de Pesquisa podem ser melhoradas com seus respectivos módulos de estrutura." msgid "Once researched, you can access these modules from the Build menu to apply them to the structures in question." -msgstr "" +msgstr "Uma vez pesquisado, você pode acessar esses módulos a partir do menu Construir para aplicá-las as estruturas em questão." msgid "Alternatively, you can select a Truck or a Combat Engineer and click on the structure in order to begin its construction." -msgstr "" +msgstr "Alternativamente, você pode selecionar um Caminhão ou um Engenheiro de Combate e clicar na estrutura de modo a iniciar sua construção." msgid "Note: While one of these structures is being upgraded, it will temporarily be unavailable until the upgrade is complete." -msgstr "" +msgstr "Nota: Enquanto uma dessas estruturas está sendo melhorada, ela estará temporariamente indisponível até que essa melhora seja completa." msgid "Upgrade Effects:" -msgstr "" +msgstr "Atualizar Efeitos:" msgid "- Power Generator modules increase the rate of power generation" -msgstr "" +msgstr "- Módulos de Gerador de Energia aumentam a taxa de geração de energia" msgid "- Factory modules allow the production of Medium and Heavy units, as well as decreasing the time it takes to produce units" -msgstr "" +msgstr "- Módulos de Fábrica permitem a produção de unidades Médias e Pesadas, assim como diminuem o tempo necessário para produzir unidades" msgid "- Research Facility modules decrease the time needed to complete assigned research projects" -msgstr "" +msgstr "- Módulos de Instalação de Pesquisa diminuem o tempo necessário para completar projetos de pesquisa atribuídos" msgid "Oil Derrick" -msgstr "" +msgstr "Torre de Perfuração de Petróleo" msgid "An Oil Derrick can be built by selecting a Truck and targeting an available Oil Resource." -msgstr "" +msgstr "Uma Torre de Perfuração de Petróleo pode ser construída selecionando um Caminhão e marcando uma fonte de Petróleo disponível." msgid "The destruction of an Oil Derrick will temporarily prevent the construction of another at the same spot until the fire subsides." -msgstr "" +msgstr "A destruição de uma Torre de Perfuração de Petróleo irá impedir temporariamente a construção de outra no mesmo lugar até que o fogo diminua." msgid "To utilize an Oil Derrick and generate power requires a Power Generator." -msgstr "" +msgstr "Para utilizar uma Torre de Perfuração de Petróleo e gerar energia requer um Gerador de Energia." msgid "Power Generator" -msgstr "" +msgstr "Gerador de Energia" msgid "Each Power Generator uses up to 4 Oil Derricks. So, for example, if you have 10 Oil Derricks you would need 3 Power Generators to utilize all of the oil derricks and generate maximum Power." -msgstr "" +msgstr "Cada Gerador de Energia usa até 4 Torres de Perfuração de Petróleo. Então, por exemplo, se você tiver 10 Torres de Perfuração de Petróleo, precisaria 3 Geradores de Energia para utilizar a energia máxima gerada pelas torres de perfuração." msgid "While oil derricks must be built on oil resources, Power Generators can be built anywhere on the map. But keep in mind: additional generators beyond one for every 4 derricks will provide no benefit." -msgstr "" +msgstr "Enquanto torres de perfuração devem ser construídas em fontes de petróleo, Geradores de Energia podem ser construídos em qualquer lugar do mapa. Mas tenha em mente: geradores adicionais além de um cada 4 torres de perfuração não providenciará nenhum benefício." msgid "Rally Point" -msgstr "" +msgstr "Ponto de Encontro" msgid "When a Factory has finished building a unit, the unit will spawn next to the Factory, and then proceed to the Factory's designated Rally Point." -msgstr "" +msgstr "Quando uma Fábrica terminou de construir uma unidade, ela surgirá próxima à Fábrica, e então proceder para o Ponto de encontro designado da Fábrica." msgid "By default, the Rally Point is placed next to the Factory. Clicking a Rally Point will allow you to move it." -msgstr "" +msgstr "Por Padrão, o Ponto de Encontro é localizado próximo à Fábrica. Clicando num Ponto de Encontro permitirá movimentá-lo." msgid "Note: Moving a Rally Point while a unit is moving to it will not affect the unit's path." -msgstr "" +msgstr "Nota: Mover um Ponto de Encontro enquanto uma unidade está se movendo para ela não afetará seu caminho." msgid "Repair Facility" -msgstr "" +msgstr "Instalação de Reparo" msgid "Building a Repair Facility creates a fixed structure to which units can retreat to be repaired." -msgstr "" +msgstr "Construir uma Instalação de Reparo cria uma estrutura fixa para qual as unidades podem recuar para serem reparadas." msgid "Repair Facilities can repair units faster than mobile units with repair turrets." -msgstr "" +msgstr "Instalações de Reparo podem reparar unidades mais rápido que unidades móveis com torres de reparo." msgid "Research Facility" msgstr "Centro de Pesquisas" msgid "Research Facilities are required in order to research new technologies." -msgstr "" +msgstr "Instalações de Pesquisa são necessárias a fim de pesquisar novas tecnologias." msgid "Each Research Facility can research one technology at a time." msgstr "Cada Centro de Pesquisas pode pesquisar uma tecnologia por vez." msgid "VTOL Factory" -msgstr "" +msgstr "Fábrica de VTOL" msgid "A VTOL Factory is used to build units with VTOL propulsion (i.e. flying units)." -msgstr "" +msgstr "Uma Fábrica de VTOL é utilizada para construir unidades com propulsão VTOL (ou seja, unidades voadoras)." msgid "Each VTOL Factory can build one unit at a time, but you can queue multiple units for production." -msgstr "" +msgstr "Cada Fábrica de VTOL pode construir uma unidade por vez, mas você pode criar uma fila com várias unidades para produção." msgid "When a VTOL Factory is done building a unit, it will order it to fly and land near the factory's Rally Point." -msgstr "" +msgstr "Quando uma Fábrica de VTOL termina de construir uma unidade, ela ordenará que a unidade voe e pouse próximo ao Ponto de Encontro da Fábrica." msgid "Structures" -msgstr "" +msgstr "Estruturas" msgid "Building structures is absolutely vital in Warzone 2100 - from Factories which build units, to Research Facilities that research new technologies." msgstr "As estruturas de construção são absolutamente vitais em Warzone 2100 — desde as fábricas que constroem unidades, até os centros de pesquisa que pesquisam novas tecnologias." msgid "Building can be done with units with Trucks as turrets and/or Combat Engineers." -msgstr "" +msgstr "Construção pode ser feita com unidades com caminhões como torres e/ou engenheiros de combate." msgid "Attack Range" -msgstr "" +msgstr "Alcance de ataque" msgid "You can use the Unit Orders menu to configure unit \"Attack Range\"." -msgstr "" +msgstr "Você pode usar o menu de Pedidos de Unidades para configurar o \"Alcance de ataque\" da unidade." msgid "- Optimum Range: Fires at the most accurate range" -msgstr "" +msgstr "- Alcance Perfeito: Dispara ao alcance mais preciso" msgid "- Short Range: Moves to short range and attacks" -msgstr "" +msgstr "- Curto alcance: Se move para o curto alcance e ataca" msgid "- Long Range: Attacks at long range (default)" -msgstr "" +msgstr "- Longo Alcance: Ataques a longo alcance (padrão)" msgid "Firing Mode" -msgstr "" +msgstr "Modos de Disparo" msgid "You can use the Unit Orders menu to configure unit \"Firing Mode\"." -msgstr "" +msgstr "Você pode usar o menu de Pedidos de Unidades para configurar o \"Modo de disparo\" da unidade." msgid "- Fire At Will: Fires at any enemy (default)" -msgstr "" +msgstr "- Dispara a vontatde: Dispara em qualquer inimigo (padrão)" msgid "- Return Fire: Only fire if fired at" -msgstr "" +msgstr "- Retornar Fogo: Somente Atira se dispararem na unidade" msgid "- Do Not Fire: Units will not fire" -msgstr "" +msgstr "- Não atirar: Unidades não irão disparar" msgid "Movement" -msgstr "" +msgstr "Movimento" msgid "You can use the Unit Orders menu to configure unit \"Movement\"." -msgstr "" +msgstr "Você pode usar o menu de Pedidos de Unidades para configurar o \"Movimento\" da unidade." msgid "- Patrol: Move between two points. Just click a point on the map after selecting it" -msgstr "" +msgstr "- Patrulha: Mova entre dois pontos. Basta clicar em um ponto no mapa depois de selecioná-lo" msgid "- Circle: (VTOLs only) Move in a circle over a position. Just click an area after selecting it" -msgstr "" +msgstr "- Círculo: (Somente VTOLs) Mova um círculo sobre uma posição. Basta clicar em uma área depois de selecioná-lo" msgid "- Pursue: Pursue enemy" -msgstr "" +msgstr "- Perseguição: Persiga o inimigo" msgid "- Guard: Stay near an area or structure. (default)" -msgstr "" +msgstr "- Guarda: Fique perto de uma área ou estrutura. (padrão)" msgid "- Hold Position: Do not move under any circumstances" -msgstr "" +msgstr "- Manter a posição: Não se mover em nenhuma circunstância" msgid "Recycling" -msgstr "" +msgstr "Reciclagem" msgid "Recycling a unit will send it to the nearest Factory or Repair Facility, and destroy it." -msgstr "" +msgstr "Reciclar uma unidade o enviará para a Fábrica ou Centro de Reparo mais próxima e o destruirá." msgid "Half the power used in making the unit will be refunded to you (although this will be reduced if the unit is damaged)." -msgstr "" +msgstr "Metade do poder usado na criação da unidade será reembolsado (embora isso seja reduzido se a unidade estiver danificada)." msgid "The unit’s experience level will be placed in the next unit that is manufactured." -msgstr "" +msgstr "O nível de experiência da unidade será colocado na próxima unidade que for fabricada." msgid "You can order the selected units to return for recycling via the Unit Orders menu or the \"Return for Recycling\" keybind." -msgstr "" +msgstr "Você pode ordenar as unidades selecionadas a retornar para reciclagem através do menu Ordens de Unidade ou pelo atalho de teclado \"Retornar para Reciclagem\"." msgid "Retreating" -msgstr "" +msgstr "Recuando" msgid "Losing units (especially units with experience levels) can be a real hit to a force's ability to successfully wage battle." -msgstr "" +msgstr "Perder unidades (especialmente unidades com níveis de experiência) pode ser um verdadeiro problema para a habilidade da força de travar batalha com sucesso." msgid "You can use the Unit Orders menu to choose a \"Retreat Threshold\", which will cause units to automatically retreat from the battle when they reach a specified damage level." -msgstr "" +msgstr "Você pode usar o menu de Pedidos de Unidades para escolher um \"Limite de Retirada\", que fará com que as unidades recuem automaticamente da batalha quando atingirem um nível de dano especificado." msgid "- Do or Die: Your unit will not retreat unless ordered to. (default)" -msgstr "" +msgstr "- Fazer ou morrer: Sua unidade não se recuará a menos que seja ordenada. (padrão)" msgid "- Retreat at Medium Damage: Your unit will retreat at medium (yellow) damage" -msgstr "" +msgstr "- Retira com Dano Médio: Sua unidade irá recuar ao dano médio (amarelo)" msgid "- Retreat at Heavy Damage: Your unit will retreat at heavy (red) damage" -msgstr "" +msgstr "- Retira com Danos Pesados: Sua unidade recuará com dano pesado (vermelho)" msgid "Retreating units will return to the nearest repair facility, repair unit, HQ, or LZ." -msgstr "" +msgstr "As unidades que se retirarem retornarão à unidade de reparo mais próxima, unidade de reparo, QG ou AP." msgid "Return To" -msgstr "" +msgstr "Retornar para" msgid "You can use the Unit Orders menu to quickly order units to return to a specific location." -msgstr "" +msgstr "Você pode usar o menu de Pedidos Unitários para ordenar rapidamente as unidades para retornarem a um local específico." msgid "- Return for Repair: Unit will return to a Repair Facility" -msgstr "" +msgstr "- Retornar para o Reparo: A unidade retornará a um Centro de Reparos" msgid "- Return to HQ: Unit will return to Command Center or LZ (campaign)" -msgstr "" +msgstr "- Retornar ao QG: Unidade retornará ao Centro de Comando ou LZ (campanha)" msgid "- Go To Transport: Unit will go to and board transport" -msgstr "" +msgstr "- Ir Para o Transporte: A unidade irá para e transporte a bordo" msgid "Unit Orders" -msgstr "" +msgstr "Pedido de Unidades" msgid "Right-click a unit or group of units to show their current Unit Orders." -msgstr "" +msgstr "Clique com o botão direito em uma unidade ou grupo de unidades para mostrar seus Pedidos de Unidade atuais." msgid "The Unit Orders panel allows you to customize the behavior of your units, from patrolling an area to retreating at low health." -msgstr "" +msgstr "O painel de Pedidos de Unidades permite que você personalize o comportamento de suas unidades, desde patrulhar uma área até recuar com pouca vida." msgid "Right-click a Factory to adjust the Unit Orders for all future units produced by the Factory." -msgstr "" +msgstr "Clique com o botão direito em uma Fábrica para ajustar Pedidos de Unidades para todas as futuras unidades produzidas pela Fábrica." msgid "Building Units" -msgstr "" +msgstr "Construir Unidades" msgid "To build units, either select a Factory, or select the \"Manufacturing\" button on the Command Panel - this will open the Manufacturing panel on the left side of the screen." -msgstr "" +msgstr "Para construir unidades, selecione uma Fábrica, ou selecione o botão \"Fabricar\" no Painel de Comando - isso abrirá o painel de Fabricação no lado esquerdo da tela." msgid "The Manufacturing panel will display the unit designs which are buildable by the currently-selected Factory. Factories may be limited to producing certain types of units (or may only be able to produce certain units if upgraded with modules)." -msgstr "" +msgstr "O painel de Manufatura mostrará os modelos de unidade que são construíveis pela Fábrica selecionada. Fábricas podem ser limitadas a produzir certos tipos de unidades (ou podem ser capazes de produzir somente certas unidades se melhoradas com módulos)." msgid "To select a different Factory, either click on the Factory in the game world, or click on the appropriate button in the Factories panel on the bottom-center of the screen." -msgstr "" +msgstr "Para selecionar uma Fábrica diferente, clique na Fábrica no mundo do jogo, ou clique no botão apropriado no painel de fábricas, no centro inferior da tela." msgid "To manufacture a unit in a Factory, click the desired unit design button in the Manufacturing panel. You can queue multiples of the same unit by repeatedly clicking the unit design button." -msgstr "" +msgstr "Para produzir uma unidade em uma Fábrica, clique no botão do modelo de unidade desejado no painel de Manufatura. Você pode enfileirar vários da mesma unidade clicando repetidamente no botão do modelo da unidade." msgid "While a unit is building, the unit will be shown in the Factories panel above the Factory that is building it. If the bar is green, the Factory is gathering power to build the unit. If the bar is yellow, the unit is being built." -msgstr "" +msgstr "Enquanto uma unidade está construindo, a unidade será mostrada no painel das Fábricas acima da Fábrica que a está construindo. Se a barra é verde, a Fábrica está reunindo poder para construir a unidade. Se a barra estiver amarelo, a unidade está sendo construída." msgid "When a Factory is done building a unit, it will order the unit to proceed to the Factory's Rally Point." -msgstr "" +msgstr "Quando uma Fábrica termina de construir uma unidade, ela ordenará a unidade a prosseguir para o Ponto de encontro da Fábrica." msgid "Attaching Units" msgstr "" msgid "To attach a unit to a Commander, select a unit, then left-click the Commander you want to attach the unit to. A symbol will appear next to the unit to signify it is attached." -msgstr "" +msgstr "Para anexar uma unidade a um Comandante, selecione uma unidade, então clique com o botão esquerdo no Comandante que você quer anexar a unidade. Um símbolo aparecerá próximo à unidade para mostrar que está anexado." msgid "## Limits:" -msgstr "" +msgstr "## Limites:" msgid "Commanders have a limit to the amount of direct-fire units (eg machine-guns) which is affected by their own experience level. Levels are earned by the Commander reaching 2 kills, 4, 8, 16, 32, 64 and so on." -msgstr "" +msgstr "Comandantes tem um limite para a quantidade de unidades de fogo direto (por exemplo, metralhadoras) que é afetado pelo seu nível de experiência. Níveis são conquistados pelo Comandante alcançando 2 mortes, 4, 8, 16, 32, 64 e assim por diante." msgid "Each experience level allows the Commander 2 more direct-fire units. However, a Commander can have as many indirect-fire units as it wants." -msgstr "" +msgstr "Cada nível de experiência permite o Comandante 2 unidades de fogo direto a mais. No entanto, um Comandante pode ter quantas unidades de fogo indireto que ele desejar." msgid "Detaching Units" -msgstr "" +msgstr "Desatribuir Unidades" msgid "To detach a unit from a Commander:" -msgstr "" +msgstr "Para desatrelar uma unidade de um Comandante:" msgid "1. Right-click the unit (or hold the \"Shift\" key while selecting the unit) to select only that unit (instead of the whole commander group)" -msgstr "" +msgstr "1. Clique com o botão direito na unidade (ou segure \"Shift\" enquanto seleciona a unidade) para selecionar somente aquela unidade (em vez do grupo inteiro do Comandante)" msgid "2. Give the unit a new order (eg. move)" -msgstr "" +msgstr "2. Dar uma ordem nova a unidade (por exemplo, mover)" msgid "Going for repairs, BRB" -msgstr "" +msgstr "Indo para reparos, já volto" msgid "A unit that retreats from the battle to go to a repair facility, will stay connected to its Commander group." -msgstr "" +msgstr "Uma unidade que recua da batalha para ir a instalação de reparo, ficará conectada ao seu grupo de comando." msgid "When it is done repairing, it will return to its Commander." -msgstr "" +msgstr "Quando o reparo é finalizado, ele retornará ao seu Comando." msgid "Targeting" -msgstr "" +msgstr "Direcionando" msgid "When you select a Commander and target an enemy unit, any attached units will move to fire on the targeted unit." -msgstr "" +msgstr "Quando você seleciona um Comandante e mira numa unidade inimiga, qualquer unidade anexada se move para atirar nela." msgid "The attached units will have greater accuracy when firing." -msgstr "" +msgstr "As unidades anexadas terão maior precisão quando atirarem." msgid "Commanders" -msgstr "" +msgstr "Comandantes" msgid "Command turrets are used much like sensors, except they can command any attacking unit, not just artillery." -msgstr "" +msgstr "Torres de Comando são usados como sensores, exceto que podem atacar qualquer unidade de ataque, não somente artilharia." msgid "Commanders provide an accuracy, armor, and movement speed bonus to all units assigned to them, which increases as the commander's rank increases." -msgstr "" +msgstr "Comandantes fornecem precisão, armadura, e bônus de velocidade de movimento para todas as unidades designadas a eles, o que aumenta à medida que a classificação do Comandante aumenta." msgid "They are limited to having 6 non-artillery attacking units assigned to them at first, but this limit rises by 2 each time the commander gains a rank, which can happen relatively quickly." -msgstr "" +msgstr "Eles estão limitados a ter inicialmente 6 unidades de ataque não-artilharia designadas a ele, mas esse limite aumenta em 2 cada vez que o comandante ganha uma classificação, que pode acontecer relativamente rápido." msgid "Designing Units" -msgstr "" +msgstr "Unidades de Projeto" msgid "You will need to design new units if you want to overpower your enemies and get that sweet taste of victory. This is a key aspect of Warzone 2100's gameplay." -msgstr "" +msgstr "Você precisará projetar novas unidades se quiser superar seus inimigos e conseguir o doce sabor da vitória. Esse é um aspecto chave na jogabilidade de Warzone 2100." msgid "To start designing a unit, select the Design button in the Command Panel. This will make two columns appear on the left of the screen." -msgstr "" +msgstr "Para começar a projetar uma unidade, selecione o botão Projetar no Painel de Comando. Isso fará 2 colunas aparecerem à esquerda da tela." msgid "To make a new design, select the \"blank\" green body in the top-left. To edit an existing unit design, just select it instead." -msgstr "" +msgstr "Para criar um novo projeto, selecione o corpo verde \"em branco\" na parte superior esquerda. Para editar um projeto de unidade existente, somente a selecione." msgid "Designing a new unit is a simple three-step procedure: selecting a body, a propulsion system, and a turret. Those three selections will result in a new unit." -msgstr "" +msgstr "Projetar uma nova unidade é um procedimento simples de três etapas: Selecione um chassi, um sistema de propulsão, e uma torre. Essas três seleções resultarão numa nova unidade." msgid "Once you have designed a unit, you will need a Factory to build it." -msgstr "" +msgstr "Depois que você projetou uma unidade, precisará de uma Fábrica para construí-lo." msgid "Experience & Ranks" -msgstr "" +msgstr "Experiência e Classificação" msgid "Units gain experience when they successfully dispatch enemies." msgstr "Unidades ganham experiência quando derrotam inimigos." msgid "A higher experience level means that a unit is more accurate, moves faster, and takes less damage." -msgstr "" +msgstr "Um nível de experiência mais alto significa que uma unidade é mais precisa, se move mais rápido e recebe menos dano." msgid "An icon displaying a unit’s rank is displayed next to the unit’s health bar." -msgstr "" +msgstr "Um ícone que mostra a classificação de um unidade é exibido próximo à barra de vida da unidade." msgid "Units with higher experience levels can make all the difference in battle!" msgstr "Unidades com níveis de experiência mais elevados podem fazer toda a diferença na batalha!" msgid "Repairing Units" -msgstr "" +msgstr "Unidades de Reparo" msgid "You can design a unit with a repair turret instead of a weapon, and it can be ordered to repair your other units." -msgstr "" +msgstr "Você pode projetar uma unidade com uma torre de reparo em vez de uma arma, e pode pedir para consertar suas outras unidades." msgid "You can also keep the repair units back from the battle, and use the Retreat Options to set your offensive units to retreat to them for repair at a certain damage level." -msgstr "" +msgstr "Você também pode manter as unidades de reparo de volta à batalha, e use as Opções de Retirada para definir suas unidades ofensivas para recuar para eles em um certo nível de dano." msgid "Retreating and repairing units is often far preferable to losing experienced units on the battlefield." -msgstr "" +msgstr "Reparar e reparar unidades é frequentemente preferível a perder unidades experientes no campo de batalha." msgid "CB Sensors" -msgstr "" +msgstr "Sensores CB" msgid "Counter-Battery (CB) Sensors dramatically alter the battlefield by allowing artillery units to directly target distant artillery platforms - provided they have the range." -msgstr "" +msgstr "Sensores Contra-Bateria (CB) alteram dramaticamente o campo de batalha permitindo unidades de artilharia mirar diretamente em plataformas de artilharia distantes - desde que tenham alcance." msgid "Identified structures or units will be colored red in the fog of war once a CB Sensor detects the launch of any enemy artillery." -msgstr "" +msgstr "Estruturas ou unidades identificadas serão coloridas de vermelho na neblina da guerra quando um sensor CB detectar o lançamento de qualquer artilharia inimiga." msgid "If active, artillery units prioritize CB Sensor targets over targets revealed by normal Sensors." -msgstr "" +msgstr "Se ativo, unidades de artilharia priorizam alvos de Sensores CB sobre alvos revelados por Sensores normais." msgid "Un-Assigning" -msgstr "" +msgstr "Desatribuir" msgid "To un-assign a unit from a sensor, the easiest way is to right-click the unit, and then tell it to move somewhere." -msgstr "" +msgstr "Para desatribuir uma unidade de um sensor, a maneira mais fácil é clicar com o botão direito na unidade, e então ordenar que se mova para outro lugar." msgid "Multiple units can be selected by holding CTRL while clicking." -msgstr "" +msgstr "Várias unidades podem ser selecionadas segurando CTRL enquanto clica." msgid "Using Sensors" -msgstr "" +msgstr "Usar sensores" msgid "Artillery structures are the easiest. Simply build a sensor tower, and if the sensor tower is targeting something within your artillery structures' weapon range, they will fire at it." -msgstr "" +msgstr "Estruturas de artilharia são as mais fáceis. Simplesmente construa uma torre de sensor e, se a torre de sensor estiver mirando algo no alcance de suas estruturas de artilharia, eles dispararão nele." msgid "An artillery tank, however, needs to be explicitly assigned to a sensor to function. Select the artillery tanks, then click on a sensor to assign the tanks to the sensor." -msgstr "" +msgstr "Um tanque de artilharia, no entanto, precisa ser explicitamente atribuído a um sensor para funcionar. Selecione os tanques de artilharia e, em seguida, clique em um sensor para atribuir os tanques ao sensor." msgid "Once the artillery is assigned, if it is assigned to a sensor tower, that tower will target enemies that come in range automatically." -msgstr "" +msgstr "Depois que a artilharia for atribuída, se ela for alocada a uma torre de sensor, aquela torre irá mirar nos inimigos que estão no alcance automaticamente." msgid "If it is assigned to a sensor tank, the sensor can be used to attack enemies by selecting the sensor and targeting an enemy. All artillery assigned to the sensor will attack its target." -msgstr "" +msgstr "Se for designado a um tanque de sensor, ele pode ser usado para atacar inimigos, selecionando o sensor e direcionando para um inimigo. Toda artilharia alocada ao sensor atacará seu alvo." msgid "Sensors" -msgstr "" +msgstr "Sensores" msgid "Sensors can be used for scouting and surveillance, but they also have a more important usage: to spot for artillery." -msgstr "" +msgstr "Os sensores podem ser usados para espionagem e vigilância, mas eles também têm um uso mais importante: identificar a artilharia." msgid "Artillery weapons, by themselves, cannot fire more than their own sensor range (8 tiles without upgrades)." -msgstr "" +msgstr "Armas de artilharia, por si só, não podem atirar mais do que seu próprio alcance de sensor (8 blocos sem upgrades)." msgid "However, even the most basic artillery weapon has an 18-tile weapon range. To use it, you will need to build and deploy sensors on the battlefield (either sensor towers or tanks with sensor turrets)." -msgstr "" +msgstr "No entanto, até a arma de artilharia mais básica tem um alcance de armas de 18 azuis. Para usá-lo, você precisará construir e implantar sensores no campo de batalha (torres de sensor ou tanques com torres de sensor)." msgid "Attacking" -msgstr "" +msgstr "Atacando" msgid "To attack with a VTOL, select it and click an enemy like normal." -msgstr "" +msgstr "Para atacar com um VTOL, selecione-o e clique em um inimigo normalmente." msgid "However, you may noticed the white ammo bar below its health bar as you start attacking." -msgstr "" +msgstr "No entanto, você pode notar a barra de munição branca abaixo da sua barra de saúde enquanto começa a atacar." msgid "Unlike ground units, which reload automatically, VTOLs carry a limited amount of ammo. Once that ammo runs out, the VTOL can’t attack until it refuels." -msgstr "" +msgstr "Ao contrário das unidades terrestres, que recarregam automaticamente, os VTOLs carregam uma quantidade limitada de munição. Uma vez que essa munição acabar, os VTOL não podem atacar até que sejam reabastecidos." msgid "A VTOL out of ammo will automatically find a VTOL rearming pad to rearm and repair itself (and will resume attacking once fully rearmed), or it can be manually rearmed by selecting it and clicking on a rearming pad." -msgstr "" +msgstr "Um VTOL sem munição irá automaticamente encontrar uma plataforma de rearmamento de VTOL para se rearmar e reparar (e continuará a atacar uma vez totalmente rearmado), ou pode ser rearmado manualmente, selecionando-o e clicando em uma área de rearmamento." msgid "Unlike other units which usually attack the nearest target, VTOLs will not attack anything automatically. However, by selecting a VTOL and alt+clicking on an area, a VTOL will patrol the area between its current location and the clicked location, and attack anything in the vicinity." -msgstr "" +msgstr "Ao contrário de outras unidades que geralmente atacam o alvo mais próximo, os VTOL's não atacam nada automaticamente. No entanto, selecionando um VTOL e alt+clicando em uma área, um VTOL patrulhará a área entre sua localização atual e a localização clicada, e atacará qualquer coisa nas redondezas." msgid "Alternatively, VTOLs can be assigned to VTOL Strike Towers and VTOL CB Towers, which will cause them to function similarly to artillery assigned to sensor towers." -msgstr "" +msgstr "Alternativamente, os VTOL's podem ser atribuídos a Torres de Ataque VTOL e Torres AB VTOL, o que fará com que eles funcionem de forma semelhante à artilharia atribuída às torres do sensor." msgid "Defending Against VTOLs" -msgstr "" +msgstr "Defendendo contra VTOLs" msgid "What's that in the sky? ... It's a VTOL unit" -msgstr "" +msgstr "Que é isso no céu? É uma unidade VTOL" msgid "Since VTOLs are not ground-based units, most ground weapons cannot hit them." -msgstr "" +msgstr "Uma vez que os VTOL's não são unidades terrestres, a maioria das armas terrestres não pode atingi-las." msgid "They can only be hit by either anti-air (often abbreviated \"AA\") or versatile (can hit air or ground) weapons." -msgstr "" +msgstr "Eles só podem ser atingidos por armas anti-ar (muitas vezes abreviadas de \"AA\") ou versátil (pode atingir o ar ou o solo)." msgid "There are only a few weapons that are versatile: machineguns, lasers, and Mini-Rocket Pod." -msgstr "" +msgstr "Existem apenas algumas armas que são versáteis: metralhadoras, lasers e Mini-Rocket Pod." msgid "(Rockets and missiles are also versatile, but only when mounted on a cyborg or VTOL.)" -msgstr "" +msgstr "(Os foguetes e mísseis também são versáteis, mas apenas quando montados em um ciborgue ou VTOL.)" msgid "In addition to being uncommon, versatile weapons do not do as much damage to VTOLs as dedicated anti-air, so having some AA is recommended against VTOLs." -msgstr "" +msgstr "Além de serem incomuns, armas versáteis não causam tantos danos aos VTOL's quanto anti-ar dedicado, então é recomendado ter alguma AA contra VTOLs." msgid "Designing VTOLs" -msgstr "" +msgstr "Projetando VTOL's" msgid "Designing VTOL units is similar to designing ground units." -msgstr "" +msgstr "Projetar unidades VTOL é semelhante a projetar unidades terrestres." msgid "When choosing a propulsion, simply pick \"VTOL\" propulsion." -msgstr "" +msgstr "Ao escolher uma propulsão, simplesmente escolha a propulsão \"VTOL\"." msgid "You will then be able to select from the available VTOL Weapons." -msgstr "" +msgstr "Em seguida, você poderá selecionar um entre as armas de VTOL disponíveis." msgid "Remember: You will need a \"VTOL Factory\" to actually build VTOL unit designs." -msgstr "" +msgstr "Lembre-se: Você precisará de uma \"Fábrica VTOL\" para realmente construir projetos de unidade VTOL." msgid "Weapons" -msgstr "" +msgstr "Armas" msgid "Most weapons have a VTOL equivalent, which does at least twice as much damage, but has limited ammo." -msgstr "" +msgstr "A maioria das armas tem um equivalente VTOL, o que causa pelo menos o dobro de dano, mas tem munição limitada." msgid "VTOL versions of regular weapons do not need to be researched separately." -msgstr "" +msgstr "Versões VTOL de armas regulares não precisam ser pesquisadas separadamente." msgid "In addition to VTOL versions of ground-based direct weapons, VTOLs can also use bomb weapons. These weapons are the equivalent of artillery, and are very powerful." -msgstr "" +msgstr "Além das versões VTOL de armas diretas no solo, os VTOL's também podem usar armas de bomba. Estas armas são o equivalente a artilharia e são muito poderosas." msgid "VTOLs" -msgstr "" +msgstr "VTOL's" msgid "VTOL (Vertical Take-Off and Landing) units are the main aerial instruments in dominating the skies." -msgstr "" +msgstr "As unidades VTOL (Decolagem Vertical e Descolagem) são os principais instrumentos aéreos para dominar os céus." msgid "To produce VTOL units, you will need to have discovered & researched the \"VTOL Propulsion\" and \"VTOL Factory\"." -msgstr "" +msgstr "Para produzir unidades VTOL, você precisará ter descoberto e pesquisado a \"Propulsão VTOL\" e a \"Fábrica VTOL\"." msgid "You should also research and build a few \"VTOL Rearming Pads\", so your VTOL units can reload ammo." -msgstr "" +msgstr "Você também deve pesquisar e construir alguns \"Pads de Rearmamento dos VTOL\", para que seus VTOL possam recarregar munição." msgid "Weapon Selection" -msgstr "" +msgstr "Seleção de arma" msgid "As you discover and research more weapons, you'll also discover that certain weapons may work dramatically better for certain situations than others (or versus certain enemy units or structures)." -msgstr "" +msgstr "Conforme você descobre e pesquisa mais armas, você também descobrirá que certas armas podem funcionar dramaticamente melhor para certas situações do que outras (ou contra certas unidades ou estruturas inimigas)." msgid "When you complete research on a new weapon, an Intelligence Display message will provide some information on its attributes." -msgstr "" +msgstr "Quando você completa a pesquisa em uma nova arma, uma mensagem de Tela de Inteligência fornecerá algumas informações sobre seus atributos." msgid "It is to your advantage to experiment with different weapon types. If you're having trouble and haven't re-evaluated your force's composition in a while, it might be time to consider changing the weapons for stronger ones, or new varieties!" -msgstr "" +msgstr "É para sua vantagem experimentar diferentes tipos de armas. Se você está tendo problemas e não reavaliou a composição de sua força por algum tempo, pode ser hora de considerar a mudança de armas para armas mais fortes, ou novas variedades!" msgid "Units" -msgstr "" +msgstr "Unidades" msgid "You will need to design and build new units if you want to overpower your enemies and get that sweet taste of victory." -msgstr "" +msgstr "Você precisará projetar e construir novas unidades se quiser superar seus inimigos e ter o sabor doce da vitória." msgid "This aspect of the game is what makes Warzone 2100 unique in its own way." -msgstr "" +msgstr "Esse aspecto do jogo é o que torna Warzone 2100 único de sua própria maneira." msgid "To be able to design units, a Command Center is required." -msgstr "" +msgstr "Para ser capaz de projetar unidades, um Centro de Comando é necessário." diff --git a/po/guide/zh_CN.po b/po/guide/zh_CN.po index 6a3206d52bc..f5afbc7c806 100644 --- a/po/guide/zh_CN.po +++ b/po/guide/zh_CN.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" "POT-Creation-Date: 2024-06-12 03:55+0000\n" -"PO-Revision-Date: 2024-09-11 19:59\n" +"PO-Revision-Date: 2024-10-07 02:29\n" "Last-Translator: \n" "Language-Team: Chinese Simplified\n" "Language: zh_CN\n" @@ -66,7 +66,7 @@ msgid "The Project dispatches three teams with the objective of reclaiming artif msgstr "“项目”派遣了三个中队,以回收遗留科技为目标,以便研究和使用“大崩溃”前的技术。" msgid "- Team Alpha is sent to an Arizona desert location southeast of Project HQ" -msgstr "- Alpha 中队被派往位于“项目”总部东南方的亚利桑那沙漠" +msgstr "- Alpha 中队被派往位于“工程”总部东南方的亚利桑那沙漠" msgid "- Beta team is sent to the remains of Chicago" msgstr "- Beta 中队被派往芝加哥的废墟上" @@ -429,7 +429,7 @@ msgid "- Return for Repair: Unit will return to a Repair Facility" msgstr "- 返回维修:单位将返回到维修设施" msgid "- Return to HQ: Unit will return to Command Center or LZ (campaign)" -msgstr "- 返回总部:单位将返回到指挥中心或着陆点 (战役模式)" +msgstr "- 返回指挥中心:单位将返回到指挥中心或着陆点 (战役模式)" msgid "- Go To Transport: Unit will go to and board transport" msgstr "- 前往运输舰:单位将前往并登陆运输舰" @@ -450,7 +450,7 @@ msgid "Building Units" msgstr "生产单位" msgid "To build units, either select a Factory, or select the \"Manufacturing\" button on the Command Panel - this will open the Manufacturing panel on the left side of the screen." -msgstr "如要生产单位,选择一个工厂, 或点击命令面板上的“制造”按钮 - 这将在屏幕左侧打开制造面板。" +msgstr "如要生产单位,选择一个工厂, 或点击命令面板上的“生产”按钮 - 这将在屏幕左侧打开制造面板。" msgid "The Manufacturing panel will display the unit designs which are buildable by the currently-selected Factory. Factories may be limited to producing certain types of units (or may only be able to produce certain units if upgraded with modules)." msgstr "制造面板将显示目前选定的工厂可以生产的单位设计。工厂可能仅限于生产某些类型的单位 (有些单元需要升级模块后才能生产)。" diff --git a/po/hu.po b/po/hu.po index ebde16be4bf..8a958bb3061 100644 --- a/po/hu.po +++ b/po/hu.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" "POT-Creation-Date: 2024-09-11 19:20+0000\n" -"PO-Revision-Date: 2024-09-11 19:59\n" +"PO-Revision-Date: 2024-09-13 02:24\n" "Last-Translator: \n" "Language-Team: Hungarian\n" "Language: hu_HU\n" @@ -51,7 +51,7 @@ msgid "The New Paradigm control superior weapons technology." msgstr "Az Új Paradigma fejlettebb fegyvertechnológiával rendelkezik." msgid "They may have the synaptic link technology, it's vital we retrieve it." -msgstr "Náluk lehet a szinaptikus kapcsolat technológia, létfontosságú visszaszerezni." +msgstr "Náluk lehet a szinaptikus kapcsolat technológia, visszaszerzése létfontosságú." msgid "TRANSPORT MISSION: Locate and Recover Artifacts" msgstr "SZÁLLÍTÁSI KÜLDETÉS: Keresse meg és szerezze vissza a leleteket" @@ -1800,7 +1800,7 @@ msgid "Destroy the Nexus HQ to disable the Nexus Intruder Program" msgstr "A Nexus főhadszállás megsemmisítésével letilthatja a Nexus behatoló programot" msgid "Warning: HQ shielded against VTOL attacks" -msgstr "" +msgstr "Figyelmeztetés: a főhadiszállás pajzzsal védett a VTOL támadásokkal szemben" msgid "Research resistance circuits and survive the assault from Nexus" msgstr "Fejlesszen ki ellenállósági áramköröket és élje túl a Nexus támadásait" @@ -2016,7 +2016,7 @@ msgid "Dawn, July 4th, 2100" msgstr "2100. július 4., pirkadat" msgid "Project HQ" -msgstr "Terv Főhadiszállás" +msgstr "Terv főhadiszállása" msgid "A New Era" msgstr "Egy új korszak" @@ -2955,7 +2955,7 @@ msgid "Your external IP is: %s" msgstr "" msgid "Failed to create port mapping (timeout)" -msgstr "" +msgstr "A porthozzárendelés létrehozása sikertelen (időtúllépés)" msgid "Client failed to ack player index swap" msgstr "A kliens nem tudta kezelni a játékosindex változását" @@ -8890,7 +8890,7 @@ msgid "Rotate Building Anticlockwise" msgstr "Építmény forgatása balra" msgid "Center View on HQ" -msgstr "Középpontba a főhadiszállást" +msgstr "A nézet ráállítása a főhadiszállásra" msgid "Hold Fire" msgstr "Tüzet szüntess" @@ -9545,10 +9545,10 @@ msgid "Reveal ON" msgstr "Felfedés Be" msgid "Centered on player HQ, direction NORTH" -msgstr "Főhadiszállása központosítva, észak felé irányítva" +msgstr "A nézet ráállítva a főhadiszállásra, északi tájolással" msgid "Unable to locate HQ!" -msgstr "Képtelen, hogy lokalizálja főhadiszállást!" +msgstr "A főhadiszállás nem található!" msgid "Formation speed limiting ON" msgstr "Alakzat sebességkorlátozása BE" @@ -11250,19 +11250,19 @@ msgid "Can't find any games for your version." msgstr "Nem talál játékokat a verziódhoz." msgid "There appears to be a game update available!" -msgstr "Mutatod, hogy elérhető e játék frissítés!" +msgstr "Úgy néz ki, hogy játékfrissítés érhető el!" msgid "No games are available for your version" -msgstr "Nincs rendelkezésre álló játék verzió" +msgstr "Nincs rendelkezésre álló játék a verziójához" msgid "Wrong Game Version!" msgstr "Rossz játékverzió." msgid "You have an incompatible mod." -msgstr "Inkompatibilis módban vagy." +msgstr "Egy nem kompatibilis moddal rendelkezik." msgid "Host couldn't send file?" -msgstr "Gazdagép nem tudott fájlt küldeni?" +msgstr "A házigazda nem tudott fájlt küldeni?" msgid "Incorrect Password!" msgstr "Helytelen Jelszó." @@ -11274,16 +11274,16 @@ msgid "CONNECTION" msgstr "KAPCSOLAT" msgid "Lobby" -msgstr "Előcsarnok" +msgstr "Váró" msgid "IP" msgstr "IP cím alapján" msgid "IP Address or Machine Name" -msgstr "IP cím vagy gépnév" +msgstr "IP-cím vagy gépnév" msgid "Launch Transport" -msgstr "Szállítást indítása" +msgstr "Szállító indítása" msgid "Launch the Transporter" msgstr "Szállítást indítása" @@ -11292,7 +11292,7 @@ msgid "There is not enough room in the Transport!" msgstr "Nincs elegendő férőhely a szállításhoz." msgid "Reinforcements landing" -msgstr "Utánpótlás leszállt" +msgstr "Az utánpótlás leszáll" msgid "Update Available" msgstr "Frissítés érhető el" diff --git a/po/pt.po b/po/pt.po index c6adde76fd2..9589f134ca5 100644 --- a/po/pt.po +++ b/po/pt.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" "POT-Creation-Date: 2024-09-11 19:20+0000\n" -"PO-Revision-Date: 2024-09-11 19:59\n" +"PO-Revision-Date: 2024-10-03 02:27\n" "Last-Translator: \n" "Language-Team: Portuguese\n" "Language: pt_PT\n" @@ -1782,10 +1782,10 @@ msgid "Secure the Uplink from The Collective" msgstr "Capture o Centro de Ligação Satélite da Colectividade" msgid "Send off at least one transporter with a truck and survive The Collective assault until the timer ends" -msgstr "" +msgstr "Envie pelo menos um transporte com um camião e sobreviver ao ataque coletivo até o tempo terminar" msgid "Send off as many transporters as you can and bring at least one truck" -msgstr "" +msgstr "Mande o maior número possível de transportadores e traga pelo menos um camião" msgid "Move all units into the valley" msgstr "Mova todas as unidades para o vale" @@ -1800,13 +1800,13 @@ msgid "Destroy the Nexus HQ to disable the Nexus Intruder Program" msgstr "Destrua o QG Nexus para desativar o Programa de Intrusão Nexus" msgid "Warning: HQ shielded against VTOL attacks" -msgstr "" +msgstr "Aviso: QG protegido contra ataques VTOL" msgid "Research resistance circuits and survive the assault from Nexus" msgstr "Pesquise circuitos de resistência e sobreviva ao ataque do Nexus" msgid "Build a forward base at the silos" -msgstr "" +msgstr "Construa uma base avançada nos silos" msgid "Protect the missile silos and research for the missile codes" msgstr "Defenda os silos e pesquise os códigos dos mísseis" @@ -1818,10 +1818,10 @@ msgid "Return to LZ" msgstr "Regresse à ZA" msgid "Hard / Insane difficulty hint:" -msgstr "" +msgstr "Difícil / Dica de dificuldade insana:" msgid "Fortify a strong base across the map to protect yourself from the Collective" -msgstr "" +msgstr "Construa uma base fortificada sobre o mapa para se proteger da Coleção" msgid "Destroy all enemy units and structures" msgstr "Destrua todas as unidades e estruturas inimigas" @@ -2184,7 +2184,7 @@ msgid "This Nexus Intruder Program is a self-mutating computer parasite. This ma msgstr "O Programa de Intrusão Nexus é um vírus de computador auto-mutante. Isso o torna difícil de ser erradicado de sistemas uma vez identificado." msgid "We have been unable to ascertain its ultimate goal or function. In its initial form it seeks out and isolates sections of memory from the rest of the invaded system. It then begins to mutate itself and data structures, effectively reprogramming the system from within." -msgstr "" +msgstr "Não pudemos identificar a sua função ou objetivo principal. Na sua forma inicial, ele procura e isola secções da memória do resto do sistema invadido. Então, começa a transformar-se ele próprio e estruturas de dados, praticamente reprogramando o sistema de dentro para fora." msgid "Further analysis was prevented by the manual shutdown of the system by our technicians to prevent additional contamination by the Nexus Intruder Program." msgstr "Análises mais a fundo não foram possíveis devido *a desactivação manual dos sistemas pelos nossos técnicos para impedir contaminação adicional pelo Programa de Intrusão Nexus." @@ -2829,10 +2829,10 @@ msgid "Lost due to being inactive / playing passively." msgstr "Perdeu por estar inactivo / jogando passivamente." msgid "Host-configured game time limit is approaching. If there is no winner within 10 minutes, the game will end." -msgstr "" +msgstr "O limite de tempo de jogo configurado pelo anfitrião está chegando. Se não houver nenhum vencedor dentro de 10 minutos, o jogo será encerrado." msgid "Host-configured game time limit exceeded. Game is over." -msgstr "" +msgstr "Limite de tempo de jogo configurado pelo anfitrião excedido. O jogo acabou." msgid "Playing passively will lead to defeat. Actions that are considered:" msgstr "Jogar passivamente levará à derrota. Ações que são consideradas:" @@ -2940,25 +2940,25 @@ msgid "System locale" msgstr "Linguagem do sistema" msgid "Failed to create port mapping" -msgstr "" +msgstr "Falha ao criar mapeamento de porta" #, c-format msgid "Manually configure your router/firewall to open port %d!" -msgstr "" +msgstr "Configure manualmente o seu roteador/firewall para abrir a porta %d!" #, c-format msgid "Port mapping opened external port: %d" -msgstr "" +msgstr "Mapeamento de porta aberto porta externa: %d" #, c-format msgid "Your external IP is: %s" -msgstr "" +msgstr "Seu IP externo é: %s" msgid "Failed to create port mapping (timeout)" -msgstr "" +msgstr "Falha ao criar mapeamento de porta (tempo esgotado)" msgid "Client failed to ack player index swap" -msgstr "" +msgstr "O cliente falhou em usar a troca de índice do jogador" #, c-format msgid "Could not resolve masterserver name (%s)!" @@ -2971,22 +2971,26 @@ msgid "" "If you're using a router configure it to enable UPnP/NAT-PMP/PCP\n" " or to forward the port to your system." msgstr "" +"Erro ao conectar-se com o servidor principal: %s.\n" +"Assegure-se que a porta %d pode receber dados de conexões.\n" +"Se você estiver usando um roteador, configure-o para utilizar UPnP/NAT-PMP/PCP \n" +"ou para encaminhar a porta para o seu sistema." msgid "Failed to get a lobby response!" msgstr "Não houve resposta do servidor principal!" msgid "The replay file format is newer than this version of Warzone 2100 can support." -msgstr "" +msgstr "O formato do arquivo de repetição é mais recente que esta versão do Warzone 2100 pode suportar." #, c-format msgid "Replay Format Version: %u" -msgstr "" +msgstr "Versão do Formato de Replay: %u" msgid "Replay File Format Unsupported" -msgstr "" +msgstr "Formato de Arquivo de Replay Não Suportado" msgid "Unable to load replay: The replay file is incomplete or corrupted." -msgstr "" +msgstr "Não foi possível carregar o replay: O arquivo de replay está incompleto ou corrompido." msgid "Menu" msgstr "Menu" @@ -3097,7 +3101,7 @@ msgid "AA reload time -15%" msgstr "Tempo de Recarregamento das AA -15%" msgid "AA Site with Stormbringer Turret" -msgstr "" +msgstr "Site AA com Torre Stormbringer" msgid "AA Target Acquisition Shells" msgstr "Projécteis AA de Aquisição de Alvo" @@ -3280,7 +3284,7 @@ msgid "Armed with Cyborg Flamer" msgstr "Armado com Lança-Chamas Cyborg" msgid "Armed with Cyborg Hyper Velocity Cannon" -msgstr "" +msgstr "Armado com Canhão de Hipervelocidade Ciborgue" msgid "Armed with Cyborg Machinegun" msgstr "Armado com Metralhadora Cyborg" @@ -3295,10 +3299,10 @@ msgid "Armed with Cyborg Scourge Missile Launcher" msgstr "Armado com lançador de míssil Scourge para Cyborgs" msgid "Armed with Cyborg Tank Killer rocket" -msgstr "" +msgstr "Armado com foguetes destruidores de Tanques Ciborgues" msgid "Armed with Cyborg Thermite flamer" -msgstr "" +msgstr "Armado com Lança-chamas de Termite" msgid "Armed with Cyborg Thermite Flamer" msgstr "Armado com Lança-chamas de Termite" @@ -3316,7 +3320,7 @@ msgid "Armed with hyper velocity cannon" msgstr "Armado com canhão de alta-velocidade" msgid "Armed with hyper velocity quad-barrel automatic-cannon" -msgstr "" +msgstr "Armado com canhão quad-barrel de hiper velocidade" msgid "Armed with Lancer anti-tank missile" msgstr "Armado com míssil Anti-Tanque Lancer" @@ -3341,7 +3345,7 @@ msgstr "Armado com foguetes tank killer" #, no-c-format msgid "Armor +120%, Body Points +90%" -msgstr "" +msgstr "Armadura +120%, Integridade +90%" #, no-c-format msgid "Armor +35%, Body Points +30%" @@ -3897,7 +3901,7 @@ msgid "Computer Research Completed" msgstr "Investigação de Computadores Completa" msgid "Computer systems are now 'ring-fenced' from NEXUS" -msgstr "" +msgstr "Os sistemas de computador agora estão 'protegidos' do NEXUS" msgid "Computer systems can now be 'ring-fenced' from NEXUS" msgstr "Sistemas de computador podem ser agora isolados de NEXUS" @@ -3998,7 +4002,7 @@ msgid "Cyborg Superdense Thermal Armor" msgstr "Blindagem Térmica Superdensa Cyborg" msgid "Cyborg Tank Killer" -msgstr "" +msgstr "Assassino de Tanque Ciborgue" msgid "Cyborg Thermal Armor Mk2" msgstr "Protecção Térmica Cyborg Mk2" @@ -4010,7 +4014,7 @@ msgid "Cyborg Thermal Armor" msgstr "Protecção Térmica Cyborg" msgid "Cyborg Thermite" -msgstr "" +msgstr "Ciborgue Termite" msgid "Cyborg Transport Available" msgstr "Transporte para Cyborgs Disponível" @@ -4055,7 +4059,7 @@ msgid "Depleted uranium kinetic energy bullets" msgstr "Balas de energia cinética com urânio empobrecido" msgid "Depleted Uranium MG Bullets Mk3" -msgstr "" +msgstr "Balas de Metralhadora de Urânio Empobrecido Mk3" msgid "Depleted Uranium MG Bullets" msgstr "Balas de Metralhadora de Urânio Empobrecido" @@ -4091,7 +4095,7 @@ msgid "Electronically attacks and disrupts enemy structures" msgstr "Ataca electrónicamente e perturba estruturas inimigas" msgid "Elite and Veteran rank units and Factories are protected" -msgstr "" +msgstr "Unidades de classificação Elite e Veterano e Fábricas são protegidas" msgid "EMP Cannon Hardpoint" msgstr "Fortificação de Canhão EMP" @@ -4109,7 +4113,7 @@ msgid "EMP Mortar" msgstr "Morteiro EMP" msgid "Enables Hardcrete gates" -msgstr "" +msgstr "Permitir portões de concreto" msgid "Enables Hardcrete walls" msgstr "Possibilita Paredes de Hardcrete" @@ -4242,7 +4246,7 @@ msgid "Flamer damage +25%" msgstr "Dano de Lança-chamas +25%" msgid "Flamer Fast Loader" -msgstr "" +msgstr "Recarregador Rápido de lança-chamas" #, no-c-format msgid "Flamer reload time -15%" @@ -4661,13 +4665,13 @@ msgid "Heavy Repair Turret Cobra Hover" msgstr "Torreão de Reparação Pesado Cobra Hovercraft" msgid "Heavy Rocket Array" -msgstr "" +msgstr "Matriz de Foguetes Pesados" msgid "Heavy Rocket Bastion" msgstr "Bastião de Foguetes" msgid "Heavy Rocket Battery" -msgstr "" +msgstr "Bateria de Foguetes Pesados" msgid "Heavy surface-to-air missile" msgstr "Míssil terra-ar pesado" @@ -4682,7 +4686,7 @@ msgid "Hellstorm" msgstr "Hellstorm" msgid "Hero and Special rank units are protected" -msgstr "" +msgstr "Unidades de classificação de Herói e Especial estão protegidas" msgid "HESH Rocket Warhead Mk2" msgstr "Ogiva HESH para Foguetes Mk2" @@ -5446,7 +5450,7 @@ msgid "Multi-barrel, rapid-fire machinegun" msgstr "Metralhadora de vários canos e disparo rápido" msgid "Must be built to produce commanders" -msgstr "" +msgstr "Deve ser construído para produzir comandantes" msgid "Nanolab" msgstr "Laboratório de Nanotecnologia" @@ -5581,7 +5585,7 @@ msgid "NEXUS Heavy Body" msgstr "Chassis Pesado do NEXUS" msgid "NEXUS Immunization System" -msgstr "" +msgstr "Sistema de Imunização de NEXUS" msgid "NEXUS Intruder Program analyzed" msgstr "Programa de intrusão NEXUS analisado" @@ -5763,7 +5767,7 @@ msgid "Produces Cyborgs" msgstr "Produz Cyborgs" msgid "Professional and Regular rank units are protected" -msgstr "" +msgstr "Unidades de classificação Profissional e Regular estão protegidas" msgid "Project Heavy Body" msgstr "Chassis Pesado do Projecto" diff --git a/po/pt_BR.po b/po/pt_BR.po index e4d71f51746..21dcfee09b0 100644 --- a/po/pt_BR.po +++ b/po/pt_BR.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" "POT-Creation-Date: 2024-09-11 19:20+0000\n" -"PO-Revision-Date: 2024-09-11 19:59\n" +"PO-Revision-Date: 2024-10-07 02:29\n" "Last-Translator: \n" "Language-Team: Portuguese, Brazilian\n" "Language: pt_BR\n" @@ -1800,7 +1800,7 @@ msgid "Destroy the Nexus HQ to disable the Nexus Intruder Program" msgstr "Destrua o QG do Nexus para desativar o Programa Intrusivo Nexus" msgid "Warning: HQ shielded against VTOL attacks" -msgstr "" +msgstr "Alerta: QG blindado contra ataques VTOL" msgid "Research resistance circuits and survive the assault from Nexus" msgstr "Pesquise circuitos de resistência e sobreviva ao ataque do Nexus" @@ -2955,7 +2955,7 @@ msgid "Your external IP is: %s" msgstr "Seu IP externo é: %s" msgid "Failed to create port mapping (timeout)" -msgstr "" +msgstr "Falha ao criar o mapeamento da porta (timeout)" msgid "Client failed to ack player index swap" msgstr "O cliente não conseguiu confirmar a troca do índice do jogador" @@ -5999,7 +5999,7 @@ msgid "Ripple Rocket Battery" msgstr "Bateria de Foguetes Ripple" msgid "Ripple Rocket Rapid Loader" -msgstr "" +msgstr "Carregador Rápido de Foguetes Ripple" msgid "Ripple Rockets" msgstr "Foguetes Ripple" @@ -6645,7 +6645,7 @@ msgid "Two-faced" msgstr "Duas-caras" msgid "Undo Reduce Scavenger Flamer Range" -msgstr "" +msgstr "Desfazer Reduzir o alcance do Incendiário dos Catadores" msgid "Unit Research Completed" msgstr "Pesquisa de Unidade Concluída" @@ -6751,7 +6751,7 @@ msgid "VTOL Assault Gun" msgstr "Metralhadora de Assalto VTOL" msgid "VTOL BaBa Rearming Pad" -msgstr "" +msgstr "VTOL BaBa Rearming Pad" msgid "VTOL Bunker Buster Bug VTOL" msgstr "VTOL Arrasa-Defesas Inseto" @@ -6808,7 +6808,7 @@ msgid "VTOL Heap Bomb Bay" msgstr "Bombas Explosivas VTOL" msgid "VTOL Heavy Cannon" -msgstr "" +msgstr "Canhão Pesado VTOL" msgid "VTOL Heavy Laser" msgstr "Laser Pesado VTOL" @@ -6847,16 +6847,16 @@ msgid "VTOL Lancer" msgstr "Lançadeiro VTOL" msgid "VTOL Machinegun Scav" -msgstr "" +msgstr "Metralhadora Scav VTOL" msgid "VTOL Machinegun" msgstr "Metralhadora VTOL" msgid "VTOL Mini-Rocket AA" -msgstr "" +msgstr "Mini-Foguetes AA VTOL" msgid "VTOL Mini-Rocket Scav" -msgstr "" +msgstr "Mini-Foguetes Scav VTOL" msgid "VTOL Mini-Rocket" msgstr "Mini-Foguetes VTOL" @@ -7250,43 +7250,43 @@ msgid "[1, true, 0, false]" msgstr "[1, verdadeiro, 0, falso]" msgid "Enable lobby slash commands (for connecting clients)" -msgstr "" +msgstr "Ativar comandos de barra de lobby (para conectar jogadores)" msgid "Add a lobby admin identity hash (for slash commands)" -msgstr "" +msgstr "Adicione um hash de identidade do administrador do lobby (para comandos com barra)" msgid "hash string" -msgstr "" +msgstr "hash string" msgid "Add a lobby admin public key (for slash commands)" -msgstr "" +msgstr "Adicione uma chave pública do administrador do lobby (para comandos com barra)" msgid "b64-pub-key" -msgstr "" +msgstr "b64-pub-key" msgid "Enable command interface" msgstr "Habilitar interface de comando" msgid "(stdin, unixsocket:path)" -msgstr "" +msgstr "(stdin, unixsocket:path)" msgid "Minimum required players to auto-start game" msgstr "Mínimo de jogadores necessários para iniciar o jogo automaticamente" msgid "startplayers" -msgstr "" +msgstr "startplayers" msgid "Game history log output mode(s)" -msgstr "" +msgstr "Modo de saída sai no histórico do jogo" msgid "Game history log output key" -msgstr "" +msgstr "Chave de saída sai no histórico do jogo" msgid "Game history log output naming" -msgstr "" +msgstr "Nomeamento sai no histórico do jogo" msgid "Game history log frame interval" -msgstr "" +msgstr "Intervalo de quadros sai no histórico do jogo" msgid "interval in seconds" msgstr "intervalo em segundos" @@ -7298,22 +7298,22 @@ msgid "number of minutes" msgstr "número de minutos" msgid "Convert a specular-map .png to a luma, single-channel, grayscale .png (and exit)" -msgstr "" +msgstr "Converta um mapa especulativo .png para um luma, single-channel, grayscale .png (e sair)" msgid "Allow Vulkan implicit layers (that may be default-disabled due to potential crashes or bugs)" -msgstr "" +msgstr "Permitir camadas implícitas de Vulkan (que podem estar desativadas por padrão devido a possíveis falhas ou bugs)" msgid "Set the default hosting chat configuration / permissions" -msgstr "" +msgstr "Definir as configurações / permissões padrão do anfitrião do bate-papo" msgid "Enable async join approval (for connecting clients)" -msgstr "" +msgstr "Ativar aprovação para entrada async (para conectar jogadores)" msgid "Base URL for on-demand video downloads" -msgstr "" +msgstr "URL base para downloads de vídeo sob demanda" msgid "Base video URL" -msgstr "" +msgstr "URL base do vídeo" msgid "Commander needs a higher level to command more units" msgstr "O comandante precisa de um nível maior para comandar mais unidades" @@ -7414,11 +7414,11 @@ msgstr "%s - Pontos de Vida %d/%d - Experiência %.1f, %s, Abates %d" #, c-format msgid "%s - Hitpoints %d/%d - ID %d - %s" -msgstr "" +msgstr "%s - Hitpoints %d/%d - ID %d - %s" #, c-format msgid "(Enemy!) %s - Hitpoints %d/%d - ID %d - experience %f, %s - order %s - action %s - sensor range %d - ECM %d - pitch %.0f" -msgstr "" +msgstr "(Inimigo!) %s - Hitpoints %d/%d - ID %d - experiência%f, %s - ordem%s - ação %s - alcance do sensor %d - ECM %d - tom %.0f" #, c-format msgid "%s - Allied - Hitpoints %d/%d - Experience %d, %s" @@ -7426,7 +7426,7 @@ msgstr "%s - Aliado - Danos %d%d - Experiência %d, %s" #, c-format msgid "(Enemy!) %s, ref: %d, ID: %d Hitpoints: %d/%d" -msgstr "" +msgstr "(Inimigo!) %s, ref: %d, ID: %d Hitpoints: %d/%d" msgid "Player left" msgstr "Jogador saiu" @@ -7472,8 +7472,8 @@ msgstr[1] "%u unidades atribuídas ao Grupo %u" #, c-format msgid "%u units removed from their Group" msgid_plural "%u units removed from their Group" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Unidades %u removidas do grupo" +msgstr[1] "Unidades %u removidas do grupo" #, c-format msgid "Centered on Group %u - %u Unit" @@ -7688,10 +7688,10 @@ msgid "On" msgstr "Ligado" msgid "Per Pixel" -msgstr "" +msgstr "Per Pixel" msgid "Lightmap" -msgstr "" +msgstr "Lightmap" msgid "Rotating" msgstr "Giratório" @@ -7715,10 +7715,10 @@ msgid "Terrain quality mode not available." msgstr "Modo de qualidade do terreno não disponível." msgid "Medium Quality" -msgstr "" +msgstr "Qualidade Média" msgid "High Quality" -msgstr "" +msgstr "Alta qualidade" msgid "Shadow mapping not available on this system." msgstr "O mapeamento de sombra não está disponível neste sistema." @@ -7739,7 +7739,7 @@ msgid "Terrain Quality" msgstr "Qualidade do Terreno" msgid "Terrain Shading" -msgstr "" +msgstr "Sombra do terreno" msgid "Shadows" msgstr "Sombras" @@ -7751,7 +7751,7 @@ msgid "Shadow Filtering" msgstr "Filtragem de Sombra" msgid "Per Pixel point lights" -msgstr "" +msgstr "Luzes por pixel" msgid "LOD Distance" msgstr "Distância do Nível de Detalhes" @@ -7989,10 +7989,10 @@ msgid "Destroy (Classic)" msgstr "Destruir (Clássico)" msgid "Allow All" -msgstr "" +msgstr "Permitir tudo" msgid "Quick Chat Only" -msgstr "" +msgstr "Apenas Bate-papo Rápido" msgid "Hosting Options:" msgstr "Opções de hospedagem:" @@ -8007,19 +8007,19 @@ msgid "Use PCP, NAT-PMP, or UPnP to help configure your router / firewall to all msgstr "Use PCP, NAT-PMP ou UPnP para ajudar a configurar seu roteador / firewall para permitir conexões durante a hospedagem." msgid "Chat" -msgstr "" +msgstr "Bate-papo" msgid "Inactivity Timeout" msgstr "Tempo de espera por inatividade" msgid "Lag Kick" -msgstr "" +msgstr "Lag Kick" msgid "Spectator Slots" msgstr "Espaços de Espectador" msgid "On Player Leave" -msgstr "" +msgstr "Quando o Player Deixar" msgid "Game Time Limit" msgstr "Tempo Limite de Jogo" @@ -8118,34 +8118,34 @@ msgstr "" "Clique com o botão direito do mouse para retirar dos Favoritos" msgid "New Joins" -msgstr "" +msgstr "Novas entradas" msgid "Refresh" -msgstr "" +msgstr "Atualizar" msgid "Host Chat Options" -msgstr "" +msgstr "Opções do Chat Host" msgid "Global Options:" -msgstr "" +msgstr "Opções globais:" msgid "Enable All" -msgstr "" +msgstr "Ativar tudo" msgid "Disable All" -msgstr "" +msgstr "Desabilitar Tudo" msgid "Chat Options" -msgstr "" +msgstr "Opções do bate-papo" msgid "Mute or configure player free chat." -msgstr "" +msgstr "Silenciar ou configurar um chat livre de jogadores." msgid "The host has globally muted 1+ players." -msgstr "" +msgstr "O host silenciou globalmente mais de 1 jogador." msgid "Local" -msgstr "" +msgstr "Local" msgid "Select / Assign Group Number: " msgstr "Selecionar / Atribuir Número de Grupo: " @@ -8224,7 +8224,7 @@ msgid "Quick Chat:" msgstr "Chat Rápido:" msgid "Lobby Chat" -msgstr "" +msgstr "Bate-papo do Lobby" msgid "Requests" msgstr "Solicitações" @@ -8248,7 +8248,7 @@ msgid "Cheats" msgstr "Trapaças" msgid "End-Game" -msgstr "" +msgstr "Fim de jogo" msgid "Can someone please transfer me some units?" msgstr "Alguém pode me transferir algumas unidades, por favor?" @@ -8577,30 +8577,30 @@ msgstr "" #, c-format msgid "Failure to load %zu game model(s)" -msgstr "" +msgstr "Falha ao carregar modelos de jogo %zu" #, c-format msgid "Failure to load textures for %zu model(s)" -msgstr "" +msgstr "Falha ao carregar texturas para modelo %zu" #, c-format msgid "Failure to load model for %zu stat(s)" -msgstr "" +msgstr "Falha ao carregar o modelo para estatísticas do %zu" msgid "Warzone 2100 encountered error(s) loading game data:" -msgstr "" +msgstr "Warzone 2100 encontrou erro(s) ao carregar dados do jogo:" msgid "Please try removing any new mods - they may have issues or be incompatible with this version." -msgstr "" +msgstr "Por favor, tente remover quaisquer novos mods - eles podem ter problemas ou ser incompatíveis com essa versão." msgid "Loaded mod(s):" -msgstr "" +msgstr "Mod(s) carregado(s):" msgid "Base game files may be corrupt or outdated - please try reinstalling the game." -msgstr "" +msgstr "Arquivos do jogo base podem estar corrompidos ou desatualizados — por favor, tente reinstalar o jogo." msgid "Error Loading Game Data" -msgstr "" +msgstr "Erro ao carregar dados do jogo" msgid "Global Hotkeys" msgstr "Atalhos Globais" @@ -9345,7 +9345,7 @@ msgstr "Exibição de caminho ativado." #, c-format msgid "Player %d: %d power" -msgstr "" +msgstr "Jogador %d: %d força" msgid "Ouch! Droid's health is down 20%!" msgstr "Ai! Integridade do droide abaixou em 20%!" @@ -9386,10 +9386,10 @@ msgid "Power overwhelming" msgstr "Energia avassaladora" msgid "A power fantasy!" -msgstr "" +msgstr "Uma fantasia de poder!" msgid "Taking things easy!" -msgstr "" +msgstr "Levando as coisas com calma!" msgid "Back to normality!" msgstr "Voltar a normalidade!" @@ -9398,7 +9398,7 @@ msgid "Getting tricky!" msgstr "Está ficando complicado!" msgid "In a nightmare!" -msgstr "" +msgstr "Em um pesadelo!" msgid "Twice as nice!" msgstr "Duas vezes mais agradável!" @@ -9555,10 +9555,10 @@ msgid "Unable to locate HQ!" msgstr "Impossível localizar QG!" msgid "Formation speed limiting ON" -msgstr "" +msgstr "Limite de velocidade de formação ATIVADO" msgid "Formation speed limiting OFF" -msgstr "" +msgstr "Limite de Formação DESLIGADO" msgid "Vertical rotation direction: Normal" msgstr "Direção da rotação vertical: Normal" @@ -9605,13 +9605,13 @@ msgid "Radar showing height" msgstr "Radar exibe altitudes" msgid "Asserts turned off" -msgstr "" +msgstr "Asserts turned off" msgid "QuickSave not allowed for multiplayer or tutorial games" msgstr "O salvamento rápido não é permitido para partidas de multijogador ou tutorial" msgid "QuickSave not allowed in Autosaves-Only mode" -msgstr "" +msgstr "Salvamento rápido não é permitido no modo Autosaves-Only" msgid "QuickSave failed" msgstr "O salvamento rápido falhou" @@ -9620,7 +9620,7 @@ msgid "QuickLoad not allowed for multiplayer or tutorial games" msgstr "O carregamento rápido não é permitido para partidas de multijogador ou tutorial" msgid "QuickLoad not allowed in Autosaves-Only mode" -msgstr "" +msgstr "Carregamento rápido não é permitido no modo Autosaves-Only" msgid "QuickSave file does not exist yet" msgstr "O arquivo de salvamento rápido ainda não existe" @@ -10040,10 +10040,10 @@ msgid "Alt Name:" msgstr "Nome Alternativo:" msgid "Player rating:" -msgstr "" +msgstr "Classificação do jogador:" msgid "Host provided" -msgstr "" +msgstr "Anfitrião fornecido" #, c-format msgid "From: %s" @@ -10089,19 +10089,19 @@ msgid "Kicked from game" msgstr "Expulso do jogo" msgid "The host has disabled free chat. Please use Quick Chat." -msgstr "" +msgstr "O host desativou o chat gratuito. Por favor, use o Chat Rápido." msgid "Quick Chat" msgstr "Chat Rápido" msgid "Press the Tab key to open Quick Chat." -msgstr "" +msgstr "Pressione a tecla Tab para abrir o Chat Rápido." msgid "The host has disabled free chat. Please use Quick Chat or /hostmsg commands." -msgstr "" +msgstr "O host desativou o chat gratuito. Use comandos Chat Rápido ou /hostmsg." msgid "The host has enabled free chat for you." -msgstr "" +msgstr "O host ativou o chat livre para você." msgid "Copy Text to Clipboard" msgstr "Copiar Texto para a Área de Transferência" @@ -10153,11 +10153,11 @@ msgstr "O Hosp. iniciou o Jogo" #, c-format msgid "Host: Free chat enabled for: %s" -msgstr "" +msgstr "Servidor: Bate-papo livre ativado para: %s" #, c-format msgid "Host: Free chat muted for: %s" -msgstr "" +msgstr "Servidor: Bate-papo livre silenciado para: %s" #, c-format msgid "Moving %s to Spectators!" @@ -10174,7 +10174,7 @@ msgid "Host supplied invalid options" msgstr "Opções de host fornecidas inválidas" msgid "Host supplied invalid host config" -msgstr "" +msgstr "Host forneceu configuração de host inválida" msgid "You have been kicked: " msgstr "Você foi expulso: " @@ -10214,17 +10214,17 @@ msgid "Port mapping disabled by user. Autoconfig of port %d will not happen." msgstr "Mapeamento de portas desabilitado pelo usuário. Configuração automática da porta %d não vai acontecer." msgid "Failed to load challenge:" -msgstr "" +msgstr "Falha ao carregar o desafio:" msgid "Failed to load the challenge's map or config" -msgstr "" +msgstr "Falha ao carregar o mapa ou configuração do desafio" msgid "Failed to process autohost config:" -msgstr "" +msgstr "Falha ao processar configuração de autohost:" #, c-format msgid "Failed to load the autohost map or config from: %s" -msgstr "" +msgstr "Falha ao carregar o mapa ou configuração do host de: %s" msgid "Closed" msgstr "Fechado" @@ -10365,7 +10365,7 @@ msgid "Give Power To Player" msgstr "Fornecer Energia" msgid "Toggle Chat Mute" -msgstr "" +msgstr "Ativar/desativar chat" msgid "Sent/Received per sec —" msgstr "Env./Receb. por seg. —" @@ -10393,26 +10393,26 @@ msgstr "Estratégia de Equipe" #, c-format msgid "Changed structure limits [%d]:" -msgstr "" +msgstr "Limite de estrutura alterado [%d]:" #, c-format msgid "[%d] Limit [%s]: %u (default: %u)" -msgstr "" +msgstr "[%d] Limite [%s]: %u (padrão: %u)" #, c-format msgid "[%d] Limit [%s]: %u (default: no limit)" -msgstr "" +msgstr "[%d] Limite [%s]: %u (padrão: ilimitado)" #, c-format msgid "[%d] Limit that is bigger than numStructureStats (%u): %u" -msgstr "" +msgstr "[%d] O limite é maior que numStructureStats (%u): %u" msgid "Limits were reset to default." msgstr "Limites redefinidos para o padrão." #, c-format msgid "Host initialized %u limits, unable to show them due to mods" -msgstr "" +msgstr "Hospedar limites %u inicializados, incapaz de mostrá-lo por causa de mods" msgid "MAP REQUESTED!" msgstr "MAPA SOLICITADO!" @@ -10427,18 +10427,18 @@ msgid "Warning, HOST has altered the game code, and can't be trusted!" msgstr "Atenção, o HOSPEDEIRO alterou seu código de jogo, e não é confiável!" msgid "The host has enabled free chat for everyone." -msgstr "" +msgstr "O host ativou o bate-papo livre para voc." msgid "The host has muted free chat for everyone." -msgstr "" +msgstr "O anfitrião silenciou o bate-papo gratuito para todos." #, c-format msgid "The host has enabled free chat for player: %s" -msgstr "" +msgstr "O anfitrião ativou o bate-papo gratuito para o jogador: %s" #, c-format msgid "The host has muted free chat for player: %s" -msgstr "" +msgstr "O anfitrião silenciou o bate-papo gratuito para o jogador: %s" #, c-format msgid "Kicking player %s, because they tried to bypass data integrity check!" @@ -10731,10 +10731,10 @@ msgid "You cheated!" msgstr "Você trapaceou!" msgid "Use Quick Chat to chat with other players." -msgstr "" +msgstr "Use o bate-papo rápido para conversar com outros jogadores." msgid "The host has disabled free chat." -msgstr "" +msgstr "O anfitrião desativou o bate-papo gratuito." msgid "Chat: All" msgstr "Chat: Todos" @@ -10743,7 +10743,7 @@ msgid "Chat: Team" msgstr "Chat: Time" msgid "Did not send message - free chat is disabled by host. Please use Quick Chat." -msgstr "" +msgstr "Mensagem não enviada - o bate-papo gratuito foi desativado pelo anfitrião. Por favor, use o bate-papo rápido." msgid "See Also:" msgstr "Veja também:" @@ -10755,7 +10755,7 @@ msgid "Toggle Sidebar" msgstr "Alterne a barra lateral" msgid "Disable Topic Pop-ups" -msgstr "" +msgstr "Desativar Popups de Tópicos" msgid "Close Help Mode" msgstr "Fechar Modo de Ajuda" @@ -10827,32 +10827,32 @@ msgid "Connection Error" msgstr "Erro de conexão" msgid "No connections available" -msgstr "" +msgstr "Nenhuma conexão disponível" msgid "Synchronizing data with host ..." -msgstr "" +msgstr "Sincronizando dados com o host ..." msgid "Host did not respond before timeout" -msgstr "" +msgstr "O anfitrião não respondeu no tempo limite" #, c-format msgid "Failed to open connection: [%d] %s" -msgstr "" +msgstr "Falha ao abrir a conexão: [%d] %s" msgid "Establishing connection with host" -msgstr "" +msgstr "Estabelecendo conexão com o host" msgid "An internal error occurred" -msgstr "" +msgstr "Ocorreu um erro interno" msgid "Invalid host - disconnected" -msgstr "" +msgstr "Host inválido - desconectado" msgid "Invalid host response" -msgstr "" +msgstr "Resposta de host inválida" msgid "Requesting to join game" -msgstr "" +msgstr "Solicitando para entrar no jogo" msgid "Kick Spectator" msgstr "Expulsar espectador" @@ -10906,13 +10906,13 @@ msgid "Current Power / Power Per Second" msgstr "Poder atual / Poder por segundo" msgid "PwrLost" -msgstr "" +msgstr "PwrPerdeu" msgid "PwrWon" -msgstr "" +msgstr "PwrGanhou" msgid "Lab Use" -msgstr "" +msgstr "Uso do Laboratório" msgid "Kinetic Armor" msgstr "Armadura Cinética" @@ -10936,49 +10936,49 @@ msgid "Energy" msgstr "Energia" msgid "Gauss" -msgstr "" +msgstr "Gauss" msgid "Flame" -msgstr "" +msgstr "Chama" msgid "Howitzers" -msgstr "" +msgstr "Howitzers" msgid "MG" -msgstr "" +msgstr "Metralhadora" msgid "Machine Guns" -msgstr "" +msgstr "Metralhadoras" msgid "Electronic" -msgstr "" +msgstr "Eletrônico" msgid "A-A" -msgstr "" +msgstr "Antiaéreo" msgid "Anti-Air" -msgstr "" +msgstr "Antiaéreo" msgid "Slow Missile" -msgstr "" +msgstr "Míssil Lento" msgid "Slow Rocket" -msgstr "" +msgstr "Foguete Lento" msgid "Las-Sat" -msgstr "" +msgstr "Satélite Laser" msgid "Laser Satellite" -msgstr "" +msgstr "Satélite Laser" msgid "Bombs" -msgstr "" +msgstr "Bombas" msgid "Command" -msgstr "" +msgstr "Comando" msgid "EMP" -msgstr "" +msgstr "Pulso elétromagnético" msgid "Can't build any more units, Unit Limit Reached — Production Halted" msgstr "Não é possível construir mais unidades, Limite de Unidades Alcançado - Produção Interrompida" @@ -10996,7 +10996,7 @@ msgid "Can't build any more \"%s\", Construction Unit Limit Reached — Producti msgstr "Não é possível construir mais \"%s\", Limite de Unidades Atingido - Produção Interrompida" msgid "Laser Satellite is ready to fire!" -msgstr "" +msgstr "O Satélite Laser está pronto para disparar!" #, c-format msgid "%s - %u Unit assigned - Hitpoints %d/%d" @@ -11006,7 +11006,7 @@ msgstr[1] "%s - %u Unidades designada - Dano %d/%d" #, c-format msgid "ID %d - sensor range %d - ECM %d" -msgstr "" +msgstr "ID %d - alcânce do sensor %d - ECM %d" #, c-format msgid "%s - %u Unit assigned - Damage %d/%d" @@ -11020,15 +11020,15 @@ msgstr "%s - Dano %d/%d" #, c-format msgid "ID %d - armour %d|%d - sensor range %d - ECM %d - born %u - depth %.02f" -msgstr "" +msgstr "ID %d - armadura %d·%d - alcance do sensor %d - ECM %d - nascido %u - profundidade %.02f" #, c-format msgid "ID %d - State %d" -msgstr "" +msgstr "ID %d - Estado %d" #, c-format msgid "ID %d - %s" -msgstr "" +msgstr "ID %d - %s" #, c-format msgid "%s - Connected %u of %u - Hitpoints %d/%d" @@ -11036,23 +11036,23 @@ msgstr "%s - %u de %u conectados - Dano %d/%d" #, c-format msgid "ID %u - Multiplier: %u" -msgstr "" +msgstr "ID %u - Multiplicador: %u" #, c-format msgid "ID %u - Production Output: %u - BuildPointsRemaining: %u - Resistance: %d / %d" -msgstr "" +msgstr "ID %u - Saída de Produção: %u - PontosDeConstruçãoRestantes: %u - Resistência: %d / %d" #, c-format msgid "ID %u - Research Points: %u" -msgstr "" +msgstr "ID %u - Pontos de Pesquisa: %u" #, c-format msgid "tile %d,%d - target %s" -msgstr "" +msgstr "tile %d,%d - target %s" #, c-format msgid "ID %u - sensor range %d - ECM %d" -msgstr "" +msgstr "ID %u - alcânce do sensor %d - ECM %d" #, c-format msgid "%s - Electronically Damaged" @@ -11083,105 +11083,105 @@ msgid "Classic" msgstr "Clássico" msgid "Additional Campaigns" -msgstr "" +msgstr "Campanhas Adicionais" msgid "Start Game" -msgstr "" +msgstr "Jogar" msgid "Tweak Options:" -msgstr "" +msgstr "Opções de ajustes:" msgid "Reset to Defaults" -msgstr "" +msgstr "Redefinir padrões" msgid "Command the forces of The Project in a battle to rebuild the world" -msgstr "" +msgstr "Comanda as forças do O Projeto em uma batalha para reconstruir o mundo" msgid "Warzone 2100 Universe" -msgstr "" +msgstr "Warzone 2100 Universe" msgid "WZ2100 Extended Universe" -msgstr "" +msgstr "WZ2100 Universo Estendido" msgid "Unique Universe" -msgstr "" +msgstr "Universo único" #, c-format msgid "Requires %s" -msgstr "" +msgstr "Precisa de %s" msgid "Compatible" -msgstr "" +msgstr "Compatível" #, c-format msgid "Compatible %s" -msgstr "" +msgstr "Compatível %s" msgid "Timer Power Bonus" -msgstr "" +msgstr "Bônus de Poder Temporizador" msgid "Grant power based on the remaining level timer, so there's no need to wait out the clock." -msgstr "" +msgstr "Conceder energia com base no tempo sobrando, então não precisa de esperar o tempo acabar." msgid "Classic Timers" -msgstr "" +msgstr "Temporizadores Clássicos" msgid "Alter / disable timers on specific levels, like the original release. (Allows power-cheating.)" -msgstr "" +msgstr "Alterar / desativar temporizadores em níveis específicos, como o lançamento original. (Permite trapaça de energia.)" msgid "40 Unit Limit" -msgstr "" +msgstr "Limite de 40 unidades" msgid "Lower the player's unit limit to 40, matching the original PS1 release." -msgstr "" +msgstr "Diminuir o limite de unidades do jogador para 40, assim como na versão original do PS1." msgid "Autosaves-Only" -msgstr "" +msgstr "Autosaves-Only" msgid "Disable the ability to manually save / quick-save, limit autosaves to the beginning of each level." -msgstr "" +msgstr "Desabilita a capacidade de salvar manualmente / salvar rapidamente, limita o salvamento automático ao início de cada nível." msgid "PS1 Modifiers" -msgstr "" +msgstr "Modificadores PS1" msgid "Reduces the damage the enemy deals to a third of the current difficulty modifier." -msgstr "" +msgstr "Reduz o dano que o inimigo lida a um terço da atual dificuldade do modificador." msgid "A more relaxed playthrough - easier than easy" -msgstr "" +msgstr "Uma brincadeira mais tranquila — mais fácil do que fácil" msgid "A slightly easier challenge than Normal" -msgstr "" +msgstr "Um desafio um pouco mais fácil do que o Normal" msgid "A fun & challenging experience" -msgstr "" +msgstr "Uma experiência divertida e desafiadora" msgid "A challenge for players who have beaten the game" -msgstr "" +msgstr "Um desafio para jogadores que tenham vencido o jogo" msgid "An unforgiving challenge for experienced players only" -msgstr "" +msgstr "Um desafio imperdoável apenas para jogadores experientes" msgid "\"Classic\" campaign balance" -msgstr "" +msgstr "Balanço da campanha \"Clássica\"" msgid "Remastered" -msgstr "" +msgstr "Remasterizado" msgid "The remastered campaign experience" -msgstr "" +msgstr "A experiência de campanha remasterizada" msgid "Difficulty:" -msgstr "" +msgstr "Dificuldade:" msgid "Balance:" -msgstr "" +msgstr "Saldo:" msgid "Start at:" -msgstr "" +msgstr "Iniciar em:" msgid "Tweaks:" -msgstr "" +msgstr "Ajustes:" msgid "CAMPAIGNS" msgstr "CAMPANHAS" @@ -11322,7 +11322,7 @@ msgstr "Foi detectado um problema que pode afetar a operação / desempenho do W #, c-format msgid "(Notice ID: %s)" -msgstr "" +msgstr "(ID de Aviso: %s)" msgid " (modified locally)" msgstr " (modificado localmente)" diff --git a/po/ru.po b/po/ru.po index 44affbb54e9..510dbce0ac8 100644 --- a/po/ru.po +++ b/po/ru.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" "POT-Creation-Date: 2024-09-11 19:20+0000\n" -"PO-Revision-Date: 2024-09-11 19:59\n" +"PO-Revision-Date: 2024-09-18 02:24\n" "Last-Translator: \n" "Language-Team: Russian\n" "Language: ru_RU\n" @@ -1800,7 +1800,7 @@ msgid "Destroy the Nexus HQ to disable the Nexus Intruder Program" msgstr "Уничтожьте командный центр, чтобы остановить программу вторжения НЕКСУС" msgid "Warning: HQ shielded against VTOL attacks" -msgstr "" +msgstr "Внимание: Командный центр защищен от воздушных атак" msgid "Research resistance circuits and survive the assault from Nexus" msgstr "Исследуйте схемы сопротивления и выживите от нападения НЕКСУС" @@ -2940,7 +2940,7 @@ msgid "System locale" msgstr "Системный язык" msgid "Failed to create port mapping" -msgstr "Не удалось назначить внешний порт" +msgstr "Не удалось создать переадресацию портов" #, c-format msgid "Manually configure your router/firewall to open port %d!" @@ -2955,7 +2955,7 @@ msgid "Your external IP is: %s" msgstr "Ваш внеший IP-адрес: %s" msgid "Failed to create port mapping (timeout)" -msgstr "" +msgstr "Не удалось создать переадресацию портов (таймаут)" msgid "Client failed to ack player index swap" msgstr "Клиент не подтвердил смену индекса игрока" diff --git a/po/sk.po b/po/sk.po index c3d5cf8fc6a..42d8b5d8e81 100644 --- a/po/sk.po +++ b/po/sk.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" "POT-Creation-Date: 2024-09-11 19:20+0000\n" -"PO-Revision-Date: 2024-09-11 19:59\n" +"PO-Revision-Date: 2024-09-26 02:28\n" "Last-Translator: \n" "Language-Team: Slovak\n" "Language: sk_SK\n" @@ -51,16 +51,16 @@ msgid "The New Paradigm control superior weapons technology." msgstr "Nová Paradigma vlastní technológiu špičkových zbraní." msgid "They may have the synaptic link technology, it's vital we retrieve it." -msgstr "Môžu mať technológiu pre synaptické spojenia, jej získanie je zásadné." +msgstr "Môžu mať technológiu synaptických spojení, jej získanie je zásadné." msgid "TRANSPORT MISSION: Locate and Recover Artifacts" msgstr "PREPRAVNÁ MISIA: Nájdi a získaj artefakty" msgid "Load an attack force into the transport." -msgstr "Naložte úločné sily do transportu." +msgstr "Naložte útočné sily do transportu." msgid "On landing, explore the ruins and recover any artifacts." -msgstr "Po pristání skontrolujte ruiny a získajte všetky artefakty." +msgstr "Po pristátí skontrolujte ruiny a získajte všetky artefakty." msgid "TRANSPORT MISSION: Investigate Research Center" msgstr "PREPRAVNÁ MISIA: Preskúmajte výskumné stredisko" @@ -645,10 +645,10 @@ msgid "Before NEXUS was expelled, we intercepted this message - Decoding complet msgstr "Pred vyhnaním NEXUS sme zachytili túto správu – Dekódovanie kompletné." msgid "A NEXUS task force is heading for these coordinates." -msgstr "" +msgstr "Útočný oddiel NEXUS smeruje na tieto súradnice." msgid "You have an opportunity to destroy NEXUS before they get there." -msgstr "" +msgstr "Máš príležitosť zničiť NEXUS pred tým, než sa tam dostanú." msgid "Take an attack force and ambush NEXUS task force at ....... the ......." msgstr "" @@ -729,19 +729,19 @@ msgid "Missile silos captured." msgstr "Raketové silá obsadené." msgid "NORTHERN SECTOR MISSION: Missile Codes" -msgstr "" +msgstr "MISIA SEVERNÉHO SEKTORA: Raketové kódy" msgid "Commander, there are missiles present at the silos." -msgstr "" +msgstr "Veliteľ, v silách sa nachádzajú rakety." msgid "Nexus is preventing us from accessing the missile control code." -msgstr "" +msgstr "Nexus nám bráni v prístupe ku kontrolnému kódu rakety." msgid "NEXUS is present in our systems." msgstr "NEXUS sa nachádza v našich systémoch." msgid "To defeat NEXUS we must research the Nexus Intruder Program." -msgstr "" +msgstr "Pre porazenie NEXUS musíme vyskúmať program narušiteľ Nexus." msgid "Assign this task to a research facility." msgstr "Priraď túto úlohu výskumnému stredisku." @@ -750,52 +750,52 @@ msgid "NEXUS forces detected at these locations." msgstr "Jednotky NEXUS boli detegované na týchto miestach." msgid "NEXUS has been eradicated from all Project systems." -msgstr "NEXUS bol odstránený zo všetkých systémov projeku." +msgstr "NEXUS bol odstránený zo všetkých systémov projektu." msgid "We are attempting to access the missile control codes." msgstr "Pokúšame sa získať prístup ku kontrolným kódom strely." msgid "A research facility is required to crack the code. Allocate one immediately." -msgstr "" +msgstr "Na prelomenie kódu je vyžadované výskumné stredisko. Okamžite jedno vyhraď." msgid "Protect the missile silos from NEXUS attacks." msgstr "Ochráň raketové silá pred útokmi NEXUS." msgid "PROJECT UPDATE: 1st Level Missile Code Cracked." -msgstr "" +msgstr "AKTUALIZÁCIA PROJEKTU: Prelomený raketový kód prvej úrovne." msgid "Missile arming in progress." -msgstr "" +msgstr "Aktivovanie rakety prebieha." msgid "More research is required to proceed further." -msgstr "" +msgstr "Pre ďalší postup je potrebný ďalší výskum." msgid "PROJECT UPDATE: 2nd Level Missile Code Cracked." -msgstr "" +msgstr "AKTUALIZÁCIA PROJEKTU: Prelomený raketový kód druhej úrovne." msgid "Missile target programming in progress." -msgstr "" +msgstr "Prebieha programovanie cieľa raketového útoku." msgid "Once level 3 codes are cracked we initiate launch procedures." -msgstr "" +msgstr "Po prelomení kódov úrovne 3 zahájime procedúry odpaľovacie procedúry." msgid "PROJECT UPDATE: 3rd Level Missile Code Cracked." -msgstr "" +msgstr "AKTUALIZÁCIA PROJEKTU: Prelomený raketový kód tretej úrovne." msgid "Missile launch sequence initiated." -msgstr "" +msgstr "Zahájená sekvencia odpálenia rakety." msgid "TRANSPORT MISSION: Attack NEXUS Final Base" msgstr "" msgid "We have located NEXUS' base at this location." -msgstr "" +msgstr "Na tomto mieste sme lokalizovali základňu NEXUS." msgid "This area contains numerous NEXUS structures." -msgstr "" +msgstr "Táto oblasť obsahuje množstvo budov NEXUS." msgid "We are certain that NEXUS's core systems are located here." -msgstr "" +msgstr "Sme si istí, že sa tu nachádzajú hlavné systémy NEXUS." msgid "Establish an LZ." msgstr "Založte MV." @@ -807,7 +807,7 @@ msgid "Incoming intelligence report... Team Gamma" msgstr "" msgid "Briefing Commences:" -msgstr "" +msgstr "Brífing začína:" msgid "Scavenger Outpost" msgstr "" @@ -867,7 +867,7 @@ msgid "Naval" msgstr "Námorné" msgid "Repair Center" -msgstr "" +msgstr "Opravárenské centrum" msgid "Tornado AA Flak Site" msgstr "" @@ -7526,10 +7526,10 @@ msgid "Videos are missing, download them from http://wz2100.net" msgstr "" msgid "Continue Last Save" -msgstr "" +msgstr "Pokračovať v poslednej uloženej pozícii" msgid "No last save available" -msgstr "" +msgstr "Nie je dostupná žiadna posledná uložená pozícia" msgid "Quit Game" msgstr "Ukončiť Hru" @@ -7538,13 +7538,13 @@ msgid "MAIN MENU" msgstr "HLAVNÉ MENU" msgid "Official site: http://wz2100.net/" -msgstr "" +msgstr "Oficiálna stránka: http://wz2100.net/" msgid "Come visit the forums and all Warzone 2100 news! Click this link." -msgstr "" +msgstr "Prídi navštíviť fóra a všetky novinky ohľadom Warzone 2100! Klikni na odkaz." msgid "Donate: http://donations.wz2100.net/" -msgstr "" +msgstr "Prispej: http://donations.wz2100.net/" msgid "Help support the project with our server costs, Click this link." msgstr "" @@ -7666,22 +7666,22 @@ msgid "Failed to open configuration directory" msgstr "" msgid "1×" -msgstr "" +msgstr "1×" msgid "2×" -msgstr "" +msgstr "2×" msgid "Fullscreen" msgstr "Celá obrazovka" msgid "Unsupported" -msgstr "" +msgstr "Nepodporované" msgid "Off" msgstr "Vypnuté" msgid "50%" -msgstr "" +msgstr "50%" msgid "Black" msgstr "Čierna" @@ -7690,7 +7690,7 @@ msgid "On" msgstr "Zapnuté" msgid "Per Pixel" -msgstr "" +msgstr "Na pixel" msgid "Lightmap" msgstr "" @@ -7833,22 +7833,22 @@ msgid "Graphics Mode" msgstr "" msgid "Resolution" -msgstr "" +msgstr "Rozlíšenie" msgid "Display Scale" -msgstr "" +msgstr "Škála zobrazenia" msgid "Adaptive" -msgstr "" +msgstr "Adaptívne" msgid "Windowed" -msgstr "" +msgstr "V okne" msgid "Desktop Full" -msgstr "" +msgstr "Plný desktop" msgid "On (Fullscreen)" -msgstr "" +msgstr "Zapnuté (Celá obrazovka)" msgid "Texture size" msgstr "Veľkosť textúry" @@ -10507,7 +10507,7 @@ msgid "Bright blue" msgstr "Svetlomodrá" msgid "Neon green" -msgstr "Neónovo zelená" +msgstr "Neónová zelená" msgid "Infrared" msgstr "Infračervená" @@ -10789,10 +10789,10 @@ msgid "Unable to Join Game" msgstr "" msgid "Error:" -msgstr "" +msgstr "Chyba:" msgid "Join Attempt Rejected" -msgstr "" +msgstr "Pokus o pripojenie odmietnutý" msgid "Message from Host:" msgstr "" @@ -10967,7 +10967,7 @@ msgid "Command" msgstr "" msgid "EMP" -msgstr "" +msgstr "EMP" msgid "Can't build any more units, Unit Limit Reached — Production Halted" msgstr "" @@ -10985,7 +10985,7 @@ msgid "Can't build any more \"%s\", Construction Unit Limit Reached — Producti msgstr "" msgid "Laser Satellite is ready to fire!" -msgstr "" +msgstr "Laserový satelit je pripravený na paľbu!" #, c-format msgid "%s - %u Unit assigned - Hitpoints %d/%d" @@ -11079,7 +11079,7 @@ msgid "Additional Campaigns" msgstr "" msgid "Start Game" -msgstr "" +msgstr "Začať hru" msgid "Tweak Options:" msgstr "" @@ -11289,7 +11289,7 @@ msgid "There is not enough room in the Transport!" msgstr "" msgid "Reinforcements landing" -msgstr "Pristály posily" +msgstr "Pristáli posily" msgid "Update Available" msgstr "" @@ -11321,7 +11321,7 @@ msgid " (modified locally)" msgstr "" msgid " - DEBUG" -msgstr "- LADENIE" +msgstr " - LADENIE" #, c-format msgid "Version: %s,%s Built: %s%s" diff --git a/po/zh_CN.po b/po/zh_CN.po index 402740fc01f..b208ebc4cac 100644 --- a/po/zh_CN.po +++ b/po/zh_CN.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" "POT-Creation-Date: 2024-09-11 19:20+0000\n" -"PO-Revision-Date: 2024-09-11 19:59\n" +"PO-Revision-Date: 2024-10-07 02:29\n" "Last-Translator: \n" "Language-Team: Chinese Simplified\n" "Language: zh_CN\n" @@ -906,7 +906,7 @@ msgid "Bunker Blaster Cyborg" msgstr "半机械人 (“碉堡终结者”) " msgid "Jump Bunker Blaster" -msgstr "跳跃半机械人 (”碉堡终结者“) " +msgstr "跳跃半机械人 (“碉堡终结者”)" msgid "Jump Heavy Gunner" msgstr "跳跃半机械人 (重炮手)" @@ -1800,7 +1800,7 @@ msgid "Destroy the Nexus HQ to disable the Nexus Intruder Program" msgstr "摧毁“枢纽”总部,停止“枢纽”入侵程序" msgid "Warning: HQ shielded against VTOL attacks" -msgstr "" +msgstr "警告:总部做足了抵抗 VTOL 攻击的防御措施" msgid "Research resistance circuits and survive the assault from Nexus" msgstr "研究抗干扰电路并抵御“枢纽”的攻击" @@ -2016,7 +2016,7 @@ msgid "Dawn, July 4th, 2100" msgstr "2100 年 7 月 4 日 黎明" msgid "Project HQ" -msgstr "项目总部" +msgstr "“工程”总部" msgid "A New Era" msgstr "新时代" @@ -2828,7 +2828,7 @@ msgid "Player" msgstr "玩家" msgid "Lost due to being inactive / playing passively." -msgstr "由于未活跃/采取被动玩法而失败。" +msgstr "由于挂机/采取被动玩法而失败。" msgid "Host-configured game time limit is approaching. If there is no winner within 10 minutes, the game will end." msgstr "主机设定的游戏时间限制即将到达。如果在10分钟内没有决出胜负,游戏将结束。" @@ -2957,7 +2957,7 @@ msgid "Your external IP is: %s" msgstr "您的外部 IP 地址是: %s" msgid "Failed to create port mapping (timeout)" -msgstr "" +msgstr "创建端口映射失败 (超时)" msgid "Client failed to ack player index swap" msgstr "客户端未能确认玩家索引交换。" @@ -6762,7 +6762,7 @@ msgid "VTOL Bunker Buster Scorpion VTOL" msgstr "毒蝎 VTOL (“碉堡终结者”)" msgid "VTOL Bunker Buster" -msgstr "VTOL ”碉堡终结者“" +msgstr "VTOL “碉堡终结者”" msgid "VTOL Cannon" msgstr "VTOL 轻型加农炮" @@ -6837,16 +6837,16 @@ msgid "VTOL III" msgstr "VTOL 三型" msgid "VTOL Lancer Bug VTOL" -msgstr "毒虫 VTOL (”枪骑兵“火箭)" +msgstr "毒虫 VTOL (“枪骑兵”火箭)" msgid "VTOL Lancer Mantis VTOL" msgstr "螳螂VTOL (枪骑兵火箭) " msgid "VTOL Lancer Scorpion VTOL" -msgstr "毒蝎 VTOL (”枪骑兵“火箭)" +msgstr "毒蝎 VTOL (“枪骑兵”火箭)" msgid "VTOL Lancer" -msgstr "VTOL ”枪骑兵“" +msgstr "VTOL “枪骑兵”" msgid "VTOL Machinegun Scav" msgstr "VTOL (拾荒者机枪)" @@ -8391,7 +8391,7 @@ msgid "Transfer Request: Trucks" msgstr "传输请求:工程车" msgid "Attacking now!" -msgstr "现在攻击!" +msgstr "正在攻击!" msgid "On my way!" msgstr "我来了!" @@ -8442,7 +8442,7 @@ msgid "Capture oil resources" msgstr "夺取石油资源" msgid "That didn't go well..." -msgstr "那不太好..." +msgstr "大事不妙……" msgid "I have another plan" msgstr "我有另一个计划" @@ -8890,7 +8890,7 @@ msgid "Rotate Building Anticlockwise" msgstr "逆时针旋转建筑" msgid "Center View on HQ" -msgstr "视角移至主基地" +msgstr "视图移至指挥中心" msgid "Hold Fire" msgstr "停火" @@ -8908,7 +8908,7 @@ msgid "Guard Position" msgstr "警戒位置" msgid "Return to HQ" -msgstr "返回主基地" +msgstr "返回指挥中心" msgid "Hold Position" msgstr "保持原位" @@ -9289,7 +9289,7 @@ msgid "PAUSED" msgstr "已暂停" msgid "New Intelligence Report" -msgstr "新的智能情报" +msgstr "新的情报报告" msgid "Research Update" msgstr "研发升级" @@ -9304,7 +9304,7 @@ msgid "Fire-At-Will" msgstr "接触时开火" msgid "Return To HQ" -msgstr "回到主基地" +msgstr "返回指挥中心" msgid "Recycle" msgstr "回收" @@ -9545,10 +9545,10 @@ msgid "Reveal ON" msgstr "打开全图视野" msgid "Centered on player HQ, direction NORTH" -msgstr "视角移至主基地,面向北方" +msgstr "视角移至指挥中心,面向北方" msgid "Unable to locate HQ!" -msgstr "无法定位至主基地" +msgstr "无法定位到指挥中心!" msgid "Formation speed limiting ON" msgstr "队形速度限制打开" @@ -9787,7 +9787,7 @@ msgid "" "Can be blocked by players' votes" msgstr "" "选择地图\n" -"可以玩家投票决定" +"可以通过玩家投票阻止" msgid "Map-Mod!" msgstr "地图模组!" @@ -10027,16 +10027,16 @@ msgid "Click to close spectator slot" msgstr "点击关闭旁观者栏位" msgid "Player ID: " -msgstr "玩家ID: " +msgstr "玩家 ID: " msgid "(none)" msgstr "(无)" msgid "Alt Name:" -msgstr "备选名称:" +msgstr "备选名称:" msgid "Player rating:" -msgstr "玩家评分:" +msgstr "玩家评分:" msgid "Host provided" msgstr "主机提供" @@ -10429,11 +10429,11 @@ msgstr "主机已禁止所有人自由聊天。" #, c-format msgid "The host has enabled free chat for player: %s" -msgstr "主机已允许玩家自由聊天:%s" +msgstr "主机已允许 %s 玩家自由聊天" #, c-format msgid "The host has muted free chat for player: %s" -msgstr "主机已禁止玩家自由聊天:%s" +msgstr "主机已禁止 %s 玩家自由聊天" #, c-format msgid "Kicking player %s, because they tried to bypass data integrity check!" @@ -10536,11 +10536,11 @@ msgstr "%s (%d) 允许地图更改。总计: %d/%d" #, c-format msgid "A player voted FOR kicking: %s" -msgstr "一个玩家支持踢:%s" +msgstr "一个玩家支持踢出:%s" #, c-format msgid "A player voted AGAINST kicking: %s" -msgstr "一个玩家反对踢:%s" +msgstr "一个玩家反对踢出:%s" #, c-format msgid "A player's client ignored your vote to kick request (too frequent): %s" @@ -10561,7 +10561,7 @@ msgstr "开始投票把 %s 踢出游戏。" #, c-format msgid "Vote To Kick: %s" -msgstr "投票踢出: %s" +msgstr "投票踢出:%s" #, c-format msgid "Should player %s be kicked from the game?" @@ -10856,7 +10856,7 @@ msgid "Kick Player" msgstr "踢出玩家" msgid "Loading Status:" -msgstr "加载状态:" +msgstr "加载状态:" msgid "TEAM STRATEGY" msgstr "队伍策略" From f76db45a611e0de439c845749bd76414681b324e Mon Sep 17 00:00:00 2001 From: past-due <30942300+past-due@users.noreply.github.com> Date: Tue, 29 Oct 2024 20:27:53 -0400 Subject: [PATCH 09/38] Update sentry-native to 0.7.11 --- .sentrynative | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.sentrynative b/.sentrynative index 6804359cb32..efe4354a132 100644 --- a/.sentrynative +++ b/.sentrynative @@ -1,2 +1,2 @@ -URL=https://github.com/getsentry/sentry-native/releases/download/0.7.9/sentry-native.zip -SHA512=04b9df74d87a9197089cef78463d9da9533eec2d2e63c427489202aa6c2285914046691fbb12e6a0f0517ac425ee5bd2a89e05a5a66bd00f71e391c487ef0bf1 +URL=https://github.com/getsentry/sentry-native/releases/download/0.7.11/sentry-native.zip +SHA512=eaa340a394ad833f37fc1db7ca226fc1eabe3a6a9628bef312edc105b3bfbdf9721e604d50d01fcbc30305fa9e384b9019de220e0b0f44e95f470358eb4e481d From 2ff29ec7d2a22376bd72c01a52af5e6157fac5e7 Mon Sep 17 00:00:00 2001 From: past-due <30942300+past-due@users.noreply.github.com> Date: Tue, 29 Oct 2024 20:35:09 -0400 Subject: [PATCH 10/38] FetchSentryCLI.cmake: Bump to 2.38.0 --- .ci/githubactions/FetchSentryCLI.cmake | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.ci/githubactions/FetchSentryCLI.cmake b/.ci/githubactions/FetchSentryCLI.cmake index f282c9f3303..066d503d854 100644 --- a/.ci/githubactions/FetchSentryCLI.cmake +++ b/.ci/githubactions/FetchSentryCLI.cmake @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.19...3.30) -set(sentry_cli_version "2.32.1") # Note: When updating, must also update all of the sentry_cli_dl_sha512 below! +set(sentry_cli_version "2.38.0") # Note: When updating, must also update all of the sentry_cli_dl_sha512 below! # Manually query the CMAKE_HOST_SYSTEM_PROCESSOR # See: https://gitlab.kitware.com/cmake/cmake/-/issues/25151 @@ -14,20 +14,20 @@ set(_exe_suffix "") if(CMAKE_HOST_SYSTEM_NAME MATCHES "Windows") if(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "^x86$") set(sentry_cli_dl_url "https://github.com/getsentry/sentry-cli/releases/download/${sentry_cli_version}/sentry-cli-Windows-i686.exe") - set(sentry_cli_dl_sha512 "de76de02e389a1c9f7c46d35d89097c4a32ff40d2b423143eda24068ce540e7f9e3d989723cda4928c394cdeda26ebfb2f0e2182124eea1b38c3e1296b03191d") + set(sentry_cli_dl_sha512 "60d004fc8df9003978596dbc45e5dba8350d47ea8535a0c60875aa937e6159911b345c817111932ae68ec71106e2c6712f8e52c3bf41086ad08db379796b575c") else() # just default to x64 otherwise set(sentry_cli_dl_url "https://github.com/getsentry/sentry-cli/releases/download/${sentry_cli_version}/sentry-cli-Windows-x86_64.exe") - set(sentry_cli_dl_sha512 "45abc55491443e6b228339bbd6bcf74dab07d08093a9a1e249d214a88c3e88aade20198d35e2f89a8614b1100c08420d19bfb3d6011724f069c83af766cf2a0e") + set(sentry_cli_dl_sha512 "427c3e1b7495a9b6c1d3d251281a37c13e71260ef05c52837b31c0c8348910047f3403855d014bf1701f18787849e2403d7ddc869b9d1b8d4985fccf0e530306") endif() set(_exe_suffix ".exe") elseif(CMAKE_HOST_SYSTEM_NAME MATCHES "Darwin") set(sentry_cli_dl_url "https://github.com/getsentry/sentry-cli/releases/download/${sentry_cli_version}/sentry-cli-Darwin-universal") - set(sentry_cli_dl_sha512 "6ab3a2d6b4e2a8ab2742478eee0bbbee96bbede600155e43650676f3925b6d0813a602498b1a1e9f962fb9d8a922459389259bd1d3a9646d6d21a18abe9ed90c") + set(sentry_cli_dl_sha512 "42c2dbbf694dcce647ccafa15fa482e0736fc50c0c50ffaf7abe02457b106b7f1f9a5b5114b3a2853aa56c5b8e957a84dc9b952c2f1f84c94054280544e7ac9f") elseif(CMAKE_HOST_SYSTEM_NAME MATCHES "Linux") if(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "^x86_64$") set(sentry_cli_dl_url "https://github.com/getsentry/sentry-cli/releases/download/${sentry_cli_version}/sentry-cli-Linux-x86_64") - set(sentry_cli_dl_sha512 "17167bece1e852073aae563bd9f3d482e83ef263566d56c5c37480eb6b58d6ec3e938cae85c0a23b30b2fa26d77319a7c217495722664c2ab00ec47665c7472c") + set(sentry_cli_dl_sha512 "71c52338f35e7afe1b452abfbfba8b070d7fc770ce7fa3016962aed8eae29b3f6c09c1758574a7f6fe63c9e18aaca465793c874716459e8d35a3dbbe01e44abe") else() message(FATAL_ERROR "Script does not currently support platform: ${CMAKE_HOST_SYSTEM_NAME} and ARCH: ${CMAKE_HOST_SYSTEM_PROCESSOR}") endif() From 799080e45bfc2c9be58cf763dc0724482793c615 Mon Sep 17 00:00:00 2001 From: past-due <30942300+past-due@users.noreply.github.com> Date: Tue, 29 Oct 2024 17:49:55 -0400 Subject: [PATCH 11/38] Use json parser directly for brief file loading, tweak format --- data/base/messages/brief1-1.json | 38 +++---- data/base/messages/brief1-2.json | 27 ++--- data/base/messages/brief1-3.json | 57 +++++----- data/base/messages/brief1-4a.json | 35 +++--- data/base/messages/brief1-5.json | 14 ++- data/base/messages/brief1-7.json | 36 +++--- data/base/messages/brief1a-c.json | 27 ++--- data/base/messages/brief1a.json | 25 +++-- data/base/messages/brief1b.json | 14 ++- data/base/messages/brief1c.json | 57 +++++----- data/base/messages/brief1ca.json | 16 +-- data/base/messages/brief1d.json | 29 ++--- data/base/messages/brief2-1.json | 23 ++-- data/base/messages/brief2-2.json | 44 ++++---- data/base/messages/brief2-5.json | 25 +++-- data/base/messages/brief2-6.json | 40 +++---- data/base/messages/brief2-7.json | 25 +++-- data/base/messages/brief2-8.json | 25 +++-- data/base/messages/brief2-c.json | 29 ++--- data/base/messages/brief2-di.json | 27 ++--- data/base/messages/brief2-dii.json | 42 +++---- data/base/messages/brief2a.json | 25 +++-- data/base/messages/brief2b.json | 25 +++-- data/base/messages/brief3-1a.json | 27 ++--- data/base/messages/brief3-1b.json | 27 ++--- data/base/messages/brief3-2.json | 51 +++++---- data/base/messages/brief3-4.json | 58 +++++----- data/base/messages/brief3-a.json | 25 +++-- data/base/messages/brief3-b.json | 38 +++---- data/base/messages/brief3-c.json | 35 +++--- data/base/messages/brief3a-b.json | 38 +++---- data/base/messages/brief3a-d1.json | 49 ++++----- data/base/messages/brief3a-d2.json | 75 ++++++------- data/base/messages/briefdemo.json | 14 ++- data/base/messages/brieftut.json | 12 +- data/base/messages/cam1-outro.json | 42 +++---- data/base/messages/genmessages.json | 23 ++-- doc/BriefAndProximityFormat.md | 20 ++-- src/message.cpp | 163 ++++++++++++++++++++-------- 39 files changed, 745 insertions(+), 657 deletions(-) diff --git a/data/base/messages/brief1-1.json b/data/base/messages/brief1-1.json index 3c9c0fd3415..0603025ff73 100644 --- a/data/base/messages/brief1-1.json +++ b/data/base/messages/brief1-1.json @@ -1,22 +1,22 @@ { - "video0000": { - "name": "FLIGHT", - "sequences": [ - { "loop": 0, "subtitles": "INFLIGHT_MSG1", "video": "inflight.ogg" } - ] - }, - "video0001": { - "name": "SB1_1_MSG", - "sequences": [ - { "loop": 0, "subtitles": ["P1-1_MSG1", "P1-1_MSG2", "P1-1_MSG3"], "video": "cam1/sub1_1p.ogg" }, - { "loop": 0, "subtitles": ["SUB1_1_MSG1", "SUB1_1_MSG2", "SUB1_1_MSG3"], "video": "cam1/sub1_1.ogg" } - ] - }, - "video0002": { - "name": "MB1_B2_MSG", - "sequences": [ - { "loop": 1, "subtitles": "TRANS_MSG1", "video": "brfcom.ogg" }, - { "loop": 0, "subtitles": ["CAM1_B2_MSG", "CAM1_B2_MSG2", "CAM1_B2_MSG3"], "video": "cam1/cam1bpow.ogg" } - ] + "type": "wz2100.briefs.v1", + "briefs": { + "FLIGHT": { + "sequences": [ + { "loop": 0, "subtitles": "INFLIGHT_MSG1", "video": "inflight.ogg" } + ] + }, + "SB1_1_MSG": { + "sequences": [ + { "loop": 0, "subtitles": ["P1-1_MSG1", "P1-1_MSG2", "P1-1_MSG3"], "video": "cam1/sub1_1p.ogg" }, + { "loop": 0, "subtitles": ["SUB1_1_MSG1", "SUB1_1_MSG2", "SUB1_1_MSG3"], "video": "cam1/sub1_1.ogg" } + ] + }, + "MB1_B2_MSG": { + "sequences": [ + { "loop": 1, "subtitles": "TRANS_MSG1", "video": "brfcom.ogg" }, + { "loop": 0, "subtitles": ["CAM1_B2_MSG", "CAM1_B2_MSG2", "CAM1_B2_MSG3"], "video": "cam1/cam1bpow.ogg" } + ] + } } } diff --git a/data/base/messages/brief1-2.json b/data/base/messages/brief1-2.json index 32e4bef6d5c..bb214219e20 100644 --- a/data/base/messages/brief1-2.json +++ b/data/base/messages/brief1-2.json @@ -1,16 +1,17 @@ { - "video0000": { - "name": "SB1_2_MSG", - "sequences": [ - { "loop": 1, "subtitles": "TRANS_MSG1", "video": "brfcom.ogg" }, - { "loop": 0, "subtitles": ["SUB1_2_MSG1", "SUB1_2_MSG2", "SUB1_2_MSG3"], "video": "cam1/sub1_2.ogg" } - ] - }, - "video0001": { - "name": "SB1_2_MSG2", - "sequences": [ - { "loop": 1, "subtitles": "SUB1_4A_MSG4", "video": "incomtns.ogg" }, - { "loop": 0, "subtitles": ["SUB1_2_MSG4", "SUB1_2_MSG5", "SUB1_2_MSG6"], "video": "cam1/sub12pt2.ogg" } - ] + "type": "wz2100.briefs.v1", + "briefs": { + "SB1_2_MSG": { + "sequences": [ + { "loop": 1, "subtitles": "TRANS_MSG1", "video": "brfcom.ogg" }, + { "loop": 0, "subtitles": ["SUB1_2_MSG1", "SUB1_2_MSG2", "SUB1_2_MSG3"], "video": "cam1/sub1_2.ogg" } + ] + }, + "SB1_2_MSG2": { + "sequences": [ + { "loop": 1, "subtitles": "SUB1_4A_MSG4", "video": "incomtns.ogg" }, + { "loop": 0, "subtitles": ["SUB1_2_MSG4", "SUB1_2_MSG5", "SUB1_2_MSG6"], "video": "cam1/sub12pt2.ogg" } + ] + } } } diff --git a/data/base/messages/brief1-3.json b/data/base/messages/brief1-3.json index 843b3bc373e..6cffcbc7e90 100644 --- a/data/base/messages/brief1-3.json +++ b/data/base/messages/brief1-3.json @@ -1,32 +1,31 @@ { - "video0000": { - "name": "SB1_3_UPDATE", - "sequences": [ - { "loop": 0, "subtitles": "P1-3A_MSG1", "video": "cam1/sub1_3p1.ogg" }, - { "loop": 0, "subtitles": ["BETA1_MSG1", "BETA1_MSG2", "BETA1_MSG3"], "video": "cam1/sub13bet.ogg" }, - { "loop": 0, "subtitles": ["GAMMA_MSG1", "GAMMA_MSG2", "GAMMA_MSG3"], "video": "cam1/sub13gam.ogg" }, - { "loop": 0, "subtitles": ["SUB1_3_MSG1", "SUB1_3_MSG2", "SUB1_3_MSG3"], "video": "cam1/sub1_3.ogg" } - ] - }, - "video0001": { - "name": "SB1_3_MSG", - "sequences": [ - { "loop": 1, "subtitles": "TRANS_MSG1", "video": "brfcom.ogg" }, - { "loop": 0, "subtitles": ["SUB1_3_MSG1", "SUB1_3_MSG2", "SUB1_3_MSG3"], "video": "cam1/sub1_3.ogg" } - ] - }, - "video0002": { - "name": "SB1_3_MSG3", - "sequences": [ - { "loop": 0, "subtitles": "NP_MSG1", "video": "cam1/sub13np1.ogg" }, - { "loop": 0, "subtitles": "NP_MSG2", "video": "npend.ogg" } - ] - }, - "video0003": { - "name": "SB1_3_MSG4", - "sequences": [ - { "loop": 0, "subtitles": "NP_MSG1", "video": "cam1/sub13np2.ogg" }, - { "loop": 0, "subtitles": "NP_MSG2", "video": "npend.ogg" } - ] + "type": "wz2100.briefs.v1", + "briefs": { + "SB1_3_UPDATE": { + "sequences": [ + { "loop": 0, "subtitles": "P1-3A_MSG1", "video": "cam1/sub1_3p1.ogg" }, + { "loop": 0, "subtitles": ["BETA1_MSG1", "BETA1_MSG2", "BETA1_MSG3"], "video": "cam1/sub13bet.ogg" }, + { "loop": 0, "subtitles": ["GAMMA_MSG1", "GAMMA_MSG2", "GAMMA_MSG3"], "video": "cam1/sub13gam.ogg" }, + { "loop": 0, "subtitles": ["SUB1_3_MSG1", "SUB1_3_MSG2", "SUB1_3_MSG3"], "video": "cam1/sub1_3.ogg" } + ] + }, + "SB1_3_MSG": { + "sequences": [ + { "loop": 1, "subtitles": "TRANS_MSG1", "video": "brfcom.ogg" }, + { "loop": 0, "subtitles": ["SUB1_3_MSG1", "SUB1_3_MSG2", "SUB1_3_MSG3"], "video": "cam1/sub1_3.ogg" } + ] + }, + "SB1_3_MSG3": { + "sequences": [ + { "loop": 0, "subtitles": "NP_MSG1", "video": "cam1/sub13np1.ogg" }, + { "loop": 0, "subtitles": "NP_MSG2", "video": "npend.ogg" } + ] + }, + "SB1_3_MSG4": { + "sequences": [ + { "loop": 0, "subtitles": "NP_MSG1", "video": "cam1/sub13np2.ogg" }, + { "loop": 0, "subtitles": "NP_MSG2", "video": "npend.ogg" } + ] + } } } diff --git a/data/base/messages/brief1-4a.json b/data/base/messages/brief1-4a.json index 4f4d4393ec2..3c71977f3fe 100644 --- a/data/base/messages/brief1-4a.json +++ b/data/base/messages/brief1-4a.json @@ -1,20 +1,21 @@ { - "video0000": { - "name": "SB1_4_MSG", - "sequences": [ - { "loop": 1, "subtitles": ["SUB1_4A_MSG4", "SUB1_4A_MSG5", "SUB1_4A_MSG6"], "video": "cam1/sub1_4pl.ogg" }, - { "loop": 0, "subtitles": "", "video": "cam1/sub14anp.ogg" }, - { "loop": 0, "subtitles": "NP_MSG2", "video": "npend.ogg" }, - { "loop": 0, "subtitles": ["SUB1_4A_MSG1", "SUB1_4A_MSG2", "SUB1_4A_MSG3"], "video": "cam1/sub1_4.ogg" } - ] - }, - "video0001": { - "name": "SB1_4_B", - "sequences": [ - { "loop": 1, "subtitles": ["TRANS_MSG1", "SUB1_4B_MSG2", "SUB1_4B_MSG3"], "video": "cam1/sub14bpl.ogg" }, - { "loop": 0, "subtitles": "", "video": "cam1/sub1_4bn.ogg" }, - { "loop": 0, "subtitles": "NP_MSG2", "video": "nexend.ogg" }, - { "loop": 0, "subtitles": ["SUB1_4B_MSG4", "SUB1_4B_MSG5", "SUB1_4B_MSG6"], "video": "cam1/sub1_4b.ogg" } - ] + "type": "wz2100.briefs.v1", + "briefs": { + "SB1_4_MSG": { + "sequences": [ + { "loop": 1, "subtitles": ["SUB1_4A_MSG4", "SUB1_4A_MSG5", "SUB1_4A_MSG6"], "video": "cam1/sub1_4pl.ogg" }, + { "loop": 0, "subtitles": "", "video": "cam1/sub14anp.ogg" }, + { "loop": 0, "subtitles": "NP_MSG2", "video": "npend.ogg" }, + { "loop": 0, "subtitles": ["SUB1_4A_MSG1", "SUB1_4A_MSG2", "SUB1_4A_MSG3"], "video": "cam1/sub1_4.ogg" } + ] + }, + "SB1_4_B": { + "sequences": [ + { "loop": 1, "subtitles": ["TRANS_MSG1", "SUB1_4B_MSG2", "SUB1_4B_MSG3"], "video": "cam1/sub14bpl.ogg" }, + { "loop": 0, "subtitles": "", "video": "cam1/sub1_4bn.ogg" }, + { "loop": 0, "subtitles": "NP_MSG2", "video": "nexend.ogg" }, + { "loop": 0, "subtitles": ["SUB1_4B_MSG4", "SUB1_4B_MSG5", "SUB1_4B_MSG6"], "video": "cam1/sub1_4b.ogg" } + ] + } } } diff --git a/data/base/messages/brief1-5.json b/data/base/messages/brief1-5.json index daeb52f59d8..3143894b6e5 100644 --- a/data/base/messages/brief1-5.json +++ b/data/base/messages/brief1-5.json @@ -1,9 +1,11 @@ { - "video0000": { - "name": "SB1_5_MSG", - "sequences": [ - { "loop": 0, "subtitles": "TRANS_MSG1", "video": "cam1/sub1_5pl.ogg" }, - { "loop": 0, "subtitles": ["SUB1_5_MSG1", "SUB1_5_MSG2", "SUB1_5_MSG3"], "video": "cam1/sub1_5.ogg" } - ] + "type": "wz2100.briefs.v1", + "briefs": { + "SB1_5_MSG": { + "sequences": [ + { "loop": 0, "subtitles": "TRANS_MSG1", "video": "cam1/sub1_5pl.ogg" }, + { "loop": 0, "subtitles": ["SUB1_5_MSG1", "SUB1_5_MSG2", "SUB1_5_MSG3"], "video": "cam1/sub1_5.ogg" } + ] + } } } diff --git a/data/base/messages/brief1-7.json b/data/base/messages/brief1-7.json index 40c405880b5..92895c4309b 100644 --- a/data/base/messages/brief1-7.json +++ b/data/base/messages/brief1-7.json @@ -1,21 +1,21 @@ { - "video0000": { - "name": "SB1_7_MSG", - "sequences": [ - { "loop": 1, "subtitles": ["TRANS_MSG1", "SUB1_7_MSG5", "SUB1_7_MSG6"], "video": "cam1/sub1_7pl.ogg" }, - { "loop": 0, "subtitles": "SUB1_7_MSG4", "video": "cam1/sub17fmv.ogg" } - ] - }, - "video0001": { - "name": "SB1_7_MSG2", - "sequences": [ - { "loop": 0, "subtitles": ["SUB1_7_MSG1", "SUB1_7_MSG2", "SUB1_7_MSG3"], "video": "cam1/sub1_7.ogg" } - ] - }, - "video0002": { - "name": "SB1_7_MSG3", - "sequences": [ - { "loop": 0, "subtitles": ["SUB1_7_MSG1", "SUB1_7_MSG2", "SUB1_7_MSG3"], "video": "cam1/sub1_7b.ogg" } - ] + "type": "wz2100.briefs.v1", + "briefs": { + "SB1_7_MSG": { + "sequences": [ + { "loop": 1, "subtitles": ["TRANS_MSG1", "SUB1_7_MSG5", "SUB1_7_MSG6"], "video": "cam1/sub1_7pl.ogg" }, + { "loop": 0, "subtitles": "SUB1_7_MSG4", "video": "cam1/sub17fmv.ogg" } + ] + }, + "SB1_7_MSG2": { + "sequences": [ + { "loop": 0, "subtitles": ["SUB1_7_MSG1", "SUB1_7_MSG2", "SUB1_7_MSG3"], "video": "cam1/sub1_7.ogg" } + ] + }, + "SB1_7_MSG3": { + "sequences": [ + { "loop": 0, "subtitles": ["SUB1_7_MSG1", "SUB1_7_MSG2", "SUB1_7_MSG3"], "video": "cam1/sub1_7b.ogg" } + ] + } } } diff --git a/data/base/messages/brief1a-c.json b/data/base/messages/brief1a-c.json index e38a9d05a56..360182df863 100644 --- a/data/base/messages/brief1a-c.json +++ b/data/base/messages/brief1a-c.json @@ -1,16 +1,17 @@ { - "video0000": { - "name": "MB1A-C_MSG", - "sequences": [ - { "loop": 0, "subtitles": ["TRANS_MSG1", "CAM1A-C_MSG5", "CAM1A-C_MSG6"], "video": "cam1/cam1acp.ogg" }, - { "loop": 0, "subtitles": "", "video": "cam1/map1a_c.ogg" } - ] - }, - "video0001": { - "name": "MB1A-C_MSG2", - "sequences": [ - { "loop": 0, "subtitles": "TRANS_MSG1", "video": "brfcom.ogg" }, - { "loop": 0, "subtitles": ["CAM1A-C_MSG1", "CAM1A-C_MSG2", "CAM1A-C_MSG3"], "video": "cam1/cam1ac.ogg" } - ] + "type": "wz2100.briefs.v1", + "briefs": { + "MB1A-C_MSG": { + "sequences": [ + { "loop": 0, "subtitles": ["TRANS_MSG1", "CAM1A-C_MSG5", "CAM1A-C_MSG6"], "video": "cam1/cam1acp.ogg" }, + { "loop": 0, "subtitles": "", "video": "cam1/map1a_c.ogg" } + ] + }, + "MB1A-C_MSG2": { + "sequences": [ + { "loop": 0, "subtitles": "TRANS_MSG1", "video": "brfcom.ogg" }, + { "loop": 0, "subtitles": ["CAM1A-C_MSG1", "CAM1A-C_MSG2", "CAM1A-C_MSG3"], "video": "cam1/cam1ac.ogg" } + ] + } } } diff --git a/data/base/messages/brief1a.json b/data/base/messages/brief1a.json index a374a9b1701..dc39636b94f 100644 --- a/data/base/messages/brief1a.json +++ b/data/base/messages/brief1a.json @@ -1,15 +1,16 @@ { - "video0000": { - "name": "MB1A_MSG", - "sequences": [ - { "loop": 1, "subtitles": "TRANS_MSG1", "video": "brfcom.ogg" }, - { "loop": 0, "subtitles": ["CAM1A_MSG1", "CAM1A_MSG2", "CAM1A_MSG3"], "video": "cam1/cam1ascv.ogg" } - ] - }, - "video0001": { - "name": "CMB1_MSG", - "sequences": [ - { "loop": 0, "subtitles": ["CAM1_MSG1", "CAM1_MSG2", "CAM1_MSG3"], "video": "cam1/cam1.ogg" } - ] + "type": "wz2100.briefs.v1", + "briefs": { + "MB1A_MSG": { + "sequences": [ + { "loop": 1, "subtitles": "TRANS_MSG1", "video": "brfcom.ogg" }, + { "loop": 0, "subtitles": ["CAM1A_MSG1", "CAM1A_MSG2", "CAM1A_MSG3"], "video": "cam1/cam1ascv.ogg" } + ] + }, + "CMB1_MSG": { + "sequences": [ + { "loop": 0, "subtitles": ["CAM1_MSG1", "CAM1_MSG2", "CAM1_MSG3"], "video": "cam1/cam1.ogg" } + ] + } } } diff --git a/data/base/messages/brief1b.json b/data/base/messages/brief1b.json index 68bb978d16d..2be9f4e8cd9 100644 --- a/data/base/messages/brief1b.json +++ b/data/base/messages/brief1b.json @@ -1,9 +1,11 @@ { - "video0000": { - "name": "MB1B_MSG", - "sequences": [ - { "loop": 1, "subtitles": ["P1B_MSG1", "P1B_MSG2", "P1B_MSG3"], "video": "cam1/cam1b_p.ogg" }, - { "loop": 0, "subtitles": ["CAM1B_MSG1", "CAM1B_MSG2", "CAM1B_MSG3"], "video": "cam1/cam1b.ogg" } - ] + "type": "wz2100.briefs.v1", + "briefs": { + "MB1B_MSG": { + "sequences": [ + { "loop": 1, "subtitles": ["P1B_MSG1", "P1B_MSG2", "P1B_MSG3"], "video": "cam1/cam1b_p.ogg" }, + { "loop": 0, "subtitles": ["CAM1B_MSG1", "CAM1B_MSG2", "CAM1B_MSG3"], "video": "cam1/cam1b.ogg" } + ] + } } } diff --git a/data/base/messages/brief1c.json b/data/base/messages/brief1c.json index d9194bd47a2..2fd7c000488 100644 --- a/data/base/messages/brief1c.json +++ b/data/base/messages/brief1c.json @@ -1,32 +1,31 @@ { - "video0000": { - "name": "MB1C_MSG", - "sequences": [ - { "loop": 1, "subtitles": "TRANS_MSG1", "video": "brfcom.ogg" }, - { "loop": 0, "subtitles": ["CAM1C_MSG1", "CAM1C_MSG2", "CAM1C_MSG3"], "video": "cam1/map1cexp.ogg" }, - { "loop": 0, "subtitles": "", "video": "cam1/cam1ccom.ogg" } - ] - }, - "video0001": { - "name": "MB1C2_MSG", - "sequences": [ - { "loop": 1, "subtitles": "NP_MSG1", "video": "incomtns.ogg" }, - { "loop": 0, "subtitles": "NP_MSG2", "video": "cam1/cam1cnp.ogg" }, - { "loop": 0, "subtitles": ["CAM1C_MSG4", "CAM1C_MSG5", "CAM1C_MSG6"], "video": "cam1/map1c.ogg" } - ] - }, - "video0002": { - "name": "MB1C3_MSG", - "sequences": [ - { "loop": 1, "subtitles": "P1-3A_MSG1", "video": "prjupdat.ogg" }, - { "loop": 0, "subtitles": ["CAM1C_MSG7", "CAM1C_MSG8", "CAM1C_MSG9"], "video": "cam1/cam1ccf.ogg" } - ] - }, - "video0003": { - "name": "MB1C4_MSG", - "sequences": [ - { "loop": 1, "subtitles": "P1-3A_MSG1", "video": "prjupdat.ogg" }, - { "loop": 0, "subtitles": ["CAM1C_MSG10", "CAM1C_MSG11"], "video": "cam1/cam1clz.ogg" } - ] + "type": "wz2100.briefs.v1", + "briefs": { + "MB1C_MSG": { + "sequences": [ + { "loop": 1, "subtitles": "TRANS_MSG1", "video": "brfcom.ogg" }, + { "loop": 0, "subtitles": ["CAM1C_MSG1", "CAM1C_MSG2", "CAM1C_MSG3"], "video": "cam1/map1cexp.ogg" }, + { "loop": 0, "subtitles": "", "video": "cam1/cam1ccom.ogg" } + ] + }, + "MB1C2_MSG": { + "sequences": [ + { "loop": 1, "subtitles": "NP_MSG1", "video": "incomtns.ogg" }, + { "loop": 0, "subtitles": "NP_MSG2", "video": "cam1/cam1cnp.ogg" }, + { "loop": 0, "subtitles": ["CAM1C_MSG4", "CAM1C_MSG5", "CAM1C_MSG6"], "video": "cam1/map1c.ogg" } + ] + }, + "MB1C3_MSG": { + "sequences": [ + { "loop": 1, "subtitles": "P1-3A_MSG1", "video": "prjupdat.ogg" }, + { "loop": 0, "subtitles": ["CAM1C_MSG7", "CAM1C_MSG8", "CAM1C_MSG9"], "video": "cam1/cam1ccf.ogg" } + ] + }, + "MB1C4_MSG": { + "sequences": [ + { "loop": 1, "subtitles": "P1-3A_MSG1", "video": "prjupdat.ogg" }, + { "loop": 0, "subtitles": ["CAM1C_MSG10", "CAM1C_MSG11"], "video": "cam1/cam1clz.ogg" } + ] + } } } diff --git a/data/base/messages/brief1ca.json b/data/base/messages/brief1ca.json index 8d3703522ae..ee269b4346e 100644 --- a/data/base/messages/brief1ca.json +++ b/data/base/messages/brief1ca.json @@ -1,10 +1,12 @@ { - "video0000": { - "name": "MB1CA_MSG", - "sequences": [ - { "loop": 0, "subtitles": "TRANS_MSG1", "video": "brfcom.ogg" }, - { "loop": 0, "subtitles": ["CAM1CA_MSG1", "CAM1CA_MSG2", "CAM1CA_MSG3"], "video": "cam1/cam1ca.ogg" }, - { "loop": 1, "subtitles": ["SUP_MSG1", "SUP_MSG2", "SUP_MSG3"], "video": "cam1/cam1capl.ogg" } - ] + "type": "wz2100.briefs.v1", + "briefs": { + "MB1CA_MSG": { + "sequences": [ + { "loop": 0, "subtitles": "TRANS_MSG1", "video": "brfcom.ogg" }, + { "loop": 0, "subtitles": ["CAM1CA_MSG1", "CAM1CA_MSG2", "CAM1CA_MSG3"], "video": "cam1/cam1ca.ogg" }, + { "loop": 1, "subtitles": ["SUP_MSG1", "SUP_MSG2", "SUP_MSG3"], "video": "cam1/cam1capl.ogg" } + ] + } } } diff --git a/data/base/messages/brief1d.json b/data/base/messages/brief1d.json index a0af9ab0391..6e8cc3823ac 100644 --- a/data/base/messages/brief1d.json +++ b/data/base/messages/brief1d.json @@ -1,17 +1,18 @@ { - "video0000": { - "name": "MB1D_MSG", - "sequences": [ - { "loop": 1, "subtitles": ["CAM1D_MSG1", "CAM1D_MSG4", "CAM1D_MSG5"], "video": "cam1/cam1dp1.ogg" }, - { "loop": 0, "subtitles": "", "video": "cam1/cam1dnp.ogg" }, - { "loop": 0, "subtitles": "NP_MSG2", "video": "npend.ogg" } - ] - }, - "video0001": { - "name": "MB1D_MSG2", - "sequences": [ - { "loop": 0, "subtitles": ["CAM1D_MSG1", "CAM1D_MSG2", "CAM1D_MSG3"], "video": "cam1/cam1d.ogg" }, - { "loop": 0, "subtitles": "", "video": "cam1/cam1dp2.ogg" } - ] + "type": "wz2100.briefs.v1", + "briefs": { + "MB1D_MSG": { + "sequences": [ + { "loop": 1, "subtitles": ["CAM1D_MSG1", "CAM1D_MSG4", "CAM1D_MSG5"], "video": "cam1/cam1dp1.ogg" }, + { "loop": 0, "subtitles": "", "video": "cam1/cam1dnp.ogg" }, + { "loop": 0, "subtitles": "NP_MSG2", "video": "npend.ogg" } + ] + }, + "MB1D_MSG2": { + "sequences": [ + { "loop": 0, "subtitles": ["CAM1D_MSG1", "CAM1D_MSG2", "CAM1D_MSG3"], "video": "cam1/cam1d.ogg" }, + { "loop": 0, "subtitles": "", "video": "cam1/cam1dp2.ogg" } + ] + } } } diff --git a/data/base/messages/brief2-1.json b/data/base/messages/brief2-1.json index ecbe3f59590..0d2064cf098 100644 --- a/data/base/messages/brief2-1.json +++ b/data/base/messages/brief2-1.json @@ -1,14 +1,15 @@ { - "video0000": { - "name": "MB2_1_MSG", - "sequences": [ - { "loop": 0, "subtitles": ["CAM2_1_MSG1", "CAM2_1_MSG2"], "video": "brfcom4s.ogg" } - ] - }, - "video0001": { - "name": "MB2_1_MSG2", - "sequences": [ - { "loop": 0, "subtitles": ["CAM2_1_MSG3", "CAM2_1_MSG4", "CAM2_1_MSG5"], "video": "cam2/cam2_1.ogg" } - ] + "type": "wz2100.briefs.v1", + "briefs": { + "MB2_1_MSG": { + "sequences": [ + { "loop": 0, "subtitles": ["CAM2_1_MSG1", "CAM2_1_MSG2"], "video": "brfcom4s.ogg" } + ] + }, + "MB2_1_MSG2": { + "sequences": [ + { "loop": 0, "subtitles": ["CAM2_1_MSG3", "CAM2_1_MSG4", "CAM2_1_MSG5"], "video": "cam2/cam2_1.ogg" } + ] + } } } diff --git a/data/base/messages/brief2-2.json b/data/base/messages/brief2-2.json index de83fabc133..5511eb3e0e1 100644 --- a/data/base/messages/brief2-2.json +++ b/data/base/messages/brief2-2.json @@ -1,25 +1,25 @@ { - "video0000": { - "name": "MB2_2_MSG", - "sequences": [ - { "loop": 0, "subtitles": "TRANS_MSG1", "video": "brfcom.ogg" }, - { "loop": 0, "subtitles": ["CAM2_2_MSG", "CAM2_2_MSG2", "CAM2_2_MSG3"], "video": "cam2/cam22pl1.ogg" }, - { "loop": 0, "subtitles": "", "video": "cam2/cam2_2n.ogg" } - ] - }, - "video0001": { - "name": "MB2_2_MSG2", - "sequences": [ - { "loop": 0, "subtitles": "CAM2_2_MSG7", "video": "cam2/cam22pl2.ogg" }, - { "loop": 0, "subtitles": "", "video": "cam2/cam22fmv.ogg" }, - { "loop": 0, "subtitles": "", "video": "cam2/cam2_2n2.ogg" }, - { "loop": 0, "subtitles": "CAM2_2_MSG", "video": "cam2/cam22pl3.ogg" } - ] - }, - "video0002": { - "name": "MB2_2_MSG3", - "sequences": [ - { "loop": 0, "subtitles": ["CAM2_2_MSG4", "CAM2_2_MSG5", "CAM2_2_MSG6"], "video": "cam2/cam2_2.ogg" } - ] + "type": "wz2100.briefs.v1", + "briefs": { + "MB2_2_MSG": { + "sequences": [ + { "loop": 0, "subtitles": "TRANS_MSG1", "video": "brfcom.ogg" }, + { "loop": 0, "subtitles": ["CAM2_2_MSG", "CAM2_2_MSG2", "CAM2_2_MSG3"], "video": "cam2/cam22pl1.ogg" }, + { "loop": 0, "subtitles": "", "video": "cam2/cam2_2n.ogg" } + ] + }, + "MB2_2_MSG2": { + "sequences": [ + { "loop": 0, "subtitles": "CAM2_2_MSG7", "video": "cam2/cam22pl2.ogg" }, + { "loop": 0, "subtitles": "", "video": "cam2/cam22fmv.ogg" }, + { "loop": 0, "subtitles": "", "video": "cam2/cam2_2n2.ogg" }, + { "loop": 0, "subtitles": "CAM2_2_MSG", "video": "cam2/cam22pl3.ogg" } + ] + }, + "MB2_2_MSG3": { + "sequences": [ + { "loop": 0, "subtitles": ["CAM2_2_MSG4", "CAM2_2_MSG5", "CAM2_2_MSG6"], "video": "cam2/cam2_2.ogg" } + ] + } } } diff --git a/data/base/messages/brief2-5.json b/data/base/messages/brief2-5.json index bdaae794f6f..f26ec23abce 100644 --- a/data/base/messages/brief2-5.json +++ b/data/base/messages/brief2-5.json @@ -1,15 +1,16 @@ { - "video0000": { - "name": "MB2_5_MSG", - "sequences": [ - { "loop": 1, "subtitles": "TRANS_MSG1", "video": "brfcom.ogg" }, - { "loop": 1, "subtitles": ["CAM2_5_MSG", "CAM2_5_MSG2", "CAM2_5_MSG3"], "video": "cam2/cam2_5pl.ogg" } - ] - }, - "video0001": { - "name": "MB2_5_MSG2", - "sequences": [ - { "loop": 0, "subtitles": ["CAM2_5_MSG4", "CAM2_5_MSG5", "CAM2_5_MSG6"], "video": "cam2/cam2_5.ogg" } - ] + "type": "wz2100.briefs.v1", + "briefs": { + "MB2_5_MSG": { + "sequences": [ + { "loop": 1, "subtitles": "TRANS_MSG1", "video": "brfcom.ogg" }, + { "loop": 1, "subtitles": ["CAM2_5_MSG", "CAM2_5_MSG2", "CAM2_5_MSG3"], "video": "cam2/cam2_5pl.ogg" } + ] + }, + "MB2_5_MSG2": { + "sequences": [ + { "loop": 0, "subtitles": ["CAM2_5_MSG4", "CAM2_5_MSG5", "CAM2_5_MSG6"], "video": "cam2/cam2_5.ogg" } + ] + } } } diff --git a/data/base/messages/brief2-6.json b/data/base/messages/brief2-6.json index ab51491557b..b23445af980 100644 --- a/data/base/messages/brief2-6.json +++ b/data/base/messages/brief2-6.json @@ -1,23 +1,23 @@ { - "video0000": { - "name": "MB2_6_MSG", - "sequences": [ - { "loop": 0, "subtitles": "CAM2_6_MSG", "video": "cam2/cam26pl1.ogg" } - ] - }, - "video0001": { - "name": "MB2_6_MSG2", - "sequences": [ - { "loop": 0, "subtitles": "", "video": "cam2/cam26afm.ogg" }, - { "loop": 1, "subtitles": ["CAM2_6_MSG", "CAM2_6_MSG2", "CAM2_6_MSG3"], "video": "cam2/cam26pl2.ogg" }, - { "loop": 0, "subtitles": ["CAM2_6_MSG4", "CAM2_6_MSG5", "CAM2_6_MSG6"], "video": "cam2/cam2_6a.ogg" }, - { "loop": 0, "subtitles": "", "video": "cam2/cam26bfm.ogg" } - ] - }, - "video0002": { - "name": "MB2_6_MSG3", - "sequences": [ - { "loop": 0, "subtitles": ["CAM2_6_MSG7", "CAM2_6_MSG8", "CAM2_6_MSG9"], "video": "cam2/cam2_6b.ogg" } - ] + "type": "wz2100.briefs.v1", + "briefs": { + "MB2_6_MSG": { + "sequences": [ + { "loop": 0, "subtitles": "CAM2_6_MSG", "video": "cam2/cam26pl1.ogg" } + ] + }, + "MB2_6_MSG2": { + "sequences": [ + { "loop": 0, "subtitles": "", "video": "cam2/cam26afm.ogg" }, + { "loop": 1, "subtitles": ["CAM2_6_MSG", "CAM2_6_MSG2", "CAM2_6_MSG3"], "video": "cam2/cam26pl2.ogg" }, + { "loop": 0, "subtitles": ["CAM2_6_MSG4", "CAM2_6_MSG5", "CAM2_6_MSG6"], "video": "cam2/cam2_6a.ogg" }, + { "loop": 0, "subtitles": "", "video": "cam2/cam26bfm.ogg" } + ] + }, + "MB2_6_MSG3": { + "sequences": [ + { "loop": 0, "subtitles": ["CAM2_6_MSG7", "CAM2_6_MSG8", "CAM2_6_MSG9"], "video": "cam2/cam2_6b.ogg" } + ] + } } } diff --git a/data/base/messages/brief2-7.json b/data/base/messages/brief2-7.json index 70cc19e1760..8be948a233d 100644 --- a/data/base/messages/brief2-7.json +++ b/data/base/messages/brief2-7.json @@ -1,15 +1,16 @@ { - "video0000": { - "name": "MB2_7_MSG", - "sequences": [ - { "loop": 1, "subtitles": "TRANS_MSG1", "video": "brfcom.ogg" }, - { "loop": 0, "subtitles": "", "video": "cam2/cam27fmv.ogg" } - ] - }, - "video0001": { - "name": "MB2_7_MSG2", - "sequences": [ - { "loop": 0, "subtitles": ["CAM2_7_MSG", "CAM2_7_MSG2", "CAM2_7_MSG3"], "video": "cam2/cam2_7.ogg" } - ] + "type": "wz2100.briefs.v1", + "briefs": { + "MB2_7_MSG": { + "sequences": [ + { "loop": 1, "subtitles": "TRANS_MSG1", "video": "brfcom.ogg" }, + { "loop": 0, "subtitles": "", "video": "cam2/cam27fmv.ogg" } + ] + }, + "MB2_7_MSG2": { + "sequences": [ + { "loop": 0, "subtitles": ["CAM2_7_MSG", "CAM2_7_MSG2", "CAM2_7_MSG3"], "video": "cam2/cam2_7.ogg" } + ] + } } } diff --git a/data/base/messages/brief2-8.json b/data/base/messages/brief2-8.json index a45fb9ea838..5601f8e8cdb 100644 --- a/data/base/messages/brief2-8.json +++ b/data/base/messages/brief2-8.json @@ -1,15 +1,16 @@ { - "video0000": { - "name": "MB2_8_MSG", - "sequences": [ - { "loop": 1, "subtitles": "TRANS_MSG1", "video": "brfcom.ogg" }, - { "loop": 1, "subtitles": ["CAM2_8_MSG", "CAM2_8_MSG2", "CAM2_8_MSG3"], "video": "cam2/cam28apl.ogg" } - ] - }, - "video0001": { - "name": "MB2_8_MSG2", - "sequences": [ - { "loop": 0, "subtitles": ["CAM2_8_MSG4", "CAM2_8_MSG5", "CAM2_8_MSG6"], "video": "cam2/cam2_8a.ogg" } - ] + "type": "wz2100.briefs.v1", + "briefs": { + "MB2_8_MSG": { + "sequences": [ + { "loop": 1, "subtitles": "TRANS_MSG1", "video": "brfcom.ogg" }, + { "loop": 1, "subtitles": ["CAM2_8_MSG", "CAM2_8_MSG2", "CAM2_8_MSG3"], "video": "cam2/cam28apl.ogg" } + ] + }, + "MB2_8_MSG2": { + "sequences": [ + { "loop": 0, "subtitles": ["CAM2_8_MSG4", "CAM2_8_MSG5", "CAM2_8_MSG6"], "video": "cam2/cam2_8a.ogg" } + ] + } } } diff --git a/data/base/messages/brief2-c.json b/data/base/messages/brief2-c.json index db14d611be9..b153540a06c 100644 --- a/data/base/messages/brief2-c.json +++ b/data/base/messages/brief2-c.json @@ -1,17 +1,18 @@ { - "video0000": { - "name": "MB2_C_MSG", - "sequences": [ - { "loop": 0, "subtitles": "TRANS_MSG1", "video": "brfcom.ogg" }, - { "loop": 0, "subtitles": ["CAM2_C_MSG1", "CAM2_C_MSG2"], "video": "cam2/cam2capl.ogg" }, - { "loop": 0, "subtitles": ["CAM2_C_MSG3", "CAM2_C_MSG4", "CAM2_C_MSG5"], "video": "cam2/cam2ca.ogg" } - ] - }, - "video0001": { - "name": "MB2_C_MSG2", - "sequences": [ - { "loop": 0, "subtitles": ["CAM2_C_MSG6", "CAM2_C_MSG7", "CAM2_C_MSG8"], "video": "cam2/cam2cbpl.ogg" }, - { "loop": 0, "subtitles": ["CAM2_C_MSG9", "CAM2_C_MSG10", "CAM2_C_MSG11"], "video": "cam2/cam2cb.ogg" } - ] + "type": "wz2100.briefs.v1", + "briefs": { + "MB2_C_MSG": { + "sequences": [ + { "loop": 0, "subtitles": "TRANS_MSG1", "video": "brfcom.ogg" }, + { "loop": 0, "subtitles": ["CAM2_C_MSG1", "CAM2_C_MSG2"], "video": "cam2/cam2capl.ogg" }, + { "loop": 0, "subtitles": ["CAM2_C_MSG3", "CAM2_C_MSG4", "CAM2_C_MSG5"], "video": "cam2/cam2ca.ogg" } + ] + }, + "MB2_C_MSG2": { + "sequences": [ + { "loop": 0, "subtitles": ["CAM2_C_MSG6", "CAM2_C_MSG7", "CAM2_C_MSG8"], "video": "cam2/cam2cbpl.ogg" }, + { "loop": 0, "subtitles": ["CAM2_C_MSG9", "CAM2_C_MSG10", "CAM2_C_MSG11"], "video": "cam2/cam2cb.ogg" } + ] + } } } diff --git a/data/base/messages/brief2-di.json b/data/base/messages/brief2-di.json index 338b069ce21..ba2b776e648 100644 --- a/data/base/messages/brief2-di.json +++ b/data/base/messages/brief2-di.json @@ -1,16 +1,17 @@ { - "video0000": { - "name": "MB2_DI_MSG", - "sequences": [ - { "loop": 1, "subtitles": "TRANS_MSG1", "video": "brfcom.ogg" }, - { "loop": 1, "subtitles": ["CAM2_DI_MSG3", "CAM2_DI_MSG4", "CAM2_DI_MSG5"], "video": "cam2/cam2_di.ogg" } - ] - }, - "video0001": { - "name": "MB2_DI_MSG2", - "sequences": [ - { "loop": 0, "subtitles": "CAM2_B_MSG3", "video": "cam2/cam2dipl.ogg" }, - { "loop": 0, "subtitles": "", "video": "cam2/cam2dico.ogg" } - ] + "type": "wz2100.briefs.v1", + "briefs": { + "MB2_DI_MSG": { + "sequences": [ + { "loop": 1, "subtitles": "TRANS_MSG1", "video": "brfcom.ogg" }, + { "loop": 1, "subtitles": ["CAM2_DI_MSG3", "CAM2_DI_MSG4", "CAM2_DI_MSG5"], "video": "cam2/cam2_di.ogg" } + ] + }, + "MB2_DI_MSG2": { + "sequences": [ + { "loop": 0, "subtitles": "CAM2_B_MSG3", "video": "cam2/cam2dipl.ogg" }, + { "loop": 0, "subtitles": "", "video": "cam2/cam2dico.ogg" } + ] + } } } diff --git a/data/base/messages/brief2-dii.json b/data/base/messages/brief2-dii.json index 34b7e5096e8..b48d2d13c5d 100644 --- a/data/base/messages/brief2-dii.json +++ b/data/base/messages/brief2-dii.json @@ -1,24 +1,24 @@ { - "video0000": { - "name": "MB2_DII_MSG", - "sequences": [ - { "loop": 0, "subtitles": "TRANS_MSG1", "video": "brfcom4s.ogg" }, - { "loop": 0, "subtitles": ["CAM2_DII_MSG1", "CAM2_DII_MSG2", "CAM2_DII_MSG9"], "video": "cam2/cam2diif.ogg" }, - { "loop": 0, "subtitles": "CAM2_DII_MSG1", "video": "cam2/c2diif2.ogg" } - ] - }, - "video0001": { - "name": "MB2_DII_MSG2", - "sequences": [ - { "loop": 0, "subtitles": ["CAM2_DII_MSG3", "CAM2_DII_MSG4", "CAM2_DII_MSG5"], "video": "cam2/cam2diib.ogg" }, - { "loop": 0, "subtitles": "", "video": "cam2/cam2diin.ogg" }, - { "loop": 0, "subtitles": ["CAM2_DII_MSG6", "CAM2_DII_MSG7", "CAM2_DII_MSG8"], "video": "cam2/cam2diip.ogg" } - ] - }, - "video0002": { - "name": "CAM2_OUT", - "sequences": [ - { "loop": 0, "subtitles": "", "video": "cam2/cam2out.ogg" } - ] + "type": "wz2100.briefs.v1", + "briefs": { + "MB2_DII_MSG": { + "sequences": [ + { "loop": 0, "subtitles": "TRANS_MSG1", "video": "brfcom4s.ogg" }, + { "loop": 0, "subtitles": ["CAM2_DII_MSG1", "CAM2_DII_MSG2", "CAM2_DII_MSG9"], "video": "cam2/cam2diif.ogg" }, + { "loop": 0, "subtitles": "CAM2_DII_MSG1", "video": "cam2/c2diif2.ogg" } + ] + }, + "MB2_DII_MSG2": { + "sequences": [ + { "loop": 0, "subtitles": ["CAM2_DII_MSG3", "CAM2_DII_MSG4", "CAM2_DII_MSG5"], "video": "cam2/cam2diib.ogg" }, + { "loop": 0, "subtitles": "", "video": "cam2/cam2diin.ogg" }, + { "loop": 0, "subtitles": ["CAM2_DII_MSG6", "CAM2_DII_MSG7", "CAM2_DII_MSG8"], "video": "cam2/cam2diip.ogg" } + ] + }, + "CAM2_OUT": { + "sequences": [ + { "loop": 0, "subtitles": "", "video": "cam2/cam2out.ogg" } + ] + } } } diff --git a/data/base/messages/brief2a.json b/data/base/messages/brief2a.json index 974bf6f9241..18a19f6be9d 100644 --- a/data/base/messages/brief2a.json +++ b/data/base/messages/brief2a.json @@ -1,15 +1,16 @@ { - "video0000": { - "name": "MB2A_MSG", - "sequences": [ - { "loop": 0, "subtitles": ["CAM2A_MSG1", "CAM2A_MSG2", "CAM2A_MSG3"], "video": "cam2/c002.ogg" } - ] - }, - "video0001": { - "name": "MB2A_MSG2", - "sequences": [ - { "loop": 0, "subtitles": ["NP_MSG1", "CAM2A_MSG7", "CAM2A_MSG8"], "video": "cam2/cam2ap.ogg" }, - { "loop": 0, "subtitles": "", "video": "cam2/cam2acol.ogg" } - ] + "type": "wz2100.briefs.v1", + "briefs": { + "MB2A_MSG": { + "sequences": [ + { "loop": 0, "subtitles": ["CAM2A_MSG1", "CAM2A_MSG2", "CAM2A_MSG3"], "video": "cam2/c002.ogg" } + ] + }, + "MB2A_MSG2": { + "sequences": [ + { "loop": 0, "subtitles": ["NP_MSG1", "CAM2A_MSG7", "CAM2A_MSG8"], "video": "cam2/cam2ap.ogg" }, + { "loop": 0, "subtitles": "", "video": "cam2/cam2acol.ogg" } + ] + } } } diff --git a/data/base/messages/brief2b.json b/data/base/messages/brief2b.json index d614087f467..ccd212869d4 100644 --- a/data/base/messages/brief2b.json +++ b/data/base/messages/brief2b.json @@ -1,15 +1,16 @@ { - "video0000": { - "name": "MB2_B_MSG", - "sequences": [ - { "loop": 0, "subtitles": ["CAM2_B_MSG1", "CAM2_B_MSG2", "CAM2_B_MSG3"], "video": "cam2/cam2bpl.ogg" }, - { "loop": 0, "subtitles": "", "video": "cam2/cam2bcol.ogg" } - ] - }, - "video0001": { - "name": "MB2_B_MSG2", - "sequences": [ - { "loop": 0, "subtitles": ["CAM2_B_MSG7", "CAM2_B_MSG8", "CAM2_B_MSG9"], "video": "cam2/cam2b.ogg" } - ] + "type": "wz2100.briefs.v1", + "briefs": { + "MB2_B_MSG": { + "sequences": [ + { "loop": 0, "subtitles": ["CAM2_B_MSG1", "CAM2_B_MSG2", "CAM2_B_MSG3"], "video": "cam2/cam2bpl.ogg" }, + { "loop": 0, "subtitles": "", "video": "cam2/cam2bcol.ogg" } + ] + }, + "MB2_B_MSG2": { + "sequences": [ + { "loop": 0, "subtitles": ["CAM2_B_MSG7", "CAM2_B_MSG8", "CAM2_B_MSG9"], "video": "cam2/cam2b.ogg" } + ] + } } } diff --git a/data/base/messages/brief3-1a.json b/data/base/messages/brief3-1a.json index 80a05c9a586..33cfb7765b1 100644 --- a/data/base/messages/brief3-1a.json +++ b/data/base/messages/brief3-1a.json @@ -1,16 +1,17 @@ { - "video0000": { - "name": "MB3_1A_MSG", - "sequences": [ - { "loop": 0, "subtitles": "CAM3_1A_MSG", "video": "incomint.ogg" }, - { "loop": 0, "subtitles": ["CAM3_1A_MSG1", "CAM3_1A_MSG2", "CAM3_1A_MSG3"], "video": "cam3/cam31gam.ogg" }, - { "loop": 0, "subtitles": ["CAM3_1A_MSG4", "CAM3_1A_MSG5"], "video": "cam3/cam31g2.ogg" } - ] - }, - "video0001": { - "name": "MB3_1A_MSG2", - "sequences": [ - { "loop": 0, "subtitles": ["CAM3_1A_MSG6", "CAM3_1A_MSG7", "CAM3_1A_MSG8"], "video": "cam3/cam3_1.ogg" } - ] + "type": "wz2100.briefs.v1", + "briefs": { + "MB3_1A_MSG": { + "sequences": [ + { "loop": 0, "subtitles": "CAM3_1A_MSG", "video": "incomint.ogg" }, + { "loop": 0, "subtitles": ["CAM3_1A_MSG1", "CAM3_1A_MSG2", "CAM3_1A_MSG3"], "video": "cam3/cam31gam.ogg" }, + { "loop": 0, "subtitles": ["CAM3_1A_MSG4", "CAM3_1A_MSG5"], "video": "cam3/cam31g2.ogg" } + ] + }, + "MB3_1A_MSG2": { + "sequences": [ + { "loop": 0, "subtitles": ["CAM3_1A_MSG6", "CAM3_1A_MSG7", "CAM3_1A_MSG8"], "video": "cam3/cam3_1.ogg" } + ] + } } } diff --git a/data/base/messages/brief3-1b.json b/data/base/messages/brief3-1b.json index 0feaf4f8eb1..ab85fb1dacf 100644 --- a/data/base/messages/brief3-1b.json +++ b/data/base/messages/brief3-1b.json @@ -1,16 +1,17 @@ { - "video0000": { - "name": "MB3_1B_MSG", - "sequences": [ - { "loop": 0, "subtitles": "NP_MSG1", "video": "incomint.ogg" }, - { "loop": 0, "subtitles": "", "video": "cam3/cam3_1bn.ogg" }, - { "loop": 0, "subtitles": ["CAM3_1B_MSG1", "CAM3_1B_MSG2", "CAM3_1B_MSG3"], "video": "cam3/cam31bpl.ogg" } - ] - }, - "video0001": { - "name": "MB3_1B_MSG2", - "sequences": [ - { "loop": 0, "subtitles": ["CAM3_1B_MSG4", "CAM3_1B_MSG5", "CAM3_1B_MSG6"], "video": "cam3/cam3_1b.ogg" } - ] + "type": "wz2100.briefs.v1", + "briefs": { + "MB3_1B_MSG": { + "sequences": [ + { "loop": 0, "subtitles": "NP_MSG1", "video": "incomint.ogg" }, + { "loop": 0, "subtitles": "", "video": "cam3/cam3_1bn.ogg" }, + { "loop": 0, "subtitles": ["CAM3_1B_MSG1", "CAM3_1B_MSG2", "CAM3_1B_MSG3"], "video": "cam3/cam31bpl.ogg" } + ] + }, + "MB3_1B_MSG2": { + "sequences": [ + { "loop": 0, "subtitles": ["CAM3_1B_MSG4", "CAM3_1B_MSG5", "CAM3_1B_MSG6"], "video": "cam3/cam3_1b.ogg" } + ] + } } } diff --git a/data/base/messages/brief3-2.json b/data/base/messages/brief3-2.json index 00c52a644f0..13579e34391 100644 --- a/data/base/messages/brief3-2.json +++ b/data/base/messages/brief3-2.json @@ -1,29 +1,28 @@ { - "video0000": { - "name": "MB3_2_MSG", - "sequences": [ - { "loop": 0, "subtitles": ["CAM3_2_MSG1", "CAM3_2_MSG2", "CAM3_2_MSG3"], "video": "cam3/cam32pl.ogg" }, - { "loop": 0, "subtitles": "CAM3_2_MSG4", "video": "cam3/cam32alp.ogg" }, - { "loop": 0, "subtitles": "CAM3_2_MSG5", "video": "cam3/cam32pl2.ogg" } - ] - }, - "video0001": { - "name": "MB3_2_MSG2", - "sequences": [ - { "loop": 0, "subtitles": ["CAM3_2_MSG6", "CAM3_2_MSG7", "CAM3_2_MSG8"], "video": "cam3/cam3_2b.ogg" } - ] - }, - "video0002": { - "name": "MB3_2_MSG3", - "sequences": [ - { "loop": 0, "subtitles": "NP_MSG1", "video": "incomtns.ogg" }, - { "loop": 0, "subtitles": "", "video": "cam3/cam32a2.ogg" } - ] - }, - "video0003": { - "name": "MB3_2_MSG4", - "sequences": [ - { "loop": 0, "subtitles": "CAM3_2_MSG9", "video": "cam3/cam32pl3.ogg" } - ] + "type": "wz2100.briefs.v1", + "briefs": { + "MB3_2_MSG": { + "sequences": [ + { "loop": 0, "subtitles": ["CAM3_2_MSG1", "CAM3_2_MSG2", "CAM3_2_MSG3"], "video": "cam3/cam32pl.ogg" }, + { "loop": 0, "subtitles": "CAM3_2_MSG4", "video": "cam3/cam32alp.ogg" }, + { "loop": 0, "subtitles": "CAM3_2_MSG5", "video": "cam3/cam32pl2.ogg" } + ] + }, + "MB3_2_MSG2": { + "sequences": [ + { "loop": 0, "subtitles": ["CAM3_2_MSG6", "CAM3_2_MSG7", "CAM3_2_MSG8"], "video": "cam3/cam3_2b.ogg" } + ] + }, + "MB3_2_MSG3": { + "sequences": [ + { "loop": 0, "subtitles": "NP_MSG1", "video": "incomtns.ogg" }, + { "loop": 0, "subtitles": "", "video": "cam3/cam32a2.ogg" } + ] + }, + "MB3_2_MSG4": { + "sequences": [ + { "loop": 0, "subtitles": "CAM3_2_MSG9", "video": "cam3/cam32pl3.ogg" } + ] + } } } diff --git a/data/base/messages/brief3-4.json b/data/base/messages/brief3-4.json index 210e088f226..dfbdd071272 100644 --- a/data/base/messages/brief3-4.json +++ b/data/base/messages/brief3-4.json @@ -1,33 +1,31 @@ { - "video0000": { - "name": "MB3_4_MSG", - "sequences": [ - { "loop": 0, "subtitles": "CAM3_4_MSG1", "video": "brfcom.ogg" }, - { "loop": 0, "subtitles": ["CAM3_4_MSG2", "CAM3_4_MSG3", "CAM3_4_MSG4"], "video": "cam3/cam3_4a.ogg" } - ] - }, - "video0001": { - "name": "MB3_4_MSG2", - "sequences": [ - { "loop": 0, "subtitles": ["CAM3_4_MSG5", "CAM3_4_MSG6"], "video": "cam3/cam3_4b.ogg" } - ] - }, - "video0002": { - "name": "MB3_4_MSG3", - "sequences": [ - { "loop": 0, "subtitles": "", "video": "cam3/cam34fmv.ogg" } - ] - }, - "video0003": { - "name": "MB3_4_MSG4", - "sequences": [ - { "loop": 0, "subtitles": "", "video": "cam3/cam34mu1.ogg" } - ] - }, - "video0004": { - "name": "MB3_4_MSG5", - "sequences": [ - { "loop": 0, "subtitles": "", "video": "cam3/cam34mu2.ogg" } - ] + "type": "wz2100.briefs.v1", + "briefs": { + "MB3_4_MSG": { + "sequences": [ + { "loop": 0, "subtitles": "CAM3_4_MSG1", "video": "brfcom.ogg" }, + { "loop": 0, "subtitles": ["CAM3_4_MSG2", "CAM3_4_MSG3", "CAM3_4_MSG4"], "video": "cam3/cam3_4a.ogg" } + ] + }, + "MB3_4_MSG2": { + "sequences": [ + { "loop": 0, "subtitles": ["CAM3_4_MSG5", "CAM3_4_MSG6"], "video": "cam3/cam3_4b.ogg" } + ] + }, + "MB3_4_MSG3": { + "sequences": [ + { "loop": 0, "subtitles": "", "video": "cam3/cam34fmv.ogg" } + ] + }, + "MB3_4_MSG4": { + "sequences": [ + { "loop": 0, "subtitles": "", "video": "cam3/cam34mu1.ogg" } + ] + }, + "MB3_4_MSG5": { + "sequences": [ + { "loop": 0, "subtitles": "", "video": "cam3/cam34mu2.ogg" } + ] + } } } diff --git a/data/base/messages/brief3-a.json b/data/base/messages/brief3-a.json index 046febbcbaa..6f9ea19062c 100644 --- a/data/base/messages/brief3-a.json +++ b/data/base/messages/brief3-a.json @@ -1,15 +1,16 @@ { - "video0000": { - "name": "MB3A_MSG", - "sequences": [ - { "loop": 0, "subtitles": ["CAM3_MSG1", "CAM3_MSG2", "CAM3_MSG3"], "video": "cam3/cam3intp.ogg" }, - { "loop": 0, "subtitles": "", "video": "cam3/cam3int.ogg" } - ] - }, - "video0001": { - "name": "MB3A_MSG2", - "sequences": [ - { "loop": 0, "subtitles": ["CAM3A_MSG1", "CAM3A_MSG2", "CAM3A_MSG3"], "video": "cam3/cam3intb.ogg" } - ] + "type": "wz2100.briefs.v1", + "briefs": { + "MB3A_MSG": { + "sequences": [ + { "loop": 0, "subtitles": ["CAM3_MSG1", "CAM3_MSG2", "CAM3_MSG3"], "video": "cam3/cam3intp.ogg" }, + { "loop": 0, "subtitles": "", "video": "cam3/cam3int.ogg" } + ] + }, + "MB3A_MSG2": { + "sequences": [ + { "loop": 0, "subtitles": ["CAM3A_MSG1", "CAM3A_MSG2", "CAM3A_MSG3"], "video": "cam3/cam3intb.ogg" } + ] + } } } diff --git a/data/base/messages/brief3-b.json b/data/base/messages/brief3-b.json index 2bafc0b7947..ee7dd68e509 100644 --- a/data/base/messages/brief3-b.json +++ b/data/base/messages/brief3-b.json @@ -1,22 +1,22 @@ { - "video0000": { - "name": "MB3_B_MSG", - "sequences": [ - { "loop": 0, "subtitles": ["CAM3_B_MSG1", "CAM3_B_MSG2", "CAM3_B_MSG3"], "video": "cam3/cam3bpl.ogg" }, - { "loop": 0, "subtitles": "INCOM_INT", "video": "incomint.ogg" }, - { "loop": 0, "subtitles": "", "video": "cam3/cam3bg.ogg" } - ] - }, - "video0001": { - "name": "MB3_B_MSG2", - "sequences": [ - { "loop": 0, "subtitles": ["CAM3_B_MSG4", "CAM3_B_MSG5", "CAM3_B_MSG6"], "video": "cam3/cam3b.ogg" } - ] - }, - "video0002": { - "name": "MB3_B_MSG3", - "sequences": [ - { "loop": 0, "subtitles": "", "video": "cam3/cam3_bn.ogg" } - ] + "type": "wz2100.briefs.v1", + "briefs": { + "MB3_B_MSG": { + "sequences": [ + { "loop": 0, "subtitles": ["CAM3_B_MSG1", "CAM3_B_MSG2", "CAM3_B_MSG3"], "video": "cam3/cam3bpl.ogg" }, + { "loop": 0, "subtitles": "INCOM_INT", "video": "incomint.ogg" }, + { "loop": 0, "subtitles": "", "video": "cam3/cam3bg.ogg" } + ] + }, + "MB3_B_MSG2": { + "sequences": [ + { "loop": 0, "subtitles": ["CAM3_B_MSG4", "CAM3_B_MSG5", "CAM3_B_MSG6"], "video": "cam3/cam3b.ogg" } + ] + }, + "MB3_B_MSG3": { + "sequences": [ + { "loop": 0, "subtitles": "", "video": "cam3/cam3_bn.ogg" } + ] + } } } diff --git a/data/base/messages/brief3-c.json b/data/base/messages/brief3-c.json index ff9c98e49ec..4a8100127e2 100644 --- a/data/base/messages/brief3-c.json +++ b/data/base/messages/brief3-c.json @@ -1,20 +1,21 @@ { - "video0000": { - "name": "MB3_C_MSG", - "sequences": [ - { "loop": 0, "subtitles": ["CAM3_C_MSG1", "CAM3_C_MSG2"], "video": "cam3/cam3cpl1.ogg" }, - { "loop": 0, "subtitles": "", "video": "cam3/cam3_cn.ogg" }, - { "loop": 0, "subtitles": "", "video": "cam3/c3c.ogg" }, - { "loop": 0, "subtitles": ["CAM3_C_MSG3", "CAM3_C_MSG4"], "video": "cam3/cam3cpl2.ogg" } - ] - }, - "video0001": { - "name": "MB3_C_MSG2", - "sequences": [ - { "loop": 0, "subtitles": ["CAM3_C_MSG5", "CAM3_C_MSG6", "CAM3_C_MSG7"], "video": "cam3/cam3cbet.ogg" }, - { "loop": 0, "subtitles": ["CAM3_C_MSG8", "CAM3_C_MSG9"], "video": "cam3/cam3cpl3.ogg" }, - { "loop": 0, "subtitles": "CAM3_C_MSG10", "video": "incomtns.ogg" }, - { "loop": 0, "subtitles": ["CAM3_C_MSG11", "CAM3_C_MSG12", "CAM3_C_MSG13"], "video": "cam3/cam3_cg.ogg" } - ] + "type": "wz2100.briefs.v1", + "briefs": { + "MB3_C_MSG": { + "sequences": [ + { "loop": 0, "subtitles": ["CAM3_C_MSG1", "CAM3_C_MSG2"], "video": "cam3/cam3cpl1.ogg" }, + { "loop": 0, "subtitles": "", "video": "cam3/cam3_cn.ogg" }, + { "loop": 0, "subtitles": "", "video": "cam3/c3c.ogg" }, + { "loop": 0, "subtitles": ["CAM3_C_MSG3", "CAM3_C_MSG4"], "video": "cam3/cam3cpl2.ogg" } + ] + }, + "MB3_C_MSG2": { + "sequences": [ + { "loop": 0, "subtitles": ["CAM3_C_MSG5", "CAM3_C_MSG6", "CAM3_C_MSG7"], "video": "cam3/cam3cbet.ogg" }, + { "loop": 0, "subtitles": ["CAM3_C_MSG8", "CAM3_C_MSG9"], "video": "cam3/cam3cpl3.ogg" }, + { "loop": 0, "subtitles": "CAM3_C_MSG10", "video": "incomtns.ogg" }, + { "loop": 0, "subtitles": ["CAM3_C_MSG11", "CAM3_C_MSG12", "CAM3_C_MSG13"], "video": "cam3/cam3_cg.ogg" } + ] + } } } diff --git a/data/base/messages/brief3a-b.json b/data/base/messages/brief3a-b.json index 5971e9ca81d..3d61ec83ad0 100644 --- a/data/base/messages/brief3a-b.json +++ b/data/base/messages/brief3a-b.json @@ -1,22 +1,22 @@ { - "video0000": { - "name": "MB3_AB_MSG", - "sequences": [ - { "loop": 0, "subtitles": ["CAM3_AB_MSG1", "CAM3_AB_MSG2"], "video": "brfcom4s.ogg" }, - { "loop": 0, "subtitles": ["CAM3_AB_MSG3", "CAM3_AB_MSG4"], "video": "cam3/cam3aba.ogg" }, - { "loop": 0, "subtitles": "", "video": "cam3/cam3abf.ogg" } - ] - }, - "video0001": { - "name": "MB3_AB_MSG2", - "sequences": [ - { "loop": 0, "subtitles": "CAM3_AB_MSG1", "video": "cam3/cam3abpl.ogg" } - ] - }, - "video0002": { - "name": "MB3_AB_MSG3", - "sequences": [ - { "loop": 0, "subtitles": ["CAM3_AB_MSG5", "CAM3_AB_MSG6", "CAM3_AB_MSG7"], "video": "cam3/cam3ab.ogg" } - ] + "type": "wz2100.briefs.v1", + "briefs": { + "MB3_AB_MSG": { + "sequences": [ + { "loop": 0, "subtitles": ["CAM3_AB_MSG1", "CAM3_AB_MSG2"], "video": "brfcom4s.ogg" }, + { "loop": 0, "subtitles": ["CAM3_AB_MSG3", "CAM3_AB_MSG4"], "video": "cam3/cam3aba.ogg" }, + { "loop": 0, "subtitles": "", "video": "cam3/cam3abf.ogg" } + ] + }, + "MB3_AB_MSG2": { + "sequences": [ + { "loop": 0, "subtitles": "CAM3_AB_MSG1", "video": "cam3/cam3abpl.ogg" } + ] + }, + "MB3_AB_MSG3": { + "sequences": [ + { "loop": 0, "subtitles": ["CAM3_AB_MSG5", "CAM3_AB_MSG6", "CAM3_AB_MSG7"], "video": "cam3/cam3ab.ogg" } + ] + } } } diff --git a/data/base/messages/brief3a-d1.json b/data/base/messages/brief3a-d1.json index 28e359a5066..de0524a2b0b 100644 --- a/data/base/messages/brief3a-d1.json +++ b/data/base/messages/brief3a-d1.json @@ -1,28 +1,27 @@ { - "video0000": { - "name": "MB3_AD1_MSG", - "sequences": [ - { "loop": 0, "subtitles": ["CAM3A_D1_MSG1", "CAM3A_D1_MSG2", "CAM3A_D1_MSG3"], "video": "cam3/c3ad1pl1.ogg" }, - { "loop": 0, "subtitles": ["CAM3A_D1_MSG4", "CAM3A_D1_MSG5"], "video": "cam3/c3_d1_a.ogg" } - ] - }, - "video0001": { - "name": "MB3_AD1_MSG2", - "sequences": [ - { "loop": 0, "subtitles": "CAM3A_D1_MSG6", "video": "cam3/c3ad1pl2.ogg" }, - { "loop": 0, "subtitles": ["CAM3A_D1_MSG7", "CAM3A_D1_MSG8"], "video": "cam3/c3_d1_b.ogg" } - ] - }, - "video0002": { - "name": "MB3_AD1_MSG3", - "sequences": [ - { "loop": 0, "subtitles": ["CAM3A_D1_MSG9", "CAM3A_D1_MSG10", "CAM3A_D1_MSG11"], "video": "cam3/cam3ad1b.ogg" } - ] - }, - "video0003": { - "name": "MB3_AD1_MSG4", - "sequences": [ - { "loop": 0, "subtitles": "CAM3A_D1_MSG12", "video": "cam3/c3ad1pl3.ogg" } - ] + "type": "wz2100.briefs.v1", + "briefs": { + "MB3_AD1_MSG": { + "sequences": [ + { "loop": 0, "subtitles": ["CAM3A_D1_MSG1", "CAM3A_D1_MSG2", "CAM3A_D1_MSG3"], "video": "cam3/c3ad1pl1.ogg" }, + { "loop": 0, "subtitles": ["CAM3A_D1_MSG4", "CAM3A_D1_MSG5"], "video": "cam3/c3_d1_a.ogg" } + ] + }, + "MB3_AD1_MSG2": { + "sequences": [ + { "loop": 0, "subtitles": "CAM3A_D1_MSG6", "video": "cam3/c3ad1pl2.ogg" }, + { "loop": 0, "subtitles": ["CAM3A_D1_MSG7", "CAM3A_D1_MSG8"], "video": "cam3/c3_d1_b.ogg" } + ] + }, + "MB3_AD1_MSG3": { + "sequences": [ + { "loop": 0, "subtitles": ["CAM3A_D1_MSG9", "CAM3A_D1_MSG10", "CAM3A_D1_MSG11"], "video": "cam3/cam3ad1b.ogg" } + ] + }, + "MB3_AD1_MSG4": { + "sequences": [ + { "loop": 0, "subtitles": "CAM3A_D1_MSG12", "video": "cam3/c3ad1pl3.ogg" } + ] + } } } diff --git a/data/base/messages/brief3a-d2.json b/data/base/messages/brief3a-d2.json index 96b44e396fc..32020641bed 100644 --- a/data/base/messages/brief3a-d2.json +++ b/data/base/messages/brief3a-d2.json @@ -1,42 +1,39 @@ { - "video0000": { - "name": "MB3_AD2_MSG", - "sequences": [ - { "loop": 0, "subtitles": ["CAM3A_D2_MSG1", "CAM3A_D2_MSG2", "CAM3A_D2_MSG3"], "video": "cam3/c3ad2pl1.ogg" }, - { "loop": 0, "subtitles": ["CAM3A_D2_MSG4", "CAM3A_D2_MSG5", "CAM3A_D2_MSG6"], "video": "cam3/c3ad2pl2.ogg" }, - { "loop": 0, "subtitles": "CAM3A_D2_MSG7", "video": "cam3/c3ad2pl3.ogg" }, - { "loop": 0, "subtitles": "", "video": "cam3/cam3ad2n.ogg" } - ] - }, - "video0001": { - "name": "MB3_AD2_MSG2", - "sequences": [ - { "loop": 0, "subtitles": "", "video": "cam3/c3ad2n2.ogg" } - ] - }, - "video0002": { - "name": "MB3_AD2_MSG3", - "sequences": [ - { "loop": 1, "subtitles": ["CAM3A_D2_MSG8", "CAM3A_D2_MSG9", "CAM3A_D2_MSG10"], "video": "cam3/c3ad2pl4.ogg" }, - { "loop": 0, "subtitles": ["CAM3A_D2_MSG11", "CAM3A_D2_MSG12", "CAM3A_D2_MSG13"], "video": "cam3/c3ad2_09.ogg" } - ] - }, - "video0003": { - "name": "MB3_AD2_MSG4", - "sequences": [ - { "loop": 0, "subtitles": ["CAM3A_D2_MSG14", "CAM3A_D2_MSG15", "CAM3A_D2_MSG16"], "video": "cam3/c3ad2_12.ogg" } - ] - }, - "video0004": { - "name": "MB3_AD2_MSG5", - "sequences": [ - { "loop": 0, "subtitles": ["CAM3A_D2_MSG17", "CAM3A_D2_MSG18", "CAM3A_D2_MSG19"], "video": "cam3/c3ad2_14.ogg" } - ] - }, - "video0005": { - "name": "MB3_AD2_MSG6", - "sequences": [ - { "loop": 0, "subtitles": ["CAM3A_D2_MSG20", "CAM3A_D2_MSG21"], "video": "cam3/c3ad2_16.ogg" } - ] + "type": "wz2100.briefs.v1", + "briefs": { + "MB3_AD2_MSG": { + "sequences": [ + { "loop": 0, "subtitles": ["CAM3A_D2_MSG1", "CAM3A_D2_MSG2", "CAM3A_D2_MSG3"], "video": "cam3/c3ad2pl1.ogg" }, + { "loop": 0, "subtitles": ["CAM3A_D2_MSG4", "CAM3A_D2_MSG5", "CAM3A_D2_MSG6"], "video": "cam3/c3ad2pl2.ogg" }, + { "loop": 0, "subtitles": "CAM3A_D2_MSG7", "video": "cam3/c3ad2pl3.ogg" }, + { "loop": 0, "subtitles": "", "video": "cam3/cam3ad2n.ogg" } + ] + }, + "MB3_AD2_MSG2": { + "sequences": [ + { "loop": 0, "subtitles": "", "video": "cam3/c3ad2n2.ogg" } + ] + }, + "MB3_AD2_MSG3": { + "sequences": [ + { "loop": 1, "subtitles": ["CAM3A_D2_MSG8", "CAM3A_D2_MSG9", "CAM3A_D2_MSG10"], "video": "cam3/c3ad2pl4.ogg" }, + { "loop": 0, "subtitles": ["CAM3A_D2_MSG11", "CAM3A_D2_MSG12", "CAM3A_D2_MSG13"], "video": "cam3/c3ad2_09.ogg" } + ] + }, + "MB3_AD2_MSG4": { + "sequences": [ + { "loop": 0, "subtitles": ["CAM3A_D2_MSG14", "CAM3A_D2_MSG15", "CAM3A_D2_MSG16"], "video": "cam3/c3ad2_12.ogg" } + ] + }, + "MB3_AD2_MSG5": { + "sequences": [ + { "loop": 0, "subtitles": ["CAM3A_D2_MSG17", "CAM3A_D2_MSG18", "CAM3A_D2_MSG19"], "video": "cam3/c3ad2_14.ogg" } + ] + }, + "MB3_AD2_MSG6": { + "sequences": [ + { "loop": 0, "subtitles": ["CAM3A_D2_MSG20", "CAM3A_D2_MSG21"], "video": "cam3/c3ad2_16.ogg" } + ] + } } } diff --git a/data/base/messages/briefdemo.json b/data/base/messages/briefdemo.json index 02a2b2f2736..a1f15fe73a8 100644 --- a/data/base/messages/briefdemo.json +++ b/data/base/messages/briefdemo.json @@ -1,9 +1,11 @@ { - "video0000": { - "name": "MBDEMO_MSG", - "sequences": [ - { "loop": 0, "subtitles": "TRANS_MSG1", "video": "brfcom.ogg" }, - { "loop": 0, "subtitles": ["CAM1A_MSG1", "CAM1A_MSG2", "CAM1A_MSG3"], "video": "fastplay.ogg" } - ] + "type": "wz2100.briefs.v1", + "briefs": { + "MBDEMO_MSG": { + "sequences": [ + { "loop": 0, "subtitles": "TRANS_MSG1", "video": "brfcom.ogg" }, + { "loop": 0, "subtitles": ["CAM1A_MSG1", "CAM1A_MSG2", "CAM1A_MSG3"], "video": "fastplay.ogg" } + ] + } } } diff --git a/data/base/messages/brieftut.json b/data/base/messages/brieftut.json index 9439314cdfa..01b5d88d41a 100644 --- a/data/base/messages/brieftut.json +++ b/data/base/messages/brieftut.json @@ -1,8 +1,10 @@ { - "video0000": { - "name": "FACTORYVIPER", - "sequences": [ - { "loop": 0, "subtitles": "", "video": "factory.ogg" } - ] + "type": "wz2100.briefs.v1", + "briefs": { + "FACTORYVIPER": { + "sequences": [ + { "loop": 0, "subtitles": "", "video": "factory.ogg" } + ] + } } } diff --git a/data/base/messages/cam1-outro.json b/data/base/messages/cam1-outro.json index 82fe0fe6895..bf586b6cc5b 100644 --- a/data/base/messages/cam1-outro.json +++ b/data/base/messages/cam1-outro.json @@ -1,24 +1,24 @@ { - "video0000": { - "name": "CAM1_OUT", - "sequences": [ - { "loop": 0, "subtitles": ["CAM1OUT_MSG1", "CAM1OUT_MSG2", "CAM1OUT_MSG3"], "video": "cam1/cam1out1.ogg" }, - { "loop": 0, "subtitles": "", "video": "cam1/cam1out2.ogg" }, - { "loop": 0, "subtitles": "", "video": "cam1/cam1out3.ogg" } - ] - }, - "video0001": { - "name": "CAM1_OUT2", - "sequences": [ - { "loop": 0, "subtitles": "", "video": "cam1/cam1out4.ogg" }, - { "loop": 0, "subtitles": "", "video": "cam1/cam1out5.ogg" }, - { "loop": 1, "subtitles": ["CAM1OUT_MSG4", "CAM1OUT_MSG5"], "video": "cam1/cam1out6.ogg" } - ] - }, - "video0002": { - "name": "CAM2_BRIEF", - "sequences": [ - { "loop": 0, "subtitles": "CAM1OUT_MSG6", "video": "cam1/c001end.ogg" } - ] + "type": "wz2100.briefs.v1", + "briefs": { + "CAM1_OUT": { + "sequences": [ + { "loop": 0, "subtitles": ["CAM1OUT_MSG1", "CAM1OUT_MSG2", "CAM1OUT_MSG3"], "video": "cam1/cam1out1.ogg" }, + { "loop": 0, "subtitles": "", "video": "cam1/cam1out2.ogg" }, + { "loop": 0, "subtitles": "", "video": "cam1/cam1out3.ogg" } + ] + }, + "CAM1_OUT2": { + "sequences": [ + { "loop": 0, "subtitles": "", "video": "cam1/cam1out4.ogg" }, + { "loop": 0, "subtitles": "", "video": "cam1/cam1out5.ogg" }, + { "loop": 1, "subtitles": ["CAM1OUT_MSG4", "CAM1OUT_MSG5"], "video": "cam1/cam1out6.ogg" } + ] + }, + "CAM2_BRIEF": { + "sequences": [ + { "loop": 0, "subtitles": "CAM1OUT_MSG6", "video": "cam1/c001end.ogg" } + ] + } } } diff --git a/data/base/messages/genmessages.json b/data/base/messages/genmessages.json index 6a6d3baea0f..87302b0ceb1 100644 --- a/data/base/messages/genmessages.json +++ b/data/base/messages/genmessages.json @@ -1,14 +1,15 @@ { - "video0000": { - "name": "END", - "sequences": [ - { "loop": 0, "subtitles": "END_MSG1", "video": "end.ogg" } - ] - }, - "video0001": { - "name": "WIN", - "sequences": [ - { "loop": 0, "subtitles": "WIN_MSG1", "video": "victory.ogg" } - ] + "type": "wz2100.briefs.v1", + "briefs": { + "END": { + "sequences": [ + { "loop": 0, "subtitles": "END_MSG1", "video": "end.ogg" } + ] + }, + "WIN": { + "sequences": [ + { "loop": 0, "subtitles": "WIN_MSG1", "video": "victory.ogg" } + ] + } } } diff --git a/doc/BriefAndProximityFormat.md b/doc/BriefAndProximityFormat.md index 4399c90080d..0e9a80783c9 100644 --- a/doc/BriefAndProximityFormat.md +++ b/doc/BriefAndProximityFormat.md @@ -29,19 +29,21 @@ Each Proximity message must have a unique ID. This ID will be what can be refere Example: ```json { - "video0000": { - "name": "MB1A_MSG", - "sequences": [ - { "loop": 1, "subtitles": "TRANS_MSG1", "video": "brfcom.ogg" }, - { "loop": 0, "subtitles": ["CAM1A_MSG1", "CAM1A_MSG2", "CAM1A_MSG3"], "video": "cam1/cam1ascv.ogg" } - ] + "type": "wz2100.briefs.v1", + "briefs": { + "MB1A_MSG": { + "sequences": [ + { "loop": 1, "subtitles": "TRANS_MSG1", "video": "brfcom.ogg" }, + { "loop": 0, "subtitles": ["CAM1A_MSG1", "CAM1A_MSG2", "CAM1A_MSG3"], "video": "cam1/cam1ascv.ogg" } + ] + } } } ``` -Each video sequence should start with something simple like "video..." or something else at your discretion. Order here does not matter. -Within each sequence, there will be two values: -- name: The unique view data name ID. This will be used as a reference for scripts to invoke to start a video subset. +Each briefing must have a unique ID. This will be used as a reference for scripts to invoke to start a video subset. + +Within each briefing, there will be: - sequences: an array of objects (order matters!) containing variables about each sub-video: - loop: An integer between 0-1 to loop the entire video until its audio stops playing. Will always display subtitles every frame if set to 1. - subtitles: String or array of string translation references for the video. These are added to the Intel menu icon text messages. diff --git a/src/message.cpp b/src/message.cpp index 1ce6400b508..bf6e8714b37 100644 --- a/src/message.cpp +++ b/src/message.cpp @@ -39,6 +39,7 @@ #include "stats.h" #include "text.h" #include "qtscript.h" +#include "wzjsonhelpers.h" static std::map apsViewData; @@ -743,71 +744,137 @@ WzString *loadProximityViewData(const char *fileName) return new WzString(fileName); // so that cleanup function will be called on right data } +inline void from_json(const nlohmann::json& j, SEQ_DISPLAY& v) +{ + v.sequenceName = WzString::fromUtf8(j["video"].get()); + debug(LOG_WZ, "Sequence name: %s", v.sequenceName.toUtf8().c_str()); + v.flag = j["loop"].get(); + debug(LOG_WZ, "Sequence loop: %d", v.flag); + // Set the subtitle string for the sequence. + const nlohmann::json& subtitles = j["subtitles"]; + if (!subtitles.is_null() && subtitles.is_array()) + { + for (auto &a : subtitles) + { + std::string msg = a.get(); + if (msg.length() != 0) + { + const char *str = strresGetString(psStringRes, msg.c_str()); + ASSERT(str, "Cannot find the view data string with id \"%s\"", msg.c_str()); + v.textMsg.push_back(WzString::fromUtf8(str)); + debug(LOG_WZ, "Sequence subtitle array: %s", msg.c_str()); + } + } + } + else + { + std::string msg = subtitles.get(); + if (msg.length() != 0) + { + const char *str = strresGetString(psStringRes, msg.c_str()); + ASSERT(str, "Cannot find the view data string with id \"%s\"", msg.c_str()); + v.textMsg.push_back(WzString::fromUtf8(str)); + debug(LOG_WZ, "Sequence subtitle string: %s", msg.c_str()); + } + } +} + +#if defined(WZ_CC_GNU) && !defined(WZ_CC_INTEL) && !defined(WZ_CC_CLANG) && (7 <= __GNUC__) && (__GNUC__ < 10) +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wnull-dereference" // GCC < 10 warning is buggy +#endif + WzString *loadFlicViewData(const char *fileName) { ASSERT_OR_RETURN(nullptr, PHYSFS_exists(fileName), "%s not found", fileName); - WzConfig ini(fileName, WzConfig::ReadOnlyAndRequired); - std::vector list = ini.childGroups(); - for (size_t i = 0; i < list.size(); ++i) + + auto jsonObjOpt = wzLoadJsonObjectFromFile(fileName); + if (!jsonObjOpt.has_value()) + { + debug(LOG_ERROR, "Failed to load JSON: %s", fileName); + return nullptr; + } + const auto& jsonObj = jsonObjOpt.value(); + + // "type": "wz2100.briefs.v1" + auto it = jsonObj.find("type"); + if (it == jsonObj.end()) + { + debug(LOG_ERROR, "Missing required \"type\" key: %s", fileName); + return nullptr; + } + if (!it.value().is_string() || it.value().get() != "wz2100.briefs.v1") + { + debug(LOG_ERROR, "Unexpected \"type\" - expecting \"wz2100.briefs.v1\": %s", fileName); + return nullptr; + } + + // "briefs" + it = jsonObj.find("briefs"); + if (it == jsonObj.end()) + { + debug(LOG_ERROR, "Missing required \"briefs\" key: %s", fileName); + return nullptr; + } + if (!it.value().is_object()) + { + debug(LOG_ERROR, "\"briefs\" value is not an object: %s", fileName); + return nullptr; + } + const auto& briefsObj = it.value(); + + for (auto brief : briefsObj.items()) { + debug(LOG_WZ, "Sequence video set: %s", brief.key().c_str()); + + const auto& briefObj = brief.value(); + if (!briefObj.is_object()) + { + debug(LOG_ERROR, "\"briefs\"[%s] value is not an object: %s", brief.key().c_str(), fileName); + continue; + } + + auto briefIt = briefObj.find("sequences"); + if (briefIt == briefObj.end()) + { + debug(LOG_ERROR, "\"briefs\"[%s] lacks a \"sequences\" property: %s", brief.key().c_str(), fileName); + continue; + } + if (!briefIt.value().is_array()) + { + debug(LOG_ERROR, "\"briefs\"[%s] \"sequences\" property must have an array value: %s", brief.key().c_str(), fileName); + continue; + } + std::vector seqList; + try { + seqList = briefObj["sequences"].get>(); + } + catch (const std::exception&) + { + debug(LOG_ERROR, "Failed to parse \"briefs\"[%s] \"sequences\" property value: %s", brief.key().c_str(), fileName); + continue; + } + debug(LOG_WZ, "Sequence list size: %zu", seqList.size()); + // Replay viewdata init - unsigned int j = 0; VIEWDATA *v = new VIEWDATA; VIEW_REPLAY *r = new VIEW_REPLAY; v->pData = r; v->fileName = fileName; v->type = VIEW_RPL; - debug(LOG_WZ, "Sequence video set: %s", list[i].toUtf8().c_str()); - - ini.beginGroup(list[i]); - v->name = WzString::fromUtf8(ini.json("name").get()); - debug(LOG_WZ, "Sequence viewdata name: %s", v->name.toUtf8().c_str()); - nlohmann::json element = ini.json("sequences"); - r->seqList.resize(element.size()); - debug(LOG_WZ, "Sequence list size: %d", (int)r->seqList.size()); - for (auto& videoIdx : element) - { - r->seqList[j].sequenceName = WzString::fromUtf8(videoIdx["video"].get()); - debug(LOG_WZ, "Sequence name: %s", r->seqList[j].sequenceName.toUtf8().c_str()); - r->seqList[j].flag = videoIdx["loop"].get(); - debug(LOG_WZ, "Sequence loop: %d", r->seqList[j].flag); - // Set the subtitle string for the sequence. - nlohmann::json array = videoIdx["subtitles"]; - if (!array.is_null() && array.is_array()) - { - for (auto &a : array) - { - std::string msg = a.get(); - if (msg.length() != 0) - { - const char *str = strresGetString(psStringRes, msg.c_str()); - ASSERT(str, "Cannot find the view data string with id \"%s\"", msg.c_str()); - r->seqList[j].textMsg.push_back(WzString::fromUtf8(str)); - debug(LOG_WZ, "Sequence subtitle array: %s", msg.c_str()); - } - } - } - else - { - std::string msg = videoIdx["subtitles"].get(); - if (msg.length() != 0) - { - const char *str = strresGetString(psStringRes, msg.c_str()); - ASSERT(str, "Cannot find the view data string with id \"%s\"", msg.c_str()); - r->seqList[j].textMsg.push_back(WzString::fromUtf8(str)); - debug(LOG_WZ, "Sequence subtitle string: %s", msg.c_str()); - } - } - ++j; - } + v->name = WzString::fromUtf8(brief.key()); + r->seqList = std::move(seqList); - ini.endGroup(); apsViewData[v->name] = v; } return new WzString(fileName); // so that cleanup function will be called on right data } +#if defined(WZ_CC_GNU) && !defined(WZ_CC_INTEL) && !defined(WZ_CC_CLANG) && (7 <= __GNUC__) && (__GNUC__ < 10) +# pragma GCC diagnostic pop +#endif + /* Get the view data identified by the name */ VIEWDATA *getViewData(const WzString &name) { From 2effb95befd89f386983133d804bfe8c560b2fa4 Mon Sep 17 00:00:00 2001 From: past-due <30942300+past-due@users.noreply.github.com> Date: Tue, 29 Oct 2024 18:52:46 -0400 Subject: [PATCH 12/38] Tweak json proximity msg file format --- data/base/messages/prox1-1.json | 7 +++++-- data/base/messages/prox1-2.json | 15 +++++++++------ data/base/messages/prox1-3.json | 19 +++++++++++-------- data/base/messages/prox1-4a.json | 13 ++++++++----- data/base/messages/prox1-5.json | 13 ++++++++----- data/base/messages/prox1-7.json | 15 +++++++++------ data/base/messages/prox1a-c.json | 13 ++++++++----- data/base/messages/prox1a.json | 13 ++++++++----- data/base/messages/prox1b.json | 11 +++++++---- data/base/messages/prox1c.json | 29 ++++++++++++++++------------- data/base/messages/prox1ca.json | 15 +++++++++------ data/base/messages/prox1d.json | 15 +++++++++------ data/base/messages/prox2-1.json | 13 ++++++++----- data/base/messages/prox2-2.json | 11 +++++++---- data/base/messages/prox2-5.json | 11 +++++++---- data/base/messages/prox2-6.json | 13 ++++++++----- data/base/messages/prox2-7.json | 21 ++++++++++++--------- data/base/messages/prox2-8.json | 9 ++++++--- data/base/messages/prox2a.json | 7 +++++-- data/base/messages/prox2b.json | 13 ++++++++----- data/base/messages/prox2c.json | 13 ++++++++----- data/base/messages/prox2d.json | 11 +++++++---- data/base/messages/prox3-1.json | 9 ++++++--- data/base/messages/prox3-2.json | 7 +++++-- data/base/messages/prox3-4.json | 21 ++++++++++++--------- data/base/messages/prox3a-d1.json | 13 ++++++++----- data/base/messages/prox3a.json | 11 +++++++---- data/base/messages/prox3b.json | 13 ++++++++----- data/base/messages/prox3c.json | 13 ++++++++----- data/base/messages/proxdemo.json | 13 ++++++++----- data/base/messages/proxtut.json | 7 +++++-- doc/BriefAndProximityFormat.md | 17 ++++++++++------- src/message.cpp | 31 +++++++++++++++++++++++++++++++ 33 files changed, 291 insertions(+), 164 deletions(-) diff --git a/data/base/messages/prox1-1.json b/data/base/messages/prox1-1.json index 211ba4225e9..025a51ca9f0 100644 --- a/data/base/messages/prox1-1.json +++ b/data/base/messages/prox1-1.json @@ -1,4 +1,7 @@ { - "C1-1_OBJ1": { "audio": "pcv448.ogg", "message": "RUINS_MSG", "type": 0, "x": 2240, "y": 1600, "z": 0 }, - "C1-1_LZ": { "audio": "pcv427.ogg", "message": "LZ_MSG", "type": 2, "x": 1216, "y": 10816, "z": 0 } + "type": "wz2100.proxmsgs.v1", + "msgs": { + "C1-1_OBJ1": { "audio": "pcv448.ogg", "message": "RUINS_MSG", "type": 0, "x": 2240, "y": 1600, "z": 0 }, + "C1-1_LZ": { "audio": "pcv427.ogg", "message": "LZ_MSG", "type": 2, "x": 1216, "y": 10816, "z": 0 } + } } diff --git a/data/base/messages/prox1-2.json b/data/base/messages/prox1-2.json index 0dfb4206c7d..9366ca46e4b 100644 --- a/data/base/messages/prox1-2.json +++ b/data/base/messages/prox1-2.json @@ -1,8 +1,11 @@ { - "C1-2_BASE1": { "audio": "pcv389.ogg", "message": "BARBASE_MSG", "type": 0, "x": 4160, "y": 2112, "z": 0 }, - "C1-2_BASE2": { "audio": "pcv389.ogg", "message": "BARBASE_MSG", "type": 0, "x": 1984, "y": 7000, "z": 0 }, - "C1-2_GUARD1": { "audio": "pcv390.ogg", "message": "BARBASE_MSG", "type": 0, "x": 2880, "y": 5824, "z": 0 }, - "C1-2_GUARD2": { "audio": "pcv390.ogg", "message": "BARBASE_MSG", "type": 0, "x": 5312, "y": 4160, "z": 0 }, - "C1-2_LZ": { "audio": "pcv427.ogg", "message": "LZ_MSG", "type": 2, "x": 6848, "y": 7104, "z": 0 }, - "C1-2_OBJ1": { "audio": "pcv448.ogg", "message": "RUINS_MSG2", "type": 0, "x": 2752, "y": 3904, "z": 0 } + "type": "wz2100.proxmsgs.v1", + "msgs": { + "C1-2_BASE1": { "audio": "pcv389.ogg", "message": "BARBASE_MSG", "type": 0, "x": 4160, "y": 2112, "z": 0 }, + "C1-2_BASE2": { "audio": "pcv389.ogg", "message": "BARBASE_MSG", "type": 0, "x": 1984, "y": 7000, "z": 0 }, + "C1-2_GUARD1": { "audio": "pcv390.ogg", "message": "BARBASE_MSG", "type": 0, "x": 2880, "y": 5824, "z": 0 }, + "C1-2_GUARD2": { "audio": "pcv390.ogg", "message": "BARBASE_MSG", "type": 0, "x": 5312, "y": 4160, "z": 0 }, + "C1-2_LZ": { "audio": "pcv427.ogg", "message": "LZ_MSG", "type": 2, "x": 6848, "y": 7104, "z": 0 }, + "C1-2_OBJ1": { "audio": "pcv448.ogg", "message": "RUINS_MSG2", "type": 0, "x": 2752, "y": 3904, "z": 0 } + } } diff --git a/data/base/messages/prox1-3.json b/data/base/messages/prox1-3.json index 566f3107881..0aaa96fe6a2 100644 --- a/data/base/messages/prox1-3.json +++ b/data/base/messages/prox1-3.json @@ -1,10 +1,13 @@ { - "C1-3_BASE1": { "audio": "pcv389.ogg", "message": "BARBASE_MSG", "type": 0, "x": 5376, "y": 4544, "z": 0 }, - "C1-3_BASE2": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 6592, "y": 1856, "z": 0 }, - "C1-3_BASE3": { "audio": "pcv389.ogg", "message": "BARBASE_MSG", "type": 0, "x": 7168, "y": 7296, "z": 0 }, - "C1-3_LZ": { "audio": "pcv427.ogg", "message": "LZ_MSG", "type": 2, "x": 704, "y": 704, "z": 0 }, - "C1-3_OBJ1": { "audio": "pcv448.ogg", "message": "RUINS_MSG", "type": 0, "x": 448, "y": 6592, "z": 0 }, - "C1-3_OBJ2": { "audio": "pcv448.ogg", "message": "RUINS_MSG", "type": 0, "x": 7616, "y": 7744, "z": 0 }, - "C1-3_OBJ3": { "audio": "pcv448.ogg", "message": "RUINS_MSG", "type": 0, "x": 5312, "y": 704, "z": 0 }, - "C1-3_OBJ4": { "audio": "pcv448.ogg", "message": "RUINS_MSG", "type": 0, "x": 6848, "y": 3008, "z": 0 } + "type": "wz2100.proxmsgs.v1", + "msgs": { + "C1-3_BASE1": { "audio": "pcv389.ogg", "message": "BARBASE_MSG", "type": 0, "x": 5376, "y": 4544, "z": 0 }, + "C1-3_BASE2": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 6592, "y": 1856, "z": 0 }, + "C1-3_BASE3": { "audio": "pcv389.ogg", "message": "BARBASE_MSG", "type": 0, "x": 7168, "y": 7296, "z": 0 }, + "C1-3_LZ": { "audio": "pcv427.ogg", "message": "LZ_MSG", "type": 2, "x": 704, "y": 704, "z": 0 }, + "C1-3_OBJ1": { "audio": "pcv448.ogg", "message": "RUINS_MSG", "type": 0, "x": 448, "y": 6592, "z": 0 }, + "C1-3_OBJ2": { "audio": "pcv448.ogg", "message": "RUINS_MSG", "type": 0, "x": 7616, "y": 7744, "z": 0 }, + "C1-3_OBJ3": { "audio": "pcv448.ogg", "message": "RUINS_MSG", "type": 0, "x": 5312, "y": 704, "z": 0 }, + "C1-3_OBJ4": { "audio": "pcv448.ogg", "message": "RUINS_MSG", "type": 0, "x": 6848, "y": 3008, "z": 0 } + } } diff --git a/data/base/messages/prox1-4a.json b/data/base/messages/prox1-4a.json index fd82bcccfdd..45754156da0 100644 --- a/data/base/messages/prox1-4a.json +++ b/data/base/messages/prox1-4a.json @@ -1,7 +1,10 @@ { - "C1-4_BASE1": { "audio": "pcv389.ogg", "message": "BARBASE_MSG", "type": 0, "x": 2624, "y": 7488, "z": 0 }, - "C1-4_BASE2": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 3648, "y": 2240, "z": 0 }, - "C1-4_BASE3": { "audio": "pcv389.ogg", "message": "BARBASE_MSG", "type": 0, "x": 7104, "y": 2496, "z": 0 }, - "C1-4_LZ": { "audio": "pcv398.ogg", "message": "LZ_MSG", "type": 2, "x": 7488, "y": 4672, "z": 0 }, - "C1-4_OBJ1": { "audio": "pcv448.ogg", "message": "RUINS_MSG", "type": 0, "x": 4160, "y": 3904, "z": 0 } + "type": "wz2100.proxmsgs.v1", + "msgs": { + "C1-4_BASE1": { "audio": "pcv389.ogg", "message": "BARBASE_MSG", "type": 0, "x": 2624, "y": 7488, "z": 0 }, + "C1-4_BASE2": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 3648, "y": 2240, "z": 0 }, + "C1-4_BASE3": { "audio": "pcv389.ogg", "message": "BARBASE_MSG", "type": 0, "x": 7104, "y": 2496, "z": 0 }, + "C1-4_LZ": { "audio": "pcv398.ogg", "message": "LZ_MSG", "type": 2, "x": 7488, "y": 4672, "z": 0 }, + "C1-4_OBJ1": { "audio": "pcv448.ogg", "message": "RUINS_MSG", "type": 0, "x": 4160, "y": 3904, "z": 0 } + } } diff --git a/data/base/messages/prox1-5.json b/data/base/messages/prox1-5.json index 01f334837f0..5559870f362 100644 --- a/data/base/messages/prox1-5.json +++ b/data/base/messages/prox1-5.json @@ -1,7 +1,10 @@ { - "C1-5_BASE1": { "audio": "pcv389.ogg", "message": "BARBASE_MSG", "type": 0, "x": 3264, "y": 704, "z": 0 }, - "C1-5_BASE2": { "audio": "pcv389.ogg", "message": "BARBASE_MSG", "type": 0, "x": 4160, "y": 7616, "z": 0 }, - "C1-5_BASE3": { "audio": "pcv389.ogg", "message": "BARBASE_MSG", "type": 0, "x": 5696, "y": 7488, "z": 0 }, - "C1-5_LZ": { "audio": "pcv427.ogg", "message": "LZ_MSG", "type": 2, "x": 832, "y": 7232, "z": 0 }, - "C1-5_OBJ1": { "audio": "pcv448.ogg", "message": "RUINS_MSG", "type": 0, "x": 5440, "y": 2752, "z": 0 } + "type": "wz2100.proxmsgs.v1", + "msgs": { + "C1-5_BASE1": { "audio": "pcv389.ogg", "message": "BARBASE_MSG", "type": 0, "x": 3264, "y": 704, "z": 0 }, + "C1-5_BASE2": { "audio": "pcv389.ogg", "message": "BARBASE_MSG", "type": 0, "x": 4160, "y": 7616, "z": 0 }, + "C1-5_BASE3": { "audio": "pcv389.ogg", "message": "BARBASE_MSG", "type": 0, "x": 5696, "y": 7488, "z": 0 }, + "C1-5_LZ": { "audio": "pcv427.ogg", "message": "LZ_MSG", "type": 2, "x": 832, "y": 7232, "z": 0 }, + "C1-5_OBJ1": { "audio": "pcv448.ogg", "message": "RUINS_MSG", "type": 0, "x": 5440, "y": 2752, "z": 0 } + } } diff --git a/data/base/messages/prox1-7.json b/data/base/messages/prox1-7.json index 01928e89f9d..4170e15099e 100644 --- a/data/base/messages/prox1-7.json +++ b/data/base/messages/prox1-7.json @@ -1,8 +1,11 @@ { - "C1-7_BASE1": { "audio": "pcv389.ogg", "message": "BARBASE_MSG", "type": 0, "x": 4288, "y": 4928, "z": 0 }, - "C1-7_BASE2": { "audio": "pcv389.ogg", "message": "BARBASE_MSG", "type": 0, "x": 7232, "y": 7104, "z": 0 }, - "C1-7_BASE3": { "audio": "pcv389.ogg", "message": "BARBASE_MSG", "type": 0, "x": 7616, "y": 576, "z": 0 }, - "C1-7_LZ": { "audio": "pcv427.ogg", "message": "LZ_MSG", "type": 2, "x": 960, "y": 7232, "z": 0 }, - "C1-7_LZ2": { "audio": "pcv396.ogg", "message": "LZ_MSG3", "type": 2, "x": 1728, "y": 1472, "z": 0 }, - "C1-7_OBJ1": { "audio": "pcv448.ogg", "message": "RUINS_MSG", "type": 0, "x": 3136, "y": 3904, "z": 0 } + "type": "wz2100.proxmsgs.v1", + "msgs": { + "C1-7_BASE1": { "audio": "pcv389.ogg", "message": "BARBASE_MSG", "type": 0, "x": 4288, "y": 4928, "z": 0 }, + "C1-7_BASE2": { "audio": "pcv389.ogg", "message": "BARBASE_MSG", "type": 0, "x": 7232, "y": 7104, "z": 0 }, + "C1-7_BASE3": { "audio": "pcv389.ogg", "message": "BARBASE_MSG", "type": 0, "x": 7616, "y": 576, "z": 0 }, + "C1-7_LZ": { "audio": "pcv427.ogg", "message": "LZ_MSG", "type": 2, "x": 960, "y": 7232, "z": 0 }, + "C1-7_LZ2": { "audio": "pcv396.ogg", "message": "LZ_MSG3", "type": 2, "x": 1728, "y": 1472, "z": 0 }, + "C1-7_OBJ1": { "audio": "pcv448.ogg", "message": "RUINS_MSG", "type": 0, "x": 3136, "y": 3904, "z": 0 } + } } diff --git a/data/base/messages/prox1a-c.json b/data/base/messages/prox1a-c.json index a58eaa5919d..24a4f57363e 100644 --- a/data/base/messages/prox1a-c.json +++ b/data/base/messages/prox1a-c.json @@ -1,7 +1,10 @@ { - "C1A-C_LZ1": { "audio": "pcv396.ogg", "message": "LZ_MSG3", "type": 0, "x": 15424, "y": 15424, "z": 0 }, - "C1A-C_LZ2": { "audio": "pcv396.ogg", "message": "LZ_MSG3", "type": 0, "x": 12736, "y": 1312, "z": 0 }, - "C1A-C_LZ3": { "audio": "pcv396.ogg", "message": "LZ_MSG3", "type": 0, "x": 8768, "y": 15424, "z": 0 }, - "C1A-C_LZ4": { "audio": "pcv396.ogg", "message": "LZ_MSG3", "type": 0, "x": 1344, "y": 8896, "z": 0 }, - "C1A-C_LZ5": { "audio": "pcv396.ogg", "message": "LZ_MSG3", "type": 0, "x": 5056, "y": 3264, "z": 0 } + "type": "wz2100.proxmsgs.v1", + "msgs": { + "C1A-C_LZ1": { "audio": "pcv396.ogg", "message": "LZ_MSG3", "type": 0, "x": 15424, "y": 15424, "z": 0 }, + "C1A-C_LZ2": { "audio": "pcv396.ogg", "message": "LZ_MSG3", "type": 0, "x": 12736, "y": 1312, "z": 0 }, + "C1A-C_LZ3": { "audio": "pcv396.ogg", "message": "LZ_MSG3", "type": 0, "x": 8768, "y": 15424, "z": 0 }, + "C1A-C_LZ4": { "audio": "pcv396.ogg", "message": "LZ_MSG3", "type": 0, "x": 1344, "y": 8896, "z": 0 }, + "C1A-C_LZ5": { "audio": "pcv396.ogg", "message": "LZ_MSG3", "type": 0, "x": 5056, "y": 3264, "z": 0 } + } } diff --git a/data/base/messages/prox1a.json b/data/base/messages/prox1a.json index 2568ae55379..a114eb0fad8 100644 --- a/data/base/messages/prox1a.json +++ b/data/base/messages/prox1a.json @@ -1,7 +1,10 @@ { - "C1A_BASE0": { "audio": "pcv390.ogg", "message": "BARBASE_MSG", "type": 0, "x": 3904, "y": 4672, "z": 0 }, - "C1A_BASE1": { "audio": "pcv389.ogg", "message": "BARBASE_MSG", "type": 0, "x": 5002, "y": 2154, "z": 135 }, - "C1A_BASE2": { "audio": "pcv389.ogg", "message": "BARBASE_MSG", "type": 0, "x": 1600, "y": 1728, "z": 0 }, - "C1A_BASE3": { "audio": "pcv389.ogg", "message": "BARBASE_MSG", "type": 0, "x": 2112, "y": 4544, "z": 0 }, - "C1A_OBJ1": { "audio": "pcv373.ogg", "message": "RUINS_MSG", "type": 0, "x": 4928, "y": 6592, "z": 0 } + "type": "wz2100.proxmsgs.v1", + "msgs": { + "C1A_BASE0": { "audio": "pcv390.ogg", "message": "BARBASE_MSG", "type": 0, "x": 3904, "y": 4672, "z": 0 }, + "C1A_BASE1": { "audio": "pcv389.ogg", "message": "BARBASE_MSG", "type": 0, "x": 5002, "y": 2154, "z": 135 }, + "C1A_BASE2": { "audio": "pcv389.ogg", "message": "BARBASE_MSG", "type": 0, "x": 1600, "y": 1728, "z": 0 }, + "C1A_BASE3": { "audio": "pcv389.ogg", "message": "BARBASE_MSG", "type": 0, "x": 2112, "y": 4544, "z": 0 }, + "C1A_OBJ1": { "audio": "pcv373.ogg", "message": "RUINS_MSG", "type": 0, "x": 4928, "y": 6592, "z": 0 } + } } diff --git a/data/base/messages/prox1b.json b/data/base/messages/prox1b.json index 800f56c19fd..629a4575c75 100644 --- a/data/base/messages/prox1b.json +++ b/data/base/messages/prox1b.json @@ -1,6 +1,9 @@ { - "C1B_BASE0": { "audio": "pcv389.ogg", "message": "BARBASE_MSG", "type": 0, "x": 2112, "y": 9280, "z": 0 }, - "C1B_BASE1": { "audio": "pcv389.ogg", "message": "BARBASE_MSG", "type": 0, "x": 4370, "y": 9872, "z": 0 }, - "C1B_BASE2": { "audio": "pcv448.ogg", "message": "POWSURGE_MSG", "type": 0, "x": 3193, "y": 13806, "z": 0 }, - "C1B_BASE3": { "audio": "pcv390.ogg", "message": "BARBASE_MSG", "type": 0, "x": 3776, "y": 11328, "z": 0 } + "type": "wz2100.proxmsgs.v1", + "msgs": { + "C1B_BASE0": { "audio": "pcv389.ogg", "message": "BARBASE_MSG", "type": 0, "x": 2112, "y": 9280, "z": 0 }, + "C1B_BASE1": { "audio": "pcv389.ogg", "message": "BARBASE_MSG", "type": 0, "x": 4370, "y": 9872, "z": 0 }, + "C1B_BASE2": { "audio": "pcv448.ogg", "message": "POWSURGE_MSG", "type": 0, "x": 3193, "y": 13806, "z": 0 }, + "C1B_BASE3": { "audio": "pcv390.ogg", "message": "BARBASE_MSG", "type": 0, "x": 3776, "y": 11328, "z": 0 } + } } diff --git a/data/base/messages/prox1c.json b/data/base/messages/prox1c.json index a1f70c151b1..b7487bef7f4 100644 --- a/data/base/messages/prox1c.json +++ b/data/base/messages/prox1c.json @@ -1,15 +1,18 @@ { - "C1C_BASE1": { "audio": "pcv390.ogg", "message": "BARBASE_MSG", "type": 0, "x": 10304, "y": 15424, "z": 0 }, - "C1C_BASE2": { "audio": "pcv389.ogg", "message": "BARBASE_MSG", "type": 0, "x": 12736, "y": 14016, "z": 0 }, - "C1C_BASE3": { "audio": "pcv389.ogg", "message": "BARBASE_MSG", "type": 0, "x": 8512, "y": 704, "z": 0 }, - "C1C_BASE4": { "audio": "pcv390.ogg", "message": "BARBASE_MSG", "type": 0, "x": 9024, "y": 3648, "z": 0 }, - "C1C_BASE5": { "audio": "pcv389.ogg", "message": "BARBASE_MSG", "type": 0, "x": 8512, "y": 6976, "z": 0 }, - "C1C_BASE6": { "audio": "pcv389.ogg", "message": "BARBASE_MSG", "type": 0, "x": 13376, "y": 13504, "z": 0 }, - "C1C_BASE7": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 11840, "y": 9792, "z": 0 }, - "C1C_BASE8": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 14272, "y": 3264, "z": 0 }, - "C1C_BASE9": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 11712, "y": 2752, "z": 0 }, - "C1C_BASE10": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 9408, "y": 7104, "z": 0 }, - "C1C_OBJ1": { "audio": "pcv378.ogg", "message": "RUINS_MSG", "type": 0, "x": 6848, "y": 13888, "z": 0 }, - "C1C_LZ1": { "audio": "pcv396.ogg", "message": "LZ_MSG3", "type": 0, "x": 13632, "y": 5056, "z": 0 }, - "C1C_LZ2": { "audio": "pcv396.ogg", "message": "LZ_MSG3", "type": 0, "x": 8768, "y": 10048, "z": 0 } + "type": "wz2100.proxmsgs.v1", + "msgs": { + "C1C_BASE1": { "audio": "pcv390.ogg", "message": "BARBASE_MSG", "type": 0, "x": 10304, "y": 15424, "z": 0 }, + "C1C_BASE2": { "audio": "pcv389.ogg", "message": "BARBASE_MSG", "type": 0, "x": 12736, "y": 14016, "z": 0 }, + "C1C_BASE3": { "audio": "pcv389.ogg", "message": "BARBASE_MSG", "type": 0, "x": 8512, "y": 704, "z": 0 }, + "C1C_BASE4": { "audio": "pcv390.ogg", "message": "BARBASE_MSG", "type": 0, "x": 9024, "y": 3648, "z": 0 }, + "C1C_BASE5": { "audio": "pcv389.ogg", "message": "BARBASE_MSG", "type": 0, "x": 8512, "y": 6976, "z": 0 }, + "C1C_BASE6": { "audio": "pcv389.ogg", "message": "BARBASE_MSG", "type": 0, "x": 13376, "y": 13504, "z": 0 }, + "C1C_BASE7": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 11840, "y": 9792, "z": 0 }, + "C1C_BASE8": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 14272, "y": 3264, "z": 0 }, + "C1C_BASE9": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 11712, "y": 2752, "z": 0 }, + "C1C_BASE10": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 9408, "y": 7104, "z": 0 }, + "C1C_OBJ1": { "audio": "pcv378.ogg", "message": "RUINS_MSG", "type": 0, "x": 6848, "y": 13888, "z": 0 }, + "C1C_LZ1": { "audio": "pcv396.ogg", "message": "LZ_MSG3", "type": 0, "x": 13632, "y": 5056, "z": 0 }, + "C1C_LZ2": { "audio": "pcv396.ogg", "message": "LZ_MSG3", "type": 0, "x": 8768, "y": 10048, "z": 0 } + } } diff --git a/data/base/messages/prox1ca.json b/data/base/messages/prox1ca.json index efce177c076..36abb89b031 100644 --- a/data/base/messages/prox1ca.json +++ b/data/base/messages/prox1ca.json @@ -1,8 +1,11 @@ { - "C1CA_OBJ1": { "audio": "pcv448.ogg", "message": "RUINS_MSG", "type": 2, "x": 9408, "y": 6848, "z": 0 }, - "C1CA_LZ1": { "audio": "pcv396.ogg", "message": "LZ_MSG3", "type": 0, "x": 10560, "y": 8384, "z": 0 }, - "C1CA_LZ2": { "audio": "pcv396.ogg", "message": "LZ_MSG3", "type": 0, "x": 7232, "y": 6336, "z": 0 }, - "C1CA_LZ3": { "audio": "pcv396.ogg", "message": "LZ_MSG3", "type": 0, "x": 6208, "y": 6848, "z": 0 }, - "C1CA_LZ4": { "audio": "pcv396.ogg", "message": "LZ_MSG3", "type": 0, "x": 7872, "y": 4672, "z": 0 }, - "C1CA_LZ5": { "audio": "pcv396.ogg", "message": "LZ_MSG3", "type": 0, "x": 6848, "y": 3520, "z": 0 } + "type": "wz2100.proxmsgs.v1", + "msgs": { + "C1CA_OBJ1": { "audio": "pcv448.ogg", "message": "RUINS_MSG", "type": 2, "x": 9408, "y": 6848, "z": 0 }, + "C1CA_LZ1": { "audio": "pcv396.ogg", "message": "LZ_MSG3", "type": 0, "x": 10560, "y": 8384, "z": 0 }, + "C1CA_LZ2": { "audio": "pcv396.ogg", "message": "LZ_MSG3", "type": 0, "x": 7232, "y": 6336, "z": 0 }, + "C1CA_LZ3": { "audio": "pcv396.ogg", "message": "LZ_MSG3", "type": 0, "x": 6208, "y": 6848, "z": 0 }, + "C1CA_LZ4": { "audio": "pcv396.ogg", "message": "LZ_MSG3", "type": 0, "x": 7872, "y": 4672, "z": 0 }, + "C1CA_LZ5": { "audio": "pcv396.ogg", "message": "LZ_MSG3", "type": 0, "x": 6848, "y": 3520, "z": 0 } + } } diff --git a/data/base/messages/prox1d.json b/data/base/messages/prox1d.json index 32d6d10e196..608d461cba4 100644 --- a/data/base/messages/prox1d.json +++ b/data/base/messages/prox1d.json @@ -1,8 +1,11 @@ { - "C1D_BASE1": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 5184, "y": 15040, "z": 0 }, - "C1D_BASE2": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 4800, "y": 4288, "z": 0 }, - "C1D_BASE3": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 8512, "y": 2240, "z": 0 }, - "C1D_LZ": { "audio": "pcv397.ogg", "message": "LZ_MSG", "type": 2, "x": 704, "y": 15552, "z": 0 }, - "C1D_LZ2": { "audio": "pcv396.ogg", "message": "LZ_MSG3", "type": 0, "x": 7488, "y": 5952, "z": 0 }, - "C1D_OBJ1": { "audio": "pcv448.ogg", "message": "RUINS_MSG", "type": 0, "x": 8512, "y": 2112, "z": 0 } + "type": "wz2100.proxmsgs.v1", + "msgs": { + "C1D_BASE1": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 5184, "y": 15040, "z": 0 }, + "C1D_BASE2": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 4800, "y": 4288, "z": 0 }, + "C1D_BASE3": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 8512, "y": 2240, "z": 0 }, + "C1D_LZ": { "audio": "pcv397.ogg", "message": "LZ_MSG", "type": 2, "x": 704, "y": 15552, "z": 0 }, + "C1D_LZ2": { "audio": "pcv396.ogg", "message": "LZ_MSG3", "type": 0, "x": 7488, "y": 5952, "z": 0 }, + "C1D_OBJ1": { "audio": "pcv448.ogg", "message": "RUINS_MSG", "type": 0, "x": 8512, "y": 2112, "z": 0 } + } } diff --git a/data/base/messages/prox2-1.json b/data/base/messages/prox2-1.json index f9c92475218..a13beb6007b 100644 --- a/data/base/messages/prox2-1.json +++ b/data/base/messages/prox2-1.json @@ -1,7 +1,10 @@ { - "C21_OBJECTIVE": { "audio": "pcv448.ogg", "message": "RUINS_MSG", "type": 2, "x": 6464, "y": 1728, "z": 0 }, - "C21_BASE1": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 3008, "y": 4928, "z": 0 }, - "C21_BASE2": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 6528, "y": 6912, "z": 0 }, - "C21_BASE3": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 1344, "y": 1216, "z": 0 }, - "C21_LZ": { "audio": "pcv427.ogg", "message": "LZ_MSG", "type": 2, "x": 960, "y": 7488, "z": 0 } + "type": "wz2100.proxmsgs.v1", + "msgs": { + "C21_OBJECTIVE": { "audio": "pcv448.ogg", "message": "RUINS_MSG", "type": 2, "x": 6464, "y": 1728, "z": 0 }, + "C21_BASE1": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 3008, "y": 4928, "z": 0 }, + "C21_BASE2": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 6528, "y": 6912, "z": 0 }, + "C21_BASE3": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 1344, "y": 1216, "z": 0 }, + "C21_LZ": { "audio": "pcv427.ogg", "message": "LZ_MSG", "type": 2, "x": 960, "y": 7488, "z": 0 } + } } diff --git a/data/base/messages/prox2-2.json b/data/base/messages/prox2-2.json index b1604909ebf..51f15daee33 100644 --- a/data/base/messages/prox2-2.json +++ b/data/base/messages/prox2-2.json @@ -1,6 +1,9 @@ { - "C22_OBJ1": { "audio": "pcv448.ogg", "message": "RUINS_MSG", "type": 0, "x": 5440, "y": 1344, "z": 0 }, - "C22_BASE1": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 5952, "y": 1344, "z": 0 }, - "C22_BASE2": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 1088, "y": 1216, "z": 0 }, - "C22_LZ": { "audio": "pcv427.ogg", "message": "LZ_MSG", "type": 2, "x": 5696, "y": 7232, "z": 0 } + "type": "wz2100.proxmsgs.v1", + "msgs": { + "C22_OBJ1": { "audio": "pcv448.ogg", "message": "RUINS_MSG", "type": 0, "x": 5440, "y": 1344, "z": 0 }, + "C22_BASE1": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 5952, "y": 1344, "z": 0 }, + "C22_BASE2": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 1088, "y": 1216, "z": 0 }, + "C22_LZ": { "audio": "pcv427.ogg", "message": "LZ_MSG", "type": 2, "x": 5696, "y": 7232, "z": 0 } + } } diff --git a/data/base/messages/prox2-5.json b/data/base/messages/prox2-5.json index b7eee085905..128da6729ad 100644 --- a/data/base/messages/prox2-5.json +++ b/data/base/messages/prox2-5.json @@ -1,6 +1,9 @@ { - "C25_OBJ1": { "audio": "pcv654.ogg", "message": "ADD_MSG42", "type": 0, "x": 6720, "y": 1856, "z": 0 }, - "C25_BASE1": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 6592, "y": 832, "z": 0 }, - "C25_BASE2": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 5888, "y": 5120, "z": 0 }, - "C25_LZ": { "audio": "pcv427.ogg", "message": "LZ_MSG", "type": 2, "x": 1344, "y": 6848, "z": 0 } + "type": "wz2100.proxmsgs.v1", + "msgs": { + "C25_OBJ1": { "audio": "pcv654.ogg", "message": "ADD_MSG42", "type": 0, "x": 6720, "y": 1856, "z": 0 }, + "C25_BASE1": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 6592, "y": 832, "z": 0 }, + "C25_BASE2": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 5888, "y": 5120, "z": 0 }, + "C25_LZ": { "audio": "pcv427.ogg", "message": "LZ_MSG", "type": 2, "x": 1344, "y": 6848, "z": 0 } + } } diff --git a/data/base/messages/prox2-6.json b/data/base/messages/prox2-6.json index 2fa83e28604..3b85927e776 100644 --- a/data/base/messages/prox2-6.json +++ b/data/base/messages/prox2-6.json @@ -1,7 +1,10 @@ { - "C26_OBJ1": { "audio": "pcv652.ogg", "message": "RUINS_MSG", "type": 0, "x": 1600, "y": 1984, "z": 0 }, - "C26_BASE1": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 1216, "y": 1088, "z": 0 }, - "C26_BASE2": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 3008, "y": 4672, "z": 0 }, - "C26_BASE3": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 7360, "y": 1344, "z": 0 }, - "C26_LZ": { "audio": "pcv427.ogg", "message": "LZ_MSG", "type": 2, "x": 2752, "y": 7488, "z": 0 } + "type": "wz2100.proxmsgs.v1", + "msgs": { + "C26_OBJ1": { "audio": "pcv652.ogg", "message": "RUINS_MSG", "type": 0, "x": 1600, "y": 1984, "z": 0 }, + "C26_BASE1": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 1216, "y": 1088, "z": 0 }, + "C26_BASE2": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 3008, "y": 4672, "z": 0 }, + "C26_BASE3": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 7360, "y": 1344, "z": 0 }, + "C26_LZ": { "audio": "pcv427.ogg", "message": "LZ_MSG", "type": 2, "x": 2752, "y": 7488, "z": 0 } + } } diff --git a/data/base/messages/prox2-7.json b/data/base/messages/prox2-7.json index 5289b5ecfe5..bfaffa5fe37 100644 --- a/data/base/messages/prox2-7.json +++ b/data/base/messages/prox2-7.json @@ -1,11 +1,14 @@ { - "C27_OBJECTIVE1": { "audio": "pcv655.ogg", "message": "RUINS_MSG", "type": 0, "x": 2624, "y": 6208, "z": 0 }, - "C27_OBJECTIVE2": { "audio": "pcv655.ogg", "message": "RUINS_MSG", "type": 0, "x": 5568, "y": 5824, "z": 0 }, - "C27_OBJECTIVE3": { "audio": "pcv655.ogg", "message": "RUINS_MSG", "type": 0, "x": 5184, "y": 1792, "z": 0 }, - "C27_OBJECTIVE4": { "audio": "pcv655.ogg", "message": "RUINS_MSG", "type": 0, "x": 2368, "y": 1344, "z": 0 }, - "C27_BASE1": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 3136, "y": 6208, "z": 0 }, - "C27_BASE2": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 6592, "y": 4928, "z": 0 }, - "C27_BASE3": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 4928, "y": 1088, "z": 0 }, - "C27_BASE4": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 1728, "y": 1344, "z": 0 }, - "C27_LZ": { "audio": "pcv427.ogg", "message": "LZ_MSG", "type": 2, "x": 704, "y": 6592, "z": 0 } + "type": "wz2100.proxmsgs.v1", + "msgs": { + "C27_OBJECTIVE1": { "audio": "pcv655.ogg", "message": "RUINS_MSG", "type": 0, "x": 2624, "y": 6208, "z": 0 }, + "C27_OBJECTIVE2": { "audio": "pcv655.ogg", "message": "RUINS_MSG", "type": 0, "x": 5568, "y": 5824, "z": 0 }, + "C27_OBJECTIVE3": { "audio": "pcv655.ogg", "message": "RUINS_MSG", "type": 0, "x": 5184, "y": 1792, "z": 0 }, + "C27_OBJECTIVE4": { "audio": "pcv655.ogg", "message": "RUINS_MSG", "type": 0, "x": 2368, "y": 1344, "z": 0 }, + "C27_BASE1": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 3136, "y": 6208, "z": 0 }, + "C27_BASE2": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 6592, "y": 4928, "z": 0 }, + "C27_BASE3": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 4928, "y": 1088, "z": 0 }, + "C27_BASE4": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 1728, "y": 1344, "z": 0 }, + "C27_LZ": { "audio": "pcv427.ogg", "message": "LZ_MSG", "type": 2, "x": 704, "y": 6592, "z": 0 } + } } diff --git a/data/base/messages/prox2-8.json b/data/base/messages/prox2-8.json index 8b347b2085e..d9d213fe9b1 100644 --- a/data/base/messages/prox2-8.json +++ b/data/base/messages/prox2-8.json @@ -1,5 +1,8 @@ { - "C28_BASE1": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 4160, "y": 4032, "z": 0 }, - "C28_BASE2": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 4032, "y": 1856, "z": 0 }, - "C28_BASE3": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 7232, "y": 1600, "z": 0 } + "type": "wz2100.proxmsgs.v1", + "msgs": { + "C28_BASE1": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 4160, "y": 4032, "z": 0 }, + "C28_BASE2": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 4032, "y": 1856, "z": 0 }, + "C28_BASE3": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 7232, "y": 1600, "z": 0 } + } } diff --git a/data/base/messages/prox2a.json b/data/base/messages/prox2a.json index 815c4245701..bce7a99ce02 100644 --- a/data/base/messages/prox2a.json +++ b/data/base/messages/prox2a.json @@ -1,4 +1,7 @@ { - "C2A_BASE1": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 13120, "y": 9792, "z": 256 }, - "C2A_BASE2": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 10816, "y": 9920, "z": 64 } + "type": "wz2100.proxmsgs.v1", + "msgs": { + "C2A_BASE1": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 13120, "y": 9792, "z": 256 }, + "C2A_BASE2": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 10816, "y": 9920, "z": 64 } + } } diff --git a/data/base/messages/prox2b.json b/data/base/messages/prox2b.json index 8c6e9557b2c..5dce66d15c9 100644 --- a/data/base/messages/prox2b.json +++ b/data/base/messages/prox2b.json @@ -1,7 +1,10 @@ { - "C2B_OBJ1": { "audio": "pcv448.ogg", "message": "RUINS_MSG", "type": 0, "x": 12096, "y": 8512, "z": 0 }, - "C2B_BASE1": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 10432, "y": 1856, "z": 0 }, - "C2B_BASE2": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 12992, "y": 2880, "z": 0 }, - "C2B_BASE3": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 12352, "y": 4160, "z": 0 }, - "C2B_BASE4": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 12224, "y": 6720, "z": 0 } + "type": "wz2100.proxmsgs.v1", + "msgs": { + "C2B_OBJ1": { "audio": "pcv448.ogg", "message": "RUINS_MSG", "type": 0, "x": 12096, "y": 8512, "z": 0 }, + "C2B_BASE1": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 10432, "y": 1856, "z": 0 }, + "C2B_BASE2": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 12992, "y": 2880, "z": 0 }, + "C2B_BASE3": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 12352, "y": 4160, "z": 0 }, + "C2B_BASE4": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 12224, "y": 6720, "z": 0 } + } } diff --git a/data/base/messages/prox2c.json b/data/base/messages/prox2c.json index 30c164193c3..4f3818e593c 100644 --- a/data/base/messages/prox2c.json +++ b/data/base/messages/prox2c.json @@ -1,7 +1,10 @@ { - "C2C_OBJ1": { "audio": "pcv448.ogg", "message": "RUINS_MSG", "type": 0, "x": 4928, "y": 4160, "z": 0 }, - "C2C_OBJ2": { "audio": "pcv396.ogg", "message": "RUINS_MSG", "type": 0, "x": 5696, "y": 11072, "z": 0 }, - "C2C_BASE1": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 2752, "y": 2368, "z": 0 }, - "C2C_BASE2": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 7488, "y": 7744, "z": 0 }, - "C2C_BASE3": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 6464, "y": 10816, "z": 0 } + "type": "wz2100.proxmsgs.v1", + "msgs": { + "C2C_OBJ1": { "audio": "pcv448.ogg", "message": "RUINS_MSG", "type": 0, "x": 4928, "y": 4160, "z": 0 }, + "C2C_OBJ2": { "audio": "pcv396.ogg", "message": "RUINS_MSG", "type": 0, "x": 5696, "y": 11072, "z": 0 }, + "C2C_BASE1": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 2752, "y": 2368, "z": 0 }, + "C2C_BASE2": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 7488, "y": 7744, "z": 0 }, + "C2C_BASE3": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 6464, "y": 10816, "z": 0 } + } } diff --git a/data/base/messages/prox2d.json b/data/base/messages/prox2d.json index 6d29f1e7cde..8a31e2d711c 100644 --- a/data/base/messages/prox2d.json +++ b/data/base/messages/prox2d.json @@ -1,6 +1,9 @@ { - "C2D_OBJ1": { "audio": "pcv653.ogg", "message": "RUINS_MSG", "type": 2, "x": 4160, "y": 4544, "z": 0 }, - "C2D_BASE1": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 5312, "y": 4032, "z": 0 }, - "C2D_BASE2": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 5824, "y": 1344, "z": 0 }, - "C2D_LZ": { "audio": "pcv427.ogg", "message": "LZ_MSG", "type": 2, "x": 704, "y": 704, "z": 0 } + "type": "wz2100.proxmsgs.v1", + "msgs": { + "C2D_OBJ1": { "audio": "pcv653.ogg", "message": "RUINS_MSG", "type": 2, "x": 4160, "y": 4544, "z": 0 }, + "C2D_BASE1": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 5312, "y": 4032, "z": 0 }, + "C2D_BASE2": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 5824, "y": 1344, "z": 0 }, + "C2D_LZ": { "audio": "pcv427.ogg", "message": "LZ_MSG", "type": 2, "x": 704, "y": 704, "z": 0 } + } } diff --git a/data/base/messages/prox3-1.json b/data/base/messages/prox3-1.json index c0dc4feb196..19262383e71 100644 --- a/data/base/messages/prox3-1.json +++ b/data/base/messages/prox3-1.json @@ -1,5 +1,8 @@ { - "CM31_BASE1": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 1856, "y": 6848, "z": 0 }, - "CM31_TAR_UPLINK": { "audio": "pcv448.ogg", "message": "MISSIONTARGET_MSG", "type": 0, "x": 768, "y": 6848, "z": 0 }, - "CM31_HIDE_LOC": { "audio": "pcv448.ogg", "message": "MISSIONTARGET_MSG", "type": 2, "x": 6464, "y": 1600, "z": 0 } + "type": "wz2100.proxmsgs.v1", + "msgs": { + "CM31_BASE1": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 1856, "y": 6848, "z": 0 }, + "CM31_TAR_UPLINK": { "audio": "pcv448.ogg", "message": "MISSIONTARGET_MSG", "type": 0, "x": 768, "y": 6848, "z": 0 }, + "CM31_HIDE_LOC": { "audio": "pcv448.ogg", "message": "MISSIONTARGET_MSG", "type": 2, "x": 6464, "y": 1600, "z": 0 } + } } diff --git a/data/base/messages/prox3-2.json b/data/base/messages/prox3-2.json index 4be054ab8fe..96fa7439525 100644 --- a/data/base/messages/prox3-2.json +++ b/data/base/messages/prox3-2.json @@ -1,4 +1,7 @@ { - "C3-2_OBJ1": { "audio": "pcv448.ogg", "message": "RUINS_MSG", "type": 2, "x": 4544, "y": 8896, "z": 0 }, - "C32_LZ": { "audio": "pcv427.ogg", "message": "LZ_MSG", "type": 2, "x": 1728, "y": 832, "z": 0 } + "type": "wz2100.proxmsgs.v1", + "msgs": { + "C3-2_OBJ1": { "audio": "pcv448.ogg", "message": "RUINS_MSG", "type": 2, "x": 4544, "y": 8896, "z": 0 }, + "C32_LZ": { "audio": "pcv427.ogg", "message": "LZ_MSG", "type": 2, "x": 1728, "y": 832, "z": 0 } + } } diff --git a/data/base/messages/prox3-4.json b/data/base/messages/prox3-4.json index 41c547056ef..9c47bb491db 100644 --- a/data/base/messages/prox3-4.json +++ b/data/base/messages/prox3-4.json @@ -1,11 +1,14 @@ { - "CM34_OBJ1": { "audio": "pcv448.ogg", "message": "RUINS_MSG", "type": 0, "x": 1984, "y": 10688, "z": 0 }, - "CM34_OBJ2": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 3392, "y": 8768, "z": 0 }, - "CM34_BASEA": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 2000, "y": 2500, "z": 0 }, - "CM34_BASEB": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 8768, "y": 4032, "z": 0 }, - "CM34_BASEC": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 8256, "y": 1344, "z": 0 }, - "CM34_BASED": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 10816, "y": 10816, "z": 0 }, - "CM34_BASEE": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 6976, "y": 10624, "z": 0 }, - "CM34_BASEF": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 2880, "y": 9408, "z": 0 }, - "CM34_BASEG": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 11328, "y": 7360, "z": 0 } + "type": "wz2100.proxmsgs.v1", + "msgs": { + "CM34_OBJ1": { "audio": "pcv448.ogg", "message": "RUINS_MSG", "type": 0, "x": 1984, "y": 10688, "z": 0 }, + "CM34_OBJ2": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 3392, "y": 8768, "z": 0 }, + "CM34_BASEA": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 2000, "y": 2500, "z": 0 }, + "CM34_BASEB": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 8768, "y": 4032, "z": 0 }, + "CM34_BASEC": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 8256, "y": 1344, "z": 0 }, + "CM34_BASED": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 10816, "y": 10816, "z": 0 }, + "CM34_BASEE": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 6976, "y": 10624, "z": 0 }, + "CM34_BASEF": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 2880, "y": 9408, "z": 0 }, + "CM34_BASEG": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 11328, "y": 7360, "z": 0 } + } } diff --git a/data/base/messages/prox3a-d1.json b/data/base/messages/prox3a-d1.json index 65782f080a3..13e3cbffe6d 100644 --- a/data/base/messages/prox3a-d1.json +++ b/data/base/messages/prox3a-d1.json @@ -1,7 +1,10 @@ { - "CM3D1_BASE1": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 5696, "y": 30400, "z": 0 }, - "CM3D1_BASE2": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 1088, "y": 30528, "z": 0 }, - "CM3D1_BASE3": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 4032, "y": 25152, "z": 0 }, - "CM3D1_BASE4": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 6336, "y": 26816, "z": 0 }, - "CM3D1_OBJ1": { "audio": "pcv448.ogg", "message": "RUINS_MSG", "type": 2, "x": 5696, "y": 31552, "z": 0 } + "type": "wz2100.proxmsgs.v1", + "msgs": { + "CM3D1_BASE1": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 5696, "y": 30400, "z": 0 }, + "CM3D1_BASE2": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 1088, "y": 30528, "z": 0 }, + "CM3D1_BASE3": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 4032, "y": 25152, "z": 0 }, + "CM3D1_BASE4": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 6336, "y": 26816, "z": 0 }, + "CM3D1_OBJ1": { "audio": "pcv448.ogg", "message": "RUINS_MSG", "type": 2, "x": 5696, "y": 31552, "z": 0 } + } } diff --git a/data/base/messages/prox3a.json b/data/base/messages/prox3a.json index 29e2f531337..652b55ddd82 100644 --- a/data/base/messages/prox3a.json +++ b/data/base/messages/prox3a.json @@ -1,6 +1,9 @@ { - "CM3A_BASE1": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 2240, "y": 12608, "z": 0 }, - "CM3A_BASE2": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 1984, "y": 14912, "z": 0 }, - "CM3A_BASE3": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 6464, "y": 8896, "z": 0 }, - "CM3A_BASE4": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 1600, "y": 8896, "z": 0 } + "type": "wz2100.proxmsgs.v1", + "msgs": { + "CM3A_BASE1": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 2240, "y": 12608, "z": 0 }, + "CM3A_BASE2": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 1984, "y": 14912, "z": 0 }, + "CM3A_BASE3": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 6464, "y": 8896, "z": 0 }, + "CM3A_BASE4": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 1600, "y": 8896, "z": 0 } + } } diff --git a/data/base/messages/prox3b.json b/data/base/messages/prox3b.json index d76ea090b82..e42e92141de 100644 --- a/data/base/messages/prox3b.json +++ b/data/base/messages/prox3b.json @@ -1,7 +1,10 @@ { - "CM3B_BASE4": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 6592, "y": 6720, "z": 0 }, - "CM3B_BASE6": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 1024, "y": 6528, "z": 0 }, - "CM3B_TRANS1": { "audio": "pcv396.ogg", "message": "LZ_MSG3", "type": 0, "x": 6208, "y": 6592, "z": 0 }, - "CM3B_TRANS2": { "audio": "pcv396.ogg", "message": "LZ_MSG3", "type": 0, "x": 1088, "y": 6848, "z": 0 }, - "CM3B_GAMMABASE": { "audio": "pcv448.ogg", "message": "RUINS_MSG", "type": 2, "x": 1728, "y": 1728, "z": 200 } + "type": "wz2100.proxmsgs.v1", + "msgs": { + "CM3B_BASE4": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 6592, "y": 6720, "z": 0 }, + "CM3B_BASE6": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 1024, "y": 6528, "z": 0 }, + "CM3B_TRANS1": { "audio": "pcv396.ogg", "message": "LZ_MSG3", "type": 0, "x": 6208, "y": 6592, "z": 0 }, + "CM3B_TRANS2": { "audio": "pcv396.ogg", "message": "LZ_MSG3", "type": 0, "x": 1088, "y": 6848, "z": 0 }, + "CM3B_GAMMABASE": { "audio": "pcv448.ogg", "message": "RUINS_MSG", "type": 2, "x": 1728, "y": 1728, "z": 200 } + } } diff --git a/data/base/messages/prox3c.json b/data/base/messages/prox3c.json index d174cf694e7..dbb31428711 100644 --- a/data/base/messages/prox3c.json +++ b/data/base/messages/prox3c.json @@ -1,7 +1,10 @@ { - "CM3C_BETATEAM": { "audio": "pcv448.ogg", "message": "RUINS_MSG", "type": 2, "x": 960, "y": 17344, "z": 0 }, - "CM3C_GAMMABASE": { "audio": "pcv448.ogg", "message": "RUINS_MSG", "type": 2, "x": 1600, "y": 23104, "z": 0 }, - "CM3C_BASE1": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 3776, "y": 17344, "z": 0 }, - "CM3C_BASE2": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 4800, "y": 21568, "z": 0 }, - "CM3C_BASE3": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 6592, "y": 22592, "z": 0 } + "type": "wz2100.proxmsgs.v1", + "msgs": { + "CM3C_BETATEAM": { "audio": "pcv448.ogg", "message": "RUINS_MSG", "type": 2, "x": 960, "y": 17344, "z": 0 }, + "CM3C_GAMMABASE": { "audio": "pcv448.ogg", "message": "RUINS_MSG", "type": 2, "x": 1600, "y": 23104, "z": 0 }, + "CM3C_BASE1": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 3776, "y": 17344, "z": 0 }, + "CM3C_BASE2": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 4800, "y": 21568, "z": 0 }, + "CM3C_BASE3": { "audio": "pcv393.ogg", "message": "ENEMYBASE_MSG", "type": 0, "x": 6592, "y": 22592, "z": 0 } + } } diff --git a/data/base/messages/proxdemo.json b/data/base/messages/proxdemo.json index 6a4c3678529..7e8b2556f66 100644 --- a/data/base/messages/proxdemo.json +++ b/data/base/messages/proxdemo.json @@ -1,7 +1,10 @@ { - "FAST_BASE1": { "audio": "pcv389.ogg", "message": "BARBASE_MSG", "type": 0, "x": 3136, "y": 960, "z": 0 }, - "FAST_BASE2": { "audio": "pcv389.ogg", "message": "BARBASE_MSG", "type": 0, "x": 5500, "y": 2000, "z": 0 }, - "FAST_BASE3": { "audio": "pcv389.ogg", "message": "BARBASE_MSG", "type": 0, "x": 5184, "y": 6592, "z": 0 }, - "FAST_BASE4": { "audio": "pcv389.ogg", "message": "BARBASE_MSG", "type": 0, "x": 4400, "y": 2800, "z": 0 }, - "FAST_OBJ1": { "audio": "pcv448.ogg", "message": "RUINS_MSG", "type": 0, "x": 1728, "y": 1216, "z": 0 } + "type": "wz2100.proxmsgs.v1", + "msgs": { + "FAST_BASE1": { "audio": "pcv389.ogg", "message": "BARBASE_MSG", "type": 0, "x": 3136, "y": 960, "z": 0 }, + "FAST_BASE2": { "audio": "pcv389.ogg", "message": "BARBASE_MSG", "type": 0, "x": 5500, "y": 2000, "z": 0 }, + "FAST_BASE3": { "audio": "pcv389.ogg", "message": "BARBASE_MSG", "type": 0, "x": 5184, "y": 6592, "z": 0 }, + "FAST_BASE4": { "audio": "pcv389.ogg", "message": "BARBASE_MSG", "type": 0, "x": 4400, "y": 2800, "z": 0 }, + "FAST_OBJ1": { "audio": "pcv448.ogg", "message": "RUINS_MSG", "type": 0, "x": 1728, "y": 1216, "z": 0 } + } } diff --git a/data/base/messages/proxtut.json b/data/base/messages/proxtut.json index f62ab2232c0..31c3b909e85 100644 --- a/data/base/messages/proxtut.json +++ b/data/base/messages/proxtut.json @@ -1,4 +1,7 @@ { - "TUT_RES1": { "audio": "pcv376.ogg", "message": "POWRES_MSG", "type": 1, "x": 1216, "y": 1472, "z": 0 }, - "TUT_ART1": { "audio": 0, "message": "ART_MSG", "type": 2, "x": 448, "y": 2752, "z": 0 } + "type": "wz2100.proxmsgs.v1", + "msgs": { + "TUT_RES1": { "audio": "pcv376.ogg", "message": "POWRES_MSG", "type": 1, "x": 1216, "y": 1472, "z": 0 }, + "TUT_ART1": { "audio": 0, "message": "ART_MSG", "type": 2, "x": 448, "y": 2752, "z": 0 } + } } diff --git a/doc/BriefAndProximityFormat.md b/doc/BriefAndProximityFormat.md index 0e9a80783c9..8d76e382f26 100644 --- a/doc/BriefAndProximityFormat.md +++ b/doc/BriefAndProximityFormat.md @@ -7,13 +7,16 @@ In releases beyond the 4.5 series, the campaign brief and Proximity files are no Example: ```json { - "C1A_BASE0": { - "audio": "pcv390.ogg", - "message": "BARBASE_MSG", - "type": 0, - "x": 3904, - "y": 4672, - "z": 0 + "type": "wz2100.proxmsgs.v1", + "msgs": { + "C1A_BASE0": { + "audio": "pcv390.ogg", + "message": "BARBASE_MSG", + "type": 0, + "x": 3904, + "y": 4672, + "z": 0 + } } } ``` diff --git a/src/message.cpp b/src/message.cpp index bf6e8714b37..d12dacb5f4c 100644 --- a/src/message.cpp +++ b/src/message.cpp @@ -664,6 +664,30 @@ WzString *loadProximityViewData(const char *fileName) { ASSERT_OR_RETURN(nullptr, PHYSFS_exists(fileName), "%s not found", fileName); WzConfig ini(fileName, WzConfig::ReadOnlyAndRequired); + + // "type": "wz2100.proxmsgs.v1" + if (!ini.contains("type")) + { + debug(LOG_ERROR, "Missing required \"type\" key: %s", fileName); + return nullptr; + } + if (ini.value("type").toWzString() != "wz2100.proxmsgs.v1") + { + debug(LOG_ERROR, "Unexpected \"type\" - expecting \"wz2100.proxmsgs.v1\": %s", fileName); + return nullptr; + } + + // msgs + if (!ini.contains("msgs")) + { + debug(LOG_ERROR, "Missing required \"msgs\" key: %s", fileName); + return nullptr; + } + if (!ini.beginGroup("msgs")) + { + debug(LOG_ERROR, "Missing valid \"msgs\" value: %s", fileName); + return nullptr; + } std::vector list = ini.childGroups(); for (size_t i = 0; i < list.size(); ++i) { @@ -685,6 +709,11 @@ WzString *loadProximityViewData(const char *fileName) { for(auto &a : array) { + if (!a.is_string()) + { + debug(LOG_ERROR, "\"message\" value is not a string: %s", fileName); + continue; + } std::string msg = a.get(); const char *str = strresGetString(psStringRes, msg.c_str()); ASSERT(str, "Cannot find the view data string with id \"%s\"", msg.c_str()); @@ -741,6 +770,8 @@ WzString *loadProximityViewData(const char *fileName) ini.endGroup(); apsViewData[v->name] = v; } + ini.endGroup(); // "msgs" + return new WzString(fileName); // so that cleanup function will be called on right data } From d3d2d55f92665a9c7f316b083611f4752bfb7af0 Mon Sep 17 00:00:00 2001 From: past-due <30942300+past-due@users.noreply.github.com> Date: Tue, 29 Oct 2024 19:07:25 -0400 Subject: [PATCH 13/38] parseJson.py: Ignore certain WZ JSON file types --- po/scripts/parseJson.py | 44 ++++++++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/po/scripts/parseJson.py b/po/scripts/parseJson.py index f0a74c28f58..27c933d993d 100644 --- a/po/scripts/parseJson.py +++ b/po/scripts/parseJson.py @@ -1,25 +1,37 @@ import json, sys, re +IGNORED_WZ_JSON_FILE_TYPES = {'wz2100.proxmsgs.v1', 'wz2100.briefs.v1'} + def printString(s, begin, end, filename, jsonPath): if not re.match(r'^(\*.*\*|CAM[0-9] .*|Z ?NULL.*)$', s): sys.stdout.write('{}{}) // SRC: {}: {}{}'.format(begin, json.dumps(s, ensure_ascii=False), filename, jsonPath, end)) -def parse(obj, filename, jsonPath="$"): +def parse(obj, filename): + def _parse(obj, filename, jsonPath="$"): + if isinstance(obj, dict): + for k, v in obj.items(): + _parse(v, filename, jsonPath + "." + k) + if k in ['name', 'tip', 'easy_tip', 'medium_tip', 'hard_tip', 'insane_tip'] and isinstance(v, str): + printString(v, '_(', '\n', filename, jsonPath + "." + k) + elif k in ['text', 'ranks'] and isinstance(v, list): + for idx, s in enumerate(v): + itemPath = jsonPath + "." + k + "[" + str(idx) + "]" + if isinstance(s, str): + if k == 'text': + printString(s, '_(', '\n', filename, itemPath) + elif k == 'ranks': + printString(s, 'NP_("rank", ', '\n', filename, itemPath) + elif isinstance(obj, list): + for idx, v in enumerate(obj): + _parse(v, filename, jsonPath + "[" + str(idx) + "]") + if isinstance(obj, dict): - for k, v in obj.items(): - parse(v, filename, jsonPath + "." + k) - if k in ['name', 'tip', 'easy_tip', 'medium_tip', 'hard_tip', 'insane_tip'] and isinstance(v, str): - printString(v, '_(', '\n', filename, jsonPath + "." + k) - elif k in ['text', 'ranks'] and isinstance(v, list): - for idx, s in enumerate(v): - itemPath = jsonPath + "." + k + "[" + str(idx) + "]" - if isinstance(s, str): - if k == 'text': - printString(s, '_(', '\n', filename, itemPath) - elif k == 'ranks': - printString(s, 'NP_("rank", ', '\n', filename, itemPath) - elif isinstance(obj, list): - for idx, v in enumerate(obj): - parse(v, filename, jsonPath + "[" + str(idx) + "]") + # check for json format types that should be ignored + if 'type' in obj: + if obj['type'] in IGNORED_WZ_JSON_FILE_TYPES: + #sys.stderr.write('// IGNORING: {}\n'.format(filename)) + return + + _parse(obj, filename); parse(json.load(open(sys.argv[1], 'r')), sys.argv[1]) From 111ef8a4577478c741d5ba2802dcd8f877e50afb Mon Sep 17 00:00:00 2001 From: Nikolay Borodin Date: Wed, 30 Oct 2024 17:03:50 +0200 Subject: [PATCH 14/38] Fix: compiler throws an error when wanaddr is not used --- lib/netplay/port_mapping_manager_impl_miniupnpc.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/netplay/port_mapping_manager_impl_miniupnpc.cpp b/lib/netplay/port_mapping_manager_impl_miniupnpc.cpp index 0b01f5dca83..9550b599bb6 100644 --- a/lib/netplay/port_mapping_manager_impl_miniupnpc.cpp +++ b/lib/netplay/port_mapping_manager_impl_miniupnpc.cpp @@ -132,8 +132,8 @@ static PortMappingImpl_Miniupnpc::DiscoveryStatus upnp_discover(DiscoveryResults return PortMappingImpl_Miniupnpc::DiscoveryStatus::UPNP_ERROR_DEVICE_NOT_FOUND; } - char wanaddr[64] = {}; #if defined(MINIUPNPC_API_VERSION) && (MINIUPNPC_API_VERSION >= 18) + char wanaddr[64] = {}; int validIGDResult = UPNP_GetValidIGD(devlist, &output.urls, &output.data, output.lanaddr, sizeof(output.lanaddr), wanaddr, sizeof(wanaddr)); #else int validIGDResult = UPNP_GetValidIGD(devlist, &output.urls, &output.data, output.lanaddr, sizeof(output.lanaddr)); From d74137889e9f87b42876e6be8a1ee93c43ad6408 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 1 Nov 2024 21:02:20 +0000 Subject: [PATCH 15/38] Update base translations --- po/POTFILES.in | 1 + po/custom/fromJson.txt | 30 +- po/warzone2100.pot | 3669 ++++++++++++++++++++-------------------- 3 files changed, 1893 insertions(+), 1807 deletions(-) diff --git a/po/POTFILES.in b/po/POTFILES.in index 37815360597..9f8c0cc58b6 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -302,6 +302,7 @@ lib/ivis_opengl/png_util_spng.cpp lib/ivis_opengl/screen.cpp lib/ivis_opengl/tex.cpp lib/ivis_opengl/textdraw.cpp +lib/netplay/error_categories.cpp lib/netplay/netjoin_stub.cpp lib/netplay/netlog.cpp lib/netplay/netpermissions.cpp diff --git a/po/custom/fromJson.txt b/po/custom/fromJson.txt index e20d3f2a427..10aadaf0ee6 100644 --- a/po/custom/fromJson.txt +++ b/po/custom/fromJson.txt @@ -537,14 +537,14 @@ _("Archangel Missile") // data/mp/messages/resmessages2.json: $.RES_CYW_BB1.text[1] _("Armed with Bunker Buster rocket") // TRANSLATORS: -// data/base/messages/resmessages2.json: $.RES_CYW_MG4.text[1] -// data/mp/messages/resmessages2.json: $.RES_CYW_MG4.text[1] -_("Armed with Cyborg Assault Gun") -// TRANSLATORS: // data/base/messages/resmessages3.json: $.RES_CYJ_MG4.text[1] // data/mp/messages/resmessages3.json: $.RES_CYJ_MG4.text[1] _("Armed with Cyborg assault gun") // TRANSLATORS: +// data/base/messages/resmessages2.json: $.RES_CYW_MG4.text[1] +// data/mp/messages/resmessages2.json: $.RES_CYW_MG4.text[1] +_("Armed with Cyborg Assault Gun") +// TRANSLATORS: // data/base/messages/resmessages1.json: $.RES_CYW_CN1.text[1] // data/mp/messages/resmessages1.json: $.RES_CYW_CN1.text[1] _("Armed with Cyborg Cannon") @@ -1096,18 +1096,18 @@ _("Best Targets: Base Structures, bunkers") // data/base/messages/resmessages3.json: $.RES_W_MS_MART.text[2] _("Best Targets: Base structures, emplacements, cyborgs") // TRANSLATORS: -// data/base/messages/resmessages1.json: $.RES_MORTA1.text[2] -// data/base/messages/resmessages12.json: $.RES_W_M2.text[2] -// data/base/messages/resmessages12.json: $.RES_W_RK_MRL1.text[2] -// ... + 7 refs -_("Best Targets: Base structures, infantry, wheeled vehicles") -// TRANSLATORS: // data/base/messages/resmessages2.json: $.RES_W_HH1.text[2] // data/base/messages/resmessages2.json: $.RES_W_HMK1.text[2] // data/base/messages/resmessages23.json: $.RES_W_RHOW.text[2] // ... + 4 refs _("Best Targets: Base Structures, infantry, wheeled vehicles") // TRANSLATORS: +// data/base/messages/resmessages1.json: $.RES_MORTA1.text[2] +// data/base/messages/resmessages12.json: $.RES_W_M2.text[2] +// data/base/messages/resmessages12.json: $.RES_W_RK_MRL1.text[2] +// ... + 7 refs +_("Best Targets: Base structures, infantry, wheeled vehicles") +// TRANSLATORS: // data/base/messages/resmessages3.json: $.RES_W_ASM_BB.text[2] // data/mp/messages/resmessages3.json: $.RES_W_ASM_BB.text[2] // data/mp/messages/resmessages3.json: $.RES_W_BMB4.text[2] @@ -1442,6 +1442,7 @@ _("Cobra") _("Collapsing Plutonium kinetic energy bullets") // TRANSLATORS: // data/base/stats/structure.json: $.A0CommandCentreCO.name +// data/mp/stats/structure.json: $.A0CommandCentreCO.name _("Collective Command Center") // TRANSLATORS: // data/base/stats/structure.json: $.CollectiveCWall.name @@ -4165,6 +4166,7 @@ _("New Laser Weapon Available") _("New Missile Turret Available") // TRANSLATORS: // data/base/stats/structure.json: $.A0CommandCentreNP.name +// data/mp/stats/structure.json: $.A0CommandCentreNP.name _("New Paradigm Command Center") // TRANSLATORS: // data/base/messages/resmessages1.json: $.RES_V_B12.text[0] @@ -5616,15 +5618,15 @@ _("The VTOL returns to the selected pad for rearming") // xgettext:no-c-format _("Thermal Armor +35%") // TRANSLATORS: -// data/mp/messages/resmessages2.json: $.RES_V_AH1.text[2] -// xgettext:no-c-format -_("Thermal armor +40%") -// TRANSLATORS: // data/mp/messages/resmessages3.json: $.RES_V_AH4.text[2] // data/mp/messages/resmessagesall.json: $.RES_V_AH7.text[2] // xgettext:no-c-format _("Thermal Armor +40%") // TRANSLATORS: +// data/mp/messages/resmessages2.json: $.RES_V_AH1.text[2] +// xgettext:no-c-format +_("Thermal armor +40%") +// TRANSLATORS: // data/mp/messages/resmessages2.json: $.RES_CY_AH1.text[2] // xgettext:no-c-format _("Thermal Armor +45%") diff --git a/po/warzone2100.pot b/po/warzone2100.pot index 3a9687965fb..67c497c1766 100644 --- a/po/warzone2100.pot +++ b/po/warzone2100.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" -"POT-Creation-Date: 2024-09-11 19:20+0000\n" +"POT-Creation-Date: 2024-11-01 21:02+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -1193,7 +1193,7 @@ msgstr "" #. TRANSLATORS: #. data/mp/stats/propulsion.json: $.Naval.name #: data/base/messages/strings/names.txt:156 -#: po/custom/fromJson.txt:4025 +#: po/custom/fromJson.txt:4026 msgid "Naval" msgstr "" @@ -1226,7 +1226,7 @@ msgstr "" #. data/mp/stats/structure.json: $.Emplacement-Howitzer105.name #: data/base/messages/strings/names.txt:215 #: data/mp/messages/strings/names.txt:251 -#: po/custom/fromJson.txt:2932 +#: po/custom/fromJson.txt:2933 msgid "Howitzer Emplacement" msgstr "" @@ -1237,7 +1237,7 @@ msgstr "" #. data/mp/stats/structure.json: $.Emplacement-Howitzer150.name #: data/base/messages/strings/names.txt:216 #: data/mp/messages/strings/names.txt:252 -#: po/custom/fromJson.txt:2286 +#: po/custom/fromJson.txt:2287 msgid "Ground Shaker Emplacement" msgstr "" @@ -1248,7 +1248,7 @@ msgstr "" #. data/mp/stats/structure.json: $.Emplacement-RotHow.name #: data/base/messages/strings/names.txt:217 #: data/mp/messages/strings/names.txt:253 -#: po/custom/fromJson.txt:2740 +#: po/custom/fromJson.txt:2741 msgid "Hellstorm Emplacement" msgstr "" @@ -1326,7 +1326,7 @@ msgstr "" #. data/base/stats/research.json: $.R-Cyborg-Legs02.name #: data/base/messages/strings/names.txt:298 #: data/mp/messages/strings/names.txt:382 -#: po/custom/fromJson.txt:1676 +#: po/custom/fromJson.txt:1677 msgid "Cyborg Propulsion II" msgstr "" @@ -1334,7 +1334,7 @@ msgstr "" #. data/base/stats/propulsion.json: $.CyborgLegs03.name #: data/base/messages/strings/names.txt:299 #: data/mp/messages/strings/names.txt:383 -#: po/custom/fromJson.txt:1679 +#: po/custom/fromJson.txt:1680 msgid "Cyborg Propulsion III" msgstr "" @@ -1350,7 +1350,7 @@ msgstr "" #. ... + 3 refs #: data/base/messages/strings/names.txt:314 #: data/mp/messages/strings/names.txt:396 -#: po/custom/fromJson.txt:2620 +#: po/custom/fromJson.txt:2621 msgid "Heavy Machinegun Bunker" msgstr "" @@ -1361,7 +1361,7 @@ msgstr "" #. data/mp/stats/structure.json: $.Emplacement-PrisLas.name #: data/base/messages/strings/names.txt:316 #: data/mp/messages/strings/names.txt:398 -#: po/custom/fromJson.txt:2145 +#: po/custom/fromJson.txt:2146 msgid "Flashlight Emplacement" msgstr "" @@ -1371,7 +1371,7 @@ msgstr "" #. data/mp/stats/research.json: $.R-Defense-Tower01.name #. data/mp/stats/structure.json: $.GuardTower1.name #: data/base/messages/strings/names.txt:322 -#: po/custom/fromJson.txt:2642 +#: po/custom/fromJson.txt:2643 msgid "Heavy Machinegun Guard Tower" msgstr "" @@ -1380,7 +1380,7 @@ msgstr "" #. data/base/stats/structure.json: $.GuardTower4.name #. data/mp/stats/structure.json: $.GuardTower4.name #: data/base/messages/strings/names.txt:323 -#: po/custom/fromJson.txt:2109 +#: po/custom/fromJson.txt:2110 msgid "Flamer Guard Tower" msgstr "" @@ -1393,7 +1393,7 @@ msgstr "" #. data/mp/stats/structure.json: $.WallTower05.name #: data/base/messages/strings/names.txt:327 #: data/mp/messages/strings/names.txt:410 -#: po/custom/fromJson.txt:2113 +#: po/custom/fromJson.txt:2114 msgid "Flamer Hardpoint" msgstr "" @@ -1702,7 +1702,7 @@ msgstr "" #. ... + 5 refs #: data/base/messages/strings/resstrings.txt:31 #: data/mp/messages/strings/resstrings.txt:1 -#: po/custom/fromJson.txt:1666 +#: po/custom/fromJson.txt:1667 msgid "Cyborg Materials Improved" msgstr "" @@ -1715,7 +1715,7 @@ msgstr "" #: data/base/messages/strings/resstrings.txt:572 #: data/mp/messages/strings/resstrings.txt:2 #: data/mp/messages/strings/resstrings.txt:262 -#: po/custom/fromJson.txt:3565 +#: po/custom/fromJson.txt:3566 msgid "Layered dense composite alloys and energy-absorbing fibres" msgstr "" @@ -1726,7 +1726,7 @@ msgstr "" #. data/base/messages/resmessages3.json: $.RES_CYMET7.text[2] #: data/base/messages/strings/resstrings.txt:33 #: data/mp/messages/strings/resstrings.txt:3 -#: po/custom/fromJson.txt:3257 +#: po/custom/fromJson.txt:3258 msgid "Increases Kinetic Armor and Body Points" msgstr "" @@ -1750,7 +1750,7 @@ msgstr "" #. data/mp/messages/resmessages3.json: $.RES_CY_AH4.text[0] #: data/base/messages/strings/resstrings.txt:41 #: data/mp/messages/strings/resstrings.txt:6 -#: po/custom/fromJson.txt:1720 +#: po/custom/fromJson.txt:1721 msgid "Cyborg Thermal Armor Improved" msgstr "" @@ -1761,7 +1761,7 @@ msgstr "" #. data/mp/messages/resmessages3.json: $.RES_CY_AH4.text[1] #: data/base/messages/strings/resstrings.txt:42 #: data/mp/messages/strings/resstrings.txt:7 -#: po/custom/fromJson.txt:2492 +#: po/custom/fromJson.txt:2493 msgid "Heat resistant armored layers" msgstr "" @@ -1770,7 +1770,7 @@ msgstr "" #. data/base/messages/resmessages3.json: $.RES_CY_AH4.text[2] #: data/base/messages/strings/resstrings.txt:43 #: data/mp/messages/strings/resstrings.txt:8 -#: po/custom/fromJson.txt:5634 +#: po/custom/fromJson.txt:5636 msgid "Thermal Armor increased" msgstr "" @@ -1783,7 +1783,7 @@ msgstr "" #: data/base/messages/strings/resstrings.txt:65 #: data/mp/messages/strings/resstrings.txt:11 #: data/mp/messages/strings/resstrings.txt:16 -#: po/custom/fromJson.txt:4122 +#: po/custom/fromJson.txt:4123 msgid "New Cyborg Available" msgstr "" @@ -1840,7 +1840,7 @@ msgstr "" #: data/mp/messages/strings/resstrings.txt:19 #: data/mp/messages/strings/resstrings.txt:24 #: data/mp/messages/strings/resstrings.txt:29 -#: po/custom/fromJson.txt:4842 +#: po/custom/fromJson.txt:4844 msgid "Requires Cyborg factory to produce" msgstr "" @@ -1849,7 +1849,7 @@ msgstr "" #. data/mp/messages/resmessages2.json: $.RES_CYW_MG4.text[1] #: data/base/messages/strings/resstrings.txt:66 #: data/mp/messages/strings/resstrings.txt:17 -#: po/custom/fromJson.txt:542 +#: po/custom/fromJson.txt:546 msgid "Armed with Cyborg Assault Gun" msgstr "" @@ -1862,7 +1862,7 @@ msgstr "" #: data/base/messages/strings/resstrings.txt:83 #: data/mp/messages/strings/resstrings.txt:21 #: data/mp/messages/strings/resstrings.txt:26 -#: po/custom/fromJson.txt:4153 +#: po/custom/fromJson.txt:4154 msgid "New Jump Cyborg Available" msgstr "" @@ -1882,7 +1882,7 @@ msgstr "" #. ... + 5 refs #: data/base/messages/strings/resstrings.txt:103 #: data/mp/messages/strings/resstrings.txt:31 -#: po/custom/fromJson.txt:1777 +#: po/custom/fromJson.txt:1778 msgid "Defenses Improved" msgstr "" @@ -1891,7 +1891,7 @@ msgstr "" #. data/mp/messages/resmessages2.json: $.RES_DF_WU4.text[1] #: data/base/messages/strings/resstrings.txt:104 #: data/mp/messages/strings/resstrings.txt:32 -#: po/custom/fromJson.txt:2880 +#: po/custom/fromJson.txt:2881 msgid "High-tensile concrete reinforced with boron" msgstr "" @@ -1904,7 +1904,7 @@ msgstr "" #: data/base/messages/strings/resstrings.txt:401 #: data/mp/messages/strings/resstrings.txt:33 #: data/mp/messages/strings/resstrings.txt:198 -#: po/custom/fromJson.txt:3183 +#: po/custom/fromJson.txt:3184 msgid "Increases Armor and Body Points" msgstr "" @@ -1976,7 +1976,7 @@ msgstr "" #: data/mp/messages/strings/resstrings.txt:151 #: data/mp/messages/strings/resstrings.txt:156 #: data/mp/messages/strings/resstrings.txt:161 -#: po/custom/fromJson.txt:4132 +#: po/custom/fromJson.txt:4133 msgid "New Defensive Structure Available" msgstr "" @@ -2043,7 +2043,7 @@ msgstr "" #: data/mp/messages/strings/resstrings.txt:119 #: data/mp/messages/strings/resstrings.txt:124 #: data/mp/messages/strings/resstrings.txt:129 -#: po/custom/fromJson.txt:1801 +#: po/custom/fromJson.txt:1802 msgid "Defensive Strength: Medium" msgstr "" @@ -2089,7 +2089,7 @@ msgstr "" #. data/mp/messages/resmessages2.json: $.RES_EMP_IDFR.text[1] #: data/base/messages/strings/resstrings.txt:142 #: data/mp/messages/strings/resstrings.txt:57 -#: po/custom/fromJson.txt:3364 +#: po/custom/fromJson.txt:3365 msgid "Indirect fire rocket battery" msgstr "" @@ -2225,7 +2225,7 @@ msgstr "" #: data/mp/messages/strings/resstrings.txt:154 #: data/mp/messages/strings/resstrings.txt:159 #: data/mp/messages/strings/resstrings.txt:164 -#: po/custom/fromJson.txt:1789 +#: po/custom/fromJson.txt:1790 msgid "Defensive Strength: High" msgstr "" @@ -2252,7 +2252,7 @@ msgstr "" #. data/mp/messages/resmessages2.json: $.RES_DEF_RotMG.text[1] #: data/base/messages/strings/resstrings.txt:224 #: data/mp/messages/strings/resstrings.txt:112 -#: po/custom/fromJson.txt:4775 +#: po/custom/fromJson.txt:4777 msgid "Reinforced tower with Assault Gun" msgstr "" @@ -2349,7 +2349,7 @@ msgstr "" #. data/mp/messages/resmessages1.json: $.RES_TTRAP1.text[1] #: data/base/messages/strings/resstrings.txt:324 #: data/mp/messages/strings/resstrings.txt:162 -#: po/custom/fromJson.txt:4771 +#: po/custom/fromJson.txt:4773 msgid "Reinforced concrete tank traps" msgstr "" @@ -2358,7 +2358,7 @@ msgstr "" #. data/mp/messages/resmessages1.json: $.RES_TTRAP1.text[2] #: data/base/messages/strings/resstrings.txt:325 #: data/mp/messages/strings/resstrings.txt:163 -#: po/custom/fromJson.txt:4543 +#: po/custom/fromJson.txt:4545 msgid "Prevents enemy movement" msgstr "" @@ -2369,7 +2369,7 @@ msgstr "" #. ... + 3 refs #: data/base/messages/strings/resstrings.txt:333 #: data/mp/messages/strings/resstrings.txt:166 -#: po/custom/fromJson.txt:4787 +#: po/custom/fromJson.txt:4789 msgid "Repair Facility Improved" msgstr "" @@ -2378,7 +2378,7 @@ msgstr "" #. data/mp/messages/resmessages2.json: $.RES_ST_RFU4.text[1] #: data/base/messages/strings/resstrings.txt:334 #: data/mp/messages/strings/resstrings.txt:167 -#: po/custom/fromJson.txt:4230 +#: po/custom/fromJson.txt:4232 msgid "New robotic repair techniques" msgstr "" @@ -2388,7 +2388,7 @@ msgstr "" #. data/base/messages/resmessages3.json: $.RES_ST_RFU7.text[2] #: data/base/messages/strings/resstrings.txt:335 #: data/mp/messages/strings/resstrings.txt:168 -#: po/custom/fromJson.txt:3331 +#: po/custom/fromJson.txt:3332 msgid "Increases Repair Speed" msgstr "" @@ -2412,7 +2412,7 @@ msgstr "" #: data/base/messages/strings/resstrings.txt:355 #: data/mp/messages/strings/resstrings.txt:171 #: data/mp/messages/strings/resstrings.txt:176 -#: po/custom/fromJson.txt:1672 +#: po/custom/fromJson.txt:1673 msgid "Cyborg Production Improved" msgstr "" @@ -2421,7 +2421,7 @@ msgstr "" #. data/mp/messages/resmessages2.json: $.RES_ST_FCY4.text[1] #: data/base/messages/strings/resstrings.txt:348 #: data/mp/messages/strings/resstrings.txt:172 -#: po/custom/fromJson.txt:4925 +#: po/custom/fromJson.txt:4927 msgid "Robotic Cyborg Production" msgstr "" @@ -2434,7 +2434,7 @@ msgstr "" #: data/base/messages/strings/resstrings.txt:357 #: data/mp/messages/strings/resstrings.txt:173 #: data/mp/messages/strings/resstrings.txt:178 -#: po/custom/fromJson.txt:3216 +#: po/custom/fromJson.txt:3217 msgid "Increases Cyborg factory output" msgstr "" @@ -2464,7 +2464,7 @@ msgstr "" #: data/base/messages/strings/resstrings.txt:373 #: data/mp/messages/strings/resstrings.txt:181 #: data/mp/messages/strings/resstrings.txt:186 -#: po/custom/fromJson.txt:5917 +#: po/custom/fromJson.txt:5919 msgid "Vehicle Production Improved" msgstr "" @@ -2473,7 +2473,7 @@ msgstr "" #. data/mp/messages/resmessages2.json: $.RES_ST_FU4.text[1] #: data/base/messages/strings/resstrings.txt:366 #: data/mp/messages/strings/resstrings.txt:182 -#: po/custom/fromJson.txt:4234 +#: po/custom/fromJson.txt:4236 msgid "New Robotic Techniques improve factory production" msgstr "" @@ -2481,7 +2481,7 @@ msgstr "" #. data/base/messages/resmessages2.json: $.RES_ST_FU4.text[2] #: data/base/messages/strings/resstrings.txt:367 #: data/mp/messages/strings/resstrings.txt:183 -#: po/custom/fromJson.txt:3229 +#: po/custom/fromJson.txt:3230 msgid "Increases factory production rate" msgstr "" @@ -2507,7 +2507,7 @@ msgstr "" #. data/base/messages/resmessages1.json: $.RES_ST_FU1.text[2] #: data/base/messages/strings/resstrings.txt:375 #: data/mp/messages/strings/resstrings.txt:188 -#: po/custom/fromJson.txt:3226 +#: po/custom/fromJson.txt:3227 msgid "Increases factory output" msgstr "" @@ -2518,7 +2518,7 @@ msgstr "" #. ... + 3 refs #: data/base/messages/strings/resstrings.txt:389 #: data/mp/messages/strings/resstrings.txt:191 -#: po/custom/fromJson.txt:4866 +#: po/custom/fromJson.txt:4868 msgid "Research Improved" msgstr "" @@ -2529,7 +2529,7 @@ msgstr "" #. data/mp/stats/research.json: $.R-Struc-Research-Upgrade04.name #: data/base/messages/strings/resstrings.txt:390 #: data/mp/messages/strings/resstrings.txt:192 -#: po/custom/fromJson.txt:1771 +#: po/custom/fromJson.txt:1772 msgid "Dedicated Synaptic Link Data Analysis" msgstr "" @@ -2540,7 +2540,7 @@ msgstr "" #. data/base/messages/resmessages3.json: $.RES_ST_RU7.text[2] #: data/base/messages/strings/resstrings.txt:391 #: data/mp/messages/strings/resstrings.txt:193 -#: po/custom/fromJson.txt:3337 +#: po/custom/fromJson.txt:3338 msgid "Increases research speed" msgstr "" @@ -2562,7 +2562,7 @@ msgstr "" #. ... + 5 refs #: data/base/messages/strings/resstrings.txt:399 #: data/mp/messages/strings/resstrings.txt:196 -#: po/custom/fromJson.txt:3222 +#: po/custom/fromJson.txt:3223 msgid "Increases Damage Resistance" msgstr "" @@ -2573,7 +2573,7 @@ msgstr "" #. data/mp/stats/research.json: $.R-Struc-Materials02.name #: data/base/messages/strings/resstrings.txt:400 #: data/mp/messages/strings/resstrings.txt:197 -#: po/custom/fromJson.txt:2335 +#: po/custom/fromJson.txt:2336 msgid "Hardened Base Structure Materials" msgstr "" @@ -2595,7 +2595,7 @@ msgstr "" #. ... + 5 refs #: data/base/messages/strings/resstrings.txt:411 #: data/mp/messages/strings/resstrings.txt:201 -#: po/custom/fromJson.txt:4553 +#: po/custom/fromJson.txt:4555 msgid "Production Improved" msgstr "" @@ -2604,7 +2604,7 @@ msgstr "" #. data/mp/messages/resmessages2.json: $.RES_ST_VFU1.text[1] #: data/base/messages/strings/resstrings.txt:412 #: data/mp/messages/strings/resstrings.txt:202 -#: po/custom/fromJson.txt:4959 +#: po/custom/fromJson.txt:4961 msgid "Robotic VTOL Production" msgstr "" @@ -2615,7 +2615,7 @@ msgstr "" #. data/mp/messages/resmessages3.json: $.RES_ST_VFU4.text[2] #: data/base/messages/strings/resstrings.txt:413 #: data/mp/messages/strings/resstrings.txt:203 -#: po/custom/fromJson.txt:3360 +#: po/custom/fromJson.txt:3361 msgid "Increases VTOL factory output" msgstr "" @@ -2637,7 +2637,7 @@ msgstr "" #. data/mp/messages/resmessages3.json: $.RES_ST_VPU4.text[0] #: data/base/messages/strings/resstrings.txt:421 #: data/mp/messages/strings/resstrings.txt:206 -#: po/custom/fromJson.txt:6193 +#: po/custom/fromJson.txt:6195 msgid "VTOL Rearming Times Reduced" msgstr "" @@ -2657,7 +2657,7 @@ msgstr "" #. data/base/messages/resmessages3.json: $.RES_ST_VPU4.text[2] #: data/base/messages/strings/resstrings.txt:423 #: data/mp/messages/strings/resstrings.txt:208 -#: po/custom/fromJson.txt:4751 +#: po/custom/fromJson.txt:4753 msgid "Reduces rearming time" msgstr "" @@ -2681,7 +2681,7 @@ msgstr "" #: data/base/messages/strings/resstrings.txt:479 #: data/mp/messages/strings/resstrings.txt:211 #: data/mp/messages/strings/resstrings.txt:226 -#: po/custom/fromJson.txt:4278 +#: po/custom/fromJson.txt:4280 msgid "New Systems Turret Available" msgstr "" @@ -2689,7 +2689,7 @@ msgstr "" #. data/mp/messages/resmessagesall.json: $.RES_REPTUHVY.text[1] #: data/base/messages/strings/resstrings.txt:444 #: data/mp/messages/strings/resstrings.txt:212 -#: po/custom/fromJson.txt:2710 +#: po/custom/fromJson.txt:2711 msgid "Heavy repair unit" msgstr "" @@ -2709,7 +2709,7 @@ msgstr "" #. data/mp/messages/resmessagesall.json: $.RES_REPTUHVY.text[3] #: data/base/messages/strings/resstrings.txt:446 #: data/mp/messages/strings/resstrings.txt:214 -#: po/custom/fromJson.txt:4393 +#: po/custom/fromJson.txt:4395 msgid "Or damaged units may be selected as target" msgstr "" @@ -2733,7 +2733,7 @@ msgstr "" #. data/mp/messages/resmessages2.json: $.RES_SY_STW2.text[0] #: data/base/messages/strings/resstrings.txt:459 #: data/mp/messages/strings/resstrings.txt:221 -#: po/custom/fromJson.txt:3099 +#: po/custom/fromJson.txt:3100 msgid "Improved Sensor Tower Available" msgstr "" @@ -2742,7 +2742,7 @@ msgstr "" #. data/mp/messages/resmessages2.json: $.RES_SY_STW2.text[1] #: data/base/messages/strings/resstrings.txt:460 #: data/mp/messages/strings/resstrings.txt:222 -#: po/custom/fromJson.txt:4116 +#: po/custom/fromJson.txt:4117 msgid "New construction techniques improve tower" msgstr "" @@ -2751,7 +2751,7 @@ msgstr "" #. data/mp/messages/resmessages2.json: $.RES_SY_STW2.text[2] #: data/base/messages/strings/resstrings.txt:461 #: data/mp/messages/strings/resstrings.txt:223 -#: po/custom/fromJson.txt:4833 +#: po/custom/fromJson.txt:4835 msgid "Replaces existing sensor tower" msgstr "" @@ -2762,7 +2762,7 @@ msgstr "" #. ... + 3 refs #: data/base/messages/strings/resstrings.txt:462 #: data/mp/messages/strings/resstrings.txt:224 -#: po/custom/fromJson.txt:3730 +#: po/custom/fromJson.txt:3731 msgid "May be assigned as spotter for indirect fire weapons" msgstr "" @@ -2771,7 +2771,7 @@ msgstr "" #. data/mp/messages/resmessages2.json: $.RES_SY_VCBSTU1.text[1] #: data/base/messages/strings/resstrings.txt:480 #: data/mp/messages/strings/resstrings.txt:227 -#: po/custom/fromJson.txt:6051 +#: po/custom/fromJson.txt:6053 msgid "VTOL CB turret detects enemy indirect fire batteries" msgstr "" @@ -2782,7 +2782,7 @@ msgstr "" #. data/mp/messages/resmessages23.json: $.RES_SY_VCBSTW1.text[2] #: data/base/messages/strings/resstrings.txt:481 #: data/mp/messages/strings/resstrings.txt:228 -#: po/custom/fromJson.txt:4409 +#: po/custom/fromJson.txt:4411 msgid "Orders assigned VTOLs to attack the enemy batteries" msgstr "" @@ -2793,7 +2793,7 @@ msgstr "" #. data/mp/messages/resmessages23.json: $.RES_SY_VCBSTW1.text[3] #: data/base/messages/strings/resstrings.txt:482 #: data/mp/messages/strings/resstrings.txt:229 -#: po/custom/fromJson.txt:6247 +#: po/custom/fromJson.txt:6249 msgid "VTOLs attack until enemy battery is suppressed" msgstr "" @@ -2804,7 +2804,7 @@ msgstr "" #. ... + 3 refs #: data/base/messages/strings/resstrings.txt:485 #: data/mp/messages/strings/resstrings.txt:231 -#: po/custom/fromJson.txt:6029 +#: po/custom/fromJson.txt:6031 msgid "VTOL CB Improved" msgstr "" @@ -2815,7 +2815,7 @@ msgstr "" #. data/mp/messages/resmessages2.json: $.RES_SY_VCBSU1.text[1] #: data/base/messages/strings/resstrings.txt:486 #: data/mp/messages/strings/resstrings.txt:232 -#: po/custom/fromJson.txt:4141 +#: po/custom/fromJson.txt:4142 msgid "New fire detection systems" msgstr "" @@ -2826,7 +2826,7 @@ msgstr "" #. ... + 3 refs #: data/base/messages/strings/resstrings.txt:487 #: data/mp/messages/strings/resstrings.txt:233 -#: po/custom/fromJson.txt:1970 +#: po/custom/fromJson.txt:1971 msgid "Extends VTOL CB Range" msgstr "" @@ -2848,7 +2848,7 @@ msgstr "" #. ... + 3 refs #: data/base/messages/strings/resstrings.txt:499 #: data/mp/messages/strings/resstrings.txt:236 -#: po/custom/fromJson.txt:6203 +#: po/custom/fromJson.txt:6205 msgid "VTOL Strike Improved" msgstr "" @@ -2857,7 +2857,7 @@ msgstr "" #. data/mp/messages/resmessages2.json: $.RES_SY_VS1.text[1] #: data/base/messages/strings/resstrings.txt:500 #: data/mp/messages/strings/resstrings.txt:237 -#: po/custom/fromJson.txt:4282 +#: po/custom/fromJson.txt:4284 msgid "New target recognition systems" msgstr "" @@ -2868,7 +2868,7 @@ msgstr "" #. ... + 3 refs #: data/base/messages/strings/resstrings.txt:501 #: data/mp/messages/strings/resstrings.txt:238 -#: po/custom/fromJson.txt:1976 +#: po/custom/fromJson.txt:1977 msgid "Extends VTOL Strike Range" msgstr "" @@ -2908,7 +2908,7 @@ msgstr "" #. data/mp/messages/resmessages2.json: $.RES_V_B02.text[0] #: data/base/messages/strings/resstrings.txt:527 #: data/mp/messages/strings/resstrings.txt:246 -#: po/custom/fromJson.txt:1457 +#: po/custom/fromJson.txt:1458 msgid "Collective Light Body" msgstr "" @@ -2919,7 +2919,7 @@ msgstr "" #. data/mp/messages/resmessages3.json: $.RES_V_B03.text[1] #: data/base/messages/strings/resstrings.txt:528 #: data/mp/messages/strings/resstrings.txt:247 -#: po/custom/fromJson.txt:5496 +#: po/custom/fromJson.txt:5498 msgid "Superior armor and body points to Viper" msgstr "" @@ -2928,7 +2928,7 @@ msgstr "" #. data/mp/messages/resmessages2.json: $.RES_V_B02.text[2] #: data/base/messages/strings/resstrings.txt:529 #: data/mp/messages/strings/resstrings.txt:248 -#: po/custom/fromJson.txt:5286 +#: po/custom/fromJson.txt:5288 msgid "Slower than Viper" msgstr "" @@ -2937,7 +2937,7 @@ msgstr "" #. data/mp/messages/resmessages2.json: $.RES_V_B02.text[3] #: data/base/messages/strings/resstrings.txt:530 #: data/mp/messages/strings/resstrings.txt:249 -#: po/custom/fromJson.txt:2854 +#: po/custom/fromJson.txt:2855 msgid "High power costs and slower to produce than Viper" msgstr "" @@ -2946,7 +2946,7 @@ msgstr "" #. data/mp/messages/resmessages2.json: $.RES_V_B06.text[0] #: data/base/messages/strings/resstrings.txt:539 #: data/mp/messages/strings/resstrings.txt:251 -#: po/custom/fromJson.txt:1461 +#: po/custom/fromJson.txt:1462 msgid "Collective Medium Body" msgstr "" @@ -2957,7 +2957,7 @@ msgstr "" #. data/mp/messages/resmessages3.json: $.RES_V_B07.text[1] #: data/base/messages/strings/resstrings.txt:540 #: data/mp/messages/strings/resstrings.txt:252 -#: po/custom/fromJson.txt:5490 +#: po/custom/fromJson.txt:5492 msgid "Superior armor and body points to Cobra" msgstr "" @@ -2966,7 +2966,7 @@ msgstr "" #. data/mp/messages/resmessages2.json: $.RES_V_B06.text[2] #: data/base/messages/strings/resstrings.txt:541 #: data/mp/messages/strings/resstrings.txt:253 -#: po/custom/fromJson.txt:5278 +#: po/custom/fromJson.txt:5280 msgid "Slower than Cobra" msgstr "" @@ -2975,7 +2975,7 @@ msgstr "" #. data/mp/messages/resmessages2.json: $.RES_V_B06.text[3] #: data/base/messages/strings/resstrings.txt:542 #: data/mp/messages/strings/resstrings.txt:254 -#: po/custom/fromJson.txt:2850 +#: po/custom/fromJson.txt:2851 msgid "High power costs and slower to produce than Cobra" msgstr "" @@ -2986,7 +2986,7 @@ msgstr "" #. ... + 5 refs #: data/base/messages/strings/resstrings.txt:559 #: data/mp/messages/strings/resstrings.txt:256 -#: po/custom/fromJson.txt:5912 +#: po/custom/fromJson.txt:5914 msgid "Vehicle Engine Upgrade" msgstr "" @@ -2997,7 +2997,7 @@ msgstr "" #. data/mp/stats/research.json: $.R-Vehicle-Engine04.name #: data/base/messages/strings/resstrings.txt:560 #: data/mp/messages/strings/resstrings.txt:257 -#: po/custom/fromJson.txt:5771 +#: po/custom/fromJson.txt:5773 msgid "Turbo-Charged Engine" msgstr "" @@ -3008,7 +3008,7 @@ msgstr "" #. data/base/messages/resmessages3.json: $.RES_V_EN7.text[2] #: data/base/messages/strings/resstrings.txt:561 #: data/mp/messages/strings/resstrings.txt:258 -#: po/custom/fromJson.txt:3132 +#: po/custom/fromJson.txt:3133 msgid "Improves vehicle speed" msgstr "" @@ -3034,7 +3034,7 @@ msgstr "" #. ... + 5 refs #: data/base/messages/strings/resstrings.txt:571 #: data/mp/messages/strings/resstrings.txt:261 -#: po/custom/fromJson.txt:5906 +#: po/custom/fromJson.txt:5908 msgid "Vehicle Bodies Improved" msgstr "" @@ -3045,7 +3045,7 @@ msgstr "" #. data/base/messages/resmessages3.json: $.RES_V_MET7.text[2] #: data/base/messages/strings/resstrings.txt:573 #: data/mp/messages/strings/resstrings.txt:263 -#: po/custom/fromJson.txt:3263 +#: po/custom/fromJson.txt:3264 msgid "Increases kinetic armor and body points" msgstr "" @@ -3056,7 +3056,7 @@ msgstr "" #. ... + 2 refs #: data/base/messages/strings/resstrings.txt:581 #: data/mp/messages/strings/resstrings.txt:266 -#: po/custom/fromJson.txt:5945 +#: po/custom/fromJson.txt:5947 msgid "Vehicle Thermal Armor Improved" msgstr "" @@ -3067,7 +3067,7 @@ msgstr "" #. ... + 2 refs #: data/base/messages/strings/resstrings.txt:582 #: data/mp/messages/strings/resstrings.txt:267 -#: po/custom/fromJson.txt:2510 +#: po/custom/fromJson.txt:2511 msgid "Heat-resistant armored layers" msgstr "" @@ -3076,7 +3076,7 @@ msgstr "" #. data/base/messages/resmessages3.json: $.RES_V_AH4.text[2] #: data/base/messages/strings/resstrings.txt:583 #: data/mp/messages/strings/resstrings.txt:268 -#: po/custom/fromJson.txt:3354 +#: po/custom/fromJson.txt:3355 msgid "Increases Thermal Armor" msgstr "" @@ -3093,7 +3093,7 @@ msgstr "" #: data/mp/messages/strings/resstrings.txt:276 #: data/mp/messages/strings/resstrings.txt:281 #: data/mp/messages/strings/resstrings.txt:286 -#: po/custom/fromJson.txt:5923 +#: po/custom/fromJson.txt:5925 msgid "Vehicle Propulsion Improved" msgstr "" @@ -3110,7 +3110,7 @@ msgstr "" #: data/mp/messages/strings/resstrings.txt:277 #: data/mp/messages/strings/resstrings.txt:282 #: data/mp/messages/strings/resstrings.txt:287 -#: po/custom/fromJson.txt:4081 +#: po/custom/fromJson.txt:4082 msgid "New armored construction" msgstr "" @@ -3127,7 +3127,7 @@ msgstr "" #: data/mp/messages/strings/resstrings.txt:278 #: data/mp/messages/strings/resstrings.txt:283 #: data/mp/messages/strings/resstrings.txt:288 -#: po/custom/fromJson.txt:3192 +#: po/custom/fromJson.txt:3193 msgid "Increases Body Points" msgstr "" @@ -3188,7 +3188,7 @@ msgstr "" #: data/mp/messages/strings/resstrings.txt:296 #: data/mp/messages/strings/resstrings.txt:301 #: data/mp/messages/strings/resstrings.txt:306 -#: po/custom/fromJson.txt:4072 +#: po/custom/fromJson.txt:4073 msgid "New AA Turret Available" msgstr "" @@ -3197,7 +3197,7 @@ msgstr "" #. data/mp/messages/resmessages2.json: $.RES_W_AA1.text[1] #: data/base/messages/strings/resstrings.txt:636 #: data/mp/messages/strings/resstrings.txt:292 -#: po/custom/fromJson.txt:5785 +#: po/custom/fromJson.txt:5787 msgid "Twin 80mm flak weapon" msgstr "" @@ -3223,7 +3223,7 @@ msgstr "" #. data/mp/messages/resmessages2.json: $.RES_W_AA2.text[1] #: data/base/messages/strings/resstrings.txt:642 #: data/mp/messages/strings/resstrings.txt:297 -#: po/custom/fromJson.txt:4639 +#: po/custom/fromJson.txt:4641 msgid "Quad 80mm flak weapon" msgstr "" @@ -3242,7 +3242,7 @@ msgstr "" #. data/mp/messages/resmessagesall.json: $.RES_WT_QUADAA.text[1] #: data/base/messages/strings/resstrings.txt:654 #: data/mp/messages/strings/resstrings.txt:307 -#: po/custom/fromJson.txt:4632 +#: po/custom/fromJson.txt:4634 msgid "Quad 30mm Anti-Aircraft machinegun" msgstr "" @@ -3264,7 +3264,7 @@ msgstr "" #. data/mp/messages/resmessages2.json: $.RES_W_AAAC1.text[1] #: data/base/messages/strings/resstrings.txt:660 #: data/mp/messages/strings/resstrings.txt:312 -#: po/custom/fromJson.txt:1840 +#: po/custom/fromJson.txt:1841 msgid "Detects and locks-on to VTOL engine emissions" msgstr "" @@ -3274,7 +3274,7 @@ msgstr "" #. data/base/messages/resmessages3.json: $.RES_W_AAAC3.text[2] #: data/base/messages/strings/resstrings.txt:661 #: data/mp/messages/strings/resstrings.txt:313 -#: po/custom/fromJson.txt:3169 +#: po/custom/fromJson.txt:3170 msgid "Increases AA accuracy" msgstr "" @@ -3307,7 +3307,7 @@ msgstr "" #. data/mp/messages/resmessages2.json: $.RES_W_AAD1.text[1] #: data/base/messages/strings/resstrings.txt:670 #: data/mp/messages/strings/resstrings.txt:317 -#: po/custom/fromJson.txt:2812 +#: po/custom/fromJson.txt:2813 msgid "High Explosive Flak shards" msgstr "" @@ -3316,7 +3316,7 @@ msgstr "" #. data/base/messages/resmessages3.json: $.RES_W_AAD4.text[2] #: data/base/messages/strings/resstrings.txt:671 #: data/mp/messages/strings/resstrings.txt:318 -#: po/custom/fromJson.txt:3173 +#: po/custom/fromJson.txt:3174 msgid "Increases AA Flak damage" msgstr "" @@ -3336,7 +3336,7 @@ msgstr "" #. data/mp/messages/resmessages2.json: $.RES_W_AAROF1.text[1] #: data/base/messages/strings/resstrings.txt:678 #: data/mp/messages/strings/resstrings.txt:322 -#: po/custom/fromJson.txt:4738 +#: po/custom/fromJson.txt:4740 msgid "Recoil loaded AA ammunition hopper" msgstr "" @@ -3345,7 +3345,7 @@ msgstr "" #. data/base/messages/resmessages3.json: $.RES_W_AAROF4.text[2] #: data/base/messages/strings/resstrings.txt:679 #: data/mp/messages/strings/resstrings.txt:323 -#: po/custom/fromJson.txt:3177 +#: po/custom/fromJson.txt:3178 msgid "Increases AA ROF" msgstr "" @@ -3358,7 +3358,7 @@ msgstr "" #: data/base/messages/strings/resstrings.txt:691 #: data/mp/messages/strings/resstrings.txt:326 #: data/mp/messages/strings/resstrings.txt:331 -#: po/custom/fromJson.txt:4206 +#: po/custom/fromJson.txt:4208 msgid "New Proximity Bomb Turret Available" msgstr "" @@ -3389,7 +3389,7 @@ msgstr "" #. data/mp/messages/resmessages2.json: $.RES_W_PBMB2.text[1] #: data/base/messages/strings/resstrings.txt:692 #: data/mp/messages/strings/resstrings.txt:332 -#: po/custom/fromJson.txt:5433 +#: po/custom/fromJson.txt:5435 msgid "Superbomb turret explodes in proximity to enemy" msgstr "" @@ -3402,7 +3402,7 @@ msgstr "" #: data/base/messages/strings/resstrings.txt:703 #: data/mp/messages/strings/resstrings.txt:336 #: data/mp/messages/strings/resstrings.txt:341 -#: po/custom/fromJson.txt:4107 +#: po/custom/fromJson.txt:4108 msgid "New Bomb Bay Available" msgstr "" @@ -3411,7 +3411,7 @@ msgstr "" #. data/mp/messages/resmessages2.json: $.RES_W_BMB1.text[1] #: data/base/messages/strings/resstrings.txt:698 #: data/mp/messages/strings/resstrings.txt:337 -#: po/custom/fromJson.txt:1866 +#: po/custom/fromJson.txt:1867 msgid "Drops High Explosive Cluster bombs" msgstr "" @@ -3449,7 +3449,7 @@ msgstr "" #. data/mp/messages/resmessages2.json: $.RES_W_BMB2.text[1] #: data/base/messages/strings/resstrings.txt:704 #: data/mp/messages/strings/resstrings.txt:342 -#: po/custom/fromJson.txt:1862 +#: po/custom/fromJson.txt:1863 msgid "Drops High Explosive Armor Piercing bombs" msgstr "" @@ -3498,7 +3498,7 @@ msgstr "" #: data/mp/messages/strings/resstrings.txt:351 #: data/mp/messages/strings/resstrings.txt:356 #: data/mp/messages/strings/resstrings.txt:361 -#: po/custom/fromJson.txt:4296 +#: po/custom/fromJson.txt:4298 msgid "New Weapon Turret Available" msgstr "" @@ -3507,7 +3507,7 @@ msgstr "" #. data/mp/messages/resmessages2.json: $.RES_W_CN_4A.text[1] #: data/base/messages/strings/resstrings.txt:730 #: data/mp/messages/strings/resstrings.txt:352 -#: po/custom/fromJson.txt:3018 +#: po/custom/fromJson.txt:3019 msgid "Hyper-velocity automatic-cannon firing 88mm rounds" msgstr "" @@ -3528,7 +3528,7 @@ msgstr "" #. data/mp/messages/resmessages2.json: $.RES_W_CN_4A.text[3] #: data/base/messages/strings/resstrings.txt:732 #: data/mp/messages/strings/resstrings.txt:354 -#: po/custom/fromJson.txt:4836 +#: po/custom/fromJson.txt:4838 msgid "Replaces Medium Cannon" msgstr "" @@ -3557,7 +3557,7 @@ msgstr "" #. data/mp/messages/resmessages2.json: $.RES_FLAME2.text[1] #: data/base/messages/strings/resstrings.txt:758 #: data/mp/messages/strings/resstrings.txt:362 -#: po/custom/fromJson.txt:2582 +#: po/custom/fromJson.txt:2583 msgid "Heavy Flame-thrower firing Propylene Oxide gel" msgstr "" @@ -3579,7 +3579,7 @@ msgstr "" #. ... + 5 refs #: data/base/messages/strings/resstrings.txt:765 #: data/mp/messages/strings/resstrings.txt:366 -#: po/custom/fromJson.txt:2126 +#: po/custom/fromJson.txt:2127 msgid "Flamer Upgrade" msgstr "" @@ -3589,7 +3589,7 @@ msgstr "" #. data/mp/messages/resmessagesall.json: $.RES_W_FL_D7.text[1] #: data/base/messages/strings/resstrings.txt:766 #: data/mp/messages/strings/resstrings.txt:367 -#: po/custom/fromJson.txt:4577 +#: po/custom/fromJson.txt:4579 msgid "Propylene Oxide treated to burn at superhot temperatures" msgstr "" @@ -3598,7 +3598,7 @@ msgstr "" #. data/base/messages/resmessages2.json: $.RES_W_FL_D4.text[2] #: data/base/messages/strings/resstrings.txt:767 #: data/mp/messages/strings/resstrings.txt:368 -#: po/custom/fromJson.txt:3233 +#: po/custom/fromJson.txt:3234 msgid "Increases Flamer damage" msgstr "" @@ -3626,7 +3626,7 @@ msgstr "" #: data/mp/messages/strings/resstrings.txt:376 #: data/mp/messages/strings/resstrings.txt:381 #: data/mp/messages/strings/resstrings.txt:411 -#: po/custom/fromJson.txt:4147 +#: po/custom/fromJson.txt:4148 msgid "New Indirect Fire Weapon Available" msgstr "" @@ -3648,7 +3648,7 @@ msgstr "" #: data/base/messages/strings/resstrings.txt:781 #: data/mp/messages/strings/resstrings.txt:373 #: data/mp/messages/strings/resstrings.txt:378 -#: po/custom/fromJson.txt:1109 +#: po/custom/fromJson.txt:1103 msgid "Best Targets: Base Structures, infantry, wheeled vehicles" msgstr "" @@ -3690,7 +3690,7 @@ msgstr "" #: data/mp/messages/strings/resstrings.txt:386 #: data/mp/messages/strings/resstrings.txt:391 #: data/mp/messages/strings/resstrings.txt:396 -#: po/custom/fromJson.txt:2946 +#: po/custom/fromJson.txt:2947 msgid "Howitzer Upgrade" msgstr "" @@ -3701,7 +3701,7 @@ msgstr "" #. data/mp/messages/resmessages23.json: $.RES_W_AAAC2.text[1] #: data/base/messages/strings/resstrings.txt:794 #: data/mp/messages/strings/resstrings.txt:387 -#: po/custom/fromJson.txt:5199 +#: po/custom/fromJson.txt:5201 msgid "Self-guided rocket powered shells" msgstr "" @@ -3710,7 +3710,7 @@ msgstr "" #. data/base/messages/resmessages3.json: $.RES_W_HOWAC3.text[2] #: data/base/messages/strings/resstrings.txt:795 #: data/mp/messages/strings/resstrings.txt:388 -#: po/custom/fromJson.txt:3243 +#: po/custom/fromJson.txt:3244 msgid "Increases Howitzer accuracy" msgstr "" @@ -3736,7 +3736,7 @@ msgstr "" #. data/mp/messages/resmessages2.json: $.RES_W_HOWD1.text[1] #: data/base/messages/strings/resstrings.txt:802 #: data/mp/messages/strings/resstrings.txt:392 -#: po/custom/fromJson.txt:2826 +#: po/custom/fromJson.txt:2827 msgid "High Explosive shells" msgstr "" @@ -3745,7 +3745,7 @@ msgstr "" #. data/base/messages/resmessages3.json: $.RES_W_HOWD4.text[2] #: data/base/messages/strings/resstrings.txt:803 #: data/mp/messages/strings/resstrings.txt:393 -#: po/custom/fromJson.txt:3247 +#: po/custom/fromJson.txt:3248 msgid "Increases Howitzer damage" msgstr "" @@ -3765,7 +3765,7 @@ msgstr "" #. data/base/messages/resmessages3.json: $.RES_W_HOWRF4.text[2] #: data/base/messages/strings/resstrings.txt:811 #: data/mp/messages/strings/resstrings.txt:398 -#: po/custom/fromJson.txt:3251 +#: po/custom/fromJson.txt:3252 msgid "Increases Howitzer ROF" msgstr "" @@ -3778,7 +3778,7 @@ msgstr "" #: data/base/messages/strings/resstrings.txt:857 #: data/mp/messages/strings/resstrings.txt:401 #: data/mp/messages/strings/resstrings.txt:406 -#: po/custom/fromJson.txt:3678 +#: po/custom/fromJson.txt:3679 msgid "Machinegun Upgrade" msgstr "" @@ -3787,7 +3787,7 @@ msgstr "" #. data/mp/messages/resmessages2.json: $.RES_W_MG_D5.text[1] #: data/base/messages/strings/resstrings.txt:846 #: data/mp/messages/strings/resstrings.txt:402 -#: po/custom/fromJson.txt:5745 +#: po/custom/fromJson.txt:5747 msgid "Tungsten-tipped armor-piercing bullets" msgstr "" @@ -3798,7 +3798,7 @@ msgstr "" #. ... + 2 refs #: data/base/messages/strings/resstrings.txt:847 #: data/mp/messages/strings/resstrings.txt:403 -#: po/custom/fromJson.txt:3278 +#: po/custom/fromJson.txt:3279 msgid "Increases Machinegun damage" msgstr "" @@ -3820,7 +3820,7 @@ msgstr "" #. data/mp/messages/resmessages2.json: $.RES_W_MG_ROF2.text[1] #: data/base/messages/strings/resstrings.txt:858 #: data/mp/messages/strings/resstrings.txt:407 -#: po/custom/fromJson.txt:3033 +#: po/custom/fromJson.txt:3034 msgid "Improved chaingun mechanism" msgstr "" @@ -3830,7 +3830,7 @@ msgstr "" #. data/base/messages/resmessages23.json: $.RES_W_MG_ROF3.text[2] #: data/base/messages/strings/resstrings.txt:859 #: data/mp/messages/strings/resstrings.txt:408 -#: po/custom/fromJson.txt:3283 +#: po/custom/fromJson.txt:3284 msgid "Increases Machinegun ROF" msgstr "" @@ -3841,7 +3841,7 @@ msgstr "" #. data/mp/messages/resmessages2.json: $.RES_W_M3.text[1] #: data/base/messages/strings/resstrings.txt:892 #: data/mp/messages/strings/resstrings.txt:412 -#: po/custom/fromJson.txt:3736 +#: po/custom/fromJson.txt:3737 msgid "May be assigned to a sensor" msgstr "" @@ -3852,7 +3852,7 @@ msgstr "" #. ... + 7 refs #: data/base/messages/strings/resstrings.txt:893 #: data/mp/messages/strings/resstrings.txt:413 -#: po/custom/fromJson.txt:1103 +#: po/custom/fromJson.txt:1109 msgid "Best Targets: Base structures, infantry, wheeled vehicles" msgstr "" @@ -3874,7 +3874,7 @@ msgstr "" #. ... + 11 refs #: data/base/messages/strings/resstrings.txt:905 #: data/mp/messages/strings/resstrings.txt:416 -#: po/custom/fromJson.txt:3996 +#: po/custom/fromJson.txt:3997 msgid "Mortar Upgrade" msgstr "" @@ -3883,7 +3883,7 @@ msgstr "" #. data/mp/messages/resmessages2.json: $.RES_W_M_D4.text[1] #: data/base/messages/strings/resstrings.txt:906 #: data/mp/messages/strings/resstrings.txt:417 -#: po/custom/fromJson.txt:2801 +#: po/custom/fromJson.txt:2802 msgid "High Explosive Armor-Piercing Shells" msgstr "" @@ -3892,7 +3892,7 @@ msgstr "" #. data/base/messages/resmessages2.json: $.RES_W_M_D4.text[2] #: data/base/messages/strings/resstrings.txt:907 #: data/mp/messages/strings/resstrings.txt:418 -#: po/custom/fromJson.txt:3313 +#: po/custom/fromJson.txt:3314 msgid "Increases Mortar damage" msgstr "" @@ -3916,7 +3916,7 @@ msgstr "" #: data/base/messages/strings/resstrings.txt:951 #: data/mp/messages/strings/resstrings.txt:421 #: data/mp/messages/strings/resstrings.txt:426 -#: po/custom/fromJson.txt:3884 +#: po/custom/fromJson.txt:3885 msgid "Mini-Rocket Upgrade" msgstr "" @@ -3924,7 +3924,7 @@ msgstr "" #. data/base/messages/resmessages2.json: $.RES_W_RK_D4.text[1] #: data/base/messages/strings/resstrings.txt:944 #: data/mp/messages/strings/resstrings.txt:422 -#: po/custom/fromJson.txt:2804 +#: po/custom/fromJson.txt:2805 msgid "High Explosive Armor-Piercing warheads" msgstr "" @@ -3933,7 +3933,7 @@ msgstr "" #. data/base/messages/resmessages2.json: $.RES_W_RK_D4.text[2] #: data/base/messages/strings/resstrings.txt:945 #: data/mp/messages/strings/resstrings.txt:423 -#: po/custom/fromJson.txt:3290 +#: po/custom/fromJson.txt:3291 msgid "Increases Mini-Rocket damage" msgstr "" @@ -3967,7 +3967,7 @@ msgstr "" #. ... + 14 refs #: data/base/messages/strings/resstrings.txt:965 #: data/mp/messages/strings/resstrings.txt:431 -#: po/custom/fromJson.txt:5043 +#: po/custom/fromJson.txt:5045 msgid "Rocket Upgrade" msgstr "" @@ -3976,7 +3976,7 @@ msgstr "" #. data/mp/messages/resmessages2.json: $.RES_W_SRK_D4.text[1] #: data/base/messages/strings/resstrings.txt:966 #: data/mp/messages/strings/resstrings.txt:432 -#: po/custom/fromJson.txt:2830 +#: po/custom/fromJson.txt:2831 msgid "High Explosive Squash Head warhead" msgstr "" @@ -3985,7 +3985,7 @@ msgstr "" #. data/base/messages/resmessages2.json: $.RES_W_SRK_D4.text[2] #: data/base/messages/strings/resstrings.txt:967 #: data/mp/messages/strings/resstrings.txt:433 -#: po/custom/fromJson.txt:3346 +#: po/custom/fromJson.txt:3347 msgid "Increases Rocket damage" msgstr "" @@ -4189,19 +4189,19 @@ msgstr "" #: data/base/script/tutorial.js:515 #: data/mp/multiplay/script/rules/reticule.js:111 #: src/challenge.cpp:265 -#: src/hci.cpp:2354 +#: src/hci.cpp:2505 #: src/hci/objects_stats.cpp:282 #: src/hci/objects_stats.cpp:367 #: src/intelmap.cpp:246 #: src/intorder.cpp:653 -#: src/loadsave.cpp:310 +#: src/loadsave.cpp:311 #: src/multimenu.cpp:429 #: src/multimenu.cpp:1376 #: src/screens/guidescreen.cpp:1670 #: src/screens/joiningscreen.cpp:631 #: src/screens/joiningscreen.cpp:644 #: src/spectatorwidgets.cpp:755 -#: src/titleui/campaign.cpp:1246 +#: src/titleui/campaign.cpp:1256 #: src/transporter.cpp:204 #: src/transporter.cpp:265 #: src/transporter.cpp:570 @@ -5219,7 +5219,7 @@ msgstr "" #. data/mp/stats/templates.json: $.A-Viper-Wheels-MG.name #. data/mp/stats/templates.json: $.ViperMG01Wheels.name #: data/mp/messages/strings/names.txt:15 -#: po/custom/fromJson.txt:3690 +#: po/custom/fromJson.txt:3691 msgid "Machinegun Viper Wheels" msgstr "" @@ -5229,7 +5229,7 @@ msgstr "" #. data/base/stats/structure.json: $.Sys-SensoTower01.name #. ... + 2 refs #: data/mp/messages/strings/names.txt:213 -#: po/custom/fromJson.txt:5230 +#: po/custom/fromJson.txt:5232 msgid "Sensor Tower" msgstr "" @@ -5243,7 +5243,7 @@ msgstr "" #. data/mp/stats/research.json: $.R-Wpn-MG1Mk1.name #. data/mp/stats/weapons.json: $.MG1Mk1.name #: data/mp/messages/strings/names.txt:271 -#: po/custom/fromJson.txt:3696 +#: po/custom/fromJson.txt:3697 msgid "Machinegun" msgstr "" @@ -5252,7 +5252,7 @@ msgstr "" #. data/base/stats/weapons.json: $.AAGun2Mk1.name #: data/mp/messages/strings/names.txt:274 #: data/mp/messages/strings/names.txt:516 -#: po/custom/fromJson.txt:1757 +#: po/custom/fromJson.txt:1758 msgid "Cyclone Flak Turret" msgstr "" @@ -5264,7 +5264,7 @@ msgstr "" #. data/base/stats/structure.json: $.CollectiveWall.name #. data/mp/stats/structure.json: $.CollectiveWall.name #: data/mp/messages/strings/names.txt:294 -#: po/custom/fromJson.txt:1465 +#: po/custom/fromJson.txt:1466 msgid "Collective Wall" msgstr "" @@ -5346,21 +5346,21 @@ msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Comp-MissileCodes01.name #: data/mp/messages/strings/names.txt:362 -#: po/custom/fromJson.txt:3921 +#: po/custom/fromJson.txt:3922 msgid "Missile Targeting Codes" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Comp-MissileCodes02.name #: data/mp/messages/strings/names.txt:363 -#: po/custom/fromJson.txt:5189 +#: po/custom/fromJson.txt:5191 msgid "Second Level Missile Targeting Codes" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Comp-MissileCodes03.name #: data/mp/messages/strings/names.txt:364 -#: po/custom/fromJson.txt:5680 +#: po/custom/fromJson.txt:5682 msgid "Third Level Missile Firing Codes" msgstr "" @@ -5370,7 +5370,7 @@ msgstr "" #. data/base/stats/templates.json: $.CyborgCannon01Grd.name #. ... + 2 refs #: data/mp/messages/strings/names.txt:372 -#: po/custom/fromJson.txt:2592 +#: po/custom/fromJson.txt:2593 msgid "Heavy Gunner Cyborg" msgstr "" @@ -5380,7 +5380,7 @@ msgstr "" #. data/base/stats/templates.json: $.CyborgFlamer01Grd.name #. ... + 2 refs #: data/mp/messages/strings/names.txt:373 -#: po/custom/fromJson.txt:2095 +#: po/custom/fromJson.txt:2096 msgid "Flamer Cyborg" msgstr "" @@ -5390,7 +5390,7 @@ msgstr "" #. data/base/stats/templates.json: $.CyborgChain01Ground.name #. ... + 2 refs #: data/mp/messages/strings/names.txt:374 -#: po/custom/fromJson.txt:3702 +#: po/custom/fromJson.txt:3703 msgid "Machinegunner Cyborg" msgstr "" @@ -5399,7 +5399,7 @@ msgstr "" #. data/base/stats/research.json: $.R-Cyborg-Legs01.name #. data/mp/stats/propulsion.json: $.CyborgLegs.name #: data/mp/messages/strings/names.txt:381 -#: po/custom/fromJson.txt:1690 +#: po/custom/fromJson.txt:1691 msgid "Cyborg Propulsion" msgstr "" @@ -5407,14 +5407,14 @@ msgstr "" #. data/base/stats/weapons.json: $.MG3-Tower.name #. data/mp/stats/structure.json: $.GuardTower3.name #: data/mp/messages/strings/names.txt:405 -#: po/custom/fromJson.txt:2658 +#: po/custom/fromJson.txt:2659 msgid "Heavy Machinegun Tower" msgstr "" #. TRANSLATORS: #. data/base/stats/weapons.json: $.Flame1Mk1-Tower.name #: data/mp/messages/strings/names.txt:406 -#: po/custom/fromJson.txt:2120 +#: po/custom/fromJson.txt:2121 msgid "Flamer Tower" msgstr "" @@ -5423,7 +5423,7 @@ msgstr "" #. data/mp/stats/research.json: $.R-Defense-Pillbox06.name #. data/mp/stats/structure.json: $.GuardTower5.name #: data/mp/messages/strings/names.txt:407 -#: po/custom/fromJson.txt:3499 +#: po/custom/fromJson.txt:3500 msgid "Lancer Tower" msgstr "" @@ -5447,7 +5447,7 @@ msgstr "" #. data/mp/stats/repair.json: $.HeavyRepair.name #. data/mp/stats/research.json: $.R-Sys-MobileRepairTurretHvy.name #: data/mp/messages/strings/names.txt:470 -#: po/custom/fromJson.txt:2707 +#: po/custom/fromJson.txt:2708 msgid "Heavy Repair Turret" msgstr "" @@ -5458,7 +5458,7 @@ msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Sys-Resistance-Circuits.name #: data/mp/messages/strings/names.txt:491 -#: po/custom/fromJson.txt:4346 +#: po/custom/fromJson.txt:4348 msgid "Nexus Resistance Circuits" msgstr "" @@ -5473,35 +5473,35 @@ msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Vehicle-Prop-Hover02.name #: data/mp/messages/strings/names.txt:505 -#: po/custom/fromJson.txt:2896 +#: po/custom/fromJson.txt:2897 msgid "Hover Propulsion II" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Vehicle-Prop-Halftracks02.name #: data/mp/messages/strings/names.txt:507 -#: po/custom/fromJson.txt:2293 +#: po/custom/fromJson.txt:2294 msgid "Half-tracked Propulsion II" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Vehicle-Prop-Tracks02.name #: data/mp/messages/strings/names.txt:509 -#: po/custom/fromJson.txt:5697 +#: po/custom/fromJson.txt:5699 msgid "Tracked Propulsion II" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Vehicle-Prop-VTOL02.name #: data/mp/messages/strings/names.txt:511 -#: po/custom/fromJson.txt:6160 +#: po/custom/fromJson.txt:6162 msgid "VTOL Propulsion II" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Vehicle-Prop-Wheels02.name #: data/mp/messages/strings/names.txt:513 -#: po/custom/fromJson.txt:6262 +#: po/custom/fromJson.txt:6264 msgid "Wheeled Propulsion II" msgstr "" @@ -5509,28 +5509,30 @@ msgstr "" #. data/base/stats/research.json: $.R-Wpn-MG-Damage09.name #. data/mp/stats/research.json: $.R-Wpn-MG-Damage09.name #: data/mp/messages/strings/names.txt:539 -#: po/custom/fromJson.txt:1825 +#: po/custom/fromJson.txt:1826 msgid "Depleted Uranium MG Bullets Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-TUTMG.name #: data/mp/messages/strings/names.txt:568 -#: po/custom/fromJson.txt:3651 +#: po/custom/fromJson.txt:3652 msgid "Machinegun Artifact" msgstr "" #. TRANSLATORS: #. data/base/stats/structure.json: $.A0CommandCentreNP.name +#. data/mp/stats/structure.json: $.A0CommandCentreNP.name #: data/mp/messages/strings/names.txt:571 -#: po/custom/fromJson.txt:4168 +#: po/custom/fromJson.txt:4170 msgid "New Paradigm Command Center" msgstr "" #. TRANSLATORS: #. data/base/stats/structure.json: $.A0CommandCentreCO.name +#. data/mp/stats/structure.json: $.A0CommandCentreCO.name #: data/mp/messages/strings/names.txt:572 -#: po/custom/fromJson.txt:1445 +#: po/custom/fromJson.txt:1446 msgid "Collective Command Center" msgstr "" @@ -5539,7 +5541,7 @@ msgstr "" #. data/mp/stats/structure.json: $.NX-CruiseSite.name #: data/mp/messages/strings/names.txt:725 #: data/mp/messages/strings/names.txt:726 -#: po/custom/fromJson.txt:3918 +#: po/custom/fromJson.txt:3919 msgid "Missile Silo" msgstr "" @@ -5547,7 +5549,7 @@ msgstr "" #. data/mp/stats/research.json: $.R-Cyborg-Hvywpn-Mcannon.name #. data/mp/stats/weapons.json: $.Cyb-Hvywpn-Mcannon.name #: data/mp/messages/strings/names.txt:777 -#: po/custom/fromJson.txt:5392 +#: po/custom/fromJson.txt:5394 msgid "Super Heavy-Gunner" msgstr "" @@ -5556,7 +5558,7 @@ msgstr "" #. data/mp/stats/templates.json: $.Cyb-Hvy-Acannon.name #. data/mp/stats/weapons.json: $.Cyb-Hvywpn-Acannon.name #: data/mp/messages/strings/names.txt:779 -#: po/custom/fromJson.txt:5385 +#: po/custom/fromJson.txt:5387 msgid "Super Auto-Cannon Cyborg" msgstr "" @@ -5569,7 +5571,7 @@ msgstr "" #. data/mp/stats/templates.json: $.Cyb-Hvy-TK.name #. data/mp/stats/weapons.json: $.Cyb-Hvywpn-TK.name #: data/mp/messages/strings/names.txt:783 -#: po/custom/fromJson.txt:5419 +#: po/custom/fromJson.txt:5421 msgid "Super Tank-Killer Cyborg" msgstr "" @@ -5577,7 +5579,7 @@ msgstr "" #. data/mp/stats/research.json: $.R-Sys-Sensor-UpLink.name #. data/mp/stats/structure.json: $.A0Sat-linkCentre.name #: data/mp/messages/strings/names.txt:790 -#: po/custom/fromJson.txt:5073 +#: po/custom/fromJson.txt:5075 msgid "Satellite Uplink Center" msgstr "" @@ -5586,7 +5588,7 @@ msgstr "" #. data/mp/stats/templates.json: $.Cyb-Hvy-PulseLsr.name #. data/mp/stats/weapons.json: $.Cyb-Hvywpn-PulseLsr.name #: data/mp/messages/strings/names.txt:801 -#: po/custom/fromJson.txt:5402 +#: po/custom/fromJson.txt:5404 msgid "Super Pulse Laser Cyborg" msgstr "" @@ -5594,7 +5596,7 @@ msgstr "" #. data/mp/stats/research.json: $.R-Cyborg-Hvywpn-RailGunner.name #. data/mp/stats/weapons.json: $.Cyb-Hvywpn-RailGunner.name #: data/mp/messages/strings/names.txt:803 -#: po/custom/fromJson.txt:5409 +#: po/custom/fromJson.txt:5411 msgid "Super Rail-Gunner" msgstr "" @@ -5603,7 +5605,7 @@ msgstr "" #. data/mp/stats/templates.json: $.Cyb-Hvy-A-T.name #. data/mp/stats/weapons.json: $.Cyb-Hvywpn-A-T.name #: data/mp/messages/strings/names.txt:805 -#: po/custom/fromJson.txt:5414 +#: po/custom/fromJson.txt:5416 msgid "Super Scourge Cyborg" msgstr "" @@ -5623,8 +5625,9 @@ msgid "Command Turret IV" msgstr "" #: data/mp/multiplay/script/rules/endconditions.js:231 -#: src/configuration.cpp:449 -#: src/multistat.cpp:589 +#: src/configuration.cpp:450 +#: src/hci/quickchat.cpp:2453 +#: src/multistat.cpp:604 #: src/spectatorwidgets.cpp:784 msgid "Player" msgstr "" @@ -5796,41 +5799,41 @@ msgstr "" msgid "System locale" msgstr "" -#: lib/netplay/netplay.cpp:1459 -#: lib/netplay/netplay.cpp:1483 +#: lib/netplay/netplay.cpp:1450 +#: lib/netplay/netplay.cpp:1474 msgid "Failed to create port mapping" msgstr "" -#: lib/netplay/netplay.cpp:1461 -#: lib/netplay/netplay.cpp:1486 +#: lib/netplay/netplay.cpp:1452 +#: lib/netplay/netplay.cpp:1477 #, c-format msgid "Manually configure your router/firewall to open port %d!" msgstr "" -#: lib/netplay/netplay.cpp:1470 +#: lib/netplay/netplay.cpp:1461 #, c-format msgid "Port mapping opened external port: %d" msgstr "" -#: lib/netplay/netplay.cpp:1472 +#: lib/netplay/netplay.cpp:1463 #, c-format msgid "Your external IP is: %s" msgstr "" -#: lib/netplay/netplay.cpp:1479 +#: lib/netplay/netplay.cpp:1470 msgid "Failed to create port mapping (timeout)" msgstr "" -#: lib/netplay/netplay.cpp:2200 +#: lib/netplay/netplay.cpp:2196 msgid "Client failed to ack player index swap" msgstr "" -#: lib/netplay/netplay.cpp:3429 +#: lib/netplay/netplay.cpp:3418 #, c-format msgid "Could not resolve masterserver name (%s)!" msgstr "" -#: lib/netplay/netplay.cpp:3455 +#: lib/netplay/netplay.cpp:3446 #, c-format msgid "" "Error connecting to the lobby server: %s.\n" @@ -5839,7 +5842,7 @@ msgid "" " or to forward the port to your system." msgstr "" -#: lib/netplay/netplay.cpp:4670 +#: lib/netplay/netplay.cpp:4676 msgid "Failed to get a lobby response!" msgstr "" @@ -5865,8 +5868,8 @@ msgid "Menu" msgstr "" #: lib/sound/cdaudio.cpp:61 -#: src/frontend.cpp:2791 -#: src/frontend.cpp:2892 +#: src/frontend.cpp:2844 +#: src/frontend.cpp:2945 msgid "Campaign" msgstr "" @@ -6478,7 +6481,7 @@ msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_CYJ_MG4.text[1] #. data/mp/messages/resmessages3.json: $.RES_CYJ_MG4.text[1] -#: po/custom/fromJson.txt:546 +#: po/custom/fromJson.txt:542 msgid "Armed with Cyborg assault gun" msgstr "" @@ -7749,73 +7752,73 @@ msgstr "" #. TRANSLATORS: #. data/base/stats/structure.json: $.CollectiveCWall.name #. data/mp/stats/structure.json: $.CollectiveCWall.name -#: po/custom/fromJson.txt:1449 +#: po/custom/fromJson.txt:1450 msgid "Collective CWall" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessagesall.json: $.RES_V_B09.text[0] #. data/mp/messages/resmessagesall.json: $.RES_V_B09.text[0] -#: po/custom/fromJson.txt:1453 +#: po/custom/fromJson.txt:1454 msgid "Collective Heavy Body" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.Cyb-ComEng.name -#: po/custom/fromJson.txt:1468 +#: po/custom/fromJson.txt:1469 msgid "Combat Engineer Cyborg" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_CYS_CEN.text[1] -#: po/custom/fromJson.txt:1471 +#: po/custom/fromJson.txt:1472 msgid "Combat engineer with construction ability" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_SY_S_WS.text[1] #. data/mp/messages/resmessagesall.json: $.RES_SY_S_WST.text[1] -#: po/custom/fromJson.txt:1475 +#: po/custom/fromJson.txt:1476 msgid "Combines standard, counter battery and VTOL sensors" msgstr "" #. TRANSLATORS: #. data/base/stats/structure.json: $.A0CommandCentre.name #. data/mp/stats/structure.json: $.A0CommandCentre.name -#: po/custom/fromJson.txt:1479 +#: po/custom/fromJson.txt:1480 msgid "Command Center" msgstr "" #. TRANSLATORS: #. data/base/stats/structure.json: $.A0ComDroidControl.name #. data/mp/stats/structure.json: $.A0ComDroidControl.name -#: po/custom/fromJson.txt:1483 +#: po/custom/fromJson.txt:1484 msgid "Command Relay Center" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Struc-CommandRelay.name #. data/mp/stats/research.json: $.R-Struc-CommandRelay.name -#: po/custom/fromJson.txt:1487 +#: po/custom/fromJson.txt:1488 msgid "Command Relay Post" msgstr "" #. TRANSLATORS: #. data/base/stats/templates.json: $.CobraComHalftrack.name #. data/mp/stats/templates.json: $.CobraComHalftrack.name -#: po/custom/fromJson.txt:1491 +#: po/custom/fromJson.txt:1492 msgid "Command Turret Cobra Half-tracks" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.Cobra-Trk-Com.name -#: po/custom/fromJson.txt:1494 +#: po/custom/fromJson.txt:1495 msgid "Command Turret Cobra Tracks" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.Mantis-Trk-Com.name -#: po/custom/fromJson.txt:1497 +#: po/custom/fromJson.txt:1498 msgid "Command Turret Mantis Tracks" msgstr "" @@ -7824,25 +7827,25 @@ msgstr "" #. data/base/stats/templates.json: $.PythonComTracks.name #. data/mp/stats/templates.json: $.P0PythonComTracks.name #. data/mp/stats/templates.json: $.PythonComTracks.name -#: po/custom/fromJson.txt:1503 +#: po/custom/fromJson.txt:1504 msgid "Command Turret Python Tracks" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.Scorp-Trk-Com.name -#: po/custom/fromJson.txt:1506 +#: po/custom/fromJson.txt:1507 msgid "Command Turret Scorpion Tracks" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Comp-CommandTurret02.name -#: po/custom/fromJson.txt:1509 +#: po/custom/fromJson.txt:1510 msgid "Command Turret Upgrade" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.Viper-Trk-Com.name -#: po/custom/fromJson.txt:1512 +#: po/custom/fromJson.txt:1513 msgid "Command Turret Viper Tracks" msgstr "" @@ -7851,7 +7854,7 @@ msgstr "" #. data/base/stats/research.json: $.R-Comp-CommandTurret01.name #. data/base/stats/weapons.json: $.CommandTurret1.name #. ... + 3 refs -#: po/custom/fromJson.txt:1518 +#: po/custom/fromJson.txt:1519 msgid "Command Turret" msgstr "" @@ -7860,73 +7863,73 @@ msgstr "" #. data/mp/messages/resmessages1.json: $.RES_C_CT1.text[2] #. data/mp/messages/resmessagesall.json: $.RES_C_CT2.text[2] #. ... + 2 refs -#: po/custom/fromJson.txt:1524 +#: po/custom/fromJson.txt:1525 msgid "Commander leads groups acts as factory delivery point" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_SY_S_UP.text[1] -#: po/custom/fromJson.txt:1527 +#: po/custom/fromJson.txt:1528 msgid "Complete battlefield visibility" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Vehicle-Metals02.name #. data/mp/stats/research.json: $.R-Vehicle-Metals02.name -#: po/custom/fromJson.txt:1531 +#: po/custom/fromJson.txt:1532 msgid "Composite Alloys Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Vehicle-Metals03.name #. data/mp/stats/research.json: $.R-Vehicle-Metals03.name -#: po/custom/fromJson.txt:1535 +#: po/custom/fromJson.txt:1536 msgid "Composite Alloys Mk3" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Vehicle-Metals01.name #. data/mp/stats/research.json: $.R-Vehicle-Metals01.name -#: po/custom/fromJson.txt:1539 +#: po/custom/fromJson.txt:1540 msgid "Composite Alloys" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_W_HOWAC3.text[1] #. data/mp/messages/resmessages3.json: $.RES_W_HOWAC3.text[1] -#: po/custom/fromJson.txt:1543 +#: po/custom/fromJson.txt:1544 msgid "Computer guided shells" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_W_AAAC3.text[1] #. data/mp/messages/resmessages3.json: $.RES_W_AAAC3.text[1] -#: po/custom/fromJson.txt:1547 +#: po/custom/fromJson.txt:1548 msgid "Computer plots and guides shell to target's position" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_W_RAIL_AC1.text[1] #. data/mp/messages/resmessages3.json: $.RES_W_RAIL_AC1.text[1] -#: po/custom/fromJson.txt:1551 +#: po/custom/fromJson.txt:1552 msgid "Computer predicts and compensates for target's movement" msgstr "" #. TRANSLATORS: #. data/base/messages/messages.json: $.MSG3.text[0] -#: po/custom/fromJson.txt:1554 +#: po/custom/fromJson.txt:1555 msgid "Computer Research Completed" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_SY_RESU5.text[2] -#: po/custom/fromJson.txt:1557 +#: po/custom/fromJson.txt:1558 msgid "Computer systems are now 'ring-fenced' from NEXUS" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessages3.json: $.RES_SY_RESU2.text[2] -#: po/custom/fromJson.txt:1560 +#: po/custom/fromJson.txt:1561 msgid "Computer systems can now be 'ring-fenced' from NEXUS" msgstr "" @@ -7935,13 +7938,13 @@ msgstr "" #. data/base/messages/resmessages3.json: $.RES_SY_RESU1.text[0] #. data/base/messages/resmessages3.json: $.RES_SY_RESU2.text[0] #. ... + 6 refs -#: po/custom/fromJson.txt:1566 +#: po/custom/fromJson.txt:1567 msgid "Computer Technology Breakthrough" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessages12.json: $.RES_ENGIN1.text[2] -#: po/custom/fromJson.txt:1570 +#: po/custom/fromJson.txt:1571 #, no-c-format msgid "Construction speed +10%" msgstr "" @@ -7949,7 +7952,7 @@ msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessages23.json: $.RES_ENGIN2.text[2] #. data/mp/messages/resmessages3.json: $.RES_ENGIN3.text[2] -#: po/custom/fromJson.txt:1575 +#: po/custom/fromJson.txt:1576 #, no-c-format msgid "Construction speed +20%" msgstr "" @@ -7957,14 +7960,14 @@ msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Sys-Spade1Mk1.name #. data/mp/stats/research.json: $.R-Sys-Spade1Mk1.name -#: po/custom/fromJson.txt:1579 +#: po/custom/fromJson.txt:1580 msgid "Construction Unit" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_ST_CR1.text[3] #. data/mp/messages/resmessages1.json: $.RES_ST_CR1.text[3] -#: po/custom/fromJson.txt:1583 +#: po/custom/fromJson.txt:1584 msgid "Controls up to ten commanders" msgstr "" @@ -7973,75 +7976,75 @@ msgstr "" #. data/base/messages/resmessagesall.json: $.RES_SY_CBSTW1.text[3] #. data/mp/messages/resmessages12.json: $.RES_SY_CBSTU1.text[3] #. data/mp/messages/resmessagesall.json: $.RES_SY_CBSTW1.text[3] -#: po/custom/fromJson.txt:1589 +#: po/custom/fromJson.txt:1590 msgid "Counter-battery fire continues until enemy battery is suppressed" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessagesall.json: $.RES_SY_CBSTW1.text[1] #. data/mp/messages/resmessagesall.json: $.RES_SY_CBSTW1.text[1] -#: po/custom/fromJson.txt:1593 +#: po/custom/fromJson.txt:1594 msgid "Counter-battery tower detects enemy indirect fire batteries" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages12.json: $.RES_SY_CBSTU1.text[1] #. data/mp/messages/resmessages12.json: $.RES_SY_CBSTU1.text[1] -#: po/custom/fromJson.txt:1597 +#: po/custom/fromJson.txt:1598 msgid "Counter-battery turret detects enemy indirect fire batteries" msgstr "" #. TRANSLATORS: #. data/mp/stats/construction.json: $.scavCrane1.name -#: po/custom/fromJson.txt:1600 +#: po/custom/fromJson.txt:1601 msgid "Crane1" msgstr "" #. TRANSLATORS: #. data/mp/stats/construction.json: $.scavCrane2.name -#: po/custom/fromJson.txt:1603 +#: po/custom/fromJson.txt:1604 msgid "Crane2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Cyborg-Metals02.name #. data/mp/stats/research.json: $.R-Cyborg-Metals02.name -#: po/custom/fromJson.txt:1607 +#: po/custom/fromJson.txt:1608 msgid "Cyborg Composite Alloys Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Cyborg-Metals03.name #. data/mp/stats/research.json: $.R-Cyborg-Metals03.name -#: po/custom/fromJson.txt:1611 +#: po/custom/fromJson.txt:1612 msgid "Cyborg Composite Alloys Mk3" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Cyborg-Metals01.name #. data/mp/stats/research.json: $.R-Cyborg-Metals01.name -#: po/custom/fromJson.txt:1615 +#: po/custom/fromJson.txt:1616 msgid "Cyborg Composite Alloys" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Cyborg-Metals05.name #. data/mp/stats/research.json: $.R-Cyborg-Metals05.name -#: po/custom/fromJson.txt:1619 +#: po/custom/fromJson.txt:1620 msgid "Cyborg Dense Composite Alloys Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Cyborg-Metals06.name #. data/mp/stats/research.json: $.R-Cyborg-Metals06.name -#: po/custom/fromJson.txt:1623 +#: po/custom/fromJson.txt:1624 msgid "Cyborg Dense Composite Alloys Mk3" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Cyborg-Metals04.name #. data/mp/stats/research.json: $.R-Cyborg-Metals04.name -#: po/custom/fromJson.txt:1627 +#: po/custom/fromJson.txt:1628 msgid "Cyborg Dense Composite Alloys" msgstr "" @@ -8050,55 +8053,55 @@ msgstr "" #. data/base/stats/research.json: $.R-Struc-Factory-Cyborg.name #. data/base/stats/structure.json: $.A0CyborgFactory.name #. ... + 3 refs -#: po/custom/fromJson.txt:1633 +#: po/custom/fromJson.txt:1634 msgid "Cyborg Factory" msgstr "" #. TRANSLATORS: #. data/base/stats/weapons.json: $.CyborgFlamer01.name #. data/mp/stats/weapons.json: $.CyborgFlamer01.name -#: po/custom/fromJson.txt:1637 +#: po/custom/fromJson.txt:1638 msgid "Cyborg Flamer" msgstr "" #. TRANSLATORS: #. data/mp/stats/body.json: $.CyborgHeavyBody.name -#: po/custom/fromJson.txt:1640 +#: po/custom/fromJson.txt:1641 msgid "Cyborg Heavy Body" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Cyborg-Armor-Heat05.name #. data/mp/stats/research.json: $.R-Cyborg-Armor-Heat05.name -#: po/custom/fromJson.txt:1644 +#: po/custom/fromJson.txt:1645 msgid "Cyborg High Intensity Thermal Armor Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Cyborg-Armor-Heat06.name #. data/mp/stats/research.json: $.R-Cyborg-Armor-Heat06.name -#: po/custom/fromJson.txt:1648 +#: po/custom/fromJson.txt:1649 msgid "Cyborg High Intensity Thermal Armor Mk3" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Cyborg-Armor-Heat04.name #. data/mp/stats/research.json: $.R-Cyborg-Armor-Heat04.name -#: po/custom/fromJson.txt:1652 +#: po/custom/fromJson.txt:1653 msgid "Cyborg High Intensity Thermal Armor" msgstr "" #. TRANSLATORS: #. data/base/stats/weapons.json: $.CyborgRocket.name #. data/mp/stats/weapons.json: $.CyborgRocket.name -#: po/custom/fromJson.txt:1656 +#: po/custom/fromJson.txt:1657 msgid "Cyborg Lancer" msgstr "" #. TRANSLATORS: #. data/base/stats/body.json: $.CyborgLightBody.name #. data/mp/stats/body.json: $.CyborgLightBody.name -#: po/custom/fromJson.txt:1660 +#: po/custom/fromJson.txt:1661 msgid "Cyborg Light Body" msgstr "" @@ -8107,126 +8110,126 @@ msgstr "" #. data/base/messages/resmessages3.json: $.RES_CY_LG3.text[0] #. data/mp/messages/resmessages23.json: $.RES_CY_LG2.text[0] #. data/mp/messages/resmessages3.json: $.RES_CY_LG3.text[0] -#: po/custom/fromJson.txt:1685 +#: po/custom/fromJson.txt:1686 msgid "Cyborg Propulsion Improved" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Cyborg-Metals08.name #. data/mp/stats/research.json: $.R-Cyborg-Metals08.name -#: po/custom/fromJson.txt:1694 +#: po/custom/fromJson.txt:1695 msgid "Cyborg Superdense Composite Alloys Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Cyborg-Metals09.name #. data/mp/stats/research.json: $.R-Cyborg-Metals09.name -#: po/custom/fromJson.txt:1698 +#: po/custom/fromJson.txt:1699 msgid "Cyborg Superdense Composite Alloys Mk3" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Cyborg-Metals07.name #. data/mp/stats/research.json: $.R-Cyborg-Metals07.name -#: po/custom/fromJson.txt:1702 +#: po/custom/fromJson.txt:1703 msgid "Cyborg Superdense Composite Alloys" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Cyborg-Armor-Heat08.name -#: po/custom/fromJson.txt:1705 +#: po/custom/fromJson.txt:1706 msgid "Cyborg Superdense Thermal Armor Mk2" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Cyborg-Armor-Heat09.name -#: po/custom/fromJson.txt:1708 +#: po/custom/fromJson.txt:1709 msgid "Cyborg Superdense Thermal Armor Mk3" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Cyborg-Armor-Heat07.name -#: po/custom/fromJson.txt:1711 +#: po/custom/fromJson.txt:1712 msgid "Cyborg Superdense Thermal Armor" msgstr "" #. TRANSLATORS: #. data/base/stats/weapons.json: $.CyborgRocket02.name -#: po/custom/fromJson.txt:1714 +#: po/custom/fromJson.txt:1715 msgid "Cyborg Tank Killer" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Cyborg-Armor-Heat02.name #. data/mp/stats/research.json: $.R-Cyborg-Armor-Heat02.name -#: po/custom/fromJson.txt:1724 +#: po/custom/fromJson.txt:1725 msgid "Cyborg Thermal Armor Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Cyborg-Armor-Heat03.name #. data/mp/stats/research.json: $.R-Cyborg-Armor-Heat03.name -#: po/custom/fromJson.txt:1728 +#: po/custom/fromJson.txt:1729 msgid "Cyborg Thermal Armor Mk3" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Cyborg-Armor-Heat01.name #. data/mp/stats/research.json: $.R-Cyborg-Armor-Heat01.name -#: po/custom/fromJson.txt:1732 +#: po/custom/fromJson.txt:1733 msgid "Cyborg Thermal Armor" msgstr "" #. TRANSLATORS: #. data/base/stats/weapons.json: $.CyborgFlamer02.name -#: po/custom/fromJson.txt:1735 +#: po/custom/fromJson.txt:1736 msgid "Cyborg Thermite" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_CYTRANS.text[0] -#: po/custom/fromJson.txt:1738 +#: po/custom/fromJson.txt:1739 msgid "Cyborg Transport Available" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Cyborg-Transport.name #. data/mp/stats/templates.json: $.Transporter.name -#: po/custom/fromJson.txt:1742 +#: po/custom/fromJson.txt:1743 msgid "Cyborg Transport" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_C_SL1.text[2] #. data/mp/messages/resmessages1.json: $.RES_C_SL1.text[2] -#: po/custom/fromJson.txt:1746 +#: po/custom/fromJson.txt:1747 msgid "Cyborgs can now be researched" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Defense-AASite-QuadBof.name #. data/base/stats/structure.json: $.AASite-QuadBof.name -#: po/custom/fromJson.txt:1750 +#: po/custom/fromJson.txt:1751 msgid "Cyclone AA Flak Site" msgstr "" #. TRANSLATORS: #. data/base/stats/templates.json: $.P0cam3PyFlakHT.name -#: po/custom/fromJson.txt:1753 +#: po/custom/fromJson.txt:1754 msgid "Cyclone AA Python Half-tracks" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Struc-Research-Upgrade05.name #. data/mp/stats/research.json: $.R-Struc-Research-Upgrade05.name -#: po/custom/fromJson.txt:1761 +#: po/custom/fromJson.txt:1762 msgid "Dedicated Synaptic Link Data Analysis Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Struc-Research-Upgrade06.name #. data/mp/stats/research.json: $.R-Struc-Research-Upgrade06.name -#: po/custom/fromJson.txt:1765 +#: po/custom/fromJson.txt:1766 msgid "Dedicated Synaptic Link Data Analysis Mk3" msgstr "" @@ -8235,7 +8238,7 @@ msgstr "" #. data/mp/messages/resmessagesall.json: $.RES_EMP_MD.text[3] #. data/mp/messages/resmessagesall.json: $.RES_EMP_MSL.text[3] #. data/mp/messages/resmessagesall.json: $.RES_EMP_RKT.text[3] -#: po/custom/fromJson.txt:1783 +#: po/custom/fromJson.txt:1784 msgid "Defensive Strength : High" msgstr "" @@ -8244,115 +8247,115 @@ msgstr "" #. data/base/messages/resmessages1.json: $.RES_TOWER2.text[3] #. data/base/messages/resmessages1.json: $.RES_TOWER3.text[3] #. ... + 2 refs -#: po/custom/fromJson.txt:1795 +#: po/custom/fromJson.txt:1796 msgid "Defensive Strength: Low" msgstr "" #. TRANSLATORS: #. data/base/stats/structure.json: $.A0ADemolishStructure.name #. data/mp/stats/structure.json: $.A0ADemolishStructure.name -#: po/custom/fromJson.txt:1805 +#: po/custom/fromJson.txt:1806 msgid "Demolish Structure" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Vehicle-Metals05.name #. data/mp/stats/research.json: $.R-Vehicle-Metals05.name -#: po/custom/fromJson.txt:1809 +#: po/custom/fromJson.txt:1810 msgid "Dense Composite Alloys Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Vehicle-Metals06.name #. data/mp/stats/research.json: $.R-Vehicle-Metals06.name -#: po/custom/fromJson.txt:1813 +#: po/custom/fromJson.txt:1814 msgid "Dense Composite Alloys Mk3" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Vehicle-Metals04.name #. data/mp/stats/research.json: $.R-Vehicle-Metals04.name -#: po/custom/fromJson.txt:1817 +#: po/custom/fromJson.txt:1818 msgid "Dense Composite Alloys" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_W_MG_D8.text[1] #. data/mp/messages/resmessages3.json: $.RES_W_MG_D8.text[1] -#: po/custom/fromJson.txt:1821 +#: po/custom/fromJson.txt:1822 msgid "Depleted uranium kinetic energy bullets" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-MG-Damage10.name #. data/mp/stats/research.json: $.R-Wpn-MG-Damage10.name -#: po/custom/fromJson.txt:1829 +#: po/custom/fromJson.txt:1830 msgid "Depleted Uranium MG Bullets Mk3" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-MG-Damage08.name #. data/mp/stats/research.json: $.R-Wpn-MG-Damage08.name -#: po/custom/fromJson.txt:1833 +#: po/custom/fromJson.txt:1834 msgid "Depleted Uranium MG Bullets" msgstr "" #. TRANSLATORS: #. data/mp/multiplay/skirmish/Cobra.json: $.AI.tip -#: po/custom/fromJson.txt:1836 +#: po/custom/fromJson.txt:1837 msgid "Designed with a focus on research" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages12.json: $.RES_W_CNAC1.text[1] #. data/mp/messages/resmessages12.json: $.RES_W_CNAC1.text[1] -#: po/custom/fromJson.txt:1844 +#: po/custom/fromJson.txt:1845 msgid "Determines range to target" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_ST_CR1.text[2] #. data/mp/messages/resmessages1.json: $.RES_ST_CR1.text[2] -#: po/custom/fromJson.txt:1848 +#: po/custom/fromJson.txt:1849 msgid "Directs and collates information for command turrets" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_SY_S_UP.text[3] -#: po/custom/fromJson.txt:1851 +#: po/custom/fromJson.txt:1852 msgid "Does not offer sensor targeting" msgstr "" #. TRANSLATORS: #. data/base/stats/structure.json: $.WreckedTransporter.name #. data/mp/stats/structure.json: $.WreckedTransporter.name -#: po/custom/fromJson.txt:1855 +#: po/custom/fromJson.txt:1856 msgid "Downed Transport" msgstr "" #. TRANSLATORS: #. data/mp/stats/body.json: $.Body14SUP.name -#: po/custom/fromJson.txt:1858 +#: po/custom/fromJson.txt:1859 msgid "Dragon" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_W_BMB5.text[1] -#: po/custom/fromJson.txt:1869 +#: po/custom/fromJson.txt:1870 msgid "Drops high intensity Plasmite bombs" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_W_BMB4.text[1] #. data/mp/messages/resmessages3.json: $.RES_W_BMB4.text[1] -#: po/custom/fromJson.txt:1873 +#: po/custom/fromJson.txt:1874 msgid "Drops high intensity thermite bombs" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages23.json: $.RES_W_BMB3.text[1] #. data/mp/messages/resmessages23.json: $.RES_W_BMB3.text[1] -#: po/custom/fromJson.txt:1877 +#: po/custom/fromJson.txt:1878 msgid "Drops incendiary bombs" msgstr "" @@ -8360,100 +8363,100 @@ msgstr "" #. data/base/messages/resmessages3.json: $.RES_SY_ST1.text[2] #. data/mp/messages/resmessages3.json: $.RES_SY_ST1.text[2] #. data/mp/messages/resmessagesall.json: $.RES_SY_SPT.text[2] -#: po/custom/fromJson.txt:1882 +#: po/custom/fromJson.txt:1883 msgid "Electronically attacks and disrupts enemy structures" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_SY_RESU3.text[3] -#: po/custom/fromJson.txt:1885 +#: po/custom/fromJson.txt:1886 msgid "Elite and Veteran rank units and Factories are protected" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Defense-EMPCannon.name #. data/mp/stats/structure.json: $.WallTower-EMP.name -#: po/custom/fromJson.txt:1889 +#: po/custom/fromJson.txt:1890 msgid "EMP Cannon Hardpoint" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Wpn-EMPCannon.name #. data/mp/stats/weapons.json: $.EMP-Cannon.name -#: po/custom/fromJson.txt:1893 +#: po/custom/fromJson.txt:1894 msgid "EMP Cannon" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Wpn-Bomb06.name -#: po/custom/fromJson.txt:1896 +#: po/custom/fromJson.txt:1897 msgid "EMP Missile Launcher" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Defense-EMPMortar.name #. data/mp/stats/structure.json: $.Emplacement-MortarEMP.name -#: po/custom/fromJson.txt:1900 +#: po/custom/fromJson.txt:1901 msgid "EMP Mortar Pit" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Wpn-MortarEMP.name #. data/mp/stats/weapons.json: $.MortarEMP.name -#: po/custom/fromJson.txt:1904 +#: po/custom/fromJson.txt:1905 msgid "EMP Mortar" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_DF_HCW2.text[2] -#: po/custom/fromJson.txt:1907 +#: po/custom/fromJson.txt:1908 msgid "Enables Hardcrete gates" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessagesall.json: $.RES_DF_HCW1.text[2] #. data/mp/messages/resmessagesall.json: $.RES_DF_HCW1.text[2] -#: po/custom/fromJson.txt:1911 +#: po/custom/fromJson.txt:1912 msgid "Enables Hardcrete walls" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_SY_RC.text[3] -#: po/custom/fromJson.txt:1914 +#: po/custom/fromJson.txt:1915 msgid "Enables resistance to Nexus Link technology" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_SY_ASTRUC.text[3] #. data/mp/messages/resmessages3.json: $.RES_SY_ASTRUC.text[3] -#: po/custom/fromJson.txt:1918 +#: po/custom/fromJson.txt:1919 msgid "Enables self-repair in all base structures" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_SY_ACYB.text[3] #. data/mp/messages/resmessages3.json: $.RES_SY_ACYB.text[3] -#: po/custom/fromJson.txt:1922 +#: po/custom/fromJson.txt:1923 msgid "Enables self-repair in all Cyborgs" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_SY_ADEF.text[3] #. data/mp/messages/resmessages3.json: $.RES_SY_ADEF.text[3] -#: po/custom/fromJson.txt:1926 +#: po/custom/fromJson.txt:1927 msgid "Enables self-repair in all defenses" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_SY_AVEH.text[3] #. data/mp/messages/resmessages3.json: $.RES_SY_AVEH.text[3] -#: po/custom/fromJson.txt:1930 +#: po/custom/fromJson.txt:1931 msgid "Enables self-repair in all vehicles" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_SY_AR.text[3] -#: po/custom/fromJson.txt:1933 +#: po/custom/fromJson.txt:1934 msgid "Enables self-repair" msgstr "" @@ -8462,35 +8465,35 @@ msgstr "" #. data/mp/challenges/hidebehind.json: $.player_4.name #. data/mp/challenges/hidebehind.json: $.player_5.name #. ... + 7 refs -#: po/custom/fromJson.txt:1939 +#: po/custom/fromJson.txt:1940 msgid "Enemy" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Sys-Engineering01.name #. data/mp/stats/research.json: $.R-Sys-Engineering01.name -#: po/custom/fromJson.txt:1943 +#: po/custom/fromJson.txt:1944 msgid "Engineering" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_V_B07.text[3] #. data/mp/messages/resmessages3.json: $.RES_V_B07.text[3] -#: po/custom/fromJson.txt:1947 +#: po/custom/fromJson.txt:1948 msgid "Expensive and slow to produce" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_V_B03.text[3] #. data/mp/messages/resmessages3.json: $.RES_V_B03.text[3] -#: po/custom/fromJson.txt:1951 +#: po/custom/fromJson.txt:1952 msgid "Expensive to produce" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessagesall.json: $.RES_SY_STW1.text[1] #. data/mp/messages/resmessagesall.json: $.RES_SY_STW1.text[1] -#: po/custom/fromJson.txt:1955 +#: po/custom/fromJson.txt:1956 msgid "Extended sensor range" msgstr "" @@ -8499,20 +8502,20 @@ msgstr "" #. data/base/messages/resmessages23.json: $.RES_SY_CBSU2.text[2] #. data/base/messages/resmessages3.json: $.RES_SY_CBSU3.text[2] #. ... + 3 refs -#: po/custom/fromJson.txt:1961 +#: po/custom/fromJson.txt:1962 msgid "Extends CB Range" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessagesall.json: $.RES_SY_SU1.text[2] -#: po/custom/fromJson.txt:1964 +#: po/custom/fromJson.txt:1965 msgid "Extends Sensor Range" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_ST_FM1.text[1] #. data/mp/messages/resmessages1.json: $.RES_ST_FM1.text[1] -#: po/custom/fromJson.txt:1980 +#: po/custom/fromJson.txt:1981 msgid "Factory module enables medium and large bodies" msgstr "" @@ -8521,13 +8524,13 @@ msgstr "" #. data/base/stats/structure.json: $.A0FacMod1.name #. data/mp/stats/research.json: $.R-Struc-Factory-Module.name #. data/mp/stats/structure.json: $.A0FacMod1.name -#: po/custom/fromJson.txt:1986 +#: po/custom/fromJson.txt:1987 msgid "Factory Module" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessages1.json: $.RES_ST_FM1.text[2] -#: po/custom/fromJson.txt:1990 +#: po/custom/fromJson.txt:1991 #, no-c-format msgid "Factory output speed +100%% per module" msgstr "" @@ -8535,14 +8538,14 @@ msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessages1.json: $.RES_ST_FU1.text[2] #. data/mp/messages/resmessagesall.json: $.RES_ST_FU7.text[2] -#: po/custom/fromJson.txt:1995 +#: po/custom/fromJson.txt:1996 #, no-c-format msgid "Factory output speed +60%" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessages2.json: $.RES_ST_FU4.text[2] -#: po/custom/fromJson.txt:1999 +#: po/custom/fromJson.txt:2000 #, no-c-format msgid "Factory production rate +60%" msgstr "" @@ -8550,44 +8553,44 @@ msgstr "" #. TRANSLATORS: #. data/base/stats/structure.json: $.A0LightFactory.name #. data/mp/stats/structure.json: $.A0LightFactory.name -#: po/custom/fromJson.txt:2003 +#: po/custom/fromJson.txt:2004 msgid "Factory" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_SY_RDST1.text[3] -#: po/custom/fromJson.txt:2006 +#: po/custom/fromJson.txt:2007 msgid "Farther range compared to other sensors" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Rocket-ROF02.name -#: po/custom/fromJson.txt:2009 +#: po/custom/fromJson.txt:2010 msgid "Fast Fire Mini-Rockets Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Rocket-ROF03.name -#: po/custom/fromJson.txt:2012 +#: po/custom/fromJson.txt:2013 msgid "Fast Fire Mini-Rockets Mk3" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Rocket-ROF01.name -#: po/custom/fromJson.txt:2015 +#: po/custom/fromJson.txt:2016 msgid "Fast Fire Mini-Rockets" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_W_RK_MP1.text[1] #. data/mp/messages/resmessages1.json: $.RES_W_RK_MP1.text[1] -#: po/custom/fromJson.txt:2019 +#: po/custom/fromJson.txt:2020 msgid "Fast firing light anti-vehicle rockets" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Howitzer-ROF04.name -#: po/custom/fromJson.txt:2022 +#: po/custom/fromJson.txt:2023 msgid "Fast Loader" msgstr "" @@ -8596,7 +8599,7 @@ msgstr "" #. data/base/messages/resmessages3.json: $.RES_V_B07.text[2] #. data/mp/messages/resmessages1.json: $.RES_V_B08.text[2] #. data/mp/messages/resmessages3.json: $.RES_V_B07.text[2] -#: po/custom/fromJson.txt:2028 +#: po/custom/fromJson.txt:2029 msgid "Faster than Cobra" msgstr "" @@ -8605,7 +8608,7 @@ msgstr "" #. data/base/messages/resmessages3.json: $.RES_V_B10.text[2] #. data/mp/messages/resmessages1.json: $.RES_V_B12.text[2] #. data/mp/messages/resmessages3.json: $.RES_V_B10.text[2] -#: po/custom/fromJson.txt:2034 +#: po/custom/fromJson.txt:2035 msgid "Faster than Python" msgstr "" @@ -8614,75 +8617,75 @@ msgstr "" #. data/base/messages/resmessages3.json: $.RES_V_B03.text[2] #. data/mp/messages/resmessages1.json: $.RES_V_B04.text[2] #. data/mp/messages/resmessages3.json: $.RES_V_B03.text[2] -#: po/custom/fromJson.txt:2040 +#: po/custom/fromJson.txt:2041 msgid "Faster than Viper" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_W_RK_AC1.text[1] #. data/mp/messages/resmessages1.json: $.RES_W_RK_AC1.text[1] -#: po/custom/fromJson.txt:2044 +#: po/custom/fromJson.txt:2045 msgid "Fin-stabilization improves flight trajectory" msgstr "" #. TRANSLATORS: #. data/base/stats/templates.json: $.BabaFireTruck.name #. data/mp/stats/templates.json: $.BabaFireTruck.name -#: po/custom/fromJson.txt:2048 +#: po/custom/fromJson.txt:2049 msgid "Fire Truck" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_W_BMB6.text[1] -#: po/custom/fromJson.txt:2051 +#: po/custom/fromJson.txt:2052 msgid "Fires Electronic Magnetic Pulse Missiles" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_W_HLAS.text[1] -#: po/custom/fromJson.txt:2054 +#: po/custom/fromJson.txt:2055 msgid "Fires heavy pulses of laser light" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_W_LAS2.text[1] #. data/mp/messages/resmessages3.json: $.RES_W_LAS2.text[1] -#: po/custom/fromJson.txt:2058 +#: po/custom/fromJson.txt:2059 msgid "Fires pulses of laser light" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages12.json: $.RES_W_RK_MRL1.text[1] #. data/mp/messages/resmessages12.json: $.RES_W_RK_MRL1.text[1] -#: po/custom/fromJson.txt:2062 +#: po/custom/fromJson.txt:2063 msgid "Fires salvoes of mini-rockets" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_FLAME1.text[1] #. data/mp/messages/resmessages1.json: $.RES_FLAME1.text[1] -#: po/custom/fromJson.txt:2066 +#: po/custom/fromJson.txt:2067 msgid "Flame-thrower firing Propylene Oxide gel" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Flamer-ROF02.name #. data/mp/stats/research.json: $.R-Wpn-Flamer-ROF02.name -#: po/custom/fromJson.txt:2070 +#: po/custom/fromJson.txt:2071 msgid "Flamer Autoloader Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Flamer-ROF03.name #. data/mp/stats/research.json: $.R-Wpn-Flamer-ROF03.name -#: po/custom/fromJson.txt:2074 +#: po/custom/fromJson.txt:2075 msgid "Flamer Autoloader Mk3" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Flamer-ROF01.name #. data/mp/stats/research.json: $.R-Wpn-Flamer-ROF01.name -#: po/custom/fromJson.txt:2078 +#: po/custom/fromJson.txt:2079 msgid "Flamer Autoloader" msgstr "" @@ -8691,7 +8694,7 @@ msgstr "" #. data/base/stats/structure.json: $.PillBox5.name #. data/mp/stats/research.json: $.R-Defense-Pillbox05.name #. data/mp/stats/structure.json: $.PillBox5.name -#: po/custom/fromJson.txt:2084 +#: po/custom/fromJson.txt:2085 msgid "Flamer Bunker" msgstr "" @@ -8699,7 +8702,7 @@ msgstr "" #. data/base/stats/templates.json: $.CobraFlameTracks.name #. data/mp/stats/templates.json: $.CobraFlameTracks.name #. data/mp/stats/templates.json: $.P0CobraFlameTracks.name -#: po/custom/fromJson.txt:2089 +#: po/custom/fromJson.txt:2090 msgid "Flamer Cobra Tracks" msgstr "" @@ -8707,34 +8710,34 @@ msgstr "" #. data/mp/messages/resmessages1.json: $.RES_W_FL_D1.text[2] #. data/mp/messages/resmessages2.json: $.RES_W_FL_D4.text[2] #. data/mp/messages/resmessagesall.json: $.RES_W_FL_D7.text[2] -#: po/custom/fromJson.txt:2101 +#: po/custom/fromJson.txt:2102 #, no-c-format msgid "Flamer damage +25%" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Flamer-ROF04.name -#: po/custom/fromJson.txt:2104 +#: po/custom/fromJson.txt:2105 msgid "Flamer Fast Loader" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessages12.json: $.RES_W_FL_ROF1.text[2] -#: po/custom/fromJson.txt:2117 +#: po/custom/fromJson.txt:2118 #, no-c-format msgid "Flamer reload time -15%" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.ViperFlameHalfTracks.name -#: po/custom/fromJson.txt:2129 +#: po/custom/fromJson.txt:2130 msgid "Flamer Viper Half-Tracks" msgstr "" #. TRANSLATORS: #. data/base/stats/templates.json: $.ViperFlameWheels.name #. data/mp/stats/templates.json: $.ViperFlameWheels.name -#: po/custom/fromJson.txt:2133 +#: po/custom/fromJson.txt:2134 msgid "Flamer Viper Wheels" msgstr "" @@ -8743,7 +8746,7 @@ msgstr "" #. data/base/stats/weapons.json: $.Flame1Mk1.name #. data/mp/stats/research.json: $.R-Wpn-Flamer01Mk1.name #. data/mp/stats/weapons.json: $.Flame1Mk1.name -#: po/custom/fromJson.txt:2139 +#: po/custom/fromJson.txt:2140 msgid "Flamer" msgstr "" @@ -8752,41 +8755,41 @@ msgstr "" #. data/base/stats/templates.json: $.Cyb-Laser1-GROUND.name #. data/mp/stats/templates.json: $.Cyb-Laser1-GROUND.name #. data/mp/stats/templates.json: $.MP-Cyb-Laser1-GRD.name -#: po/custom/fromJson.txt:2151 +#: po/custom/fromJson.txt:2152 msgid "Flashlight Gunner Cyborg" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Defense-WallTower-PulseLas.name #. data/base/stats/structure.json: $.WallTower-PulseLas.name -#: po/custom/fromJson.txt:2155 +#: po/custom/fromJson.txt:2156 msgid "Flashlight Hardpoint" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.RetreHoverFlashLight.name -#: po/custom/fromJson.txt:2158 +#: po/custom/fromJson.txt:2159 msgid "Flashlight Retribution Hover" msgstr "" #. TRANSLATORS: #. data/base/stats/weapons.json: $.Laser3BEAMMk1.name #. data/mp/stats/weapons.json: $.Laser3BEAMMk1.name -#: po/custom/fromJson.txt:2162 +#: po/custom/fromJson.txt:2163 msgid "Flashlight" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Vehicle-Engine02.name #. data/mp/stats/research.json: $.R-Vehicle-Engine02.name -#: po/custom/fromJson.txt:2166 +#: po/custom/fromJson.txt:2167 msgid "Fuel Injection Engine Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Vehicle-Engine03.name #. data/mp/stats/research.json: $.R-Vehicle-Engine03.name -#: po/custom/fromJson.txt:2170 +#: po/custom/fromJson.txt:2171 msgid "Fuel Injection Engine Mk3" msgstr "" @@ -8795,40 +8798,40 @@ msgstr "" #. data/base/stats/research.json: $.R-Vehicle-Engine01.name #. data/mp/messages/resmessages1.json: $.RES_V_EN1.text[1] #. data/mp/stats/research.json: $.R-Vehicle-Engine01.name -#: po/custom/fromJson.txt:2176 +#: po/custom/fromJson.txt:2177 msgid "Fuel Injection Engine" msgstr "" #. TRANSLATORS: #. data/base/campaigns/gamma.json: $.name -#: po/custom/fromJson.txt:2179 +#: po/custom/fromJson.txt:2180 msgid "Gamma Campaign" msgstr "" #. TRANSLATORS: #. data/mp/challenges/two-faced.json: $.player_3.name -#: po/custom/fromJson.txt:2182 +#: po/custom/fromJson.txt:2183 msgid "Gamma" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages23.json: $.RES_POWU1.text[2] #. data/mp/messages/resmessages23.json: $.RES_POWU1.text[1] -#: po/custom/fromJson.txt:2186 +#: po/custom/fromJson.txt:2187 msgid "Gas turbine boosts power output" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Vehicle-Engine08.name #. data/mp/stats/research.json: $.R-Vehicle-Engine08.name -#: po/custom/fromJson.txt:2190 +#: po/custom/fromJson.txt:2191 msgid "Gas Turbine Engine Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Vehicle-Engine09.name #. data/mp/stats/research.json: $.R-Vehicle-Engine09.name -#: po/custom/fromJson.txt:2194 +#: po/custom/fromJson.txt:2195 msgid "Gas Turbine Engine Mk3" msgstr "" @@ -8837,26 +8840,26 @@ msgstr "" #. data/base/stats/research.json: $.R-Vehicle-Engine07.name #. data/mp/messages/resmessages3.json: $.RES_V_EN7.text[1] #. data/mp/stats/research.json: $.R-Vehicle-Engine07.name -#: po/custom/fromJson.txt:2200 +#: po/custom/fromJson.txt:2201 msgid "Gas Turbine Engine" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Struc-Power-Upgrade01b.name -#: po/custom/fromJson.txt:2203 +#: po/custom/fromJson.txt:2204 msgid "Gas Turbine Generator Mk2" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Struc-Power-Upgrade01c.name -#: po/custom/fromJson.txt:2206 +#: po/custom/fromJson.txt:2207 msgid "Gas Turbine Generator Mk3" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Struc-Power-Upgrade01.name #. data/mp/stats/research.json: $.R-Struc-Power-Upgrade01.name -#: po/custom/fromJson.txt:2210 +#: po/custom/fromJson.txt:2211 msgid "Gas Turbine Generator" msgstr "" @@ -8865,7 +8868,7 @@ msgstr "" #. data/base/stats/structure.json: $.Emplacement-Rail3.name #. data/mp/stats/research.json: $.R-Defense-Rail3.name #. data/mp/stats/structure.json: $.Emplacement-Rail3.name -#: po/custom/fromJson.txt:2216 +#: po/custom/fromJson.txt:2217 msgid "Gauss Cannon Emplacement" msgstr "" @@ -8874,19 +8877,19 @@ msgstr "" #. data/base/stats/structure.json: $.WallTower-Rail3.name #. data/mp/stats/research.json: $.R-Defense-WallTower-Rail3.name #. data/mp/stats/structure.json: $.WallTower-Rail3.name -#: po/custom/fromJson.txt:2222 +#: po/custom/fromJson.txt:2223 msgid "Gauss Cannon Hardpoint" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.PythonGaussTracks.name -#: po/custom/fromJson.txt:2225 +#: po/custom/fromJson.txt:2226 msgid "Gauss Cannon Python Tracks" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.WyvernGaussTracks.name -#: po/custom/fromJson.txt:2228 +#: po/custom/fromJson.txt:2229 msgid "Gauss Cannon Wyvern Tracks" msgstr "" @@ -8895,14 +8898,14 @@ msgstr "" #. data/base/stats/weapons.json: $.RailGun3Mk1.name #. data/mp/stats/research.json: $.R-Wpn-RailGun03.name #. data/mp/stats/weapons.json: $.RailGun3Mk1.name -#: po/custom/fromJson.txt:2234 +#: po/custom/fromJson.txt:2235 msgid "Gauss Cannon" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_W_LAS1.text[1] #. data/mp/messages/resmessages3.json: $.RES_W_LAS1.text[1] -#: po/custom/fromJson.txt:2238 +#: po/custom/fromJson.txt:2239 msgid "Generates and concentrates bursts of laser energy" msgstr "" @@ -8911,7 +8914,7 @@ msgstr "" #. data/mp/multiplay/skirmish/Cobra.json: $.AI.insane_tip #. data/mp/multiplay/skirmish/nb_generic.json: $.AI.insane_tip #. ... + 4 refs -#: po/custom/fromJson.txt:2245 +#: po/custom/fromJson.txt:2246 #, no-c-format msgid "" "Gets ~ 100% more power from each oil derrick\n" @@ -8923,14 +8926,14 @@ msgstr "" #. data/mp/multiplay/skirmish/nb_hover.json: $.AI.easy_tip #. data/mp/multiplay/skirmish/nexus.json: $.AI.easy_tip #. data/mp/multiplay/skirmish/semperfi.json: $.AI.easy_tip -#: po/custom/fromJson.txt:2252 +#: po/custom/fromJson.txt:2253 #, no-c-format msgid "Gets ~ 25% less power from each oil derrick" msgstr "" #. TRANSLATORS: #. data/mp/multiplay/skirmish/Cobra.json: $.AI.easy_tip -#: po/custom/fromJson.txt:2256 +#: po/custom/fromJson.txt:2257 #, no-c-format msgid "" "Gets ~ 25% less power from each oil derrick\n" @@ -8940,7 +8943,7 @@ msgstr "" #. TRANSLATORS: #. data/mp/multiplay/skirmish/nb_generic.json: $.AI.easy_tip #. data/mp/multiplay/skirmish/nb_turtle.json: $.AI.easy_tip -#: po/custom/fromJson.txt:2261 +#: po/custom/fromJson.txt:2262 #, no-c-format msgid "" "Gets ~ 25% less power from each oil derrick\n" @@ -8950,154 +8953,154 @@ msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_CY_JP1.text[2] #. data/mp/messages/resmessages3.json: $.RES_CY_JP1.text[2] -#: po/custom/fromJson.txt:2265 +#: po/custom/fromJson.txt:2266 msgid "Gives Cyborg limited flight abilities" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_V_B11.text[2] #. data/mp/messages/resmessages1.json: $.RES_V_B11.text[2] -#: po/custom/fromJson.txt:2269 +#: po/custom/fromJson.txt:2270 msgid "Good main battle tank and heavy artillery platform" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_V_B05.text[2] #. data/mp/messages/resmessages1.json: $.RES_V_B05.text[2] -#: po/custom/fromJson.txt:2273 +#: po/custom/fromJson.txt:2274 msgid "Good medium tank and support vehicle" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_V_B01.text[2] #. data/mp/messages/resmessages1.json: $.RES_V_B01.text[2] -#: po/custom/fromJson.txt:2277 +#: po/custom/fromJson.txt:2278 msgid "Good scout vehicle" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.Cyb-Gren.name -#: po/custom/fromJson.txt:2280 +#: po/custom/fromJson.txt:2281 msgid "Grenadier Cyborg" msgstr "" #. TRANSLATORS: #. data/base/stats/weapons.json: $.Howitzer150Mk1.name #. data/mp/stats/weapons.json: $.Howitzer150Mk1.name -#: po/custom/fromJson.txt:2290 +#: po/custom/fromJson.txt:2291 msgid "Ground Shaker" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Vehicle-Prop-Halftracks.name #. data/mp/stats/research.json: $.R-Vehicle-Prop-Halftracks.name -#: po/custom/fromJson.txt:2297 +#: po/custom/fromJson.txt:2298 msgid "Half-tracked Propulsion" msgstr "" #. TRANSLATORS: #. data/base/stats/propulsion.json: $.HalfTrack02.name -#: po/custom/fromJson.txt:2300 +#: po/custom/fromJson.txt:2301 msgid "Half-tracks II" msgstr "" #. TRANSLATORS: #. data/base/stats/propulsion.json: $.HalfTrack03.name -#: po/custom/fromJson.txt:2303 +#: po/custom/fromJson.txt:2304 msgid "Half-tracks III" msgstr "" #. TRANSLATORS: #. data/base/stats/propulsion.json: $.HalfTrack.name #. data/mp/stats/propulsion.json: $.HalfTrack.name -#: po/custom/fromJson.txt:2307 +#: po/custom/fromJson.txt:2308 msgid "Half-tracks" msgstr "" #. TRANSLATORS: #. data/base/stats/structure.json: $.A0HardcreteMk1CWall.name #. data/mp/stats/structure.json: $.A0HardcreteMk1CWall.name -#: po/custom/fromJson.txt:2311 +#: po/custom/fromJson.txt:2312 msgid "Hardcrete Corner Wall" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Defense-HardcreteGate.name #. data/mp/stats/structure.json: $.A0HardcreteMk1Gate.name -#: po/custom/fromJson.txt:2315 +#: po/custom/fromJson.txt:2316 msgid "Hardcrete Gate" msgstr "" #. TRANSLATORS: #. data/base/stats/structure.json: $.A0HardcreteMk1Wall.name #. data/mp/stats/structure.json: $.A0HardcreteMk1Wall.name -#: po/custom/fromJson.txt:2319 +#: po/custom/fromJson.txt:2320 msgid "Hardcrete Wall" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Defense-HardcreteWall.name #. data/mp/stats/research.json: $.R-Defense-HardcreteWall.name -#: po/custom/fromJson.txt:2323 +#: po/custom/fromJson.txt:2324 msgid "Hardcrete" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Struc-Materials05.name -#: po/custom/fromJson.txt:2326 +#: po/custom/fromJson.txt:2327 msgid "Hardened Base Structure Materials Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Struc-Materials06.name -#: po/custom/fromJson.txt:2329 +#: po/custom/fromJson.txt:2330 msgid "Hardened Base Structure Materials Mk3" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_W_MG_D1.text[1] #. data/mp/messages/resmessages1.json: $.RES_W_MG_D1.text[1] -#: po/custom/fromJson.txt:2339 +#: po/custom/fromJson.txt:2340 msgid "Hardened case machinegun bullets" msgstr "" #. TRANSLATORS: #. data/base/stats/structure.json: $.GuardTower4H.name -#: po/custom/fromJson.txt:2342 +#: po/custom/fromJson.txt:2343 msgid "Hardened Flamer Guard Tower" msgstr "" #. TRANSLATORS: #. data/base/stats/structure.json: $.GuardTower3H.name -#: po/custom/fromJson.txt:2345 +#: po/custom/fromJson.txt:2346 msgid "Hardened Heavy Machinegun Guard Tower" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-MG-Damage01.name #. data/mp/stats/research.json: $.R-Wpn-MG-Damage01.name -#: po/custom/fromJson.txt:2349 +#: po/custom/fromJson.txt:2350 msgid "Hardened MG Bullets" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Rail-Damage02.name #. data/mp/stats/research.json: $.R-Wpn-Rail-Damage02.name -#: po/custom/fromJson.txt:2353 +#: po/custom/fromJson.txt:2354 msgid "Hardened Rail Dart Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Rail-Damage03.name #. data/mp/stats/research.json: $.R-Wpn-Rail-Damage03.name -#: po/custom/fromJson.txt:2357 +#: po/custom/fromJson.txt:2358 msgid "Hardened Rail Dart Mk3" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Rail-Damage01.name #. data/mp/stats/research.json: $.R-Wpn-Rail-Damage01.name -#: po/custom/fromJson.txt:2361 +#: po/custom/fromJson.txt:2362 msgid "Hardened Rail Dart" msgstr "" @@ -9106,317 +9109,317 @@ msgstr "" #. data/base/stats/sensor.json: $.SensorTower2Mk1.name #. data/base/stats/structure.json: $.Sys-SensoTower02.name #. ... + 3 refs -#: po/custom/fromJson.txt:2367 +#: po/custom/fromJson.txt:2368 msgid "Hardened Sensor Tower" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_MS_SAM1WT.text[0] -#: po/custom/fromJson.txt:2370 +#: po/custom/fromJson.txt:2371 msgid "Hardpoint Avenger SAM Site Available" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_WT_DOUBLEAA.text[0] -#: po/custom/fromJson.txt:2373 +#: po/custom/fromJson.txt:2374 msgid "Hardpoint Cyclone AA Gun Available" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_WT_DOUBLEAA2.text[0] -#: po/custom/fromJson.txt:2376 +#: po/custom/fromJson.txt:2377 msgid "Hardpoint Tornado AA Gun Available" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_WT_TWINAGHP.text[0] -#: po/custom/fromJson.txt:2379 +#: po/custom/fromJson.txt:2380 msgid "Hardpoint Twin Assault Gun Available" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_MS_SAM2WT.text[0] -#: po/custom/fromJson.txt:2382 +#: po/custom/fromJson.txt:2383 msgid "Hardpoint Vindicator SAM Site Available" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_WT_QUADAA.text[0] -#: po/custom/fromJson.txt:2385 +#: po/custom/fromJson.txt:2386 msgid "Hardpoint Whirlwind AA Gun Available" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Bomb-Damage01.name #. data/mp/stats/research.json: $.R-Wpn-Bomb-Damage01.name -#: po/custom/fromJson.txt:2389 +#: po/custom/fromJson.txt:2390 msgid "HE Bomb Shells" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Howitzer-Damage02.name #. data/mp/stats/research.json: $.R-Wpn-Howitzer-Damage02.name -#: po/custom/fromJson.txt:2393 +#: po/custom/fromJson.txt:2394 msgid "HE Howitzer Shells Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Howitzer-Damage03.name #. data/mp/stats/research.json: $.R-Wpn-Howitzer-Damage03.name -#: po/custom/fromJson.txt:2397 +#: po/custom/fromJson.txt:2398 msgid "HE Howitzer Shells Mk3" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Howitzer-Damage01.name #. data/mp/stats/research.json: $.R-Wpn-Howitzer-Damage01.name -#: po/custom/fromJson.txt:2401 +#: po/custom/fromJson.txt:2402 msgid "HE Howitzer Shells" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Rocket-Damage02.name -#: po/custom/fromJson.txt:2404 +#: po/custom/fromJson.txt:2405 msgid "HE Mini-Rockets Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Rocket-Damage03.name -#: po/custom/fromJson.txt:2407 +#: po/custom/fromJson.txt:2408 msgid "HE Mini-Rockets Mk3" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Rocket-Damage01.name -#: po/custom/fromJson.txt:2410 +#: po/custom/fromJson.txt:2411 msgid "HE Mini-Rockets" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Mortar-Damage02.name #. data/mp/stats/research.json: $.R-Wpn-Mortar-Damage02.name -#: po/custom/fromJson.txt:2414 +#: po/custom/fromJson.txt:2415 msgid "HE Mortar Shells Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Mortar-Damage03.name #. data/mp/stats/research.json: $.R-Wpn-Mortar-Damage03.name -#: po/custom/fromJson.txt:2418 +#: po/custom/fromJson.txt:2419 msgid "HE Mortar Shells Mk3" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Mortar-Damage01.name #. data/mp/stats/research.json: $.R-Wpn-Mortar-Damage01.name -#: po/custom/fromJson.txt:2422 +#: po/custom/fromJson.txt:2423 msgid "HE Mortar Shells" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Wpn-Rocket-Damage02.name -#: po/custom/fromJson.txt:2425 +#: po/custom/fromJson.txt:2426 msgid "HE Rockets Mk2" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Wpn-Rocket-Damage03.name -#: po/custom/fromJson.txt:2428 +#: po/custom/fromJson.txt:2429 msgid "HE Rockets Mk3" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Wpn-Rocket-Damage01.name -#: po/custom/fromJson.txt:2431 +#: po/custom/fromJson.txt:2432 msgid "HE Rockets" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.SK-Mantis-VTOL-HBB.name -#: po/custom/fromJson.txt:2434 +#: po/custom/fromJson.txt:2435 msgid "Heap Bomb Bay Mantis VTOL" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.SK-Retre-VTOL-HBB.name -#: po/custom/fromJson.txt:2437 +#: po/custom/fromJson.txt:2438 msgid "Heap Bomb Bay Retribution VTOL" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Bomb02.name #. data/mp/stats/research.json: $.R-Wpn-Bomb02.name -#: po/custom/fromJson.txt:2441 +#: po/custom/fromJson.txt:2442 msgid "HEAP Bomb Bay" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Howitzer-Damage05.name #. data/mp/stats/research.json: $.R-Wpn-Howitzer-Damage05.name -#: po/custom/fromJson.txt:2445 +#: po/custom/fromJson.txt:2446 msgid "HEAP Howitzer Shells Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Howitzer-Damage06.name #. data/mp/stats/research.json: $.R-Wpn-Howitzer-Damage06.name -#: po/custom/fromJson.txt:2449 +#: po/custom/fromJson.txt:2450 msgid "HEAP Howitzer Shells Mk3" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Howitzer-Damage04.name #. data/mp/stats/research.json: $.R-Wpn-Howitzer-Damage04.name -#: po/custom/fromJson.txt:2453 +#: po/custom/fromJson.txt:2454 msgid "HEAP Howitzer Shells" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Rocket-Damage05.name -#: po/custom/fromJson.txt:2456 +#: po/custom/fromJson.txt:2457 msgid "HEAP Mini-Rockets Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Rocket-Damage06.name -#: po/custom/fromJson.txt:2459 +#: po/custom/fromJson.txt:2460 msgid "HEAP Mini-Rockets Mk3" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Rocket-Damage04.name -#: po/custom/fromJson.txt:2462 +#: po/custom/fromJson.txt:2463 msgid "HEAP Mini-Rockets" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Mortar-Damage05.name #. data/mp/stats/research.json: $.R-Wpn-Mortar-Damage05.name -#: po/custom/fromJson.txt:2466 +#: po/custom/fromJson.txt:2467 msgid "HEAP Mortar Shells Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Mortar-Damage06.name #. data/mp/stats/research.json: $.R-Wpn-Mortar-Damage06.name -#: po/custom/fromJson.txt:2470 +#: po/custom/fromJson.txt:2471 msgid "HEAP Mortar Shells Mk3" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Mortar-Damage04.name #. data/mp/stats/research.json: $.R-Wpn-Mortar-Damage04.name -#: po/custom/fromJson.txt:2474 +#: po/custom/fromJson.txt:2475 msgid "HEAP Mortar Shells" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Cannon-Damage02.name #. data/mp/stats/research.json: $.R-Wpn-Cannon-Damage02.name -#: po/custom/fromJson.txt:2478 +#: po/custom/fromJson.txt:2479 msgid "HEAT Cannon Shells Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Cannon-Damage03.name #. data/mp/stats/research.json: $.R-Wpn-Cannon-Damage03.name -#: po/custom/fromJson.txt:2482 +#: po/custom/fromJson.txt:2483 msgid "HEAT Cannon Shells Mk3" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Cannon-Damage01.name #. data/mp/stats/research.json: $.R-Wpn-Cannon-Damage01.name -#: po/custom/fromJson.txt:2486 +#: po/custom/fromJson.txt:2487 msgid "HEAT Cannon Shells" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-RocketSlow-Damage02.name #. data/mp/stats/research.json: $.R-Wpn-Rocket-Damage05.name -#: po/custom/fromJson.txt:2496 +#: po/custom/fromJson.txt:2497 msgid "HEAT Rocket Warhead Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-RocketSlow-Damage03.name #. data/mp/stats/research.json: $.R-Wpn-Rocket-Damage06.name -#: po/custom/fromJson.txt:2500 +#: po/custom/fromJson.txt:2501 msgid "HEAT Rocket Warhead Mk3" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-RocketSlow-Damage01.name #. data/mp/stats/research.json: $.R-Wpn-Rocket-Damage04.name -#: po/custom/fromJson.txt:2504 +#: po/custom/fromJson.txt:2505 msgid "HEAT Rocket Warhead" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages12.json: $.RES_W_RK_HvAT.text[1] #. data/mp/messages/resmessages12.json: $.RES_W_RK_HvAT.text[1] -#: po/custom/fromJson.txt:2514 +#: po/custom/fromJson.txt:2515 msgid "Heavy anti-tank rocket" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Vehicle-Body12.name #. data/mp/stats/research.json: $.R-Vehicle-Body12.name -#: po/custom/fromJson.txt:2518 +#: po/custom/fromJson.txt:2519 msgid "Heavy Body - Mantis" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Vehicle-Body11.name #. data/mp/stats/research.json: $.R-Vehicle-Body11.name -#: po/custom/fromJson.txt:2522 +#: po/custom/fromJson.txt:2523 msgid "Heavy Body - Python" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Vehicle-Body09.name #. data/mp/stats/research.json: $.R-Vehicle-Body09.name -#: po/custom/fromJson.txt:2526 +#: po/custom/fromJson.txt:2527 msgid "Heavy Body - Tiger" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Vehicle-Body10.name #. data/mp/stats/research.json: $.R-Vehicle-Body10.name -#: po/custom/fromJson.txt:2530 +#: po/custom/fromJson.txt:2531 msgid "Heavy Body - Vengeance" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Vehicle-Body13.name -#: po/custom/fromJson.txt:2533 +#: po/custom/fromJson.txt:2534 msgid "Heavy Body - Wyvern" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_V_B11.text[1] #. data/mp/messages/resmessages1.json: $.RES_V_B11.text[1] -#: po/custom/fromJson.txt:2537 +#: po/custom/fromJson.txt:2538 msgid "Heavy body increases armor and body points" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.Cobra-Hover-HC.name -#: po/custom/fromJson.txt:2540 +#: po/custom/fromJson.txt:2541 msgid "Heavy Cannon Cobra Hover" msgstr "" #. TRANSLATORS: #. data/base/stats/templates.json: $.CobraHvyCnTrks.name #. data/mp/stats/templates.json: $.CobraHvyCnTrks.name -#: po/custom/fromJson.txt:2544 +#: po/custom/fromJson.txt:2545 msgid "Heavy Cannon Cobra Tracks" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_CN3MK1.text[1] #. data/mp/messages/resmessages1.json: $.RES_CN3MK1.text[1] -#: po/custom/fromJson.txt:2548 +#: po/custom/fromJson.txt:2549 msgid "Heavy Cannon firing 120 mm rounds" msgstr "" @@ -9425,19 +9428,19 @@ msgstr "" #. data/base/stats/structure.json: $.WallTower04.name #. data/mp/stats/research.json: $.R-Defense-WallTower04.name #. data/mp/stats/structure.json: $.WallTower04.name -#: po/custom/fromJson.txt:2554 +#: po/custom/fromJson.txt:2555 msgid "Heavy Cannon Hardpoint" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.MantisTrkHC.name -#: po/custom/fromJson.txt:2557 +#: po/custom/fromJson.txt:2558 msgid "Heavy Cannon Mantis Tracks" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.A-Python-Hover-HC.name -#: po/custom/fromJson.txt:2560 +#: po/custom/fromJson.txt:2561 msgid "Heavy Cannon Python Hover" msgstr "" @@ -9446,19 +9449,19 @@ msgstr "" #. data/mp/stats/templates.json: $.A-Python-Trk-HC.name #. data/mp/stats/templates.json: $.P0PythonHvyCnTrks.name #. ... + 2 refs -#: po/custom/fromJson.txt:2566 +#: po/custom/fromJson.txt:2567 msgid "Heavy Cannon Python Tracks" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.H-Scorp-Trk-HC.name -#: po/custom/fromJson.txt:2569 +#: po/custom/fromJson.txt:2570 msgid "Heavy Cannon Scorpion Tracks" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.A-Tiger-Trk-HC.name -#: po/custom/fromJson.txt:2572 +#: po/custom/fromJson.txt:2573 msgid "Heavy Cannon Tiger Tracks" msgstr "" @@ -9467,54 +9470,54 @@ msgstr "" #. data/base/stats/weapons.json: $.Cannon375mmMk1.name #. data/mp/stats/research.json: $.R-Wpn-Cannon3Mk1.name #. data/mp/stats/weapons.json: $.Cannon375mmMk1.name -#: po/custom/fromJson.txt:2578 +#: po/custom/fromJson.txt:2579 msgid "Heavy Cannon" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Flame2.name #. data/mp/stats/research.json: $.R-Wpn-Flame2.name -#: po/custom/fromJson.txt:2586 +#: po/custom/fromJson.txt:2587 msgid "Heavy Flamer - Inferno" msgstr "" #. TRANSLATORS: #. data/base/stats/weapons.json: $.CyborgCannon.name #. data/mp/stats/weapons.json: $.CyborgCannon.name -#: po/custom/fromJson.txt:2596 +#: po/custom/fromJson.txt:2597 msgid "Heavy Gunner" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-HvyHowitzer.name #. data/mp/stats/research.json: $.R-Wpn-HvyHowitzer.name -#: po/custom/fromJson.txt:2600 +#: po/custom/fromJson.txt:2601 msgid "Heavy Howitzer - Ground Shaker" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Defense-HeavyLas.name #. data/mp/stats/structure.json: $.Emplacement-HeavyLaser.name -#: po/custom/fromJson.txt:2604 +#: po/custom/fromJson.txt:2605 msgid "Heavy Laser Emplacement" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.TigerHvLaserTracks.name -#: po/custom/fromJson.txt:2607 +#: po/custom/fromJson.txt:2608 msgid "Heavy Laser Tiger Tracks" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.WyvernHvLaserTracks.name -#: po/custom/fromJson.txt:2610 +#: po/custom/fromJson.txt:2611 msgid "Heavy Laser Wyvern Tracks" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Wpn-HvyLaser.name #. data/mp/stats/weapons.json: $.HeavyLaser.name -#: po/custom/fromJson.txt:2614 +#: po/custom/fromJson.txt:2615 msgid "Heavy Laser" msgstr "" @@ -9523,26 +9526,26 @@ msgstr "" #. data/base/stats/templates.json: $.P0CobraHvyMGHtrack.name #. data/mp/stats/templates.json: $.CobraHMGHalfTrack.name #. data/mp/stats/templates.json: $.P0CobraHvyMGHtrack.name -#: po/custom/fromJson.txt:2626 +#: po/custom/fromJson.txt:2627 msgid "Heavy Machinegun Cobra Half-tracks" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.A-Cobra-Hover-HMG.name -#: po/custom/fromJson.txt:2629 +#: po/custom/fromJson.txt:2630 msgid "Heavy Machinegun Cobra Hover" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.A-Cobra-Trk-HMG.name #. data/mp/stats/templates.json: $.CobraHMGTracks.name -#: po/custom/fromJson.txt:2633 +#: po/custom/fromJson.txt:2634 msgid "Heavy Machinegun Cobra Tracks" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.A-Cobra-Wheels-HMG.name -#: po/custom/fromJson.txt:2636 +#: po/custom/fromJson.txt:2637 msgid "Heavy Machinegun Cobra Wheels" msgstr "" @@ -9551,26 +9554,26 @@ msgstr "" #. data/base/stats/structure.json: $.WallTower01.name #. data/mp/stats/research.json: $.R-Defense-WallTower01.name #. data/mp/stats/structure.json: $.WallTower01.name -#: po/custom/fromJson.txt:2648 +#: po/custom/fromJson.txt:2649 msgid "Heavy Machinegun Hardpoint" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.ScorpHTrackHMG.name -#: po/custom/fromJson.txt:2651 +#: po/custom/fromJson.txt:2652 msgid "Heavy Machinegun Scorpion Half Tracks" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.ScorpTrkHMG.name -#: po/custom/fromJson.txt:2654 +#: po/custom/fromJson.txt:2655 msgid "Heavy Machinegun Scorpion Tracks" msgstr "" #. TRANSLATORS: #. data/base/stats/templates.json: $.ViperHMGHalftrack.name #. data/mp/stats/templates.json: $.ViperHMGHalftrack.name -#: po/custom/fromJson.txt:2662 +#: po/custom/fromJson.txt:2663 msgid "Heavy Machinegun Viper Half-tracks" msgstr "" @@ -9578,14 +9581,14 @@ msgstr "" #. data/base/stats/templates.json: $.ViperHMGTracks.name #. data/mp/stats/templates.json: $.A-Viper-Trk-HMG.name #. data/mp/stats/templates.json: $.ViperHMGTracks.name -#: po/custom/fromJson.txt:2667 +#: po/custom/fromJson.txt:2668 msgid "Heavy Machinegun Viper Tracks" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.A-Viper-Wheels-HMG.name #. data/mp/stats/templates.json: $.ViperHMGWheels.name -#: po/custom/fromJson.txt:2671 +#: po/custom/fromJson.txt:2672 msgid "Heavy Machinegun Viper Wheels" msgstr "" @@ -9594,61 +9597,61 @@ msgstr "" #. data/base/stats/weapons.json: $.MG3Mk1.name #. data/mp/stats/research.json: $.R-Wpn-MG3Mk1.name #. data/mp/stats/weapons.json: $.MG3Mk1.name -#: po/custom/fromJson.txt:2677 +#: po/custom/fromJson.txt:2678 msgid "Heavy Machinegun" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Mortar02Hvy.name #. data/mp/stats/research.json: $.R-Wpn-Mortar02Hvy.name -#: po/custom/fromJson.txt:2681 +#: po/custom/fromJson.txt:2682 msgid "Heavy Mortar - Bombard" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Defense-HeavyPlasmaLauncher.name #. data/mp/stats/structure.json: $.Emplacement-HeavyPlasmaLauncher.name -#: po/custom/fromJson.txt:2685 +#: po/custom/fromJson.txt:2686 msgid "Heavy Plasma Launcher Emplacement" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_EMP_PLASLAUNCH.text[1] #. data/mp/messages/resmessagesall.json: $.RES_W_PLASLAUNCH.text[1] -#: po/custom/fromJson.txt:2689 +#: po/custom/fromJson.txt:2690 msgid "Heavy Plasma Launcher firing plasma" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Wpn-HeavyPlasmaLauncher.name #. data/mp/stats/weapons.json: $.PlasmaHeavy.name -#: po/custom/fromJson.txt:2693 +#: po/custom/fromJson.txt:2694 msgid "Heavy Plasma Launcher" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_W_RAIL3.text[1] #. data/mp/messages/resmessages3.json: $.RES_W_RAIL3.text[1] -#: po/custom/fromJson.txt:2697 +#: po/custom/fromJson.txt:2698 msgid "Heavy rail gun firing large kinetic energy darts" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.ScorpHRepairHover.name -#: po/custom/fromJson.txt:2700 +#: po/custom/fromJson.txt:2701 msgid "Heavy Repair Scorpion Hover" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.CobraHRepairHover.name -#: po/custom/fromJson.txt:2703 +#: po/custom/fromJson.txt:2704 msgid "Heavy Repair Turret Cobra Hover" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Wpn-Rocket02-MRLHvy.name #. data/mp/stats/weapons.json: $.Rocket-MRL-Hvy.name -#: po/custom/fromJson.txt:2714 +#: po/custom/fromJson.txt:2715 msgid "Heavy Rocket Array" msgstr "" @@ -9656,14 +9659,14 @@ msgstr "" #. data/mp/stats/research.json: $.R-Defense-Super-Rocket.name #. data/mp/stats/structure.json: $.X-Super-Rocket.name #. data/mp/stats/weapons.json: $.RocketSuper.name -#: po/custom/fromJson.txt:2719 +#: po/custom/fromJson.txt:2720 msgid "Heavy Rocket Bastion" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Defense-MRLHvy.name #. data/mp/stats/structure.json: $.Emplacement-MRLHvy-pit.name -#: po/custom/fromJson.txt:2723 +#: po/custom/fromJson.txt:2724 msgid "Heavy Rocket Battery" msgstr "" @@ -9671,256 +9674,256 @@ msgstr "" #. data/base/messages/resmessages3.json: $.RES_W_MS_HvSAM1.text[1] #. data/mp/messages/resmessages3.json: $.RES_W_MS_HvSAM1.text[1] #. data/mp/messages/resmessagesall.json: $.RES_MS_SAM2WT.text[1] -#: po/custom/fromJson.txt:2728 +#: po/custom/fromJson.txt:2729 msgid "Heavy surface-to-air missile" msgstr "" #. TRANSLATORS: #. data/base/stats/features.json: $.Heavywepslab.name -#: po/custom/fromJson.txt:2731 +#: po/custom/fromJson.txt:2732 msgid "Heavyweaponslab" msgstr "" #. TRANSLATORS: #. data/mp/stats/propulsion.json: $.Helicopter.name -#: po/custom/fromJson.txt:2734 +#: po/custom/fromJson.txt:2735 msgid "Helicopter" msgstr "" #. TRANSLATORS: #. data/base/stats/weapons.json: $.Howitzer03-Rot.name #. data/mp/stats/weapons.json: $.Howitzer03-Rot.name -#: po/custom/fromJson.txt:2744 +#: po/custom/fromJson.txt:2745 msgid "Hellstorm" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_SY_RESU2.text[3] -#: po/custom/fromJson.txt:2747 +#: po/custom/fromJson.txt:2748 msgid "Hero and Special rank units are protected" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-RocketSlow-Damage05.name #. data/mp/stats/research.json: $.R-Wpn-Rocket-Damage08.name -#: po/custom/fromJson.txt:2751 +#: po/custom/fromJson.txt:2752 msgid "HESH Rocket Warhead Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-RocketSlow-Damage06.name #. data/mp/stats/research.json: $.R-Wpn-Rocket-Damage09.name -#: po/custom/fromJson.txt:2755 +#: po/custom/fromJson.txt:2756 msgid "HESH Rocket Warhead Mk3" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-RocketSlow-Damage04.name #. data/mp/stats/research.json: $.R-Wpn-Rocket-Damage07.name -#: po/custom/fromJson.txt:2759 +#: po/custom/fromJson.txt:2760 msgid "HESH Rocket Warhead" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Energy-Damage02.name #. data/mp/stats/research.json: $.R-Wpn-Energy-Damage02.name -#: po/custom/fromJson.txt:2763 +#: po/custom/fromJson.txt:2764 msgid "Hi-Energy Laser Emitter Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Energy-Damage03.name #. data/mp/stats/research.json: $.R-Wpn-Energy-Damage03.name -#: po/custom/fromJson.txt:2767 +#: po/custom/fromJson.txt:2768 msgid "Hi-Energy Laser Emitter Mk3" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Energy-Damage01.name #. data/mp/stats/research.json: $.R-Wpn-Energy-Damage01.name -#: po/custom/fromJson.txt:2771 +#: po/custom/fromJson.txt:2772 msgid "Hi-Energy Laser Emitter" msgstr "" #. TRANSLATORS: #. data/mp/challenges/hidebehind.json: $.challenge.name -#: po/custom/fromJson.txt:2774 +#: po/custom/fromJson.txt:2775 msgid "Hide Behind Me" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_ST_MAT10.text[1] #. data/mp/messages/resmessages3.json: $.RES_ST_MAT10.text[1] -#: po/custom/fromJson.txt:2778 +#: po/custom/fromJson.txt:2779 msgid "High Density Base Structure Materials" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_W_CN_D1.text[1] #. data/mp/messages/resmessages1.json: $.RES_W_CN_D1.text[1] -#: po/custom/fromJson.txt:2782 +#: po/custom/fromJson.txt:2783 msgid "High Explosive Anti-Tank Cannon Shells" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_W_SRK_D1.text[1] #. data/mp/messages/resmessages1.json: $.RES_W_SRK_D1.text[1] -#: po/custom/fromJson.txt:2786 +#: po/custom/fromJson.txt:2787 msgid "High Explosive Anti-Tank warhead" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessages2.json: $.RES_W_RK_D4.text[1] -#: po/custom/fromJson.txt:2789 +#: po/custom/fromJson.txt:2790 msgid "High Explosive Anti-Tank warheads" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_W_AAD4.text[1] #. data/mp/messages/resmessages3.json: $.RES_W_AAD4.text[1] -#: po/custom/fromJson.txt:2793 +#: po/custom/fromJson.txt:2794 msgid "High Explosive Armor Piercing Flak" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_W_HOWD4.text[1] #. data/mp/messages/resmessages3.json: $.RES_W_HOWD4.text[1] -#: po/custom/fromJson.txt:2797 +#: po/custom/fromJson.txt:2798 msgid "High Explosive Armor Piercing Shells" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_W_MS_MART.text[1] #. data/mp/messages/resmessages3.json: $.RES_W_MS_MART.text[1] -#: po/custom/fromJson.txt:2808 +#: po/custom/fromJson.txt:2809 msgid "High explosive artillery missile" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_W_MS_HART.text[1] #. data/mp/messages/resmessages3.json: $.RES_W_MS_HART.text[1] -#: po/custom/fromJson.txt:2816 +#: po/custom/fromJson.txt:2817 msgid "High explosive heavy artillery missile" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessagesall.json: $.RES_W_RK_HVAT1.text[1] #. data/mp/messages/resmessagesall.json: $.RES_W_RK_HVAT1.text[1] -#: po/custom/fromJson.txt:2820 +#: po/custom/fromJson.txt:2821 msgid "High explosive shaped charge missile" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Vehicle-Armor-Heat05.name #. data/mp/stats/research.json: $.R-Vehicle-Armor-Heat05.name -#: po/custom/fromJson.txt:2834 +#: po/custom/fromJson.txt:2835 msgid "High Intensity Thermal Armor Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Vehicle-Armor-Heat06.name #. data/mp/stats/research.json: $.R-Vehicle-Armor-Heat06.name -#: po/custom/fromJson.txt:2838 +#: po/custom/fromJson.txt:2839 msgid "High Intensity Thermal Armor Mk3" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Vehicle-Armor-Heat04.name #. data/mp/stats/research.json: $.R-Vehicle-Armor-Heat04.name -#: po/custom/fromJson.txt:2842 +#: po/custom/fromJson.txt:2843 msgid "High Intensity Thermal Armor" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessagesall.json: $.RES_V_B09.text[3] #. data/mp/messages/resmessagesall.json: $.RES_V_B09.text[3] -#: po/custom/fromJson.txt:2846 +#: po/custom/fromJson.txt:2847 msgid "High power costs and slow to produce" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Flamer-Damage02.name #. data/mp/stats/research.json: $.R-Wpn-Flamer-Damage02.name -#: po/custom/fromJson.txt:2858 +#: po/custom/fromJson.txt:2859 msgid "High Temperature Flamer Gel Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Flamer-Damage03.name #. data/mp/stats/research.json: $.R-Wpn-Flamer-Damage03.name -#: po/custom/fromJson.txt:2862 +#: po/custom/fromJson.txt:2863 msgid "High Temperature Flamer Gel Mk3" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Flamer-Damage01.name #. data/mp/stats/research.json: $.R-Wpn-Flamer-Damage01.name -#: po/custom/fromJson.txt:2866 +#: po/custom/fromJson.txt:2867 msgid "High Temperature Flamer Gel" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_DF_WU7.text[1] #. data/mp/messages/resmessages3.json: $.RES_DF_WU7.text[1] -#: po/custom/fromJson.txt:2870 +#: po/custom/fromJson.txt:2871 msgid "High tensile concrete-plastic composite" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Flamer-Range01.name -#: po/custom/fromJson.txt:2873 +#: po/custom/fromJson.txt:2874 msgid "High-Pressure Gas Container" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_W_FL_R1.text[1] -#: po/custom/fromJson.txt:2876 +#: po/custom/fromJson.txt:2877 msgid "High-pressure gas throws the flamer gel further" msgstr "" #. TRANSLATORS: #. data/base/stats/structure.json: $.PillBox3.name #. data/mp/stats/structure.json: $.PillBox3.name -#: po/custom/fromJson.txt:2884 +#: po/custom/fromJson.txt:2885 msgid "HMG Bunker" msgstr "" #. TRANSLATORS: #. data/mp/multiplay/skirmish/nb_hover.json: $.AI.name -#: po/custom/fromJson.txt:2887 +#: po/custom/fromJson.txt:2888 msgid "Hover AI" msgstr "" #. TRANSLATORS: #. data/base/stats/propulsion.json: $.hover02.name -#: po/custom/fromJson.txt:2890 +#: po/custom/fromJson.txt:2891 msgid "Hover II" msgstr "" #. TRANSLATORS: #. data/base/stats/propulsion.json: $.hover03.name -#: po/custom/fromJson.txt:2893 +#: po/custom/fromJson.txt:2894 msgid "Hover III" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Vehicle-Prop-Hover.name #. data/mp/stats/research.json: $.R-Vehicle-Prop-Hover.name -#: po/custom/fromJson.txt:2900 +#: po/custom/fromJson.txt:2901 msgid "Hover Propulsion" msgstr "" #. TRANSLATORS: #. data/base/stats/propulsion.json: $.hover01.name #. data/mp/stats/propulsion.json: $.hover01.name -#: po/custom/fromJson.txt:2904 +#: po/custom/fromJson.txt:2905 msgid "Hover" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessages2.json: $.RES_W_HOWAC1.text[2] #. data/mp/messages/resmessages3.json: $.RES_W_HOWAC3.text[2] -#: po/custom/fromJson.txt:2909 +#: po/custom/fromJson.txt:2910 #, no-c-format msgid "Howitzer accuracy +10%" msgstr "" @@ -9928,42 +9931,42 @@ msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Howitzer-ROF02.name #. data/mp/stats/research.json: $.R-Wpn-Howitzer-ROF02.name -#: po/custom/fromJson.txt:2913 +#: po/custom/fromJson.txt:2914 msgid "Howitzer Autoloader Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Howitzer-ROF03.name #. data/mp/stats/research.json: $.R-Wpn-Howitzer-ROF03.name -#: po/custom/fromJson.txt:2917 +#: po/custom/fromJson.txt:2918 msgid "Howitzer Autoloader Mk3" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Howitzer-ROF01.name #. data/mp/stats/research.json: $.R-Wpn-Howitzer-ROF01.name -#: po/custom/fromJson.txt:2921 +#: po/custom/fromJson.txt:2922 msgid "Howitzer Autoloader" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessages2.json: $.RES_W_HOWD1.text[2] #. data/mp/messages/resmessages3.json: $.RES_W_HOWD4.text[2] -#: po/custom/fromJson.txt:2926 +#: po/custom/fromJson.txt:2927 #, no-c-format msgid "Howitzer damage +25%" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Wpn-Howitzer-ROF04.name -#: po/custom/fromJson.txt:2935 +#: po/custom/fromJson.txt:2936 msgid "Howitzer Fast Loader" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessages2.json: $.RES_W_HOWRF1.text[2] #. data/mp/messages/resmessages3.json: $.RES_W_HOWRF4.text[2] -#: po/custom/fromJson.txt:2940 +#: po/custom/fromJson.txt:2941 #, no-c-format msgid "Howitzer reload time -10%" msgstr "" @@ -9973,7 +9976,7 @@ msgstr "" #. data/base/stats/weapons.json: $.Howitzer105Mk1.name #. data/mp/stats/research.json: $.R-Wpn-HowitzerMk1.name #. data/mp/stats/weapons.json: $.Howitzer105Mk1.name -#: po/custom/fromJson.txt:2952 +#: po/custom/fromJson.txt:2953 msgid "Howitzer" msgstr "" @@ -9982,7 +9985,7 @@ msgstr "" #. data/base/stats/structure.json: $.AASite-QuadMg1.name #. data/mp/stats/research.json: $.R-Defense-AASite-QuadMg1.name #. data/mp/stats/structure.json: $.AASite-QuadMg1.name -#: po/custom/fromJson.txt:2958 +#: po/custom/fromJson.txt:2959 msgid "Hurricane AA Site" msgstr "" @@ -9991,47 +9994,47 @@ msgstr "" #. data/base/stats/weapons.json: $.QuadMg1AAGun.name #. data/mp/stats/research.json: $.R-Wpn-AAGun03.name #. data/mp/stats/weapons.json: $.QuadMg1AAGun.name -#: po/custom/fromJson.txt:2964 +#: po/custom/fromJson.txt:2965 msgid "Hurricane AA Turret" msgstr "" #. TRANSLATORS: #. data/base/stats/features.json: $.BarbHUT.name -#: po/custom/fromJson.txt:2967 +#: po/custom/fromJson.txt:2968 msgid "Hut" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Cannon-Damage08.name #. data/mp/stats/research.json: $.R-Wpn-Cannon-Damage08.name -#: po/custom/fromJson.txt:2971 +#: po/custom/fromJson.txt:2972 msgid "HVAPFSDS Cannon Rounds Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Cannon-Damage09.name #. data/mp/stats/research.json: $.R-Wpn-Cannon-Damage09.name -#: po/custom/fromJson.txt:2975 +#: po/custom/fromJson.txt:2976 msgid "HVAPFSDS Cannon Rounds Mk3" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Cannon-Damage07.name #. data/mp/stats/research.json: $.R-Wpn-Cannon-Damage07.name -#: po/custom/fromJson.txt:2979 +#: po/custom/fromJson.txt:2980 msgid "HVAPFSDS Cannon Rounds" msgstr "" #. TRANSLATORS: #. data/base/stats/templates.json: $.P0cam3PyHPVcanTrk.name -#: po/custom/fromJson.txt:2982 +#: po/custom/fromJson.txt:2983 msgid "HVC Python Tracks" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-MG-ROF03.name #. data/mp/stats/research.json: $.R-Wpn-MG-ROF03.name -#: po/custom/fromJson.txt:2986 +#: po/custom/fromJson.txt:2987 msgid "Hyper Fire Chaingun Upgrade" msgstr "" @@ -10040,7 +10043,7 @@ msgstr "" #. data/base/stats/structure.json: $.Emplacement-HPVcannon.name #. data/mp/stats/research.json: $.R-Defense-Emplacement-HPVcannon.name #. data/mp/stats/structure.json: $.Emplacement-HPVcannon.name -#: po/custom/fromJson.txt:2992 +#: po/custom/fromJson.txt:2993 msgid "Hyper Velocity Cannon Emplacement" msgstr "" @@ -10049,19 +10052,19 @@ msgstr "" #. data/base/stats/structure.json: $.WallTower-HPVcannon.name #. data/mp/stats/research.json: $.R-Defense-WallTower-HPVcannon.name #. data/mp/stats/structure.json: $.WallTower-HPVcannon.name -#: po/custom/fromJson.txt:2998 +#: po/custom/fromJson.txt:2999 msgid "Hyper Velocity Cannon Hardpoint" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.PythonHoverHVC.name -#: po/custom/fromJson.txt:3001 +#: po/custom/fromJson.txt:3002 msgid "Hyper Velocity Cannon Python Hover" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.P0cam3PyHPVcanTrk.name -#: po/custom/fromJson.txt:3004 +#: po/custom/fromJson.txt:3005 msgid "Hyper Velocity Cannon Python Tracks" msgstr "" @@ -10070,41 +10073,41 @@ msgstr "" #. data/base/stats/weapons.json: $.Cannon4AUTOMk1.name #. data/mp/stats/research.json: $.R-Wpn-Cannon4AMk1.name #. data/mp/stats/weapons.json: $.Cannon4AUTOMk1.name -#: po/custom/fromJson.txt:3010 +#: po/custom/fromJson.txt:3011 msgid "Hyper Velocity Cannon" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_W_CN_D7.text[1] #. data/mp/messages/resmessages3.json: $.RES_W_CN_D7.text[1] -#: po/custom/fromJson.txt:3014 +#: po/custom/fromJson.txt:3015 msgid "Hyper-Velocity Armor-Piercing Fin-Stabilised Discarding Sabot" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_W_LASSAT.text[2] -#: po/custom/fromJson.txt:3021 +#: po/custom/fromJson.txt:3022 msgid "Immense damage infliction capability" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_W_RAIL_D1.text[1] #. data/mp/messages/resmessages3.json: $.RES_W_RAIL_D1.text[1] -#: po/custom/fromJson.txt:3025 +#: po/custom/fromJson.txt:3026 msgid "Improved armor-piercing dart" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Bomb-Damage02.name #. data/mp/stats/research.json: $.R-Wpn-Bomb-Damage02.name -#: po/custom/fromJson.txt:3029 +#: po/custom/fromJson.txt:3030 msgid "Improved Bomb Warhead" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_LASROF1.text[1] #. data/mp/messages/resmessages3.json: $.RES_LASROF1.text[1] -#: po/custom/fromJson.txt:3037 +#: po/custom/fromJson.txt:3038 msgid "Improved Energizer reduces laser recharge time" msgstr "" @@ -10113,14 +10116,14 @@ msgstr "" #. data/base/messages/resmessages23.json: $.RES_ENGIN2.text[1] #. data/mp/messages/resmessages12.json: $.RES_ENGIN1.text[1] #. data/mp/messages/resmessages23.json: $.RES_ENGIN2.text[1] -#: po/custom/fromJson.txt:3043 +#: po/custom/fromJson.txt:3044 msgid "Improved Engineering Techniques" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Sys-Engineering02.name #. data/mp/stats/research.json: $.R-Sys-Engineering02.name -#: po/custom/fromJson.txt:3047 +#: po/custom/fromJson.txt:3048 msgid "Improved Engineering" msgstr "" @@ -10129,42 +10132,42 @@ msgstr "" #. data/base/messages/resmessages23.json: $.RES_SY_VCBSU2.text[1] #. data/base/messages/resmessages3.json: $.RES_SY_CBSU3.text[1] #. ... + 3 refs -#: po/custom/fromJson.txt:3053 +#: po/custom/fromJson.txt:3054 msgid "Improved fire detection systems" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Defense-WallUpgrade02.name #. data/mp/stats/research.json: $.R-Defense-WallUpgrade02.name -#: po/custom/fromJson.txt:3057 +#: po/custom/fromJson.txt:3058 msgid "Improved Hardcrete Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Defense-WallUpgrade03.name #. data/mp/stats/research.json: $.R-Defense-WallUpgrade03.name -#: po/custom/fromJson.txt:3061 +#: po/custom/fromJson.txt:3062 msgid "Improved Hardcrete Mk3" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Defense-WallUpgrade01.name #. data/mp/stats/research.json: $.R-Defense-WallUpgrade01.name -#: po/custom/fromJson.txt:3065 +#: po/custom/fromJson.txt:3066 msgid "Improved Hardcrete" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_W_M_D1.text[1] #. data/mp/messages/resmessages1.json: $.RES_W_M_D1.text[1] -#: po/custom/fromJson.txt:3069 +#: po/custom/fromJson.txt:3070 msgid "Improved high explosive shells" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Energy-Accuracy01.name #. data/mp/stats/research.json: $.R-Wpn-Energy-Accuracy01.name -#: po/custom/fromJson.txt:3073 +#: po/custom/fromJson.txt:3074 msgid "Improved Laser Focusing" msgstr "" @@ -10173,7 +10176,7 @@ msgstr "" #. data/base/messages/resmessages3.json: $.RES_SY_RESU3.text[1] #. data/base/messages/resmessages3.json: $.RES_SY_RESU4.text[1] #. ... + 2 refs -#: po/custom/fromJson.txt:3079 +#: po/custom/fromJson.txt:3080 msgid "Improved NEXUS resistance circuitry" msgstr "" @@ -10182,14 +10185,14 @@ msgstr "" #. data/base/messages/resmessages23.json: $.RES_POWU1.text[0] #. data/base/messages/resmessages3.json: $.RES_POWU2.text[0] #. ... + 3 refs -#: po/custom/fromJson.txt:3085 +#: po/custom/fromJson.txt:3086 msgid "Improved Power Generator Performance" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-RocketSlow-Accuracy01.name #. data/mp/stats/research.json: $.R-Wpn-Rocket-Accuracy02.name -#: po/custom/fromJson.txt:3089 +#: po/custom/fromJson.txt:3090 msgid "Improved Rocket Wire Guidance" msgstr "" @@ -10198,127 +10201,127 @@ msgstr "" #. data/mp/messages/resmessagesall.json: $.RES_SENSO1.text[1] #. data/mp/messages/resmessagesall.json: $.RES_SY_S_WS.text[3] #. data/mp/messages/resmessagesall.json: $.RES_SY_S_WST.text[3] -#: po/custom/fromJson.txt:3095 +#: po/custom/fromJson.txt:3096 msgid "Improved sensor range" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_W_RK_D1.text[1] #. data/mp/messages/resmessages1.json: $.RES_W_RK_D1.text[1] -#: po/custom/fromJson.txt:3103 +#: po/custom/fromJson.txt:3104 msgid "Improved shaped charge warhead" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages23.json: $.RES_SY_VS2.text[1] #. data/mp/messages/resmessages23.json: $.RES_SY_VS2.text[1] -#: po/custom/fromJson.txt:3107 +#: po/custom/fromJson.txt:3108 msgid "Improved target recognition systems" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_SY_SU2.text[1] -#: po/custom/fromJson.txt:3110 +#: po/custom/fromJson.txt:3111 msgid "Improved Thermal Emissions detection" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_DF_WU1.text[1] #. data/mp/messages/resmessages1.json: $.RES_DF_WU1.text[1] -#: po/custom/fromJson.txt:3114 +#: po/custom/fromJson.txt:3115 msgid "Improved Titanium-reinforced concrete" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages23.json: $.RES_W_BDMG2.text[1] #. data/mp/messages/resmessages23.json: $.RES_W_BDMG2.text[1] -#: po/custom/fromJson.txt:3118 +#: po/custom/fromJson.txt:3119 msgid "Improved trinitramine explosive formula" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_LASD1.text[1] #. data/mp/messages/resmessages3.json: $.RES_LASD1.text[1] -#: po/custom/fromJson.txt:3122 +#: po/custom/fromJson.txt:3123 msgid "Improvement in laser emission density" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_LASAC1.text[1] #. data/mp/messages/resmessages3.json: $.RES_LASAC1.text[1] -#: po/custom/fromJson.txt:3126 +#: po/custom/fromJson.txt:3127 msgid "Improvement in laser optics reduces light dispersal" msgstr "" #. TRANSLATORS: #. data/mp/stats/structure.json: $.Emplacement-Howitzer-Incenediary.name -#: po/custom/fromJson.txt:3135 +#: po/custom/fromJson.txt:3136 msgid "Incendiary Howitzer Emplacement 2" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Defense-Howitzer-Incendiary.name #. data/mp/stats/structure.json: $.Emplacement-Howitzer-Incendiary.name -#: po/custom/fromJson.txt:3139 +#: po/custom/fromJson.txt:3140 msgid "Incendiary Howitzer Emplacement" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_EMP_INH.text[1] -#: po/custom/fromJson.txt:3142 +#: po/custom/fromJson.txt:3143 msgid "Incendiary howitzer emplacement" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_W_INH.text[1] -#: po/custom/fromJson.txt:3145 +#: po/custom/fromJson.txt:3146 msgid "Incendiary Howitzer may be assigned to a sensor" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Wpn-Howitzer-Incendiary.name #. data/mp/stats/weapons.json: $.Howitzer-Incendiary.name -#: po/custom/fromJson.txt:3149 +#: po/custom/fromJson.txt:3150 msgid "Incendiary Howitzer" msgstr "" #. TRANSLATORS: #. data/mp/stats/structure.json: $.Emplacement-MortarPit-Incenediary.name -#: po/custom/fromJson.txt:3152 +#: po/custom/fromJson.txt:3153 msgid "Incendiary Mortar Pit 2" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Defense-MortarPit-Incendiary.name #. data/mp/stats/structure.json: $.Emplacement-MortarPit-Incendiary.name -#: po/custom/fromJson.txt:3156 +#: po/custom/fromJson.txt:3157 msgid "Incendiary Mortar Pit" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Wpn-Mortar-Incendiary.name #. data/mp/stats/weapons.json: $.Mortar-Incendiary.name -#: po/custom/fromJson.txt:3160 +#: po/custom/fromJson.txt:3161 msgid "Incendiary Mortar" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_W_RAIL_ROF1.text[1] #. data/mp/messages/resmessages3.json: $.RES_W_RAIL_ROF1.text[1] -#: po/custom/fromJson.txt:3164 +#: po/custom/fromJson.txt:3165 msgid "Increased gauss output speeds up reload time" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_DF_WU1.text[2] -#: po/custom/fromJson.txt:3186 +#: po/custom/fromJson.txt:3187 msgid "Increases Armour and Body Points" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages12.json: $.RES_W_CNAC1.text[2] #. data/base/messages/resmessagesall.json: $.RES_W_CNAC2.text[2] -#: po/custom/fromJson.txt:3196 +#: po/custom/fromJson.txt:3197 msgid "Increases Cannon accuracy" msgstr "" @@ -10326,14 +10329,14 @@ msgstr "" #. data/base/messages/resmessages1.json: $.RES_W_CN_D1.text[2] #. data/base/messages/resmessages12.json: $.RES_W_CN_D4.text[2] #. data/base/messages/resmessages3.json: $.RES_W_CN_D7.text[2] -#: po/custom/fromJson.txt:3201 +#: po/custom/fromJson.txt:3202 msgid "Increases Cannon damage" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages12.json: $.RES_W_CN_ROF1.text[2] #. data/base/messages/resmessages3.json: $.RES_W_CN_ROF4.text[2] -#: po/custom/fromJson.txt:3205 +#: po/custom/fromJson.txt:3206 msgid "Increases Cannon ROF" msgstr "" @@ -10341,69 +10344,69 @@ msgstr "" #. data/base/messages/resmessages12.json: $.RES_ENGIN1.text[2] #. data/base/messages/resmessages23.json: $.RES_ENGIN2.text[2] #. data/base/messages/resmessages3.json: $.RES_ENGIN3.text[2] -#: po/custom/fromJson.txt:3210 +#: po/custom/fromJson.txt:3211 msgid "Increases construction speed" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_W_FL_R1.text[2] -#: po/custom/fromJson.txt:3236 +#: po/custom/fromJson.txt:3237 msgid "Increases Flamer range" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages12.json: $.RES_W_FL_ROF1.text[2] -#: po/custom/fromJson.txt:3239 +#: po/custom/fromJson.txt:3240 msgid "Increases Flamer ROF" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_LASAC1.text[2] -#: po/custom/fromJson.txt:3266 +#: po/custom/fromJson.txt:3267 msgid "Increases Laser accuracy" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_LASD1.text[2] -#: po/custom/fromJson.txt:3269 +#: po/custom/fromJson.txt:3270 msgid "Increases Laser damage" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_LASROF1.text[2] -#: po/custom/fromJson.txt:3272 +#: po/custom/fromJson.txt:3273 msgid "Increases Laser ROF" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_W_RK_AC1.text[2] -#: po/custom/fromJson.txt:3286 +#: po/custom/fromJson.txt:3287 msgid "Increases Mini-Rocket accuracy" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_W_RK_ROF1.text[2] -#: po/custom/fromJson.txt:3293 +#: po/custom/fromJson.txt:3294 msgid "Increases Mini-Rockets ROF" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_W_MS_AC1.text[2] #. data/base/messages/resmessages3.json: $.RES_W_MS_AC2.text[2] -#: po/custom/fromJson.txt:3297 +#: po/custom/fromJson.txt:3298 msgid "Increases Missile accuracy" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_W_MS_D1.text[2] -#: po/custom/fromJson.txt:3300 +#: po/custom/fromJson.txt:3301 msgid "Increases Missile damage" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_W_MS_ROF1.text[2] #. data/base/messages/resmessages3.json: $.RES_W_SMS_ROF1.text[2] -#: po/custom/fromJson.txt:3304 +#: po/custom/fromJson.txt:3305 msgid "Increases Missile ROF" msgstr "" @@ -10411,32 +10414,32 @@ msgstr "" #. data/base/messages/resmessages12.json: $.RES_W_M_AC1.text[2] #. data/base/messages/resmessages23.json: $.RES_W_M_AC2.text[2] #. data/base/messages/resmessages3.json: $.RES_W_M_AC3.text[2] -#: po/custom/fromJson.txt:3309 +#: po/custom/fromJson.txt:3310 msgid "Increases Mortar accuracy" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages12.json: $.RES_W_M_ROF1.text[2] #. data/base/messages/resmessages3.json: $.RES_W_M_ROF4.text[2] -#: po/custom/fromJson.txt:3317 +#: po/custom/fromJson.txt:3318 msgid "Increases Mortar ROF" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_W_RAIL_AC1.text[2] -#: po/custom/fromJson.txt:3320 +#: po/custom/fromJson.txt:3321 msgid "Increases Rail Gun accuracy" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_W_RAIL_D1.text[2] -#: po/custom/fromJson.txt:3323 +#: po/custom/fromJson.txt:3324 msgid "Increases Rail Gun damage" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_W_RAIL_ROF1.text[2] -#: po/custom/fromJson.txt:3326 +#: po/custom/fromJson.txt:3327 msgid "Increases Rail Gun ROF" msgstr "" @@ -10444,53 +10447,53 @@ msgstr "" #. data/base/messages/resmessages1.json: $.RES_W_SRK_AC1.text[2] #. data/base/messages/resmessages12.json: $.RES_W_SRK_AC2.text[2] #. data/base/messages/resmessagesall.json: $.RES_W_SRK_AC3.text[2] -#: po/custom/fromJson.txt:3342 +#: po/custom/fromJson.txt:3343 msgid "Increases Rocket accuracy" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages12.json: $.RES_W_SRK_ROF1.text[2] #. data/base/messages/resmessages23.json: $.RES_W_SRK_ROF4.text[2] -#: po/custom/fromJson.txt:3350 +#: po/custom/fromJson.txt:3351 msgid "Increases Rocket ROF" msgstr "" #. TRANSLATORS: #. data/base/stats/features.json: $.Indirectlab.name -#: po/custom/fromJson.txt:3367 +#: po/custom/fromJson.txt:3368 msgid "Indirectweaponslab" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_V_B08.text[1] #. data/mp/messages/resmessages1.json: $.RES_V_B08.text[1] -#: po/custom/fromJson.txt:3371 +#: po/custom/fromJson.txt:3372 msgid "Inferior armor and body points to Cobra" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_V_B04.text[1] #. data/mp/messages/resmessages1.json: $.RES_V_B04.text[1] -#: po/custom/fromJson.txt:3375 +#: po/custom/fromJson.txt:3376 msgid "Inferior armor and body points to Viper" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Defense-HvyFlamer.name #. data/mp/stats/structure.json: $.Tower-Projector.name -#: po/custom/fromJson.txt:3379 +#: po/custom/fromJson.txt:3380 msgid "Inferno Bunker" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.CobraInfernoHTracks.name -#: po/custom/fromJson.txt:3382 +#: po/custom/fromJson.txt:3383 msgid "Inferno Cobra Half-Tracks" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.CobraInfernoHover.name -#: po/custom/fromJson.txt:3385 +#: po/custom/fromJson.txt:3386 msgid "Inferno Cobra Hover" msgstr "" @@ -10498,67 +10501,67 @@ msgstr "" #. data/base/stats/research.json: $.R-Defense-HvyFlamer.name #. data/base/stats/structure.json: $.Tower-Projector.name #. data/base/stats/weapons.json: $.Flame2-Emplacement.name -#: po/custom/fromJson.txt:3390 +#: po/custom/fromJson.txt:3391 msgid "Inferno Emplacement" msgstr "" #. TRANSLATORS: #. data/base/stats/structure.json: $.WallTower-Projector.name #. data/mp/stats/structure.json: $.WallTower-Projector.name -#: po/custom/fromJson.txt:3394 +#: po/custom/fromJson.txt:3395 msgid "Inferno Hardpoint" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.PythonHoverInferno.name -#: po/custom/fromJson.txt:3397 +#: po/custom/fromJson.txt:3398 msgid "Inferno Python Hover" msgstr "" #. TRANSLATORS: #. data/base/stats/weapons.json: $.Flame2.name #. data/mp/stats/weapons.json: $.Flame2.name -#: po/custom/fromJson.txt:3401 +#: po/custom/fromJson.txt:3402 msgid "Inferno" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_SY_RESU1.text[2] #. data/mp/messages/resmessages3.json: $.RES_SY_RESU1.text[2] -#: po/custom/fromJson.txt:3405 +#: po/custom/fromJson.txt:3406 msgid "Intruder parasite isolated" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_V_EN10.text[1] #. data/mp/messages/resmessages3.json: $.RES_V_EN10.text[1] -#: po/custom/fromJson.txt:3409 +#: po/custom/fromJson.txt:3410 msgid "Ionizing Turbine Engine" msgstr "" #. TRANSLATORS: #. data/mp/stats/structure.json: $.ECM1PylonMk1.name -#: po/custom/fromJson.txt:3412 +#: po/custom/fromJson.txt:3413 msgid "Jammer Tower" msgstr "" #. TRANSLATORS: #. data/mp/stats/ecm.json: $.ECM1TurretMk1.name -#: po/custom/fromJson.txt:3415 +#: po/custom/fromJson.txt:3416 msgid "Jammer Turret" msgstr "" #. TRANSLATORS: #. data/base/stats/templates.json: $.BabaJeep.name #. data/mp/stats/templates.json: $.BabaJeep.name -#: po/custom/fromJson.txt:3419 +#: po/custom/fromJson.txt:3420 msgid "Jeep" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_CY_JP1.text[3] #. data/mp/messages/resmessages3.json: $.RES_CY_JP1.text[3] -#: po/custom/fromJson.txt:3423 +#: po/custom/fromJson.txt:3424 msgid "Jump Cyborgs can now be researched" msgstr "" @@ -10567,7 +10570,7 @@ msgstr "" #. data/mp/messages/resmessagesall.json: $.RES_SY_S_UP.text[2] #. data/mp/messages/resmessagesall.json: $.RES_SY_S_WS.text[2] #. ... + 2 refs -#: po/custom/fromJson.txt:3429 +#: po/custom/fromJson.txt:3430 msgid "Keeps map areas under constant surveillance" msgstr "" @@ -10576,14 +10579,14 @@ msgstr "" #. data/mp/messages/resmessages2.json: $.RES_V_MET4.text[2] #. data/mp/messages/resmessages3.json: $.RES_V_MET10.text[2] #. data/mp/messages/resmessages3.json: $.RES_V_MET7.text[2] -#: po/custom/fromJson.txt:3436 +#: po/custom/fromJson.txt:3437 #, no-c-format msgid "Kinetic armor +30%, body points +30%" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessages2.json: $.RES_CYMET4.text[2] -#: po/custom/fromJson.txt:3440 +#: po/custom/fromJson.txt:3441 #, no-c-format msgid "Kinetic Armor +35%, and Body Points +35%" msgstr "" @@ -10592,7 +10595,7 @@ msgstr "" #. data/mp/messages/resmessages1.json: $.RES_CYMET1.text[2] #. data/mp/messages/resmessages3.json: $.RES_CYMET10.text[2] #. data/mp/messages/resmessages3.json: $.RES_CYMET7.text[2] -#: po/custom/fromJson.txt:3446 +#: po/custom/fromJson.txt:3447 #, no-c-format msgid "Kinetic Armor +35%, Body Points +35%" msgstr "" @@ -10602,14 +10605,14 @@ msgstr "" #. data/base/messages/resmessages3.json: $.RES_V_MET10.text[1] #. data/mp/messages/resmessages3.json: $.RES_CYMET10.text[1] #. data/mp/messages/resmessages3.json: $.RES_V_MET10.text[1] -#: po/custom/fromJson.txt:3452 +#: po/custom/fromJson.txt:3453 msgid "Laminated alloys bonded with energy-deflecting optic bundles" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Rocket01-LtAT.name #. data/mp/stats/research.json: $.R-Wpn-Rocket01-LtAT.name -#: po/custom/fromJson.txt:3456 +#: po/custom/fromJson.txt:3457 msgid "Lancer AT Rocket" msgstr "" @@ -10617,7 +10620,7 @@ msgstr "" #. data/base/stats/research.json: $.R-Defense-Pillbox06.name #. data/base/stats/structure.json: $.PillBox6.name #. data/mp/stats/structure.json: $.PillBox6.name -#: po/custom/fromJson.txt:3461 +#: po/custom/fromJson.txt:3462 msgid "Lancer Bunker" msgstr "" @@ -10626,13 +10629,13 @@ msgstr "" #. data/base/stats/templates.json: $.P0CobraLtATRktHtrack.name #. data/mp/stats/templates.json: $.CobraLtA-Thalftrack.name #. data/mp/stats/templates.json: $.P0CobraLtATRktHtrack.name -#: po/custom/fromJson.txt:3467 +#: po/custom/fromJson.txt:3468 msgid "Lancer Cobra Half-tracks" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.CobraTrkLancer.name -#: po/custom/fromJson.txt:3470 +#: po/custom/fromJson.txt:3471 msgid "Lancer Cobra Tracks" msgstr "" @@ -10641,7 +10644,7 @@ msgstr "" #. data/base/stats/templates.json: $.Cyb-Rocket-GROUND.name #. data/base/stats/templates.json: $.CyborgRkt01Ground.name #. ... + 2 refs -#: po/custom/fromJson.txt:3476 +#: po/custom/fromJson.txt:3477 msgid "Lancer Cyborg" msgstr "" @@ -10650,83 +10653,83 @@ msgstr "" #. data/base/stats/structure.json: $.WallTower06.name #. data/mp/stats/research.json: $.R-Defense-WallTower06.name #. data/mp/stats/structure.json: $.WallTower06.name -#: po/custom/fromJson.txt:3482 +#: po/custom/fromJson.txt:3483 msgid "Lancer Hardpoint" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.A-Mantis-Trk-Lancer.name -#: po/custom/fromJson.txt:3485 +#: po/custom/fromJson.txt:3486 msgid "Lancer Mantis Tracks" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.A-Python-Trk-Lancer.name -#: po/custom/fromJson.txt:3488 +#: po/custom/fromJson.txt:3489 msgid "Lancer Python Tracks" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.H-Scorp-Trk-Lancer.name -#: po/custom/fromJson.txt:3491 +#: po/custom/fromJson.txt:3492 msgid "Lancer Scorpion Tracks" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.H-Scorp-VTOL-Lancer.name -#: po/custom/fromJson.txt:3494 +#: po/custom/fromJson.txt:3495 msgid "Lancer Scorpion VTOL" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.ViperTrkLancer.name -#: po/custom/fromJson.txt:3502 +#: po/custom/fromJson.txt:3503 msgid "Lancer Viper Tracks" msgstr "" #. TRANSLATORS: #. data/base/stats/templates.json: $.ViperLtA-Twheels.name #. data/mp/stats/templates.json: $.ViperLtA-Twheels.name -#: po/custom/fromJson.txt:3506 +#: po/custom/fromJson.txt:3507 msgid "Lancer Viper Wheels" msgstr "" #. TRANSLATORS: #. data/base/stats/weapons.json: $.Rocket-LtA-T.name #. data/mp/stats/weapons.json: $.Rocket-LtA-T.name -#: po/custom/fromJson.txt:3510 +#: po/custom/fromJson.txt:3511 msgid "Lancer" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_V_B14.text[0] -#: po/custom/fromJson.txt:3513 +#: po/custom/fromJson.txt:3514 msgid "Large Super Heavy Body" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Laser01.name #. data/mp/stats/research.json: $.R-Wpn-Laser01.name -#: po/custom/fromJson.txt:3517 +#: po/custom/fromJson.txt:3518 msgid "Laser - Flashlight" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_W_AALAS.text[0] -#: po/custom/fromJson.txt:3520 +#: po/custom/fromJson.txt:3521 msgid "Laser AA Gun Available" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessages3.json: $.RES_LASAC1.text[2] -#: po/custom/fromJson.txt:3524 +#: po/custom/fromJson.txt:3525 #, no-c-format msgid "Laser accuracy +10%" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessages3.json: $.RES_LASD1.text[2] -#: po/custom/fromJson.txt:3528 +#: po/custom/fromJson.txt:3529 #, no-c-format msgid "Laser damage +25%" msgstr "" @@ -10734,13 +10737,13 @@ msgstr "" #. TRANSLATORS: #. data/base/messages/resmessagesall.json: $.RES_W_CNAC2.text[1] #. data/mp/messages/resmessagesall.json: $.RES_W_CNAC2.text[1] -#: po/custom/fromJson.txt:3532 +#: po/custom/fromJson.txt:3533 msgid "Laser designator paints and guides rounds to the target" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessages3.json: $.RES_LASROF1.text[2] -#: po/custom/fromJson.txt:3536 +#: po/custom/fromJson.txt:3537 #, no-c-format msgid "Laser reload time -15%" msgstr "" @@ -10749,7 +10752,7 @@ msgstr "" #. data/mp/stats/research.json: $.R-Wpn-LasSat.name #. data/mp/stats/structure.json: $.A0LasSatCommand.name #. data/mp/stats/weapons.json: $.LasSat.name -#: po/custom/fromJson.txt:3541 +#: po/custom/fromJson.txt:3542 msgid "Laser Satellite Command Post" msgstr "" @@ -10758,19 +10761,19 @@ msgstr "" #. data/base/messages/resmessages3.json: $.RES_LASD1.text[0] #. data/base/messages/resmessages3.json: $.RES_LASROF1.text[0] #. ... + 3 refs -#: po/custom/fromJson.txt:3547 +#: po/custom/fromJson.txt:3548 msgid "Laser Upgrade" msgstr "" #. TRANSLATORS: #. data/base/stats/features.json: $.Laseropticslab.name -#: po/custom/fromJson.txt:3550 +#: po/custom/fromJson.txt:3551 msgid "Laseropticslab" msgstr "" #. TRANSLATORS: #. data/base/stats/weapons.json: $.LasSat.name -#: po/custom/fromJson.txt:3553 +#: po/custom/fromJson.txt:3554 msgid "LasSat" msgstr "" @@ -10779,56 +10782,56 @@ msgstr "" #. data/base/messages/resmessages1.json: $.RES_V_MET1.text[1] #. data/mp/messages/resmessages1.json: $.RES_CYMET1.text[1] #. data/mp/messages/resmessages1.json: $.RES_V_MET1.text[1] -#: po/custom/fromJson.txt:3559 +#: po/custom/fromJson.txt:3560 msgid "Layered composite alloys and energy-absorbing fibres" msgstr "" #. TRANSLATORS: #. data/base/stats/body.json: $.Body2SUP.name #. data/mp/stats/body.json: $.Body2SUP.name -#: po/custom/fromJson.txt:3569 +#: po/custom/fromJson.txt:3570 msgid "Leopard" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_V_B12.text[1] #. data/mp/messages/resmessages1.json: $.RES_V_B12.text[1] -#: po/custom/fromJson.txt:3573 +#: po/custom/fromJson.txt:3574 msgid "Less armor and body points than Python" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Vehicle-Body04.name #. data/mp/stats/research.json: $.R-Vehicle-Body04.name -#: po/custom/fromJson.txt:3577 +#: po/custom/fromJson.txt:3578 msgid "Light Body - Bug" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Vehicle-Body02.name #. data/mp/stats/research.json: $.R-Vehicle-Body02.name -#: po/custom/fromJson.txt:3581 +#: po/custom/fromJson.txt:3582 msgid "Light Body - Leopard" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Vehicle-Body03.name #. data/mp/stats/research.json: $.R-Vehicle-Body03.name -#: po/custom/fromJson.txt:3585 +#: po/custom/fromJson.txt:3586 msgid "Light Body - Retaliation" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Vehicle-Body01.name #. data/mp/stats/research.json: $.R-Vehicle-Body01.name -#: po/custom/fromJson.txt:3589 +#: po/custom/fromJson.txt:3590 msgid "Light Body - Viper" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_V_B01.text[1] #. data/mp/messages/resmessages1.json: $.RES_V_B01.text[1] -#: po/custom/fromJson.txt:3593 +#: po/custom/fromJson.txt:3594 msgid "Light body vulnerable to heavy weapons" msgstr "" @@ -10837,21 +10840,21 @@ msgstr "" #. data/base/stats/structure.json: $.PillBox4.name #. data/mp/stats/research.json: $.R-Defense-Pillbox04.name #. data/mp/stats/structure.json: $.PillBox4.name -#: po/custom/fromJson.txt:3599 +#: po/custom/fromJson.txt:3600 msgid "Light Cannon Bunker" msgstr "" #. TRANSLATORS: #. data/base/stats/templates.json: $.CobraLtCnTrks.name #. data/mp/stats/templates.json: $.CobraLtCnTrks.name -#: po/custom/fromJson.txt:3603 +#: po/custom/fromJson.txt:3604 msgid "Light Cannon Cobra Tracks" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_CN1MK1.text[1] #. data/mp/messages/resmessages1.json: $.RES_CN1MK1.text[1] -#: po/custom/fromJson.txt:3607 +#: po/custom/fromJson.txt:3608 msgid "Light Cannon firing 40mm rounds" msgstr "" @@ -10860,34 +10863,34 @@ msgstr "" #. data/base/stats/structure.json: $.WallTower02.name #. data/mp/stats/research.json: $.R-Defense-WallTower02.name #. data/mp/stats/structure.json: $.WallTower02.name -#: po/custom/fromJson.txt:3613 +#: po/custom/fromJson.txt:3614 msgid "Light Cannon Hardpoint" msgstr "" #. TRANSLATORS: #. data/base/stats/templates.json: $.PythonLtCnTrks.name #. data/mp/stats/templates.json: $.PythonLtCnTrks.name -#: po/custom/fromJson.txt:3617 +#: po/custom/fromJson.txt:3618 msgid "Light Cannon Python Tracks" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.ViperLtCannonHTracks.name -#: po/custom/fromJson.txt:3620 +#: po/custom/fromJson.txt:3621 msgid "Light Cannon Viper Half-tracks" msgstr "" #. TRANSLATORS: #. data/base/stats/templates.json: $.ViperLtCannonTracks.name #. data/mp/stats/templates.json: $.ViperLtCannonTracks.name -#: po/custom/fromJson.txt:3624 +#: po/custom/fromJson.txt:3625 msgid "Light Cannon Viper Tracks" msgstr "" #. TRANSLATORS: #. data/base/stats/templates.json: $.ViperLtCannonWheels.name #. data/mp/stats/templates.json: $.ViperLtCannonWheels.name -#: po/custom/fromJson.txt:3628 +#: po/custom/fromJson.txt:3629 msgid "Light Cannon Viper Wheels" msgstr "" @@ -10896,21 +10899,21 @@ msgstr "" #. data/base/stats/weapons.json: $.Cannon1Mk1.name #. data/mp/stats/research.json: $.R-Wpn-Cannon1Mk1.name #. data/mp/stats/weapons.json: $.Cannon1Mk1.name -#: po/custom/fromJson.txt:3634 +#: po/custom/fromJson.txt:3635 msgid "Light Cannon" msgstr "" #. TRANSLATORS: #. data/base/stats/structure.json: $.LookOutTower.name #. data/mp/stats/structure.json: $.LookOutTower.name -#: po/custom/fromJson.txt:3638 +#: po/custom/fromJson.txt:3639 msgid "Look-Out Tower" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_V_B01.text[3] #. data/mp/messages/resmessages1.json: $.RES_V_B01.text[3] -#: po/custom/fromJson.txt:3642 +#: po/custom/fromJson.txt:3643 msgid "Low power cost and low production times" msgstr "" @@ -10919,14 +10922,14 @@ msgstr "" #. data/base/messages/resmessages3.json: $.RES_W_MS_D1.text[1] #. data/mp/messages/resmessages3.json: $.RES_W_BDMG3.text[1] #. data/mp/messages/resmessages3.json: $.RES_W_MS_D1.text[1] -#: po/custom/fromJson.txt:3648 +#: po/custom/fromJson.txt:3649 msgid "Low yield thermonuclear warhead" msgstr "" #. TRANSLATORS: #. data/base/stats/weapons.json: $.MG1-Pillbox.name #. data/mp/stats/weapons.json: $.MG1-Pillbox.name -#: po/custom/fromJson.txt:3655 +#: po/custom/fromJson.txt:3656 msgid "Machinegun Bunker" msgstr "" @@ -10935,7 +10938,7 @@ msgstr "" #. data/mp/messages/resmessages1.json: $.RES_W_MG_D2.text[2] #. data/mp/messages/resmessages2.json: $.RES_W_MG_D5.text[2] #. ... + 2 refs -#: po/custom/fromJson.txt:3662 +#: po/custom/fromJson.txt:3663 #, no-c-format msgid "Machinegun damage +25%" msgstr "" @@ -10943,7 +10946,7 @@ msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Defense-Tower01.name #. data/base/stats/structure.json: $.GuardTower1MG.name -#: po/custom/fromJson.txt:3666 +#: po/custom/fromJson.txt:3667 msgid "Machinegun Guard Tower" msgstr "" @@ -10951,66 +10954,66 @@ msgstr "" #. data/mp/messages/resmessages12.json: $.RES_W_MG_ROF1.text[2] #. data/mp/messages/resmessages2.json: $.RES_W_MG_ROF2.text[2] #. data/mp/messages/resmessages23.json: $.RES_W_MG_ROF3.text[2] -#: po/custom/fromJson.txt:3672 +#: po/custom/fromJson.txt:3673 #, no-c-format msgid "Machinegun reload time -15%" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.ViperLtMGHalfTracks.name -#: po/custom/fromJson.txt:3681 +#: po/custom/fromJson.txt:3682 msgid "Machinegun Viper Half-Tracks" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.A-Viper-Trk-MG.name -#: po/custom/fromJson.txt:3684 +#: po/custom/fromJson.txt:3685 msgid "Machinegun Viper Tracks" msgstr "" #. TRANSLATORS: #. data/base/stats/weapons.json: $.CyborgChaingun.name #. data/mp/stats/weapons.json: $.CyborgChaingun.name -#: po/custom/fromJson.txt:3706 +#: po/custom/fromJson.txt:3707 msgid "Machinegunner" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessagesall.json: $.RES_SENSO1.text[2] #. data/mp/messages/resmessagesall.json: $.RES_SENSO1.text[2] -#: po/custom/fromJson.txt:3710 +#: po/custom/fromJson.txt:3711 msgid "Makes excellent scout vehicle" msgstr "" #. TRANSLATORS: #. data/base/stats/body.json: $.Body12SUP.name #. data/mp/stats/body.json: $.Body12SUP.name -#: po/custom/fromJson.txt:3714 +#: po/custom/fromJson.txt:3715 msgid "Mantis" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Defense-MassDriver.name #. data/mp/stats/structure.json: $.X-Super-MassDriver.name -#: po/custom/fromJson.txt:3718 +#: po/custom/fromJson.txt:3719 msgid "Mass Driver Fortress" msgstr "" #. TRANSLATORS: #. data/mp/stats/weapons.json: $.MassDriver.name -#: po/custom/fromJson.txt:3721 +#: po/custom/fromJson.txt:3722 msgid "Mass Driver" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_V_B14.text[1] -#: po/custom/fromJson.txt:3724 +#: po/custom/fromJson.txt:3725 msgid "Maximum armor and body points" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_SY_SUE1.text[3] -#: po/custom/fromJson.txt:3739 +#: po/custom/fromJson.txt:3740 msgid "May be assigned to follow units" msgstr "" @@ -11018,73 +11021,73 @@ msgstr "" #. data/base/messages/resmessages1.json: $.RES_MORTA1.text[1] #. data/mp/messages/resmessages1.json: $.RES_MORTA1.text[1] #. data/mp/messages/resmessagesall.json: $.RES_IMORT.text[1] -#: po/custom/fromJson.txt:3744 +#: po/custom/fromJson.txt:3745 msgid "May be targeted directly or assigned to a sensor turret or tower" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessagesall.json: $.RES_ST_VF.text[3] #. data/mp/messages/resmessagesall.json: $.RES_ST_VF.text[3] -#: po/custom/fromJson.txt:3748 +#: po/custom/fromJson.txt:3749 msgid "May be upgraded using factory modules" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.Cyb-Mechanic.name -#: po/custom/fromJson.txt:3751 +#: po/custom/fromJson.txt:3752 msgid "Mechanic Cyborg" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_CYS_MCH.text[1] -#: po/custom/fromJson.txt:3754 +#: po/custom/fromJson.txt:3755 msgid "Mechanic with repair ability" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Vehicle-Body05.name #. data/mp/stats/research.json: $.R-Vehicle-Body05.name -#: po/custom/fromJson.txt:3758 +#: po/custom/fromJson.txt:3759 msgid "Medium Body - Cobra" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Vehicle-Body06.name #. data/mp/stats/research.json: $.R-Vehicle-Body06.name -#: po/custom/fromJson.txt:3762 +#: po/custom/fromJson.txt:3763 msgid "Medium Body - Panther" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Vehicle-Body07.name #. data/mp/stats/research.json: $.R-Vehicle-Body07.name -#: po/custom/fromJson.txt:3766 +#: po/custom/fromJson.txt:3767 msgid "Medium Body - Retribution" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Vehicle-Body08.name #. data/mp/stats/research.json: $.R-Vehicle-Body08.name -#: po/custom/fromJson.txt:3770 +#: po/custom/fromJson.txt:3771 msgid "Medium Body - Scorpion" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_V_B05.text[1] #. data/mp/messages/resmessages1.json: $.RES_V_B05.text[1] -#: po/custom/fromJson.txt:3774 +#: po/custom/fromJson.txt:3775 msgid "Medium body increases armor and body points" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.CobraMedCnHTrks.name -#: po/custom/fromJson.txt:3777 +#: po/custom/fromJson.txt:3778 msgid "Medium Cannon Cobra Half Track" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.A-Cobra-Hover-MC.name -#: po/custom/fromJson.txt:3780 +#: po/custom/fromJson.txt:3781 msgid "Medium Cannon Cobra Hover" msgstr "" @@ -11092,14 +11095,14 @@ msgstr "" #. data/base/stats/templates.json: $.CobraMedCnTrks.name #. data/mp/stats/templates.json: $.CobraMedCnTrks.name #. data/mp/stats/templates.json: $.P0CobraMedCnTrks.name -#: po/custom/fromJson.txt:3785 +#: po/custom/fromJson.txt:3786 msgid "Medium Cannon Cobra Tracks" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_CN2MK1.text[1] #. data/mp/messages/resmessages1.json: $.RES_CN2MK1.text[1] -#: po/custom/fromJson.txt:3789 +#: po/custom/fromJson.txt:3790 msgid "Medium Cannon firing 76mm rounds" msgstr "" @@ -11108,13 +11111,13 @@ msgstr "" #. data/base/stats/structure.json: $.WallTower03.name #. data/mp/stats/research.json: $.R-Defense-WallTower03.name #. data/mp/stats/structure.json: $.WallTower03.name -#: po/custom/fromJson.txt:3795 +#: po/custom/fromJson.txt:3796 msgid "Medium Cannon Hardpoint" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.A-Python-Hover-MC.name -#: po/custom/fromJson.txt:3798 +#: po/custom/fromJson.txt:3799 msgid "Medium Cannon Python Hover" msgstr "" @@ -11122,26 +11125,26 @@ msgstr "" #. data/base/stats/templates.json: $.PythonMedCnTrks.name #. data/mp/stats/templates.json: $.PythonMedCanTracks.name #. data/mp/stats/templates.json: $.PythonMedCnTrks.name -#: po/custom/fromJson.txt:3803 +#: po/custom/fromJson.txt:3804 msgid "Medium Cannon Python Tracks" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.A-Scorp-Hover-MC.name -#: po/custom/fromJson.txt:3806 +#: po/custom/fromJson.txt:3807 msgid "Medium Cannon Scorpion Hover" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.A-Scorp-Trk-MC.name -#: po/custom/fromJson.txt:3809 +#: po/custom/fromJson.txt:3810 msgid "Medium Cannon Scorpion Tracks" msgstr "" #. TRANSLATORS: #. data/base/stats/templates.json: $.ViperMedCnTrks.name #. data/mp/stats/templates.json: $.ViperMedCnTrks.name -#: po/custom/fromJson.txt:3813 +#: po/custom/fromJson.txt:3814 msgid "Medium Cannon Viper Tracks" msgstr "" @@ -11150,70 +11153,70 @@ msgstr "" #. data/base/stats/weapons.json: $.Cannon2A-TMk1.name #. data/mp/stats/research.json: $.R-Wpn-Cannon2Mk1.name #. data/mp/stats/weapons.json: $.Cannon2A-TMk1.name -#: po/custom/fromJson.txt:3819 +#: po/custom/fromJson.txt:3820 msgid "Medium Cannon" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_V_B13.text[0] -#: po/custom/fromJson.txt:3822 +#: po/custom/fromJson.txt:3823 msgid "Medium Super Heavy Body" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages12.json: $.RES_EMP_MRL.text[1] #. data/mp/messages/resmessages12.json: $.RES_EMP_MRL.text[1] -#: po/custom/fromJson.txt:3826 +#: po/custom/fromJson.txt:3827 msgid "Mini-rocket armored strongpoint" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.CobraMRLHalftrack.name -#: po/custom/fromJson.txt:3829 +#: po/custom/fromJson.txt:3830 msgid "Mini-Rocket Array Cobra Half-tracks" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.CobraMRLTracks.name -#: po/custom/fromJson.txt:3832 +#: po/custom/fromJson.txt:3833 msgid "Mini-Rocket Array Cobra Tracks" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.ViperMRLHalfTracks.name -#: po/custom/fromJson.txt:3835 +#: po/custom/fromJson.txt:3836 msgid "Mini-Rocket Array Viper Half Track" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.ViperMRLWheels.name -#: po/custom/fromJson.txt:3838 +#: po/custom/fromJson.txt:3839 msgid "Mini-Rocket Array Viper Wheels" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Wpn-Rocket02-MRL.name #. data/mp/stats/weapons.json: $.Rocket-MRL.name -#: po/custom/fromJson.txt:3842 +#: po/custom/fromJson.txt:3843 msgid "Mini-Rocket Array" msgstr "" #. TRANSLATORS: #. data/base/stats/templates.json: $.CobraMRLHalftrack.name -#: po/custom/fromJson.txt:3845 +#: po/custom/fromJson.txt:3846 msgid "Mini-Rocket Artillery Cobra Half-tracks" msgstr "" #. TRANSLATORS: #. data/base/stats/templates.json: $.ViperMRLWheels.name -#: po/custom/fromJson.txt:3848 +#: po/custom/fromJson.txt:3849 msgid "Mini-Rocket Artillery Viper Wheels" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Rocket02-MRL.name #. data/base/stats/weapons.json: $.Rocket-MRL.name -#: po/custom/fromJson.txt:3852 +#: po/custom/fromJson.txt:3853 msgid "Mini-Rocket Artillery" msgstr "" @@ -11222,26 +11225,26 @@ msgstr "" #. data/base/stats/structure.json: $.Emplacement-MRL-pit.name #. data/mp/stats/research.json: $.R-Defense-MRL.name #. data/mp/stats/structure.json: $.Emplacement-MRL-pit.name -#: po/custom/fromJson.txt:3858 +#: po/custom/fromJson.txt:3859 msgid "Mini-Rocket Battery" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.CobraPODHTracks.name -#: po/custom/fromJson.txt:3861 +#: po/custom/fromJson.txt:3862 msgid "Mini-Rocket Cobra Half-Tracks" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.CobraPODTracks.name -#: po/custom/fromJson.txt:3864 +#: po/custom/fromJson.txt:3865 msgid "Mini-Rocket Cobra Tracks" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Defense-Tower06.name #. data/base/stats/structure.json: $.GuardTower6.name -#: po/custom/fromJson.txt:3868 +#: po/custom/fromJson.txt:3869 msgid "Mini-Rocket Guard Tower" msgstr "" @@ -11250,34 +11253,34 @@ msgstr "" #. data/base/stats/weapons.json: $.Rocket-Pod.name #. data/mp/stats/research.json: $.R-Wpn-Rocket05-MiniPod.name #. data/mp/stats/weapons.json: $.Rocket-Pod.name -#: po/custom/fromJson.txt:3874 +#: po/custom/fromJson.txt:3875 msgid "Mini-Rocket Pod" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Defense-Tower06.name #. data/mp/stats/structure.json: $.GuardTower6.name -#: po/custom/fromJson.txt:3878 +#: po/custom/fromJson.txt:3879 msgid "Mini-Rocket Tower" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.ViperPODHalfTracks.name -#: po/custom/fromJson.txt:3887 +#: po/custom/fromJson.txt:3888 msgid "Mini-Rocket Viper Half Track" msgstr "" #. TRANSLATORS: #. data/base/stats/templates.json: $.ViperPODWheels.name #. data/mp/stats/templates.json: $.ViperPODWheels.name -#: po/custom/fromJson.txt:3891 +#: po/custom/fromJson.txt:3892 msgid "Mini-Rocket Viper Wheels" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessages3.json: $.RES_W_MS_AC1.text[2] #. data/mp/messages/resmessages3.json: $.RES_W_MS_AC2.text[2] -#: po/custom/fromJson.txt:3896 +#: po/custom/fromJson.txt:3897 #, no-c-format msgid "Missile accuracy +10%" msgstr "" @@ -11285,13 +11288,13 @@ msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_W_MS_AC2.text[1] #. data/mp/messages/resmessages3.json: $.RES_W_MS_AC2.text[1] -#: po/custom/fromJson.txt:3900 +#: po/custom/fromJson.txt:3901 msgid "Missile actively seeks and homes on targets" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessages3.json: $.RES_W_MS_D1.text[2] -#: po/custom/fromJson.txt:3904 +#: po/custom/fromJson.txt:3905 #, no-c-format msgid "Missile damage +25%" msgstr "" @@ -11300,14 +11303,14 @@ msgstr "" #. data/mp/stats/research.json: $.R-Defense-Super-Missile.name #. data/mp/stats/structure.json: $.X-Super-Missile.name #. data/mp/stats/weapons.json: $.MissileSuper.name -#: po/custom/fromJson.txt:3909 +#: po/custom/fromJson.txt:3910 msgid "Missile Fortress" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessages3.json: $.RES_W_MS_ROF1.text[2] #. data/mp/messages/resmessages3.json: $.RES_W_SMS_ROF1.text[2] -#: po/custom/fromJson.txt:3914 +#: po/custom/fromJson.txt:3915 #, no-c-format msgid "Missile reload time -15%" msgstr "" @@ -11317,21 +11320,21 @@ msgstr "" #. data/base/messages/resmessages3.json: $.RES_W_MS_AC2.text[0] #. data/base/messages/resmessages3.json: $.RES_W_MS_D1.text[0] #. ... + 7 refs -#: po/custom/fromJson.txt:3927 +#: po/custom/fromJson.txt:3928 msgid "Missile Upgrade" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_W_MS_ROF1.text[1] #. data/mp/messages/resmessages3.json: $.RES_W_MS_ROF1.text[1] -#: po/custom/fromJson.txt:3931 +#: po/custom/fromJson.txt:3932 msgid "Missiles detect and lock-on to targets while loading" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Sys-MobileRepairTurret01.name #. data/mp/stats/research.json: $.R-Sys-MobileRepairTurret01.name -#: po/custom/fromJson.txt:3935 +#: po/custom/fromJson.txt:3936 msgid "Mobile Repair Turret" msgstr "" @@ -11340,13 +11343,13 @@ msgstr "" #. data/base/messages/resmessagesall.json: $.RES_V_B09.text[1] #. data/mp/messages/resmessages3.json: $.RES_V_B10.text[1] #. data/mp/messages/resmessagesall.json: $.RES_V_B09.text[1] -#: po/custom/fromJson.txt:3941 +#: po/custom/fromJson.txt:3942 msgid "More armor and body points than Python" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_V_B13.text[1] -#: po/custom/fromJson.txt:3944 +#: po/custom/fromJson.txt:3945 msgid "More armor and body points than Vengeance" msgstr "" @@ -11354,7 +11357,7 @@ msgstr "" #. data/mp/messages/resmessages12.json: $.RES_W_M_AC1.text[2] #. data/mp/messages/resmessages23.json: $.RES_W_M_AC2.text[2] #. data/mp/messages/resmessages3.json: $.RES_W_M_AC3.text[2] -#: po/custom/fromJson.txt:3950 +#: po/custom/fromJson.txt:3951 #, no-c-format msgid "Mortar accuracy +10%" msgstr "" @@ -11362,35 +11365,35 @@ msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Mortar-ROF02.name #. data/mp/stats/research.json: $.R-Wpn-Mortar-ROF02.name -#: po/custom/fromJson.txt:3954 +#: po/custom/fromJson.txt:3955 msgid "Mortar Autoloader Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Mortar-ROF03.name #. data/mp/stats/research.json: $.R-Wpn-Mortar-ROF03.name -#: po/custom/fromJson.txt:3958 +#: po/custom/fromJson.txt:3959 msgid "Mortar Autoloader Mk3" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Mortar-ROF01.name #. data/mp/stats/research.json: $.R-Wpn-Mortar-ROF01.name -#: po/custom/fromJson.txt:3962 +#: po/custom/fromJson.txt:3963 msgid "Mortar Autoloader" msgstr "" #. TRANSLATORS: #. data/base/stats/templates.json: $.CobraMortarHalfTrack.name #. data/mp/stats/templates.json: $.CobraMortarHalfTrack.name -#: po/custom/fromJson.txt:3966 +#: po/custom/fromJson.txt:3967 msgid "Mortar Cobra Half-tracks" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessages1.json: $.RES_W_M_D1.text[2] #. data/mp/messages/resmessages2.json: $.RES_W_M_D4.text[2] -#: po/custom/fromJson.txt:3971 +#: po/custom/fromJson.txt:3972 #, no-c-format msgid "Mortar damage +25%" msgstr "" @@ -11398,7 +11401,7 @@ msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Mortar-ROF04.name #. data/mp/stats/research.json: $.R-Wpn-Mortar-ROF04.name -#: po/custom/fromJson.txt:3975 +#: po/custom/fromJson.txt:3976 msgid "Mortar Fast Loader" msgstr "" @@ -11407,14 +11410,14 @@ msgstr "" #. data/base/stats/structure.json: $.Emplacement-MortarPit01.name #. data/mp/stats/research.json: $.R-Defense-MortarPit.name #. data/mp/stats/structure.json: $.Emplacement-MortarPit01.name -#: po/custom/fromJson.txt:3981 +#: po/custom/fromJson.txt:3982 msgid "Mortar Pit" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessages12.json: $.RES_W_M_ROF1.text[2] #. data/mp/messages/resmessages3.json: $.RES_W_M_ROF4.text[2] -#: po/custom/fromJson.txt:3986 +#: po/custom/fromJson.txt:3987 #, no-c-format msgid "Mortar reload time -10%" msgstr "" @@ -11422,7 +11425,7 @@ msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Mortar-Acc01.name #. data/mp/stats/research.json: $.R-Wpn-Mortar-Acc01.name -#: po/custom/fromJson.txt:3990 +#: po/custom/fromJson.txt:3991 msgid "Mortar Targeting Computer" msgstr "" @@ -11431,57 +11434,57 @@ msgstr "" #. data/base/stats/weapons.json: $.Mortar1Mk1.name #. data/mp/stats/research.json: $.R-Wpn-Mortar01Lt.name #. data/mp/stats/weapons.json: $.Mortar1Mk1.name -#: po/custom/fromJson.txt:4002 +#: po/custom/fromJson.txt:4003 msgid "Mortar" msgstr "" #. TRANSLATORS: #. data/base/stats/weapons.json: $.MG1-Tower.name -#: po/custom/fromJson.txt:4005 +#: po/custom/fromJson.txt:4006 msgid "Mounted Machinegun" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Vehicle-Body14.name -#: po/custom/fromJson.txt:4008 +#: po/custom/fromJson.txt:4009 msgid "Multi Turret Body - Dragon" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages23.json: $.RES_W_MG4.text[1] #. data/mp/messages/resmessages23.json: $.RES_W_MG4.text[1] -#: po/custom/fromJson.txt:4012 +#: po/custom/fromJson.txt:4013 msgid "Multi-barrel, rapid-fire machinegun" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_ST_CR1.text[1] #. data/mp/messages/resmessages1.json: $.RES_ST_CR1.text[1] -#: po/custom/fromJson.txt:4016 +#: po/custom/fromJson.txt:4017 msgid "Must be built to produce commanders" msgstr "" #. TRANSLATORS: #. data/base/stats/features.json: $.Nanolab.name -#: po/custom/fromJson.txt:4019 +#: po/custom/fromJson.txt:4020 msgid "Nanolab" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_W_LASSAT.text[3] -#: po/custom/fromJson.txt:4022 +#: po/custom/fromJson.txt:4023 msgid "Narrow area of effect" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.A-Retrib-Trk-Needle.name -#: po/custom/fromJson.txt:4028 +#: po/custom/fromJson.txt:4029 msgid "Needle Gun Retribution Tracks" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.A-Tiger-Trk-Needle.name -#: po/custom/fromJson.txt:4031 +#: po/custom/fromJson.txt:4032 msgid "Needle Gun Tiger Tracks" msgstr "" @@ -11490,13 +11493,13 @@ msgstr "" #. data/base/stats/structure.json: $.GuardTower-Rail1.name #. data/mp/stats/research.json: $.R-Defense-GuardTower-Rail1.name #. data/mp/stats/structure.json: $.GuardTower-Rail1.name -#: po/custom/fromJson.txt:4037 +#: po/custom/fromJson.txt:4038 msgid "Needle Gun Tower" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.A-Veng-Trk-Needle.name -#: po/custom/fromJson.txt:4040 +#: po/custom/fromJson.txt:4041 msgid "Needle Gun Vengeance Tracks" msgstr "" @@ -11505,7 +11508,7 @@ msgstr "" #. data/base/stats/weapons.json: $.RailGun1Mk1.name #. data/mp/stats/research.json: $.R-Wpn-RailGun01.name #. data/mp/stats/weapons.json: $.RailGun1Mk1.name -#: po/custom/fromJson.txt:4046 +#: po/custom/fromJson.txt:4047 msgid "Needle Gun" msgstr "" @@ -11514,21 +11517,21 @@ msgstr "" #. data/base/stats/templates.json: $.Cyb-Rail1-GROUND.name #. data/mp/stats/templates.json: $.Cyb-Rail1-GROUND.name #. data/mp/stats/templates.json: $.MP-Cyb-Needle-GRD.name -#: po/custom/fromJson.txt:4052 +#: po/custom/fromJson.txt:4053 msgid "Needle Gunner Cyborg" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Struc-Research-Upgrade08.name #. data/mp/stats/research.json: $.R-Struc-Research-Upgrade08.name -#: po/custom/fromJson.txt:4056 +#: po/custom/fromJson.txt:4057 msgid "Neural Synapse Research Brain Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Struc-Research-Upgrade09.name #. data/mp/stats/research.json: $.R-Struc-Research-Upgrade09.name -#: po/custom/fromJson.txt:4060 +#: po/custom/fromJson.txt:4061 msgid "Neural Synapse Research Brain Mk3" msgstr "" @@ -11537,13 +11540,13 @@ msgstr "" #. data/base/stats/research.json: $.R-Struc-Research-Upgrade07.name #. data/mp/messages/resmessages3.json: $.RES_ST_RU7.text[1] #. data/mp/stats/research.json: $.R-Struc-Research-Upgrade07.name -#: po/custom/fromJson.txt:4066 +#: po/custom/fromJson.txt:4067 msgid "Neural Synapse Research Brain" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_W_LASSAT.text[0] -#: po/custom/fromJson.txt:4075 +#: po/custom/fromJson.txt:4076 msgid "New Advanced Weapon Available" msgstr "" @@ -11552,14 +11555,14 @@ msgstr "" #. data/base/messages/resmessages3.json: $.RES_W_MS_MART.text[0] #. data/mp/messages/resmessages3.json: $.RES_W_MS_HART.text[0] #. data/mp/messages/resmessages3.json: $.RES_W_MS_MART.text[0] -#: po/custom/fromJson.txt:4087 +#: po/custom/fromJson.txt:4088 msgid "New Artillery Missile Turret Available" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_ST_RFU1.text[1] #. data/mp/messages/resmessages1.json: $.RES_ST_RFU1.text[1] -#: po/custom/fromJson.txt:4091 +#: po/custom/fromJson.txt:4092 msgid "New automated repair techniques" msgstr "" @@ -11568,14 +11571,14 @@ msgstr "" #. data/base/messages/resmessages1.json: $.RES_ST_CR1.text[0] #. data/base/messages/resmessages1.json: $.RES_ST_FCY1.text[0] #. ... + 7 refs -#: po/custom/fromJson.txt:4097 +#: po/custom/fromJson.txt:4098 msgid "New Base Structure Available" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_C_CT1.text[1] #. data/mp/messages/resmessages1.json: $.RES_C_CT1.text[1] -#: po/custom/fromJson.txt:4101 +#: po/custom/fromJson.txt:4102 msgid "New battlefield computer system" msgstr "" @@ -11583,20 +11586,20 @@ msgstr "" #. data/base/messages/resmessagesall.json: $.RES_DF_HCW1.text[0] #. data/mp/messages/resmessagesall.json: $.RES_DF_HCW1.text[0] #. data/mp/messages/resmessagesall.json: $.RES_DF_HCW2.text[0] -#: po/custom/fromJson.txt:4112 +#: po/custom/fromJson.txt:4113 msgid "New Construction Options Available" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_CY_JP1.text[0] #. data/mp/messages/resmessages3.json: $.RES_CY_JP1.text[0] -#: po/custom/fromJson.txt:4126 +#: po/custom/fromJson.txt:4127 msgid "New Cyborg Research Available" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_SY_RC.text[0] -#: po/custom/fromJson.txt:4135 +#: po/custom/fromJson.txt:4136 msgid "New Electronic Technology Discovered" msgstr "" @@ -11605,7 +11608,7 @@ msgstr "" #. data/base/messages/resmessages3.json: $.RES_W_LAS2.text[0] #. data/mp/messages/resmessages3.json: $.RES_W_LAS1.text[0] #. ... + 2 refs -#: po/custom/fromJson.txt:4159 +#: po/custom/fromJson.txt:4160 msgid "New Laser Weapon Available" msgstr "" @@ -11614,28 +11617,28 @@ msgstr "" #. data/base/messages/resmessages3.json: $.RES_W_ASM_BB.text[0] #. data/mp/messages/resmessages3.json: $.RES_W_ASM_AT.text[0] #. data/mp/messages/resmessages3.json: $.RES_W_ASM_BB.text[0] -#: po/custom/fromJson.txt:4165 +#: po/custom/fromJson.txt:4166 msgid "New Missile Turret Available" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_V_B12.text[0] #. data/mp/messages/resmessages1.json: $.RES_V_B12.text[0] -#: po/custom/fromJson.txt:4172 +#: po/custom/fromJson.txt:4174 msgid "New Paradigm Heavy Body" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_V_B04.text[0] #. data/mp/messages/resmessages1.json: $.RES_V_B04.text[0] -#: po/custom/fromJson.txt:4176 +#: po/custom/fromJson.txt:4178 msgid "New Paradigm Light Body" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_V_B08.text[0] #. data/mp/messages/resmessages1.json: $.RES_V_B08.text[0] -#: po/custom/fromJson.txt:4180 +#: po/custom/fromJson.txt:4182 msgid "New Paradigm Medium body" msgstr "" @@ -11644,21 +11647,21 @@ msgstr "" #. data/base/messages/resmessages3.json: $.RES_V_P_V3.text[1] #. data/mp/messages/resmessages3.json: $.RES_V_P_V2.text[1] #. data/mp/messages/resmessages3.json: $.RES_V_P_V3.text[1] -#: po/custom/fromJson.txt:4186 +#: po/custom/fromJson.txt:4188 msgid "New power efficient propulsion" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages23.json: $.RES_POWU1.text[1] #. data/base/messages/resmessages3.json: $.RES_POWU2.text[1] -#: po/custom/fromJson.txt:4190 +#: po/custom/fromJson.txt:4192 msgid "New Power Generation Technology" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessagesall.json: $.RES_V_P_V1.text[0] #. data/mp/messages/resmessagesall.json: $.RES_V_P_V1.text[0] -#: po/custom/fromJson.txt:4194 +#: po/custom/fromJson.txt:4196 msgid "New Propulsion Available for Design" msgstr "" @@ -11667,7 +11670,7 @@ msgstr "" #. data/base/messages/resmessages1.json: $.RES_TRACK1.text[0] #. data/base/messages/resmessages1.json: $.RES_V_P_H1.text[0] #. ... + 5 refs -#: po/custom/fromJson.txt:4200 +#: po/custom/fromJson.txt:4202 msgid "New Propulsion Available" msgstr "" @@ -11676,14 +11679,14 @@ msgstr "" #. data/base/messages/resmessages3.json: $.RES_W_RAIL2.text[0] #. data/base/messages/resmessages3.json: $.RES_W_RAIL3.text[0] #. ... + 3 refs -#: po/custom/fromJson.txt:4212 +#: po/custom/fromJson.txt:4214 msgid "New Rail Gun Available" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_REPAI1.text[1] #. data/mp/messages/resmessages1.json: $.RES_REPAI1.text[1] -#: po/custom/fromJson.txt:4216 +#: po/custom/fromJson.txt:4218 msgid "New Repair Facility Repairs Damaged Units" msgstr "" @@ -11692,14 +11695,14 @@ msgstr "" #. data/base/messages/resmessages3.json: $.RES_SY_ADEF.text[0] #. data/base/messages/resmessages3.json: $.RES_SY_ASTRUC.text[0] #. ... + 6 refs -#: po/custom/fromJson.txt:4222 +#: po/custom/fromJson.txt:4224 msgid "New Repair Technology Discovered" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_C_SL1.text[3] #. data/mp/messages/resmessages1.json: $.RES_C_SL1.text[3] -#: po/custom/fromJson.txt:4226 +#: po/custom/fromJson.txt:4228 msgid "New research options available" msgstr "" @@ -11708,7 +11711,7 @@ msgstr "" #. data/base/messages/resmessages12.json: $.RES_W_RK_HvAT.text[0] #. data/base/messages/resmessages12.json: $.RES_W_RK_IDF.text[0] #. ... + 9 refs -#: po/custom/fromJson.txt:4240 +#: po/custom/fromJson.txt:4242 msgid "New Rocket Available" msgstr "" @@ -11717,26 +11720,26 @@ msgstr "" #. data/base/messages/resmessages3.json: $.RES_W_MS_LtSAM1.text[0] #. data/mp/messages/resmessages3.json: $.RES_W_MS_HvSAM1.text[0] #. data/mp/messages/resmessages3.json: $.RES_W_MS_LtSAM1.text[0] -#: po/custom/fromJson.txt:4246 +#: po/custom/fromJson.txt:4248 msgid "New SAM Turret Available" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_SY_S_WST.text[0] -#: po/custom/fromJson.txt:4249 +#: po/custom/fromJson.txt:4251 msgid "New System Available" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_SY_SUE1.text[0] -#: po/custom/fromJson.txt:4252 +#: po/custom/fromJson.txt:4254 msgid "New Systems Sensor Available" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_SY_S_UP.text[0] #. data/mp/messages/resmessagesall.json: $.RES_SY_S_WS.text[0] -#: po/custom/fromJson.txt:4256 +#: po/custom/fromJson.txt:4258 msgid "New Systems Structure Available" msgstr "" @@ -11745,14 +11748,14 @@ msgstr "" #. data/base/messages/resmessages23.json: $.RES_SY_VSTW1.text[0] #. data/base/messages/resmessagesall.json: $.RES_SY_CBSTW1.text[0] #. ... + 6 refs -#: po/custom/fromJson.txt:4262 +#: po/custom/fromJson.txt:4264 msgid "New Systems Tower Available" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessagesall.json: $.RES_SENSO1.text[0] #. data/mp/messages/resmessagesall.json: $.RES_SENSO1.text[0] -#: po/custom/fromJson.txt:4266 +#: po/custom/fromJson.txt:4268 msgid "New Systems Turret Available For Design" msgstr "" @@ -11761,7 +11764,7 @@ msgstr "" #. data/base/messages/resmessages12.json: $.RES_SY_CBSTU1.text[0] #. data/mp/messages/resmessages1.json: $.RES_C_CT1.text[0] #. data/mp/messages/resmessages12.json: $.RES_SY_CBSTU1.text[0] -#: po/custom/fromJson.txt:4272 +#: po/custom/fromJson.txt:4274 msgid "New Systems Turret Available for Design" msgstr "" @@ -11769,162 +11772,162 @@ msgstr "" #. data/base/messages/resmessagesall.json: $.RES_SY_SU1.text[1] #. data/mp/messages/resmessagesall.json: $.RES_SY_SU1.text[1] #. data/mp/messages/resmessagesall.json: $.RES_SY_SUE1.text[1] -#: po/custom/fromJson.txt:4287 +#: po/custom/fromJson.txt:4289 msgid "New Thermal Emissions detection" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_W_BMB6.text[0] -#: po/custom/fromJson.txt:4290 +#: po/custom/fromJson.txt:4292 msgid "New VTOL Missile Launcher" msgstr "" #. TRANSLATORS: #. data/base/stats/structure.json: $.NEXUSCWall.name #. data/mp/stats/structure.json: $.NEXUSCWall.name -#: po/custom/fromJson.txt:4300 +#: po/custom/fromJson.txt:4302 msgid "NEXUS CWall" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_V_B10.text[0] #. data/mp/messages/resmessages3.json: $.RES_V_B10.text[0] -#: po/custom/fromJson.txt:4304 +#: po/custom/fromJson.txt:4306 msgid "NEXUS Heavy Body" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Sys-Resistance-Upgrade04.name -#: po/custom/fromJson.txt:4307 +#: po/custom/fromJson.txt:4309 msgid "NEXUS Immunization System" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_SY_RESU1.text[1] #. data/mp/messages/resmessages3.json: $.RES_SY_RESU1.text[1] -#: po/custom/fromJson.txt:4311 +#: po/custom/fromJson.txt:4313 msgid "NEXUS Intruder Program analyzed" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Sys-Resistance.name -#: po/custom/fromJson.txt:4314 +#: po/custom/fromJson.txt:4316 msgid "NEXUS Intruder Program" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_V_B03.text[0] #. data/mp/messages/resmessages3.json: $.RES_V_B03.text[0] -#: po/custom/fromJson.txt:4318 +#: po/custom/fromJson.txt:4320 msgid "NEXUS Light Body" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Sys-SpyTower.name #. data/mp/stats/structure.json: $.Sys-SpyTower.name -#: po/custom/fromJson.txt:4322 +#: po/custom/fromJson.txt:4324 msgid "Nexus Link Tower" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Sys-SpyTurret.name #. data/mp/stats/weapons.json: $.SpyTurret01.name -#: po/custom/fromJson.txt:4326 +#: po/custom/fromJson.txt:4328 msgid "Nexus Link Turret" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_V_B07.text[0] #. data/mp/messages/resmessages3.json: $.RES_V_B07.text[0] -#: po/custom/fromJson.txt:4330 +#: po/custom/fromJson.txt:4332 msgid "NEXUS Medium Body" msgstr "" #. TRANSLATORS: #. data/base/stats/structure.json: $.NX-ANTI-SATSite.name #. data/mp/stats/structure.json: $.NX-ANTI-SATSite.name -#: po/custom/fromJson.txt:4334 +#: po/custom/fromJson.txt:4336 msgid "Nexus Missile Silo" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Sys-Resistance-Upgrade02.name -#: po/custom/fromJson.txt:4337 +#: po/custom/fromJson.txt:4339 msgid "NEXUS Resistance Circuits Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Sys-Resistance-Upgrade03.name -#: po/custom/fromJson.txt:4340 +#: po/custom/fromJson.txt:4342 msgid "NEXUS Resistance Circuits Mk3" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Sys-Resistance-Upgrade01.name -#: po/custom/fromJson.txt:4343 +#: po/custom/fromJson.txt:4345 msgid "NEXUS Resistance Circuits" msgstr "" #. TRANSLATORS: #. data/base/stats/structure.json: $.NEXUSWall.name #. data/mp/stats/structure.json: $.NEXUSWall.name -#: po/custom/fromJson.txt:4350 +#: po/custom/fromJson.txt:4352 msgid "NEXUS Wall" msgstr "" #. TRANSLATORS: #. data/mp/multiplay/skirmish/nexus.json: $.AI.name -#: po/custom/fromJson.txt:4353 +#: po/custom/fromJson.txt:4355 msgid "Nexus" msgstr "" #. TRANSLATORS: #. data/mp/challenges/noplace.json: $.challenge.name -#: po/custom/fromJson.txt:4356 +#: po/custom/fromJson.txt:4358 msgid "No Place To Hide" msgstr "" #. TRANSLATORS: #. data/mp/multiplay/skirmish/bonecrusher.json: $.AI.tip -#: po/custom/fromJson.txt:4359 +#: po/custom/fromJson.txt:4361 msgid "Non-Cheating. Hard. Fun. Crush!" msgstr "" #. TRANSLATORS: #. data/mp/multiplay/skirmish/nb_generic.json: $.AI.name -#: po/custom/fromJson.txt:4362 +#: po/custom/fromJson.txt:4364 msgid "NullBot" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_SY_SUE1.text[2] -#: po/custom/fromJson.txt:4365 +#: po/custom/fromJson.txt:4367 msgid "Objects become difficult to locate near it" msgstr "" #. TRANSLATORS: #. data/base/stats/structure.json: $.A0ResourceExtractor.name #. data/mp/stats/structure.json: $.A0ResourceExtractor.name -#: po/custom/fromJson.txt:4369 +#: po/custom/fromJson.txt:4371 msgid "Oil Derrick" msgstr "" #. TRANSLATORS: #. data/base/stats/features.json: $.OilDrum.name -#: po/custom/fromJson.txt:4372 +#: po/custom/fromJson.txt:4374 msgid "Oil Drum" msgstr "" #. TRANSLATORS: #. data/base/stats/features.json: $.OilResource.name -#: po/custom/fromJson.txt:4375 +#: po/custom/fromJson.txt:4377 msgid "Oil Resource" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_W_MS_AC1.text[1] #. data/mp/messages/resmessages3.json: $.RES_W_MS_AC1.text[1] -#: po/custom/fromJson.txt:4379 +#: po/custom/fromJson.txt:4381 msgid "On-board computer predicts target movement" msgstr "" @@ -11933,20 +11936,20 @@ msgstr "" #. data/base/messages/resmessages3.json: $.RES_SY_AVEH.text[2] #. data/mp/messages/resmessages3.json: $.RES_SY_ACYB.text[2] #. ... + 2 refs -#: po/custom/fromJson.txt:4385 +#: po/custom/fromJson.txt:4387 msgid "On-board diagnostic and repair systems" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_SY_RC.text[2] -#: po/custom/fromJson.txt:4388 +#: po/custom/fromJson.txt:4390 msgid "On-board resistance circuit systems" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_REPAI1.text[3] #. data/mp/messages/resmessages1.json: $.RES_REPAI1.text[3] -#: po/custom/fromJson.txt:4397 +#: po/custom/fromJson.txt:4399 msgid "Or select the Repair Facility as a unit's target" msgstr "" @@ -11955,28 +11958,28 @@ msgstr "" #. data/base/messages/resmessagesall.json: $.RES_SY_CBSTW1.text[2] #. data/mp/messages/resmessages12.json: $.RES_SY_CBSTU1.text[2] #. data/mp/messages/resmessagesall.json: $.RES_SY_CBSTW1.text[2] -#: po/custom/fromJson.txt:4403 +#: po/custom/fromJson.txt:4405 msgid "Orders assigned indirect fire units to fire at the enemy batteries" msgstr "" #. TRANSLATORS: #. data/base/ruleset.json: $.name -#: po/custom/fromJson.txt:4412 -#: src/titleui/campaign.cpp:484 -#: src/titleui/campaign.cpp:1611 +#: po/custom/fromJson.txt:4414 +#: src/titleui/campaign.cpp:494 +#: src/titleui/campaign.cpp:1621 msgid "Original Campaign" msgstr "" #. TRANSLATORS: #. data/mp/ruleset.json: $.name -#: po/custom/fromJson.txt:4415 +#: po/custom/fromJson.txt:4417 msgid "Original Skirmish" msgstr "" #. TRANSLATORS: #. data/base/stats/body.json: $.Body6SUPP.name #. data/mp/stats/body.json: $.Body6SUPP.name -#: po/custom/fromJson.txt:4419 +#: po/custom/fromJson.txt:4421 msgid "Panther" msgstr "" @@ -11985,170 +11988,170 @@ msgstr "" #. data/base/stats/structure.json: $.Emplacement-RotMor.name #. data/mp/stats/research.json: $.R-Defense-RotMor.name #. data/mp/stats/structure.json: $.Emplacement-RotMor.name -#: po/custom/fromJson.txt:4425 +#: po/custom/fromJson.txt:4427 msgid "Pepperpot Pit" msgstr "" #. TRANSLATORS: #. data/base/stats/weapons.json: $.Mortar3ROTARYMk1.name #. data/mp/stats/weapons.json: $.Mortar3ROTARYMk1.name -#: po/custom/fromJson.txt:4429 +#: po/custom/fromJson.txt:4431 msgid "Pepperpot" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.SK-Mantis-VTOL-PBB.name -#: po/custom/fromJson.txt:4432 +#: po/custom/fromJson.txt:4434 msgid "Phosphor Bomb Bay Mantis VTOL" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Bomb03.name #. data/mp/stats/research.json: $.R-Wpn-Bomb03.name -#: po/custom/fromJson.txt:4436 +#: po/custom/fromJson.txt:4438 msgid "Phosphor Bomb Bay" msgstr "" #. TRANSLATORS: #. data/base/stats/templates.json: $.BabaPickUp.name #. data/mp/stats/templates.json: $.BabaPickUp.name -#: po/custom/fromJson.txt:4440 +#: po/custom/fromJson.txt:4442 msgid "Pick-Up Truck" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Defense-WallUpgrade08.name #. data/mp/stats/research.json: $.R-Defense-WallUpgrade08.name -#: po/custom/fromJson.txt:4444 +#: po/custom/fromJson.txt:4446 msgid "Plascrete Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Defense-WallUpgrade09.name #. data/mp/stats/research.json: $.R-Defense-WallUpgrade09.name -#: po/custom/fromJson.txt:4448 +#: po/custom/fromJson.txt:4450 msgid "Plascrete Mk3" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Defense-WallUpgrade07.name #. data/mp/stats/research.json: $.R-Defense-WallUpgrade07.name -#: po/custom/fromJson.txt:4452 +#: po/custom/fromJson.txt:4454 msgid "Plascrete" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Defense-PlasmaCannon.name #. data/mp/stats/structure.json: $.Emplacement-PlasmaCannon.name -#: po/custom/fromJson.txt:4456 +#: po/custom/fromJson.txt:4458 msgid "Plasma Cannon Emplacement" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_EMP_PLASCAN.text[1] #. data/mp/messages/resmessagesall.json: $.RES_W_PLASCAN.text[1] -#: po/custom/fromJson.txt:4460 +#: po/custom/fromJson.txt:4462 msgid "Plasma Cannon firing plasma" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.WyvernPlasmaCTracks.name -#: po/custom/fromJson.txt:4463 +#: po/custom/fromJson.txt:4465 msgid "Plasma Cannon Wyvern Tracks" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Wpn-PlasmaCannon.name #. data/mp/stats/weapons.json: $.Laser4-PlasmaCannon.name -#: po/custom/fromJson.txt:4467 +#: po/custom/fromJson.txt:4469 msgid "Plasma Cannon" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Wpn-Bomb05.name -#: po/custom/fromJson.txt:4470 +#: po/custom/fromJson.txt:4472 msgid "Plasmite Bomb" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_PLFL.text[1] -#: po/custom/fromJson.txt:4473 +#: po/custom/fromJson.txt:4475 msgid "Plasmite Flame-thrower" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Defense-PlasmiteFlamer.name #. data/mp/stats/structure.json: $.Plasmite-flamer-bunker.name -#: po/custom/fromJson.txt:4477 +#: po/custom/fromJson.txt:4479 msgid "Plasmite Flamer Bunker" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Wpn-Plasmite-Flamer.name #. data/mp/stats/weapons.json: $.PlasmiteFlamer.name -#: po/custom/fromJson.txt:4481 +#: po/custom/fromJson.txt:4483 msgid "Plasmite Flamer" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.SK-Retre-VTOL-Plasmite.name -#: po/custom/fromJson.txt:4484 +#: po/custom/fromJson.txt:4486 msgid "Plasmite Retribution VTOL" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Defense-WallUpgrade11.name #. data/mp/stats/research.json: $.R-Defense-WallUpgrade11.name -#: po/custom/fromJson.txt:4488 +#: po/custom/fromJson.txt:4490 msgid "Plasteel Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Defense-WallUpgrade12.name #. data/mp/stats/research.json: $.R-Defense-WallUpgrade12.name -#: po/custom/fromJson.txt:4492 +#: po/custom/fromJson.txt:4494 msgid "Plasteel Mk3" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Defense-WallUpgrade10.name #. data/mp/stats/research.json: $.R-Defense-WallUpgrade10.name -#: po/custom/fromJson.txt:4496 +#: po/custom/fromJson.txt:4498 msgid "Plasteel" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_V_B08.text[3] #. data/mp/messages/resmessages1.json: $.RES_V_B08.text[3] -#: po/custom/fromJson.txt:4500 +#: po/custom/fromJson.txt:4502 msgid "Power cost and production time similar to Cobra" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_V_B04.text[3] #. data/mp/messages/resmessages1.json: $.RES_V_B04.text[3] -#: po/custom/fromJson.txt:4504 +#: po/custom/fromJson.txt:4506 msgid "Power cost and production time similar to Viper" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_V_B12.text[3] #. data/mp/messages/resmessages1.json: $.RES_V_B12.text[3] -#: po/custom/fromJson.txt:4508 +#: po/custom/fromJson.txt:4510 msgid "Power cost and production time the same as Python" msgstr "" #. TRANSLATORS: #. data/base/stats/structure.json: $.A0PowerGenerator.name #. data/mp/stats/structure.json: $.A0PowerGenerator.name -#: po/custom/fromJson.txt:4512 +#: po/custom/fromJson.txt:4514 msgid "Power Generator" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_POWMD1.text[0] #. data/mp/messages/resmessages1.json: $.RES_POWMD1.text[0] -#: po/custom/fromJson.txt:4516 +#: po/custom/fromJson.txt:4518 msgid "Power Module Available" msgstr "" @@ -12157,86 +12160,86 @@ msgstr "" #. data/base/stats/structure.json: $.A0PowMod1.name #. data/mp/stats/research.json: $.R-Struc-PowerModuleMk1.name #. data/mp/stats/structure.json: $.A0PowMod1.name -#: po/custom/fromJson.txt:4522 +#: po/custom/fromJson.txt:4524 msgid "Power Module" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessages23.json: $.RES_POWU1.text[2] -#: po/custom/fromJson.txt:4526 +#: po/custom/fromJson.txt:4528 #, no-c-format msgid "Power output +25%" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessages3.json: $.RES_POWU2.text[2] -#: po/custom/fromJson.txt:4530 +#: po/custom/fromJson.txt:4532 #, no-c-format msgid "Power output +30%" msgstr "" #. TRANSLATORS: #. data/base/messages/messages.json: $.MSG2.text[0] -#: po/custom/fromJson.txt:4533 +#: po/custom/fromJson.txt:4535 msgid "Power Research Completed" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_EMP_CANT.text[1] -#: po/custom/fromJson.txt:4536 +#: po/custom/fromJson.txt:4538 msgid "Powerful Electronic magnetic pulse weapon" msgstr "" #. TRANSLATORS: #. data/base/stats/features.json: $.Powlab.name -#: po/custom/fromJson.txt:4539 +#: po/custom/fromJson.txt:4541 msgid "Powerlab" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_ST_FCY1.text[2] #. data/mp/messages/resmessages1.json: $.RES_ST_FCY1.text[2] -#: po/custom/fromJson.txt:4547 +#: po/custom/fromJson.txt:4549 msgid "Produces Cyborgs" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_SY_RESU4.text[3] -#: po/custom/fromJson.txt:4556 +#: po/custom/fromJson.txt:4558 msgid "Professional and Regular rank units are protected" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_V_B11.text[0] #. data/mp/messages/resmessages1.json: $.RES_V_B11.text[0] -#: po/custom/fromJson.txt:4560 +#: po/custom/fromJson.txt:4562 msgid "Project Heavy Body" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_V_B01.text[0] #. data/mp/messages/resmessages1.json: $.RES_V_B01.text[0] -#: po/custom/fromJson.txt:4564 +#: po/custom/fromJson.txt:4566 msgid "Project Light Body" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_V_B05.text[0] #. data/mp/messages/resmessages1.json: $.RES_V_B05.text[0] -#: po/custom/fromJson.txt:4568 +#: po/custom/fromJson.txt:4570 msgid "Project Medium Body" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_W_FL_D1.text[1] #. data/mp/messages/resmessages1.json: $.RES_W_FL_D1.text[1] -#: po/custom/fromJson.txt:4572 +#: po/custom/fromJson.txt:4574 msgid "Propylene Oxide gel treated to burn at higher temperatures" msgstr "" #. TRANSLATORS: #. data/mp/multiplay/skirmish/semperfi.json: $.AI.tip -#: po/custom/fromJson.txt:4580 +#: po/custom/fromJson.txt:4582 msgid "Prototypical AI focusing on rockets/missiles" msgstr "" @@ -12244,63 +12247,63 @@ msgstr "" #. data/base/stats/research.json: $.R-Defense-PulseLas.name #. data/base/stats/structure.json: $.Emplacement-PulseLaser.name #. data/mp/stats/structure.json: $.Emplacement-PulseLaser.name -#: po/custom/fromJson.txt:4585 +#: po/custom/fromJson.txt:4587 msgid "Pulse Laser Emplacement" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Defense-WallTower-PulseLas.name #. data/mp/stats/structure.json: $.WallTower-PulseLas.name -#: po/custom/fromJson.txt:4589 +#: po/custom/fromJson.txt:4591 msgid "Pulse Laser Hardpoint" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.LeopardHoverPulseLas.name -#: po/custom/fromJson.txt:4592 +#: po/custom/fromJson.txt:4594 msgid "Pulse Laser Leopard Hover" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.A-Mantis-Trk-Pulse.name -#: po/custom/fromJson.txt:4595 +#: po/custom/fromJson.txt:4597 msgid "Pulse Laser Mantis Tracks" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.PantherHoverPulseLas.name -#: po/custom/fromJson.txt:4598 +#: po/custom/fromJson.txt:4600 msgid "Pulse Laser Panther Hover" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.PythonPulseTracks.name -#: po/custom/fromJson.txt:4601 +#: po/custom/fromJson.txt:4603 msgid "Pulse Laser Python Tracks" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.TigerHoverPulseLas.name -#: po/custom/fromJson.txt:4604 +#: po/custom/fromJson.txt:4606 msgid "Pulse Laser Tiger Hover" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.TigerPulseTracks.name -#: po/custom/fromJson.txt:4607 +#: po/custom/fromJson.txt:4609 msgid "Pulse Laser Tiger Tracks" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Defense-PulseLas.name #. data/mp/stats/structure.json: $.GuardTower-BeamLas.name -#: po/custom/fromJson.txt:4611 +#: po/custom/fromJson.txt:4613 msgid "Pulse Laser Tower" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.WyvernPulseTracks.name -#: po/custom/fromJson.txt:4614 +#: po/custom/fromJson.txt:4616 msgid "Pulse Laser Wyvern Tracks" msgstr "" @@ -12309,65 +12312,65 @@ msgstr "" #. data/base/stats/weapons.json: $.Laser2PULSEMk1.name #. data/mp/stats/research.json: $.R-Wpn-Laser02.name #. data/mp/stats/weapons.json: $.Laser2PULSEMk1.name -#: po/custom/fromJson.txt:4620 +#: po/custom/fromJson.txt:4622 msgid "Pulse Laser" msgstr "" #. TRANSLATORS: #. data/base/stats/templates.json: $.P0PythonHvyCnTrks.name -#: po/custom/fromJson.txt:4623 +#: po/custom/fromJson.txt:4625 msgid "Python Heavy Cannon Tracks" msgstr "" #. TRANSLATORS: #. data/base/stats/body.json: $.Body11ABT.name #. data/mp/stats/body.json: $.Body11ABT.name -#: po/custom/fromJson.txt:4627 +#: po/custom/fromJson.txt:4629 msgid "Python" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_WT_DOUBLEAA2.text[1] -#: po/custom/fromJson.txt:4635 +#: po/custom/fromJson.txt:4637 msgid "Quad 80mm Anti-Aircraft cannon" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_W_SMS_ROF1.text[1] #. data/mp/messages/resmessages3.json: $.RES_W_SMS_ROF1.text[1] -#: po/custom/fromJson.txt:4643 +#: po/custom/fromJson.txt:4645 msgid "Racked missile dispensers allow for fast reloading" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_SY_RDST1.text[2] -#: po/custom/fromJson.txt:4646 +#: po/custom/fromJson.txt:4648 msgid "Radar detector detects enemy sensors" msgstr "" #. TRANSLATORS: #. data/mp/stats/structure.json: $.Sys-RadarDetector01.name -#: po/custom/fromJson.txt:4649 +#: po/custom/fromJson.txt:4651 msgid "Radar Detector Tower" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Sys-RadarDetector01.name #. data/mp/stats/sensor.json: $.RadarDetector.name -#: po/custom/fromJson.txt:4653 +#: po/custom/fromJson.txt:4655 msgid "Radar Detector" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessages3.json: $.RES_W_RAIL_AC1.text[2] -#: po/custom/fromJson.txt:4657 +#: po/custom/fromJson.txt:4659 #, no-c-format msgid "Rail Gun accuracy +10%" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessages3.json: $.RES_W_RAIL_D1.text[2] -#: po/custom/fromJson.txt:4661 +#: po/custom/fromJson.txt:4663 #, no-c-format msgid "Rail Gun damage +25%" msgstr "" @@ -12375,14 +12378,14 @@ msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Defense-Rail2.name #. data/mp/stats/research.json: $.R-Defense-Rail2.name -#: po/custom/fromJson.txt:4665 +#: po/custom/fromJson.txt:4667 msgid "Rail Gun Emplacement" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_W_RAIL2.text[1] #. data/mp/messages/resmessages3.json: $.RES_W_RAIL2.text[1] -#: po/custom/fromJson.txt:4669 +#: po/custom/fromJson.txt:4671 msgid "Rail gun firing armor-piercing darts" msgstr "" @@ -12391,19 +12394,19 @@ msgstr "" #. data/base/stats/structure.json: $.WallTower-Rail2.name #. data/mp/stats/research.json: $.R-Defense-WallTower-Rail2.name #. data/mp/stats/structure.json: $.WallTower-Rail2.name -#: po/custom/fromJson.txt:4675 +#: po/custom/fromJson.txt:4677 msgid "Rail Gun Hardpoint" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.A-Mantis-Trk-Rail.name -#: po/custom/fromJson.txt:4678 +#: po/custom/fromJson.txt:4680 msgid "Rail Gun Mantis Tracks" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessages3.json: $.RES_W_RAIL_ROF1.text[2] -#: po/custom/fromJson.txt:4682 +#: po/custom/fromJson.txt:4684 #, no-c-format msgid "Rail Gun reload time -15%" msgstr "" @@ -12411,27 +12414,27 @@ msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Rail-ROF02.name #. data/mp/stats/research.json: $.R-Wpn-Rail-ROF02.name -#: po/custom/fromJson.txt:4686 +#: po/custom/fromJson.txt:4688 msgid "Rail Gun ROF Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Rail-ROF03.name #. data/mp/stats/research.json: $.R-Wpn-Rail-ROF03.name -#: po/custom/fromJson.txt:4690 +#: po/custom/fromJson.txt:4692 msgid "Rail Gun ROF Mk3" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Rail-ROF01.name #. data/mp/stats/research.json: $.R-Wpn-Rail-ROF01.name -#: po/custom/fromJson.txt:4694 +#: po/custom/fromJson.txt:4696 msgid "Rail Gun ROF" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.TigerHoverRailGun.name -#: po/custom/fromJson.txt:4697 +#: po/custom/fromJson.txt:4699 msgid "Rail Gun Tiger Hover" msgstr "" @@ -12440,7 +12443,7 @@ msgstr "" #. data/base/messages/resmessages3.json: $.RES_W_RAIL_D1.text[0] #. data/base/messages/resmessages3.json: $.RES_W_RAIL_ROF1.text[0] #. ... + 3 refs -#: po/custom/fromJson.txt:4703 +#: po/custom/fromJson.txt:4705 msgid "Rail Gun Upgrade" msgstr "" @@ -12449,59 +12452,59 @@ msgstr "" #. data/base/stats/weapons.json: $.RailGun2Mk1.name #. data/mp/stats/research.json: $.R-Wpn-RailGun02.name #. data/mp/stats/weapons.json: $.RailGun2Mk1.name -#: po/custom/fromJson.txt:4709 +#: po/custom/fromJson.txt:4711 msgid "Rail Gun" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Wpn-Rail-Accuracy01.name -#: po/custom/fromJson.txt:4712 +#: po/custom/fromJson.txt:4714 msgid "Rail Target Prediction Computer" msgstr "" #. TRANSLATORS: #. data/base/stats/structure.json: $.Emplacement-Rail2.name #. data/mp/stats/structure.json: $.Emplacement-Rail2.name -#: po/custom/fromJson.txt:4716 +#: po/custom/fromJson.txt:4718 msgid "Railgun Emplacement" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-MG-ROF02.name -#: po/custom/fromJson.txt:4719 +#: po/custom/fromJson.txt:4721 msgid "Rapid Fire Chaingun Upgrade" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Wpn-MG-ROF02.name -#: po/custom/fromJson.txt:4722 +#: po/custom/fromJson.txt:4724 msgid "Rapid Fire Chaingun" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_W_RAIL1.text[1] #. data/mp/messages/resmessages3.json: $.RES_W_RAIL1.text[1] -#: po/custom/fromJson.txt:4726 +#: po/custom/fromJson.txt:4728 msgid "Rapid fire rail gun firing needle darts" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages23.json: $.RES_W_SRK_ROF4.text[1] -#: po/custom/fromJson.txt:4729 +#: po/custom/fromJson.txt:4731 msgid "Rapid Loader increases reload rate" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessages2.json: $.RES_ST_VPU1.text[2] #. data/mp/messages/resmessages3.json: $.RES_ST_VPU4.text[2] -#: po/custom/fromJson.txt:4734 +#: po/custom/fromJson.txt:4736 #, no-c-format msgid "Rearming speed +30%" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Flamer-Range01-ScavReduce.name -#: po/custom/fromJson.txt:4741 +#: po/custom/fromJson.txt:4743 msgid "Reduce Scavenger Flamer Range" msgstr "" @@ -12510,26 +12513,26 @@ msgstr "" #. data/base/messages/resmessages3.json: $.RES_SY_RESU2.text[2] #. data/base/messages/resmessages3.json: $.RES_SY_RESU3.text[2] #. ... + 3 refs -#: po/custom/fromJson.txt:4747 +#: po/custom/fromJson.txt:4749 msgid "Reduced chance of NEXUS take-over" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessagesall.json: $.RES_ST_VP.text[1] #. data/mp/messages/resmessagesall.json: $.RES_ST_VP.text[1] -#: po/custom/fromJson.txt:4755 +#: po/custom/fromJson.txt:4757 msgid "Refuels, rearms and repairs VTOLs" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Struc-Materials02.name -#: po/custom/fromJson.txt:4758 +#: po/custom/fromJson.txt:4760 msgid "Reinforced Base Structure Materials Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Struc-Materials03.name -#: po/custom/fromJson.txt:4761 +#: po/custom/fromJson.txt:4763 msgid "Reinforced Base Structure Materials Mk3" msgstr "" @@ -12538,19 +12541,19 @@ msgstr "" #. data/base/stats/research.json: $.R-Struc-Materials01.name #. data/mp/messages/resmessages1.json: $.RES_ST_MAT1.text[1] #. data/mp/stats/research.json: $.R-Struc-Materials01.name -#: po/custom/fromJson.txt:4767 +#: po/custom/fromJson.txt:4769 msgid "Reinforced Base Structure Materials" msgstr "" #. TRANSLATORS: #. data/mp/stats/ecm.json: $.RepairCentre.name -#: po/custom/fromJson.txt:4778 +#: po/custom/fromJson.txt:4780 msgid "Repair Center Turret" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.P0CobraRepairTrks.name -#: po/custom/fromJson.txt:4781 +#: po/custom/fromJson.txt:4783 msgid "Repair Cobra Tracks" msgstr "" @@ -12559,13 +12562,13 @@ msgstr "" #. data/base/stats/structure.json: $.A0RepairCentre3.name #. data/mp/stats/research.json: $.R-Struc-RepairFacility.name #. data/mp/stats/structure.json: $.A0RepairCentre3.name -#: po/custom/fromJson.txt:4793 +#: po/custom/fromJson.txt:4795 msgid "Repair Facility" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.ScorpRepairTrk.name -#: po/custom/fromJson.txt:4796 +#: po/custom/fromJson.txt:4798 msgid "Repair Scorpion Tracks" msgstr "" @@ -12573,7 +12576,7 @@ msgstr "" #. data/mp/messages/resmessages1.json: $.RES_ST_RFU1.text[2] #. data/mp/messages/resmessages2.json: $.RES_ST_RFU4.text[2] #. data/mp/messages/resmessages3.json: $.RES_ST_RFU7.text[2] -#: po/custom/fromJson.txt:4802 +#: po/custom/fromJson.txt:4804 #, no-c-format msgid "Repair Speed +100%" msgstr "" @@ -12581,39 +12584,39 @@ msgstr "" #. TRANSLATORS: #. data/base/stats/templates.json: $.P0CobraRepairTrks.name #. data/mp/stats/templates.json: $.A-Rep-Cobra-Trk.name -#: po/custom/fromJson.txt:4806 +#: po/custom/fromJson.txt:4808 msgid "Repair Turret Cobra Tracks" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.A-Rep-Mantis-Trk.name -#: po/custom/fromJson.txt:4809 +#: po/custom/fromJson.txt:4811 msgid "Repair Turret Mantis Tracks" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.ViperRepairHalftrack.name -#: po/custom/fromJson.txt:4812 +#: po/custom/fromJson.txt:4814 msgid "Repair Turret Viper Half-track" msgstr "" #. TRANSLATORS: #. data/base/stats/templates.json: $.ViperRepairHalftrack.name -#: po/custom/fromJson.txt:4815 +#: po/custom/fromJson.txt:4817 msgid "Repair Turret Viper Half-tracks" msgstr "" #. TRANSLATORS: #. data/base/stats/templates.json: $.ViperRepairWheels.name #. data/mp/stats/templates.json: $.ViperRepairWheels.name -#: po/custom/fromJson.txt:4819 +#: po/custom/fromJson.txt:4821 msgid "Repair Turret Viper Wheels" msgstr "" #. TRANSLATORS: #. data/base/stats/repair.json: $.LightRepair1.name #. data/mp/stats/repair.json: $.LightRepair1.name -#: po/custom/fromJson.txt:4823 +#: po/custom/fromJson.txt:4825 msgid "Repair Turret" msgstr "" @@ -12622,21 +12625,21 @@ msgstr "" #. data/mp/messages/resmessages23.json: $.RES_W_MG4.text[3] #. data/mp/messages/resmessagesall.json: $.RES_WT_TWINAGHP.text[3] #. data/mp/messages/resmessagesall.json: $.RES_WT_TWINAGUN.text[3] -#: po/custom/fromJson.txt:4829 +#: po/custom/fromJson.txt:4831 msgid "Replaces all machineguns" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_CYJ_LS1.text[3] #. data/mp/messages/resmessages3.json: $.RES_CYJ_LS1.text[3] -#: po/custom/fromJson.txt:4846 +#: po/custom/fromJson.txt:4848 msgid "Requires cyborg factory to produce" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_CYTRANS.text[3] #. data/mp/messages/resmessagesall.json: $.RES_SUPERTRANS.text[3] -#: po/custom/fromJson.txt:4850 +#: po/custom/fromJson.txt:4852 msgid "Requires heavy VTOL factory to produce" msgstr "" @@ -12645,35 +12648,35 @@ msgstr "" #. data/base/messages/resmessages23.json: $.RES_ENGIN2.text[0] #. data/base/messages/resmessages3.json: $.RES_ENGIN3.text[0] #. ... + 3 refs -#: po/custom/fromJson.txt:4856 +#: po/custom/fromJson.txt:4858 msgid "Research Breakthrough Improves Construction Rates" msgstr "" #. TRANSLATORS: #. data/base/stats/structure.json: $.A0ResearchFacility.name #. data/mp/stats/structure.json: $.A0ResearchFacility.name -#: po/custom/fromJson.txt:4860 +#: po/custom/fromJson.txt:4862 msgid "Research Facility" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_ST_FCY1.text[3] #. data/mp/messages/resmessages1.json: $.RES_ST_FCY1.text[3] -#: po/custom/fromJson.txt:4870 +#: po/custom/fromJson.txt:4872 msgid "Research makes additional Cyborgs available" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_ST_RM1.text[0] #. data/mp/messages/resmessages1.json: $.RES_ST_RM1.text[0] -#: po/custom/fromJson.txt:4874 +#: po/custom/fromJson.txt:4876 msgid "Research Module Available" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_ST_RM1.text[1] #. data/mp/messages/resmessages1.json: $.RES_ST_RM1.text[1] -#: po/custom/fromJson.txt:4878 +#: po/custom/fromJson.txt:4880 msgid "Research module expands research facilities" msgstr "" @@ -12682,7 +12685,7 @@ msgstr "" #. data/base/stats/structure.json: $.A0ResearchModule1.name #. data/mp/stats/research.json: $.R-Struc-Research-Module.name #. data/mp/stats/structure.json: $.A0ResearchModule1.name -#: po/custom/fromJson.txt:4884 +#: po/custom/fromJson.txt:4886 msgid "Research Module" msgstr "" @@ -12690,14 +12693,14 @@ msgstr "" #. data/mp/messages/resmessages1.json: $.RES_ST_RU1.text[2] #. data/mp/messages/resmessages2.json: $.RES_ST_RU4.text[2] #. data/mp/messages/resmessages3.json: $.RES_ST_RU7.text[2] -#: po/custom/fromJson.txt:4890 +#: po/custom/fromJson.txt:4892 #, no-c-format msgid "Research speed +30%" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessages1.json: $.RES_ST_RM1.text[2] -#: po/custom/fromJson.txt:4894 +#: po/custom/fromJson.txt:4896 #, no-c-format msgid "Research speed +85%" msgstr "" @@ -12705,14 +12708,14 @@ msgstr "" #. TRANSLATORS: #. data/base/stats/body.json: $.Body3MBT.name #. data/mp/stats/body.json: $.Body3MBT.name -#: po/custom/fromJson.txt:4898 +#: po/custom/fromJson.txt:4900 msgid "Retaliation" msgstr "" #. TRANSLATORS: #. data/base/stats/body.json: $.Body7ABT.name #. data/mp/stats/body.json: $.Body7ABT.name -#: po/custom/fromJson.txt:4902 +#: po/custom/fromJson.txt:4904 msgid "Retribution" msgstr "" @@ -12721,13 +12724,13 @@ msgstr "" #. data/base/stats/structure.json: $.Emplacement-Rocket06-IDF.name #. data/mp/stats/research.json: $.R-Defense-IDFRocket.name #. data/mp/stats/structure.json: $.Emplacement-Rocket06-IDF.name -#: po/custom/fromJson.txt:4908 +#: po/custom/fromJson.txt:4910 msgid "Ripple Rocket Battery" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-RocketSlow-ROFRR01.name -#: po/custom/fromJson.txt:4911 +#: po/custom/fromJson.txt:4913 msgid "Ripple Rocket Rapid Loader" msgstr "" @@ -12736,32 +12739,32 @@ msgstr "" #. data/base/stats/weapons.json: $.Rocket-IDF.name #. data/mp/stats/research.json: $.R-Wpn-Rocket06-IDF.name #. data/mp/stats/weapons.json: $.Rocket-IDF.name -#: po/custom/fromJson.txt:4917 +#: po/custom/fromJson.txt:4919 msgid "Ripple Rockets" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages23.json: $.RES_W_MG_ROF3.text[1] #. data/mp/messages/resmessages23.json: $.RES_W_MG_ROF3.text[1] -#: po/custom/fromJson.txt:4921 +#: po/custom/fromJson.txt:4923 msgid "Robotic advances make new chaingun upgrade available" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Struc-Factory-Upgrade05.name -#: po/custom/fromJson.txt:4928 +#: po/custom/fromJson.txt:4930 msgid "Robotic Factory Production Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Struc-Factory-Upgrade06.name -#: po/custom/fromJson.txt:4931 +#: po/custom/fromJson.txt:4933 msgid "Robotic Factory Production Mk3" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Struc-Factory-Upgrade04.name -#: po/custom/fromJson.txt:4934 +#: po/custom/fromJson.txt:4936 msgid "Robotic Factory Production" msgstr "" @@ -12770,51 +12773,51 @@ msgstr "" #. data/base/messages/resmessages3.json: $.RES_W_HOWRF4.text[1] #. data/base/messages/resmessages3.json: $.RES_W_M_ROF4.text[1] #. ... + 3 refs -#: po/custom/fromJson.txt:4940 +#: po/custom/fromJson.txt:4942 msgid "Robotic loading system feeds rounds into breech" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Struc-Factory-Upgrade04.name -#: po/custom/fromJson.txt:4943 +#: po/custom/fromJson.txt:4945 msgid "Robotic Manufacturing" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Struc-RprFac-Upgrade05.name -#: po/custom/fromJson.txt:4946 +#: po/custom/fromJson.txt:4948 msgid "Robotic Repair Facility Upgrade Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Struc-RprFac-Upgrade06.name -#: po/custom/fromJson.txt:4949 +#: po/custom/fromJson.txt:4951 msgid "Robotic Repair Facility Upgrade Mk3" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Struc-RprFac-Upgrade04.name -#: po/custom/fromJson.txt:4952 +#: po/custom/fromJson.txt:4954 msgid "Robotic Repair Facility Upgrade" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Struc-RprFac-Upgrade04.name -#: po/custom/fromJson.txt:4955 +#: po/custom/fromJson.txt:4957 msgid "Robotic Repair Facility" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Struc-VTOLPad-Upgrade05.name #. data/mp/stats/research.json: $.R-Struc-VTOLPad-Upgrade05.name -#: po/custom/fromJson.txt:4963 +#: po/custom/fromJson.txt:4965 msgid "Robotic VTOL Rearming Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Struc-VTOLPad-Upgrade06.name #. data/mp/stats/research.json: $.R-Struc-VTOLPad-Upgrade06.name -#: po/custom/fromJson.txt:4967 +#: po/custom/fromJson.txt:4969 msgid "Robotic VTOL Rearming Mk3" msgstr "" @@ -12823,7 +12826,7 @@ msgstr "" #. data/base/stats/research.json: $.R-Struc-VTOLPad-Upgrade04.name #. data/mp/messages/resmessages3.json: $.RES_ST_VPU4.text[1] #. data/mp/stats/research.json: $.R-Struc-VTOLPad-Upgrade04.name -#: po/custom/fromJson.txt:4973 +#: po/custom/fromJson.txt:4975 msgid "Robotic VTOL Rearming" msgstr "" @@ -12832,7 +12835,7 @@ msgstr "" #. data/mp/messages/resmessages1.json: $.RES_W_SRK_AC1.text[2] #. data/mp/messages/resmessages12.json: $.RES_W_SRK_AC2.text[2] #. data/mp/messages/resmessagesall.json: $.RES_W_SRK_AC3.text[2] -#: po/custom/fromJson.txt:4980 +#: po/custom/fromJson.txt:4982 #, no-c-format msgid "Rocket accuracy +10%" msgstr "" @@ -12840,35 +12843,35 @@ msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages12.json: $.RES_W_RK_IDF.text[1] #. data/mp/messages/resmessages12.json: $.RES_W_RK_IDF.text[1] -#: po/custom/fromJson.txt:4984 +#: po/custom/fromJson.txt:4986 msgid "Rocket artillery; can be assigned to a sensor" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-RocketSlow-ROF02.name #. data/mp/stats/research.json: $.R-Wpn-Rocket-ROF02.name -#: po/custom/fromJson.txt:4988 +#: po/custom/fromJson.txt:4990 msgid "Rocket Autoloader Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-RocketSlow-ROF03.name #. data/mp/stats/research.json: $.R-Wpn-Rocket-ROF03.name -#: po/custom/fromJson.txt:4992 +#: po/custom/fromJson.txt:4994 msgid "Rocket Autoloader Mk3" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-RocketSlow-ROF01.name #. data/mp/stats/research.json: $.R-Wpn-Rocket-ROF01.name -#: po/custom/fromJson.txt:4996 +#: po/custom/fromJson.txt:4998 msgid "Rocket Autoloader" msgstr "" #. TRANSLATORS: #. data/base/stats/templates.json: $.BarbarianRKBuggy.name #. data/mp/stats/templates.json: $.BarbarianRKBuggy.name -#: po/custom/fromJson.txt:5000 +#: po/custom/fromJson.txt:5002 msgid "Rocket Buggy" msgstr "" @@ -12877,7 +12880,7 @@ msgstr "" #. data/mp/messages/resmessages1.json: $.RES_W_SRK_D1.text[2] #. data/mp/messages/resmessages2.json: $.RES_W_RK_D4.text[2] #. data/mp/messages/resmessages2.json: $.RES_W_SRK_D4.text[2] -#: po/custom/fromJson.txt:5007 +#: po/custom/fromJson.txt:5009 #, no-c-format msgid "Rocket damage +25%" msgstr "" @@ -12885,46 +12888,46 @@ msgstr "" #. TRANSLATORS: #. data/base/messages/resmessagesall.json: $.RES_W_SRK_AC3.text[1] #. data/mp/messages/resmessagesall.json: $.RES_W_SRK_AC3.text[1] -#: po/custom/fromJson.txt:5011 +#: po/custom/fromJson.txt:5013 msgid "Rocket detects and locks on to engine emissions" msgstr "" #. TRANSLATORS: #. data/base/stats/templates.json: $.BabaRKJeep.name #. data/mp/stats/templates.json: $.BabaRKJeep.name -#: po/custom/fromJson.txt:5015 +#: po/custom/fromJson.txt:5017 msgid "Rocket Jeep" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-RocketSlow-Accuracy02.name #. data/mp/stats/research.json: $.R-Wpn-RocketSlow-Accuracy01.name -#: po/custom/fromJson.txt:5019 +#: po/custom/fromJson.txt:5021 msgid "Rocket Laser Designator" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-RocketSlow-ROF05.name -#: po/custom/fromJson.txt:5022 +#: po/custom/fromJson.txt:5024 msgid "Rocket Rapid Loader Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-RocketSlow-ROF06.name -#: po/custom/fromJson.txt:5025 +#: po/custom/fromJson.txt:5027 msgid "Rocket Rapid Loader Mk3" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-RocketSlow-ROF04.name -#: po/custom/fromJson.txt:5028 +#: po/custom/fromJson.txt:5030 msgid "Rocket Rapid Loader" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessages1.json: $.RES_W_RK_ROF1.text[2] #. data/mp/messages/resmessages12.json: $.RES_W_SRK_ROF1.text[2] -#: po/custom/fromJson.txt:5033 +#: po/custom/fromJson.txt:5035 #, no-c-format msgid "Rocket reload time -15%" msgstr "" @@ -12932,168 +12935,168 @@ msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages12.json: $.RES_W_SRK_AC2.text[1] #. data/mp/messages/resmessages12.json: $.RES_W_SRK_AC2.text[1] -#: po/custom/fromJson.txt:5037 +#: po/custom/fromJson.txt:5039 msgid "Rocket tracks the laser designator to the target" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Howitzer03-Rot.name #. data/mp/stats/research.json: $.R-Wpn-Howitzer03-Rot.name -#: po/custom/fromJson.txt:5047 +#: po/custom/fromJson.txt:5049 msgid "Rotary Howitzer - Hellstorm" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Defense-RotMG.name #. data/mp/stats/structure.json: $.Pillbox-RotMG.name -#: po/custom/fromJson.txt:5051 +#: po/custom/fromJson.txt:5053 msgid "Rotary MG Bunker" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Mortar3.name #. data/mp/stats/research.json: $.R-Wpn-Mortar3.name -#: po/custom/fromJson.txt:5055 +#: po/custom/fromJson.txt:5057 msgid "Rotary Mortar - Pepperpot" msgstr "" #. TRANSLATORS: #. data/base/stats/features.json: $.Rotarywepslab.name -#: po/custom/fromJson.txt:5058 +#: po/custom/fromJson.txt:5060 msgid "Rotaryweaponslab" msgstr "" #. TRANSLATORS: #. data/base/stats/features.json: $.BarbTechRuin.name -#: po/custom/fromJson.txt:5061 +#: po/custom/fromJson.txt:5063 msgid "Ruined Factory" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_EMP_SAM1.text[1] #. data/mp/messages/resmessages3.json: $.RES_EMP_SAM1.text[1] -#: po/custom/fromJson.txt:5065 +#: po/custom/fromJson.txt:5067 msgid "SAM site with Avenger missiles" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_EMP_SAM2.text[1] #. data/mp/messages/resmessages3.json: $.RES_EMP_SAM2.text[1] -#: po/custom/fromJson.txt:5069 +#: po/custom/fromJson.txt:5071 msgid "SAM site with Vindicator missiles" msgstr "" #. TRANSLATORS: #. data/base/stats/structure.json: $.A0BaBaRocketPitAT.name #. data/mp/stats/structure.json: $.A0BaBaRocketPitAT.name -#: po/custom/fromJson.txt:5077 +#: po/custom/fromJson.txt:5079 msgid "Scavenger AT-Rocket Pit" msgstr "" #. TRANSLATORS: #. data/base/stats/structure.json: $.A0BaBaBunker.name #. data/mp/stats/structure.json: $.A0BaBaBunker.name -#: po/custom/fromJson.txt:5081 +#: po/custom/fromJson.txt:5083 msgid "Scavenger Bunker" msgstr "" #. TRANSLATORS: #. data/mp/stats/structure.json: $.A0BaBaVtolFactory.name -#: po/custom/fromJson.txt:5084 +#: po/custom/fromJson.txt:5086 msgid "Scavenger Chopper Factory" msgstr "" #. TRANSLATORS: #. data/base/stats/structure.json: $.A0BabaCornerWall.name #. data/mp/stats/structure.json: $.A0BabaCornerWall.name -#: po/custom/fromJson.txt:5088 +#: po/custom/fromJson.txt:5090 msgid "Scavenger CornerWall" msgstr "" #. TRANSLATORS: #. data/base/stats/structure.json: $.A0BaBaFactory.name #. data/mp/stats/structure.json: $.A0BaBaFactory.name -#: po/custom/fromJson.txt:5092 +#: po/custom/fromJson.txt:5094 msgid "Scavenger Factory" msgstr "" #. TRANSLATORS: #. data/base/stats/structure.json: $.A0BaBaFlameTower.name #. data/mp/stats/structure.json: $.A0BaBaFlameTower.name -#: po/custom/fromJson.txt:5096 +#: po/custom/fromJson.txt:5098 msgid "Scavenger Flame Tower" msgstr "" #. TRANSLATORS: #. data/base/stats/structure.json: $.A0BaBaGunTower.name #. data/mp/stats/structure.json: $.A0BaBaGunTower.name -#: po/custom/fromJson.txt:5100 +#: po/custom/fromJson.txt:5102 msgid "Scavenger Gun Tower" msgstr "" #. TRANSLATORS: #. data/base/stats/structure.json: $.A0BaBaHorizontalWall.name #. data/mp/stats/structure.json: $.A0BaBaHorizontalWall.name -#: po/custom/fromJson.txt:5104 +#: po/custom/fromJson.txt:5106 msgid "Scavenger Horizontal Wall" msgstr "" #. TRANSLATORS: #. data/mp/stats/structure.json: $.bbaatow.name -#: po/custom/fromJson.txt:5107 +#: po/custom/fromJson.txt:5109 msgid "Scavenger MG tower" msgstr "" #. TRANSLATORS: #. data/mp/stats/weapons.json: $.bbaawep.name -#: po/custom/fromJson.txt:5110 +#: po/custom/fromJson.txt:5112 msgid "Scavenger Mounted MG" msgstr "" #. TRANSLATORS: #. data/base/stats/structure.json: $.A0BaBaPowerGenerator.name #. data/mp/stats/structure.json: $.A0BaBaPowerGenerator.name -#: po/custom/fromJson.txt:5114 +#: po/custom/fromJson.txt:5116 msgid "Scavenger Power Generator" msgstr "" #. TRANSLATORS: #. data/mp/stats/structure.json: $.ScavRepairCentre.name -#: po/custom/fromJson.txt:5117 +#: po/custom/fromJson.txt:5119 msgid "Scavenger Repair Center" msgstr "" #. TRANSLATORS: #. data/base/stats/structure.json: $.A0BaBaRocketPit.name #. data/mp/stats/structure.json: $.A0BaBaRocketPit.name -#: po/custom/fromJson.txt:5121 +#: po/custom/fromJson.txt:5123 msgid "Scavenger Rocket Pit" msgstr "" #. TRANSLATORS: #. data/base/stats/templates.json: $.BaBaPeople.name #. data/mp/stats/templates.json: $.BaBaPeople.name -#: po/custom/fromJson.txt:5125 +#: po/custom/fromJson.txt:5127 msgid "Scavenger" msgstr "" #. TRANSLATORS: #. data/mp/stats/weapons.json: $.ScavNEXUSlink.name -#: po/custom/fromJson.txt:5128 +#: po/custom/fromJson.txt:5130 msgid "scavengernexuslinkturret" msgstr "" #. TRANSLATORS: #. data/base/stats/templates.json: $.BabaBusCan.name #. data/mp/stats/templates.json: $.BabaBusCan.name -#: po/custom/fromJson.txt:5132 +#: po/custom/fromJson.txt:5134 msgid "School Bus" msgstr "" #. TRANSLATORS: #. data/base/stats/body.json: $.Body8MBT.name #. data/mp/stats/body.json: $.Body8MBT.name -#: po/custom/fromJson.txt:5136 +#: po/custom/fromJson.txt:5138 msgid "Scorpion" msgstr "" @@ -13102,19 +13105,19 @@ msgstr "" #. data/base/stats/templates.json: $.Cyb-Atmiss-GROUND.name #. data/mp/stats/templates.json: $.Cyb-Atmiss-GROUND.name #. data/mp/stats/templates.json: $.MP-Cyb-ATmiss-GRD.name -#: po/custom/fromJson.txt:5142 +#: po/custom/fromJson.txt:5144 msgid "Scourge Cyborg" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.Scourge-Mantis-H.name -#: po/custom/fromJson.txt:5145 +#: po/custom/fromJson.txt:5147 msgid "Scourge Mantis Hover" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.MantisScourgeTracks.name -#: po/custom/fromJson.txt:5148 +#: po/custom/fromJson.txt:5150 msgid "Scourge Mantis Tracks" msgstr "" @@ -13123,7 +13126,7 @@ msgstr "" #. data/base/stats/structure.json: $.WallTower-Atmiss.name #. data/mp/stats/research.json: $.R-Defense-WallTower-A-Tmiss.name #. data/mp/stats/structure.json: $.WallTower-Atmiss.name -#: po/custom/fromJson.txt:5154 +#: po/custom/fromJson.txt:5156 msgid "Scourge Missile Hardpoint" msgstr "" @@ -13132,13 +13135,13 @@ msgstr "" #. data/base/stats/structure.json: $.GuardTower-ATMiss.name #. data/mp/stats/research.json: $.R-Defense-GuardTower-ATMiss.name #. data/mp/stats/structure.json: $.GuardTower-ATMiss.name -#: po/custom/fromJson.txt:5160 +#: po/custom/fromJson.txt:5162 msgid "Scourge Missile Tower" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.WyvernScourgeTracks.name -#: po/custom/fromJson.txt:5163 +#: po/custom/fromJson.txt:5165 msgid "Scourge Missile Wyvern Tracks" msgstr "" @@ -13147,105 +13150,105 @@ msgstr "" #. data/base/stats/weapons.json: $.Missile-A-T.name #. data/mp/stats/research.json: $.R-Wpn-Missile2A-T.name #. data/mp/stats/weapons.json: $.Missile-A-T.name -#: po/custom/fromJson.txt:5169 +#: po/custom/fromJson.txt:5171 msgid "Scourge Missile" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.PythonScourgeTracks.name -#: po/custom/fromJson.txt:5172 +#: po/custom/fromJson.txt:5174 msgid "Scourge Python Tracks" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.SK-Retal-VTOL-Scourge.name -#: po/custom/fromJson.txt:5175 +#: po/custom/fromJson.txt:5177 msgid "Scourge Retaliation VTOL" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Sys-SpyTurret.name #. data/base/stats/weapons.json: $.SpyTurret01.name -#: po/custom/fromJson.txt:5179 +#: po/custom/fromJson.txt:5181 msgid "Scrambler Turret" msgstr "" #. TRANSLATORS: #. data/mp/multiplay/skirmish/nb_hover.json: $.AI.tip -#: po/custom/fromJson.txt:5182 +#: po/custom/fromJson.txt:5184 msgid "Sea map AI, based on NullBot" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Missile-Accuracy02.name #. data/mp/stats/research.json: $.R-Wpn-Missile-Accuracy02.name -#: po/custom/fromJson.txt:5186 +#: po/custom/fromJson.txt:5188 msgid "Search & Destroy Missiles" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages23.json: $.RES_SY_VSTU1.text[3] #. data/mp/messages/resmessages23.json: $.RES_SY_VSTU1.text[3] -#: po/custom/fromJson.txt:5193 +#: po/custom/fromJson.txt:5195 msgid "Select new targets to continue the VTOL strikes" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_W_M_AC3.text[1] #. data/mp/messages/resmessages3.json: $.RES_W_M_AC3.text[1] -#: po/custom/fromJson.txt:5203 +#: po/custom/fromJson.txt:5205 msgid "Self-guided rocket-powered shells" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Struc-Factory-Upgrade09.name -#: po/custom/fromJson.txt:5206 +#: po/custom/fromJson.txt:5208 msgid "Self-Replicating Manufacturing" msgstr "" #. TRANSLATORS: #. data/mp/multiplay/skirmish/semperfi.json: $.AI.name -#: po/custom/fromJson.txt:5209 +#: po/custom/fromJson.txt:5211 msgid "SemperFi" msgstr "" #. TRANSLATORS: #. data/base/stats/templates.json: $.CobraSensorHalftrack.name -#: po/custom/fromJson.txt:5212 +#: po/custom/fromJson.txt:5214 msgid "Sensor Cobra Half-tracks" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_SY_SU3.text[2] -#: po/custom/fromJson.txt:5216 +#: po/custom/fromJson.txt:5218 #, no-c-format msgid "Sensor Range +10%" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_SY_SU2.text[2] -#: po/custom/fromJson.txt:5220 +#: po/custom/fromJson.txt:5222 #, no-c-format msgid "Sensor Range +15%" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_SY_SU1.text[2] -#: po/custom/fromJson.txt:5224 +#: po/custom/fromJson.txt:5226 #, no-c-format msgid "Sensor Range +25%" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.CobraSensorHalftrack.name -#: po/custom/fromJson.txt:5233 +#: po/custom/fromJson.txt:5235 msgid "Sensor Turret Cobra Half-tracks" msgstr "" #. TRANSLATORS: #. data/base/stats/templates.json: $.ViperSensorWheels.name #. data/mp/stats/templates.json: $.ViperSensorWheels.name -#: po/custom/fromJson.txt:5237 +#: po/custom/fromJson.txt:5239 msgid "Sensor Turret Viper Wheels" msgstr "" @@ -13254,26 +13257,26 @@ msgstr "" #. data/base/stats/sensor.json: $.SensorTurret1Mk1.name #. data/mp/stats/research.json: $.R-Sys-Sensor-Turret01.name #. data/mp/stats/sensor.json: $.SensorTurret1Mk1.name -#: po/custom/fromJson.txt:5243 +#: po/custom/fromJson.txt:5245 msgid "Sensor Turret" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Sys-Sensor-Upgrade02.name -#: po/custom/fromJson.txt:5246 +#: po/custom/fromJson.txt:5248 msgid "Sensor Upgrade Mk2" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Sys-Sensor-Upgrade03.name -#: po/custom/fromJson.txt:5249 +#: po/custom/fromJson.txt:5251 msgid "Sensor Upgrade Mk3" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Sys-Sensor-Upgrade01.name #. data/mp/stats/research.json: $.R-Sys-Sensor-Upgrade01.name -#: po/custom/fromJson.txt:5253 +#: po/custom/fromJson.txt:5255 msgid "Sensor Upgrade" msgstr "" @@ -13282,53 +13285,53 @@ msgstr "" #. data/mp/messages/resmessagesall.json: $.RES_SY_SU1.text[0] #. data/mp/messages/resmessagesall.json: $.RES_SY_SU2.text[0] #. data/mp/messages/resmessagesall.json: $.RES_SY_SU3.text[0] -#: po/custom/fromJson.txt:5259 +#: po/custom/fromJson.txt:5261 msgid "Sensors Improved" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Wpn-MdArtMissile.name #. data/mp/stats/weapons.json: $.Missile-MdArt.name -#: po/custom/fromJson.txt:5263 +#: po/custom/fromJson.txt:5265 msgid "Seraph Missile Array" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Defense-MdArtMissile.name #. data/mp/stats/structure.json: $.Emplacement-MdART-pit.name -#: po/custom/fromJson.txt:5267 +#: po/custom/fromJson.txt:5269 msgid "Seraph Missile Battery" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages23.json: $.RES_W_M_AC2.text[1] #. data/mp/messages/resmessages23.json: $.RES_W_M_AC2.text[1] -#: po/custom/fromJson.txt:5271 +#: po/custom/fromJson.txt:5273 msgid "Shells detect and home to thermal heat signatures" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_V_B13.text[2] -#: po/custom/fromJson.txt:5274 +#: po/custom/fromJson.txt:5276 msgid "Slow moving Body" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessagesall.json: $.RES_V_B09.text[2] #. data/mp/messages/resmessagesall.json: $.RES_V_B09.text[2] -#: po/custom/fromJson.txt:5282 +#: po/custom/fromJson.txt:5284 msgid "Slower than Python" msgstr "" #. TRANSLATORS: #. data/base/stats/features.json: $.WallCornerSmashed.name -#: po/custom/fromJson.txt:5289 +#: po/custom/fromJson.txt:5291 msgid "Smashedcornerwall" msgstr "" #. TRANSLATORS: #. data/base/stats/features.json: $.WallSmashed.name -#: po/custom/fromJson.txt:5292 +#: po/custom/fromJson.txt:5294 msgid "Smashedwall" msgstr "" @@ -13336,7 +13339,7 @@ msgstr "" #. data/base/stats/research.json: $.R-Cyborg-Wpn-Cannon02.name #. data/base/stats/templates.json: $.CyborgCannon02Grd.name #. data/base/stats/weapons.json: $.CyborgCannon02.name -#: po/custom/fromJson.txt:5297 +#: po/custom/fromJson.txt:5299 msgid "Sniper Cyborg" msgstr "" @@ -13345,117 +13348,117 @@ msgstr "" #. data/base/messages/resmessages1.json: $.RES_V_P_W1.text[2] #. data/mp/messages/resmessages1.json: $.RES_V_P_H1.text[2] #. data/mp/messages/resmessages1.json: $.RES_V_P_W1.text[2] -#: po/custom/fromJson.txt:5303 +#: po/custom/fromJson.txt:5305 msgid "Speed: Fast" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_HALFT1.text[2] #. data/mp/messages/resmessages1.json: $.RES_HALFT1.text[2] -#: po/custom/fromJson.txt:5307 +#: po/custom/fromJson.txt:5309 msgid "Speed: Medium" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_TRACK1.text[2] #. data/mp/messages/resmessages1.json: $.RES_TRACK1.text[2] -#: po/custom/fromJson.txt:5311 +#: po/custom/fromJson.txt:5313 msgid "Speed: Slow" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessagesall.json: $.RES_V_P_V1.text[2] #. data/mp/messages/resmessagesall.json: $.RES_V_P_V1.text[2] -#: po/custom/fromJson.txt:5315 +#: po/custom/fromJson.txt:5317 msgid "Speed: VTOL" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Rocket-Accuracy02.name -#: po/custom/fromJson.txt:5318 +#: po/custom/fromJson.txt:5320 msgid "Stabilized Mini-Rockets Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Rocket-Accuracy01.name -#: po/custom/fromJson.txt:5321 +#: po/custom/fromJson.txt:5323 msgid "Stabilized Mini-Rockets" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Wpn-Rocket-Accuracy01.name -#: po/custom/fromJson.txt:5324 +#: po/custom/fromJson.txt:5326 msgid "Stabilized Rockets" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_SY_ST1.text[3] #. data/mp/messages/resmessages3.json: $.RES_SY_ST1.text[3] -#: po/custom/fromJson.txt:5328 +#: po/custom/fromJson.txt:5330 msgid "Steals technology from enemies" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_SY_SPT.text[3] -#: po/custom/fromJson.txt:5331 +#: po/custom/fromJson.txt:5333 msgid "Steals technology from structures and takes control of weapons" msgstr "" #. TRANSLATORS: #. data/base/stats/structure.json: $.GuardTower3.name -#: po/custom/fromJson.txt:5334 +#: po/custom/fromJson.txt:5336 msgid "Steel Heavy Machinegun Guard Tower" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_TOWER4.text[1] -#: po/custom/fromJson.txt:5337 +#: po/custom/fromJson.txt:5339 msgid "Steel tower with flamer" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_TOWER3.text[1] -#: po/custom/fromJson.txt:5340 +#: po/custom/fromJson.txt:5342 msgid "Steel tower with heavy machinegun" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_TOWER1.text[1] #. data/mp/messages/resmessages1.json: $.RES_TOWER1.text[1] -#: po/custom/fromJson.txt:5344 +#: po/custom/fromJson.txt:5346 msgid "Steel tower with machinegun" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_TOWER2.text[1] -#: po/custom/fromJson.txt:5347 +#: po/custom/fromJson.txt:5349 msgid "Steel tower with twin machinegun" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_SY_RESU5.text[3] -#: po/custom/fromJson.txt:5350 +#: po/custom/fromJson.txt:5352 msgid "Stops NEXUS take-over" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Wpn-AALaser.name #. data/mp/stats/weapons.json: $.AAGunLaser.name -#: po/custom/fromJson.txt:5354 +#: po/custom/fromJson.txt:5356 msgid "Stormbringer AA Laser" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Defense-AA-Laser.name #. data/mp/stats/structure.json: $.P0-AASite-Laser.name -#: po/custom/fromJson.txt:5358 +#: po/custom/fromJson.txt:5360 msgid "Stormbringer Emplacement" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages23.json: $.RES_SY_VSTW1.text[3] #. data/mp/messages/resmessages23.json: $.RES_SY_VSTW1.text[3] -#: po/custom/fromJson.txt:5362 +#: po/custom/fromJson.txt:5364 msgid "Strike mission continues until enemy destroyed or they retreat" msgstr "" @@ -13463,38 +13466,38 @@ msgstr "" #. data/mp/messages/resmessagesall.json: $.RES_C_CT2.text[0] #. data/mp/messages/resmessagesall.json: $.RES_C_CT3.text[0] #. data/mp/messages/resmessagesall.json: $.RES_C_CT4.text[0] -#: po/custom/fromJson.txt:5367 +#: po/custom/fromJson.txt:5369 msgid "Stronger Commander Turret Available for Design" msgstr "" #. TRANSLATORS: #. data/base/messages/messages.json: $.MSG1.text[0] -#: po/custom/fromJson.txt:5370 +#: po/custom/fromJson.txt:5372 msgid "Structure Research Completed" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Wpn-Sunburst.name -#: po/custom/fromJson.txt:5373 +#: po/custom/fromJson.txt:5375 msgid "Sunburst AA Rocket Array" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Defense-Sunburst.name #. data/mp/stats/structure.json: $.P0-AASite-Sunburst.name -#: po/custom/fromJson.txt:5377 +#: po/custom/fromJson.txt:5379 msgid "Sunburst AA Site" msgstr "" #. TRANSLATORS: #. data/mp/stats/weapons.json: $.Rocket-Sunburst.name -#: po/custom/fromJson.txt:5380 +#: po/custom/fromJson.txt:5382 msgid "Sunburst AA" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.Cyb-Hvy-Mcannon.name -#: po/custom/fromJson.txt:5388 +#: po/custom/fromJson.txt:5390 msgid "Super Heavy-Gunner Cyborg" msgstr "" @@ -13502,32 +13505,32 @@ msgstr "" #. data/mp/stats/research.json: $.R-Cyborg-Hvywpn-HPV.name #. data/mp/stats/templates.json: $.Cyb-Hvy-HPV.name #. data/mp/stats/weapons.json: $.Cyb-Hvywpn-HPV.name -#: po/custom/fromJson.txt:5397 +#: po/custom/fromJson.txt:5399 msgid "Super HVC Cyborg" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.Cyb-Hvy-RailGunner.name -#: po/custom/fromJson.txt:5405 +#: po/custom/fromJson.txt:5407 msgid "Super Rail-Gunner Cyborg" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_SUPERTRANS.text[0] -#: po/custom/fromJson.txt:5422 +#: po/custom/fromJson.txt:5424 msgid "Super Transport Available" msgstr "" #. TRANSLATORS: #. data/mp/stats/body.json: $.SuperTransportBody.name -#: po/custom/fromJson.txt:5425 +#: po/custom/fromJson.txt:5427 msgid "Super Transport Body" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-SuperTransport.name #. data/mp/stats/templates.json: $.SuperTransport.name -#: po/custom/fromJson.txt:5429 +#: po/custom/fromJson.txt:5431 #: src/design.cpp:1332 msgid "Super Transport" msgstr "" @@ -13535,21 +13538,21 @@ msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Defense-WallUpgrade05.name #. data/mp/stats/research.json: $.R-Defense-WallUpgrade05.name -#: po/custom/fromJson.txt:5437 +#: po/custom/fromJson.txt:5439 msgid "Supercrete Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Defense-WallUpgrade06.name #. data/mp/stats/research.json: $.R-Defense-WallUpgrade06.name -#: po/custom/fromJson.txt:5441 +#: po/custom/fromJson.txt:5443 msgid "Supercrete Mk3" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Defense-WallUpgrade04.name #. data/mp/stats/research.json: $.R-Defense-WallUpgrade04.name -#: po/custom/fromJson.txt:5445 +#: po/custom/fromJson.txt:5447 msgid "Supercrete" msgstr "" @@ -13558,67 +13561,67 @@ msgstr "" #. data/base/messages/resmessages3.json: $.RES_V_MET7.text[1] #. data/mp/messages/resmessages3.json: $.RES_CYMET7.text[1] #. data/mp/messages/resmessages3.json: $.RES_V_MET7.text[1] -#: po/custom/fromJson.txt:5451 +#: po/custom/fromJson.txt:5453 msgid "Superdense composite alloys and energy-absorbing fibres" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Vehicle-Metals08.name #. data/mp/stats/research.json: $.R-Vehicle-Metals08.name -#: po/custom/fromJson.txt:5455 +#: po/custom/fromJson.txt:5457 msgid "Superdense Composite Alloys Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Vehicle-Metals09.name #. data/mp/stats/research.json: $.R-Vehicle-Metals09.name -#: po/custom/fromJson.txt:5459 +#: po/custom/fromJson.txt:5461 msgid "Superdense Composite Alloys Mk3" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Vehicle-Metals07.name #. data/mp/stats/research.json: $.R-Vehicle-Metals07.name -#: po/custom/fromJson.txt:5463 +#: po/custom/fromJson.txt:5465 msgid "Superdense Composite Alloys" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Flamer-Damage05.name #. data/mp/stats/research.json: $.R-Wpn-Flamer-Damage05.name -#: po/custom/fromJson.txt:5467 +#: po/custom/fromJson.txt:5469 msgid "Superhot Flamer Gel Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Flamer-Damage06.name #. data/mp/stats/research.json: $.R-Wpn-Flamer-Damage06.name -#: po/custom/fromJson.txt:5471 +#: po/custom/fromJson.txt:5473 msgid "Superhot Flamer Gel Mk3" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Flamer-Damage04.name #. data/mp/stats/research.json: $.R-Wpn-Flamer-Damage04.name -#: po/custom/fromJson.txt:5475 +#: po/custom/fromJson.txt:5477 msgid "Superhot Flamer Gel" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Wpn-Flamer-Damage08.name -#: po/custom/fromJson.txt:5478 +#: po/custom/fromJson.txt:5480 msgid "Superhot Plasmite Gel Mk2" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Wpn-Flamer-Damage09.name -#: po/custom/fromJson.txt:5481 +#: po/custom/fromJson.txt:5483 msgid "Superhot Plasmite Gel Mk3" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Wpn-Flamer-Damage07.name -#: po/custom/fromJson.txt:5484 +#: po/custom/fromJson.txt:5486 msgid "Superhot Plasmite Gel" msgstr "" @@ -13626,42 +13629,42 @@ msgstr "" #. data/base/messages/resmessages3.json: $.RES_W_MS_LtSAM1.text[1] #. data/mp/messages/resmessages3.json: $.RES_W_MS_LtSAM1.text[1] #. data/mp/messages/resmessagesall.json: $.RES_MS_SAM1WT.text[1] -#: po/custom/fromJson.txt:5501 +#: po/custom/fromJson.txt:5503 msgid "Surface-to-air missile" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_C_SL1.text[1] #. data/mp/messages/resmessages1.json: $.RES_C_SL1.text[1] -#: po/custom/fromJson.txt:5505 +#: po/custom/fromJson.txt:5507 msgid "Synaptic Link allows humans to interface directly with computers" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Struc-Research-Upgrade02.name #. data/mp/stats/research.json: $.R-Struc-Research-Upgrade02.name -#: po/custom/fromJson.txt:5509 +#: po/custom/fromJson.txt:5511 msgid "Synaptic Link Data Analysis Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Struc-Research-Upgrade03.name #. data/mp/stats/research.json: $.R-Struc-Research-Upgrade03.name -#: po/custom/fromJson.txt:5513 +#: po/custom/fromJson.txt:5515 msgid "Synaptic Link Data Analysis Mk3" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Struc-Research-Upgrade01.name #. data/mp/stats/research.json: $.R-Struc-Research-Upgrade01.name -#: po/custom/fromJson.txt:5517 +#: po/custom/fromJson.txt:5519 msgid "Synaptic Link Data Analysis" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_ST_RU1.text[1] #. data/mp/messages/resmessages1.json: $.RES_ST_RU1.text[1] -#: po/custom/fromJson.txt:5521 +#: po/custom/fromJson.txt:5523 msgid "Synaptic link data analysis" msgstr "" @@ -13669,7 +13672,7 @@ msgstr "" #. data/base/messages/resmessages3.json: $.RES_SY_ST1.text[1] #. data/mp/messages/resmessages3.json: $.RES_SY_ST1.text[1] #. data/mp/messages/resmessagesall.json: $.RES_SY_SPT.text[1] -#: po/custom/fromJson.txt:5526 +#: po/custom/fromJson.txt:5528 msgid "Synaptic Link Scrambler technology" msgstr "" @@ -13678,26 +13681,26 @@ msgstr "" #. data/base/messages/resmessages3.json: $.RES_SY_ADEF.text[1] #. data/base/messages/resmessages3.json: $.RES_SY_ASTRUC.text[1] #. ... + 7 refs -#: po/custom/fromJson.txt:5532 +#: po/custom/fromJson.txt:5534 msgid "Synaptic Link technology breakthrough" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Comp-SynapticLink.name -#: po/custom/fromJson.txt:5535 +#: po/custom/fromJson.txt:5537 msgid "Synaptic Link" msgstr "" #. TRANSLATORS: #. data/base/messages/messages.json: $.MSG5.text[0] -#: po/custom/fromJson.txt:5538 +#: po/custom/fromJson.txt:5540 msgid "Systems Research Completed" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Cyborg-Wpn-Rocket02.name #. data/base/stats/templates.json: $.CyborgRkt02Ground.name -#: po/custom/fromJson.txt:5542 +#: po/custom/fromJson.txt:5544 msgid "Tank Killer Cyborg" msgstr "" @@ -13706,7 +13709,7 @@ msgstr "" #. data/base/stats/structure.json: $.Emplacement-HvyATrocket.name #. data/mp/stats/research.json: $.R-Defense-HvyA-Trocket.name #. data/mp/stats/structure.json: $.Emplacement-HvyATrocket.name -#: po/custom/fromJson.txt:5548 +#: po/custom/fromJson.txt:5550 msgid "Tank Killer Emplacement" msgstr "" @@ -13715,19 +13718,19 @@ msgstr "" #. data/base/stats/structure.json: $.WallTower-HvATrocket.name #. data/mp/stats/research.json: $.R-Defense-WallTower-HvyA-Trocket.name #. data/mp/stats/structure.json: $.WallTower-HvATrocket.name -#: po/custom/fromJson.txt:5554 +#: po/custom/fromJson.txt:5556 msgid "Tank Killer Hardpoint" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.TK-Mantis-H.name -#: po/custom/fromJson.txt:5557 +#: po/custom/fromJson.txt:5559 msgid "Tank Killer Mantis Hover" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.MantisTKTracks.name -#: po/custom/fromJson.txt:5560 +#: po/custom/fromJson.txt:5562 msgid "Tank Killer Mantis Tracks" msgstr "" @@ -13735,27 +13738,27 @@ msgstr "" #. data/base/stats/templates.json: $.P0cam3PyHvyATTrk.name #. data/mp/stats/templates.json: $.P0cam3PyHvyATTrk.name #. data/mp/stats/templates.json: $.PythonTKTracks.name -#: po/custom/fromJson.txt:5565 +#: po/custom/fromJson.txt:5567 msgid "Tank Killer Python Tracks" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Rocket07-Tank-Killer.name #. data/mp/stats/research.json: $.R-Wpn-Rocket07-Tank-Killer.name -#: po/custom/fromJson.txt:5569 +#: po/custom/fromJson.txt:5571 msgid "Tank Killer Rocket" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.A-Veng-Trk-TK.name -#: po/custom/fromJson.txt:5572 +#: po/custom/fromJson.txt:5574 msgid "Tank Killer Vengeance Tracks" msgstr "" #. TRANSLATORS: #. data/base/stats/weapons.json: $.Rocket-HvyA-T.name #. data/mp/stats/weapons.json: $.Rocket-HvyA-T.name -#: po/custom/fromJson.txt:5576 +#: po/custom/fromJson.txt:5578 msgid "Tank Killer" msgstr "" @@ -13764,90 +13767,90 @@ msgstr "" #. data/base/stats/structure.json: $.A0TankTrap.name #. data/base/stats/structure.json: $.TankTrapC.name #. ... + 3 refs -#: po/custom/fromJson.txt:5582 +#: po/custom/fromJson.txt:5584 msgid "Tank Traps" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Howitzer-Accuracy02.name #. data/mp/stats/research.json: $.R-Wpn-Howitzer-Accuracy02.name -#: po/custom/fromJson.txt:5586 +#: po/custom/fromJson.txt:5588 msgid "Target Acquisition Artillery Shells Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Howitzer-Accuracy01.name #. data/mp/stats/research.json: $.R-Wpn-Howitzer-Accuracy01.name -#: po/custom/fromJson.txt:5590 +#: po/custom/fromJson.txt:5592 msgid "Target Acquisition Artillery Shells" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Mortar-Acc03.name #. data/mp/stats/research.json: $.R-Wpn-Mortar-Acc03.name -#: po/custom/fromJson.txt:5594 +#: po/custom/fromJson.txt:5596 msgid "Target Acquisition Mortar Shells" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Howitzer-Accuracy03.name #. data/mp/stats/research.json: $.R-Wpn-Howitzer-Accuracy03.name -#: po/custom/fromJson.txt:5598 +#: po/custom/fromJson.txt:5600 msgid "Target Prediction Artillery Shells" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Rail-Accuracy01.name -#: po/custom/fromJson.txt:5601 +#: po/custom/fromJson.txt:5603 msgid "Target Prediction Computer" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Missile-Accuracy01.name #. data/mp/stats/research.json: $.R-Wpn-Missile-Accuracy01.name -#: po/custom/fromJson.txt:5605 +#: po/custom/fromJson.txt:5607 msgid "Target Prediction Missiles" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages12.json: $.RES_W_M_AC1.text[1] #. data/mp/messages/resmessages12.json: $.RES_W_M_AC1.text[1] -#: po/custom/fromJson.txt:5609 +#: po/custom/fromJson.txt:5611 msgid "Targeting systems compensate for distance and weather conditions" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessagesall.json: $.RES_ST_VP.text[3] #. data/mp/messages/resmessagesall.json: $.RES_ST_VP.text[3] -#: po/custom/fromJson.txt:5613 +#: po/custom/fromJson.txt:5615 msgid "The VTOL returns to the selected pad for rearming" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessages3.json: $.RES_CY_AH4.text[2] -#: po/custom/fromJson.txt:5617 +#: po/custom/fromJson.txt:5619 #, no-c-format msgid "Thermal Armor +35%" msgstr "" #. TRANSLATORS: -#. data/mp/messages/resmessages2.json: $.RES_V_AH1.text[2] -#: po/custom/fromJson.txt:5621 +#. data/mp/messages/resmessages3.json: $.RES_V_AH4.text[2] +#. data/mp/messages/resmessagesall.json: $.RES_V_AH7.text[2] +#: po/custom/fromJson.txt:5624 #, no-c-format -msgid "Thermal armor +40%" +msgid "Thermal Armor +40%" msgstr "" #. TRANSLATORS: -#. data/mp/messages/resmessages3.json: $.RES_V_AH4.text[2] -#. data/mp/messages/resmessagesall.json: $.RES_V_AH7.text[2] -#: po/custom/fromJson.txt:5626 +#. data/mp/messages/resmessages2.json: $.RES_V_AH1.text[2] +#: po/custom/fromJson.txt:5628 #, no-c-format -msgid "Thermal Armor +40%" +msgid "Thermal armor +40%" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessages2.json: $.RES_CY_AH1.text[2] -#: po/custom/fromJson.txt:5630 +#: po/custom/fromJson.txt:5632 #, no-c-format msgid "Thermal Armor +45%" msgstr "" @@ -13855,21 +13858,21 @@ msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Vehicle-Armor-Heat02.name #. data/mp/stats/research.json: $.R-Vehicle-Armor-Heat02.name -#: po/custom/fromJson.txt:5638 +#: po/custom/fromJson.txt:5640 msgid "Thermal Armor Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Vehicle-Armor-Heat03.name #. data/mp/stats/research.json: $.R-Vehicle-Armor-Heat03.name -#: po/custom/fromJson.txt:5642 +#: po/custom/fromJson.txt:5644 msgid "Thermal Armor Mk3" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Vehicle-Armor-Heat01.name #. data/mp/stats/research.json: $.R-Vehicle-Armor-Heat01.name -#: po/custom/fromJson.txt:5646 +#: po/custom/fromJson.txt:5648 #: src/spectatorwidgets.cpp:795 msgid "Thermal Armor" msgstr "" @@ -13877,127 +13880,127 @@ msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Mortar-Acc02.name #. data/mp/stats/research.json: $.R-Wpn-Mortar-Acc02.name -#: po/custom/fromJson.txt:5650 +#: po/custom/fromJson.txt:5652 msgid "Thermal Imaging Mortar Shells" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-RocketSlow-Accuracy03.name #. data/mp/stats/research.json: $.R-Wpn-RocketSlow-Accuracy02.name -#: po/custom/fromJson.txt:5654 +#: po/custom/fromJson.txt:5656 msgid "Thermal Imaging Rockets" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Bomb04.name #. data/mp/stats/research.json: $.R-Wpn-Bomb04.name -#: po/custom/fromJson.txt:5658 +#: po/custom/fromJson.txt:5660 msgid "Thermite Bomb Bay" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Cyborg-Wpn-Flamer02.name #. data/base/stats/templates.json: $.CyborgFlamer02Grd.name -#: po/custom/fromJson.txt:5662 +#: po/custom/fromJson.txt:5664 msgid "Thermite Cyborg" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.Cyb-Thermite.name -#: po/custom/fromJson.txt:5665 +#: po/custom/fromJson.txt:5667 msgid "Thermite Flamer Cyborg" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Energy-ROF02.name #. data/mp/stats/research.json: $.R-Wpn-Energy-ROF02.name -#: po/custom/fromJson.txt:5669 +#: po/custom/fromJson.txt:5671 msgid "Thermopole Energizer Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Energy-ROF03.name #. data/mp/stats/research.json: $.R-Wpn-Energy-ROF03.name -#: po/custom/fromJson.txt:5673 +#: po/custom/fromJson.txt:5675 msgid "Thermopole Energizer Mk3" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Energy-ROF01.name #. data/mp/stats/research.json: $.R-Wpn-Energy-ROF01.name -#: po/custom/fromJson.txt:5677 +#: po/custom/fromJson.txt:5679 msgid "Thermopole Energizer" msgstr "" #. TRANSLATORS: #. data/base/stats/body.json: $.Body9REC.name #. data/mp/stats/body.json: $.Body9REC.name -#: po/custom/fromJson.txt:5684 +#: po/custom/fromJson.txt:5686 msgid "Tiger" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_DF_HCW2.text[1] -#: po/custom/fromJson.txt:5687 +#: po/custom/fromJson.txt:5689 msgid "Titanium-reinforced concrete gate" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessagesall.json: $.RES_DF_HCW1.text[1] #. data/mp/messages/resmessagesall.json: $.RES_DF_HCW1.text[1] -#: po/custom/fromJson.txt:5691 +#: po/custom/fromJson.txt:5693 msgid "Titanium-reinforced concrete" msgstr "" #. TRANSLATORS: #. data/mp/multiplay/skirmish/nb_turtle.json: $.AI.tip -#: po/custom/fromJson.txt:5694 +#: po/custom/fromJson.txt:5696 msgid "Tower wars AI, based on NullBot" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Vehicle-Prop-Tracks.name #. data/mp/stats/research.json: $.R-Vehicle-Prop-Tracks.name -#: po/custom/fromJson.txt:5701 +#: po/custom/fromJson.txt:5703 msgid "Tracked Propulsion" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_W_SRK_AC1.text[1] #. data/mp/messages/resmessages1.json: $.RES_W_SRK_AC1.text[1] -#: po/custom/fromJson.txt:5705 +#: po/custom/fromJson.txt:5707 msgid "Tracks and directs in-flight rocket to target" msgstr "" #. TRANSLATORS: #. data/base/stats/propulsion.json: $.tracked02.name -#: po/custom/fromJson.txt:5708 +#: po/custom/fromJson.txt:5710 msgid "Tracks II" msgstr "" #. TRANSLATORS: #. data/base/stats/propulsion.json: $.tracked03.name -#: po/custom/fromJson.txt:5711 +#: po/custom/fromJson.txt:5713 msgid "Tracks III" msgstr "" #. TRANSLATORS: #. data/base/stats/propulsion.json: $.tracked01.name #. data/mp/stats/propulsion.json: $.tracked01.name -#: po/custom/fromJson.txt:5715 +#: po/custom/fromJson.txt:5717 msgid "Tracks" msgstr "" #. TRANSLATORS: #. data/base/stats/body.json: $.TransporterBody.name #. data/mp/stats/body.json: $.TransporterBody.name -#: po/custom/fromJson.txt:5719 +#: po/custom/fromJson.txt:5721 msgid "Transport Body" msgstr "" #. TRANSLATORS: #. data/base/stats/templates.json: $.Transporter.name -#: po/custom/fromJson.txt:5722 +#: po/custom/fromJson.txt:5724 #: src/design.cpp:1327 msgid "Transport" msgstr "" @@ -14005,25 +14008,25 @@ msgstr "" #. TRANSLATORS: #. data/base/stats/templates.json: $.BarbarianTrike.name #. data/mp/stats/templates.json: $.BarbarianTrike.name -#: po/custom/fromJson.txt:5726 +#: po/custom/fromJson.txt:5728 msgid "Trike" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.CobraHoverTruck.name -#: po/custom/fromJson.txt:5729 +#: po/custom/fromJson.txt:5731 msgid "Truck Cobra Hover" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.MantisHoverTruck.name -#: po/custom/fromJson.txt:5732 +#: po/custom/fromJson.txt:5734 msgid "Truck Mantis Hover" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.ScorpHoverTruck.name -#: po/custom/fromJson.txt:5735 +#: po/custom/fromJson.txt:5737 msgid "Truck Scorpion Hover" msgstr "" @@ -14032,89 +14035,89 @@ msgstr "" #. data/base/stats/templates.json: $.ConstructionDroid.name #. data/base/stats/templates.json: $.ConstructorDroid.name #. ... + 5 refs -#: po/custom/fromJson.txt:5741 +#: po/custom/fromJson.txt:5743 msgid "Truck" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-MG-Damage06.name #. data/mp/stats/research.json: $.R-Wpn-MG-Damage06.name -#: po/custom/fromJson.txt:5749 +#: po/custom/fromJson.txt:5751 msgid "Tungsten-Tipped MG Bullets Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-MG-Damage07.name #. data/mp/stats/research.json: $.R-Wpn-MG-Damage07.name -#: po/custom/fromJson.txt:5753 +#: po/custom/fromJson.txt:5755 msgid "Tungsten-Tipped MG Bullets Mk3" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-MG-Damage05.name #. data/mp/stats/research.json: $.R-Wpn-MG-Damage05.name -#: po/custom/fromJson.txt:5757 +#: po/custom/fromJson.txt:5759 msgid "Tungsten-Tipped MG Bullets" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Vehicle-Engine05.name #. data/mp/stats/research.json: $.R-Vehicle-Engine05.name -#: po/custom/fromJson.txt:5761 +#: po/custom/fromJson.txt:5763 msgid "Turbo-Charged Engine Mk2" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Vehicle-Engine06.name #. data/mp/stats/research.json: $.R-Vehicle-Engine06.name -#: po/custom/fromJson.txt:5765 +#: po/custom/fromJson.txt:5767 msgid "Turbo-Charged Engine Mk3" msgstr "" #. TRANSLATORS: #. data/mp/multiplay/skirmish/nb_turtle.json: $.AI.name -#: po/custom/fromJson.txt:5774 +#: po/custom/fromJson.txt:5776 msgid "Turtle AI" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_MG2MK1.text[1] #. data/mp/messages/resmessages1.json: $.RES_MG2MK1.text[1] -#: po/custom/fromJson.txt:5778 +#: po/custom/fromJson.txt:5780 msgid "Twin 7.62mm machineguns" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_WT_DOUBLEAA.text[1] -#: po/custom/fromJson.txt:5781 +#: po/custom/fromJson.txt:5783 msgid "Twin 80mm Anti-Aircraft cannon" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Defense-Cannon6.name #. data/mp/stats/structure.json: $.PillBox-Cannon6.name -#: po/custom/fromJson.txt:5789 +#: po/custom/fromJson.txt:5791 msgid "Twin Assault Cannon Bunker" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Wpn-Cannon6TwinAslt.name #. data/mp/stats/weapons.json: $.Cannon6TwinAslt.name -#: po/custom/fromJson.txt:5793 +#: po/custom/fromJson.txt:5795 msgid "Twin Assault Cannon" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Defense-WallTower-TwinAGun.name #. data/mp/stats/structure.json: $.WallTower-TwinAssaultGun.name -#: po/custom/fromJson.txt:5797 +#: po/custom/fromJson.txt:5799 msgid "Twin Assault Gun Hardpoint" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Wpn-MG5.name #. data/mp/stats/weapons.json: $.MG5TWINROTARY.name -#: po/custom/fromJson.txt:5801 +#: po/custom/fromJson.txt:5803 msgid "Twin Assault Gun" msgstr "" @@ -14123,7 +14126,7 @@ msgstr "" #. data/base/stats/weapons.json: $.MG2-Pillbox.name #. data/mp/stats/structure.json: $.PillBox2.name #. data/mp/stats/weapons.json: $.MG2-Pillbox.name -#: po/custom/fromJson.txt:5807 +#: po/custom/fromJson.txt:5809 msgid "Twin Machinegun Bunker" msgstr "" @@ -14131,26 +14134,26 @@ msgstr "" #. data/base/stats/research.json: $.R-Defense-Tower02.name #. data/base/stats/structure.json: $.GuardTower2.name #. data/mp/stats/structure.json: $.GuardTower2.name -#: po/custom/fromJson.txt:5812 +#: po/custom/fromJson.txt:5814 msgid "Twin Machinegun Guard Tower" msgstr "" #. TRANSLATORS: #. data/base/stats/weapons.json: $.MG2-Tower.name -#: po/custom/fromJson.txt:5815 +#: po/custom/fromJson.txt:5817 msgid "Twin Machinegun Tower" msgstr "" #. TRANSLATORS: #. data/base/stats/templates.json: $.ViperMG02Halftrack.name #. data/mp/stats/templates.json: $.ViperMG02Halftrack.name -#: po/custom/fromJson.txt:5819 +#: po/custom/fromJson.txt:5821 msgid "Twin Machinegun Viper Half-tracks" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.A-Viper-Trk-TMG.name -#: po/custom/fromJson.txt:5822 +#: po/custom/fromJson.txt:5824 msgid "Twin Machinegun Viper Tracks" msgstr "" @@ -14158,7 +14161,7 @@ msgstr "" #. data/base/stats/templates.json: $.ViperMG02Wheels.name #. data/mp/stats/templates.json: $.A-Viper-Wheels-TMG.name #. data/mp/stats/templates.json: $.ViperMG02Wheels.name -#: po/custom/fromJson.txt:5827 +#: po/custom/fromJson.txt:5829 msgid "Twin Machinegun Viper Wheels" msgstr "" @@ -14167,38 +14170,38 @@ msgstr "" #. data/base/stats/weapons.json: $.MG2Mk1.name #. data/mp/stats/research.json: $.R-Wpn-MG2Mk1.name #. data/mp/stats/weapons.json: $.MG2Mk1.name -#: po/custom/fromJson.txt:5833 +#: po/custom/fromJson.txt:5835 msgid "Twin Machinegun" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_W_AALAS.text[1] -#: po/custom/fromJson.txt:5836 +#: po/custom/fromJson.txt:5838 msgid "Twin Medium Anti-Aircraft Laser" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_WT_TWINAGHP.text[1] #. data/mp/messages/resmessagesall.json: $.RES_WT_TWINAGUN.text[1] -#: po/custom/fromJson.txt:5840 +#: po/custom/fromJson.txt:5842 msgid "Twin Multi-barrel, rapid-fire machinegun" msgstr "" #. TRANSLATORS: #. data/mp/challenges/two-faced.json: $.challenge.name -#: po/custom/fromJson.txt:5843 +#: po/custom/fromJson.txt:5845 msgid "Two-faced" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Wpn-Flamer-Range01-ScavReduce-Undo.name -#: po/custom/fromJson.txt:5846 +#: po/custom/fromJson.txt:5848 msgid "Undo Reduce Scavenger Flamer Range" msgstr "" #. TRANSLATORS: #. data/base/messages/messages.json: $.MSG4.text[0] -#: po/custom/fromJson.txt:5849 +#: po/custom/fromJson.txt:5851 msgid "Unit Research Completed" msgstr "" @@ -14206,92 +14209,92 @@ msgstr "" #. data/mp/messages/resmessagesall.json: $.RES_C_CT2.text[1] #. data/mp/messages/resmessagesall.json: $.RES_C_CT3.text[1] #. data/mp/messages/resmessagesall.json: $.RES_C_CT4.text[1] -#: po/custom/fromJson.txt:5854 +#: po/custom/fromJson.txt:5856 msgid "Upgraded battlefield computer system" msgstr "" #. TRANSLATORS: #. data/base/stats/sensor.json: $.UplinkSensor.name #. data/mp/stats/sensor.json: $.UplinkSensor.name -#: po/custom/fromJson.txt:5858 +#: po/custom/fromJson.txt:5860 msgid "Uplink Sensor" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_ST_FM1.text[3] #. data/mp/messages/resmessages1.json: $.RES_ST_FM1.text[3] -#: po/custom/fromJson.txt:5862 +#: po/custom/fromJson.txt:5864 msgid "Use a truck to add modules to a factory" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_POWMD1.text[3] #. data/mp/messages/resmessages1.json: $.RES_POWMD1.text[3] -#: po/custom/fromJson.txt:5866 +#: po/custom/fromJson.txt:5868 msgid "Use a truck to add the module to a power generator" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_ST_RM1.text[3] #. data/mp/messages/resmessages1.json: $.RES_ST_RM1.text[3] -#: po/custom/fromJson.txt:5870 +#: po/custom/fromJson.txt:5872 msgid "Use a truck to add the module to a research facility" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_REPAI1.text[2] #. data/mp/messages/resmessages1.json: $.RES_REPAI1.text[2] -#: po/custom/fromJson.txt:5874 +#: po/custom/fromJson.txt:5876 msgid "Use the Command Console to send units back for repair" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_EMP_CAN.text[1] -#: po/custom/fromJson.txt:5877 +#: po/custom/fromJson.txt:5879 msgid "Uses advanced cannon technology" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_EMP_MD.text[1] -#: po/custom/fromJson.txt:5880 +#: po/custom/fromJson.txt:5882 msgid "Uses advanced mass driver railgun technology" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_EMP_MSL.text[1] -#: po/custom/fromJson.txt:5883 +#: po/custom/fromJson.txt:5885 msgid "Uses advanced missile gun technology" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_EMP_RKT.text[1] -#: po/custom/fromJson.txt:5886 +#: po/custom/fromJson.txt:5888 msgid "Uses advanced rocket gun technology" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages3.json: $.RES_POWU2.text[2] #. data/mp/messages/resmessages3.json: $.RES_POWU2.text[1] -#: po/custom/fromJson.txt:5890 +#: po/custom/fromJson.txt:5892 msgid "Vapor Turbine boosts power output" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Struc-Power-Upgrade03.name -#: po/custom/fromJson.txt:5893 +#: po/custom/fromJson.txt:5895 msgid "Vapor Turbine Generator Mk2" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Struc-Power-Upgrade03a.name -#: po/custom/fromJson.txt:5896 +#: po/custom/fromJson.txt:5898 msgid "Vapor Turbine Generator Mk3" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Struc-Power-Upgrade02.name #. data/mp/stats/research.json: $.R-Struc-Power-Upgrade02.name -#: po/custom/fromJson.txt:5900 +#: po/custom/fromJson.txt:5902 msgid "Vapor Turbine Generator" msgstr "" @@ -14300,58 +14303,58 @@ msgstr "" #. data/mp/messages/resmessages2.json: $.RES_V_EN4.text[2] #. data/mp/messages/resmessages3.json: $.RES_V_EN10.text[2] #. data/mp/messages/resmessages3.json: $.RES_V_EN7.text[2] -#: po/custom/fromJson.txt:5930 +#: po/custom/fromJson.txt:5932 #, no-c-format msgid "Vehicle speed +5%" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Vehicle-Armor-Heat08.name -#: po/custom/fromJson.txt:5933 +#: po/custom/fromJson.txt:5935 msgid "Vehicle Superdense Thermal Armor Mk2" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Vehicle-Armor-Heat09.name -#: po/custom/fromJson.txt:5936 +#: po/custom/fromJson.txt:5938 msgid "Vehicle Superdense Thermal Armor Mk3" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Vehicle-Armor-Heat07.name -#: po/custom/fromJson.txt:5939 +#: po/custom/fromJson.txt:5941 msgid "Vehicle Superdense Thermal Armor" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.A-Veng-Trk-Guass.name -#: po/custom/fromJson.txt:5948 +#: po/custom/fromJson.txt:5950 msgid "Vengeance Tracks Gauss Cannon" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.A-Veng-Trk-Scourge.name -#: po/custom/fromJson.txt:5951 +#: po/custom/fromJson.txt:5953 msgid "Vengeance Tracks Gauss Scourge" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.A-Veng-Trk-Rail.name -#: po/custom/fromJson.txt:5954 +#: po/custom/fromJson.txt:5956 msgid "Vengeance Tracks Rail Gun" msgstr "" #. TRANSLATORS: #. data/base/stats/body.json: $.Body10MBT.name #. data/mp/stats/body.json: $.Body10MBT.name -#: po/custom/fromJson.txt:5958 +#: po/custom/fromJson.txt:5960 msgid "Vengeance" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessagesall.json: $.RES_V_P_V1.text[1] #. data/mp/messages/resmessagesall.json: $.RES_V_P_V1.text[1] -#: po/custom/fromJson.txt:5962 +#: po/custom/fromJson.txt:5964 msgid "Vertical Take Off and Landing Propulsion" msgstr "" @@ -14360,33 +14363,33 @@ msgstr "" #. data/mp/messages/resmessages3.json: $.RES_V_B10.text[3] #. data/mp/messages/resmessagesall.json: $.RES_V_B13.text[3] #. data/mp/messages/resmessagesall.json: $.RES_V_B14.text[3] -#: po/custom/fromJson.txt:5968 +#: po/custom/fromJson.txt:5970 msgid "Very expensive to produce" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages1.json: $.RES_V_B11.text[3] #. data/mp/messages/resmessages1.json: $.RES_V_B11.text[3] -#: po/custom/fromJson.txt:5972 +#: po/custom/fromJson.txt:5974 msgid "Very high power costs and very slow to produce" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_V_B14.text[2] -#: po/custom/fromJson.txt:5975 +#: po/custom/fromJson.txt:5977 msgid "Very slow moving Body" msgstr "" #. TRANSLATORS: #. data/mp/messages/resmessagesall.json: $.RES_W_LASSAT.text[1] -#: po/custom/fromJson.txt:5978 +#: po/custom/fromJson.txt:5980 msgid "Very slow recharge time" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Defense-WallTower-SamHvy.name #. data/mp/stats/structure.json: $.WallTower-SamHvy.name -#: po/custom/fromJson.txt:5982 +#: po/custom/fromJson.txt:5984 msgid "Vindicator Hardpoint" msgstr "" @@ -14395,7 +14398,7 @@ msgstr "" #. data/base/stats/structure.json: $.P0-AASite-SAM2.name #. data/mp/stats/research.json: $.R-Defense-SamSite2.name #. data/mp/stats/structure.json: $.P0-AASite-SAM2.name -#: po/custom/fromJson.txt:5988 +#: po/custom/fromJson.txt:5990 msgid "Vindicator SAM Site" msgstr "" @@ -14404,81 +14407,81 @@ msgstr "" #. data/base/stats/weapons.json: $.Missile-HvySAM.name #. data/mp/stats/research.json: $.R-Wpn-Missile-HvSAM.name #. data/mp/stats/weapons.json: $.Missile-HvySAM.name -#: po/custom/fromJson.txt:5994 +#: po/custom/fromJson.txt:5996 msgid "Vindicator SAM" msgstr "" #. TRANSLATORS: #. data/base/stats/body.json: $.Body1REC.name #. data/mp/stats/body.json: $.Body1REC.name -#: po/custom/fromJson.txt:5998 +#: po/custom/fromJson.txt:6000 msgid "Viper" msgstr "" #. TRANSLATORS: #. data/base/stats/weapons.json: $.Cannon5Vulcan-VTOL.name #. data/mp/stats/weapons.json: $.Cannon5Vulcan-VTOL.name -#: po/custom/fromJson.txt:6002 +#: po/custom/fromJson.txt:6004 msgid "VTOL Assault Cannon" msgstr "" #. TRANSLATORS: #. data/base/stats/weapons.json: $.MG4ROTARY-VTOL.name #. data/mp/stats/weapons.json: $.MG4ROTARY-VTOL.name -#: po/custom/fromJson.txt:6006 +#: po/custom/fromJson.txt:6008 msgid "VTOL Assault Gun" msgstr "" #. TRANSLATORS: #. data/mp/stats/structure.json: $.A0BaBaVtolPad.name -#: po/custom/fromJson.txt:6009 +#: po/custom/fromJson.txt:6011 msgid "VTOL BaBa Rearming Pad" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.V-Bug-BB.name -#: po/custom/fromJson.txt:6012 +#: po/custom/fromJson.txt:6014 msgid "VTOL Bunker Buster Bug VTOL" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.V-Scor-BB.name -#: po/custom/fromJson.txt:6015 +#: po/custom/fromJson.txt:6017 msgid "VTOL Bunker Buster Scorpion VTOL" msgstr "" #. TRANSLATORS: #. data/base/stats/weapons.json: $.Rocket-VTOL-BB.name #. data/mp/stats/weapons.json: $.Rocket-VTOL-BB.name -#: po/custom/fromJson.txt:6019 +#: po/custom/fromJson.txt:6021 msgid "VTOL Bunker Buster" msgstr "" #. TRANSLATORS: #. data/base/stats/weapons.json: $.Cannon1-VTOL.name #. data/mp/stats/weapons.json: $.Cannon1-VTOL.name -#: po/custom/fromJson.txt:6023 +#: po/custom/fromJson.txt:6025 msgid "VTOL Cannon" msgstr "" #. TRANSLATORS: #. data/base/stats/sensor.json: $.Sys-VTOLCBTower01.name #. data/mp/stats/sensor.json: $.Sys-VTOLCBTower01.name -#: po/custom/fromJson.txt:6033 +#: po/custom/fromJson.txt:6035 msgid "VTOL CB Radar Tower" msgstr "" #. TRANSLATORS: #. data/base/stats/sensor.json: $.Sys-VTOLCBTurret01.name #. data/mp/stats/sensor.json: $.Sys-VTOLCBTurret01.name -#: po/custom/fromJson.txt:6037 +#: po/custom/fromJson.txt:6039 msgid "VTOL CB Radar Turret" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages23.json: $.RES_SY_VCBSTW1.text[1] #. data/mp/messages/resmessages23.json: $.RES_SY_VCBSTW1.text[1] -#: po/custom/fromJson.txt:6041 +#: po/custom/fromJson.txt:6043 msgid "VTOL CB Tower detects enemy indirect fire batteries" msgstr "" @@ -14487,51 +14490,51 @@ msgstr "" #. data/base/stats/structure.json: $.Sys-VTOL-CB-Tower01.name #. data/mp/stats/research.json: $.R-Sys-VTOLCBS-Tower01.name #. data/mp/stats/structure.json: $.Sys-VTOL-CB-Tower01.name -#: po/custom/fromJson.txt:6047 +#: po/custom/fromJson.txt:6049 msgid "VTOL CB Tower" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Sys-VTOLCBS-Turret01.name #. data/mp/stats/research.json: $.R-Sys-VTOLCBS-Turret01.name -#: po/custom/fromJson.txt:6055 +#: po/custom/fromJson.txt:6057 msgid "VTOL CB Turret" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.V-Bug-ClusterBomb.name -#: po/custom/fromJson.txt:6058 +#: po/custom/fromJson.txt:6060 msgid "VTOL Cluster Bomb Bay Bug VTOL" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.V-Scor-ClusterBomb.name -#: po/custom/fromJson.txt:6061 +#: po/custom/fromJson.txt:6063 msgid "VTOL Cluster Bomb Bay Scorpion VTOL" msgstr "" #. TRANSLATORS: #. data/mp/stats/weapons.json: $.Bomb1-VTOL-LtHE.name -#: po/custom/fromJson.txt:6064 +#: po/custom/fromJson.txt:6066 msgid "VTOL Cluster Bomb Bay" msgstr "" #. TRANSLATORS: #. data/base/stats/weapons.json: $.Bomb1-VTOL-LtHE.name -#: po/custom/fromJson.txt:6067 +#: po/custom/fromJson.txt:6069 msgid "VTOL Cluster Bombs Bay" msgstr "" #. TRANSLATORS: #. data/mp/stats/weapons.json: $.Bomb6-VTOL-EMP.name -#: po/custom/fromJson.txt:6070 +#: po/custom/fromJson.txt:6072 msgid "VTOL EMP Missile Launcher" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessagesall.json: $.RES_ST_VF.text[1] #. data/mp/messages/resmessagesall.json: $.RES_ST_VF.text[1] -#: po/custom/fromJson.txt:6074 +#: po/custom/fromJson.txt:6076 msgid "VTOL factory enables VTOL production" msgstr "" @@ -14540,167 +14543,167 @@ msgstr "" #. data/base/stats/structure.json: $.A0VTolFactory1.name #. data/mp/stats/research.json: $.R-Struc-VTOLFactory.name #. data/mp/stats/structure.json: $.A0VTolFactory1.name -#: po/custom/fromJson.txt:6080 +#: po/custom/fromJson.txt:6082 msgid "VTOL Factory" msgstr "" #. TRANSLATORS: #. data/base/stats/weapons.json: $.Laser3BEAM-VTOL.name #. data/mp/stats/weapons.json: $.Laser3BEAM-VTOL.name -#: po/custom/fromJson.txt:6084 +#: po/custom/fromJson.txt:6086 msgid "VTOL Flashlight" msgstr "" #. TRANSLATORS: #. data/base/stats/weapons.json: $.Bomb2-VTOL-HvHE.name #. data/mp/stats/weapons.json: $.Bomb2-VTOL-HvHE.name -#: po/custom/fromJson.txt:6088 +#: po/custom/fromJson.txt:6090 msgid "VTOL Heap Bomb Bay" msgstr "" #. TRANSLATORS: #. data/base/stats/weapons.json: $.Cannon375mm-VTOL.name -#: po/custom/fromJson.txt:6091 +#: po/custom/fromJson.txt:6093 msgid "VTOL Heavy Cannon" msgstr "" #. TRANSLATORS: #. data/mp/stats/weapons.json: $.HeavyLaser-VTOL.name -#: po/custom/fromJson.txt:6094 +#: po/custom/fromJson.txt:6096 msgid "VTOL Heavy Laser" msgstr "" #. TRANSLATORS: #. data/base/stats/weapons.json: $.MG3-VTOL.name #. data/mp/stats/weapons.json: $.MG3-VTOL.name -#: po/custom/fromJson.txt:6098 +#: po/custom/fromJson.txt:6100 msgid "VTOL Heavy Machinegun" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.V-Bug-HPV.name -#: po/custom/fromJson.txt:6101 +#: po/custom/fromJson.txt:6103 msgid "VTOL Hyper Velocity Cannon Bug VTOL" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.V-Mantis-HPV.name -#: po/custom/fromJson.txt:6104 +#: po/custom/fromJson.txt:6106 msgid "VTOL Hyper Velocity Cannon Mantis VTOL" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.V-Scor-HPV.name -#: po/custom/fromJson.txt:6107 +#: po/custom/fromJson.txt:6109 msgid "VTOL Hyper Velocity Cannon Scorpion VTOL" msgstr "" #. TRANSLATORS: #. data/base/stats/weapons.json: $.Cannon4AUTO-VTOL.name #. data/mp/stats/weapons.json: $.Cannon4AUTO-VTOL.name -#: po/custom/fromJson.txt:6111 +#: po/custom/fromJson.txt:6113 msgid "VTOL Hyper Velocity Cannon" msgstr "" #. TRANSLATORS: #. data/base/stats/propulsion.json: $.V-Tol02.name -#: po/custom/fromJson.txt:6114 +#: po/custom/fromJson.txt:6116 msgid "VTOL II" msgstr "" #. TRANSLATORS: #. data/base/stats/propulsion.json: $.V-Tol03.name -#: po/custom/fromJson.txt:6117 +#: po/custom/fromJson.txt:6119 msgid "VTOL III" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.V-Bug-Lancer.name -#: po/custom/fromJson.txt:6120 +#: po/custom/fromJson.txt:6122 msgid "VTOL Lancer Bug VTOL" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.V-Mantis-Lancer.name -#: po/custom/fromJson.txt:6123 +#: po/custom/fromJson.txt:6125 msgid "VTOL Lancer Mantis VTOL" msgstr "" #. TRANSLATORS: #. data/mp/stats/templates.json: $.V-Scor-Lancer.name -#: po/custom/fromJson.txt:6126 +#: po/custom/fromJson.txt:6128 msgid "VTOL Lancer Scorpion VTOL" msgstr "" #. TRANSLATORS: #. data/base/stats/weapons.json: $.Rocket-VTOL-LtA-T.name #. data/mp/stats/weapons.json: $.Rocket-VTOL-LtA-T.name -#: po/custom/fromJson.txt:6130 +#: po/custom/fromJson.txt:6132 msgid "VTOL Lancer" msgstr "" #. TRANSLATORS: #. data/mp/stats/weapons.json: $.MG1-VTOL-SCAVS.name -#: po/custom/fromJson.txt:6133 +#: po/custom/fromJson.txt:6135 msgid "VTOL Machinegun Scav" msgstr "" #. TRANSLATORS: #. data/base/stats/weapons.json: $.MG1-VTOL.name #. data/mp/stats/weapons.json: $.MG1-VTOL.name -#: po/custom/fromJson.txt:6137 +#: po/custom/fromJson.txt:6139 msgid "VTOL Machinegun" msgstr "" #. TRANSLATORS: #. data/base/stats/weapons.json: $.Rocket-VTOL-Pod.name -#: po/custom/fromJson.txt:6140 +#: po/custom/fromJson.txt:6142 msgid "VTOL Mini-Rocket AA" msgstr "" #. TRANSLATORS: #. data/mp/stats/weapons.json: $.Rocket-VTOL-Pod-SCAVS.name -#: po/custom/fromJson.txt:6143 +#: po/custom/fromJson.txt:6145 msgid "VTOL Mini-Rocket Scav" msgstr "" #. TRANSLATORS: #. data/mp/stats/weapons.json: $.Rocket-VTOL-Pod.name -#: po/custom/fromJson.txt:6146 +#: po/custom/fromJson.txt:6148 msgid "VTOL Mini-Rocket" msgstr "" #. TRANSLATORS: #. data/base/stats/weapons.json: $.RailGun1-VTOL.name #. data/mp/stats/weapons.json: $.RailGun1-VTOL.name -#: po/custom/fromJson.txt:6150 +#: po/custom/fromJson.txt:6152 msgid "VTOL Needle Gun" msgstr "" #. TRANSLATORS: #. data/base/stats/weapons.json: $.Bomb3-VTOL-LtINC.name #. data/mp/stats/weapons.json: $.Bomb3-VTOL-LtINC.name -#: po/custom/fromJson.txt:6154 +#: po/custom/fromJson.txt:6156 msgid "VTOL Phosphor Bomb Bay" msgstr "" #. TRANSLATORS: #. data/mp/stats/weapons.json: $.Bomb5-VTOL-Plasmite.name -#: po/custom/fromJson.txt:6157 +#: po/custom/fromJson.txt:6159 msgid "VTOL Plasmite Bomb Bay" msgstr "" #. TRANSLATORS: #. data/base/stats/research.json: $.R-Vehicle-Prop-VTOL.name #. data/mp/stats/research.json: $.R-Vehicle-Prop-VTOL.name -#: po/custom/fromJson.txt:6164 +#: po/custom/fromJson.txt:6166 msgid "VTOL Propulsion" msgstr "" #. TRANSLATORS: #. data/base/stats/weapons.json: $.Laser2PULSE-VTOL.name #. data/mp/stats/weapons.json: $.Laser2PULSE-VTOL.name -#: po/custom/fromJson.txt:6168 +#: po/custom/fromJson.txt:6170 msgid "VTOL Pulse Laser" msgstr "" @@ -14708,14 +14711,14 @@ msgstr "" #. data/base/stats/sensor.json: $.Sys-VTOLRadarTower01.name #. data/base/stats/structure.json: $.Sys-VTOL-RadarTower01.name #. data/mp/stats/sensor.json: $.Sys-VTOLRadarTower01.name -#: po/custom/fromJson.txt:6173 +#: po/custom/fromJson.txt:6175 msgid "VTOL Radar Tower" msgstr "" #. TRANSLATORS: #. data/base/stats/weapons.json: $.RailGun2-VTOL.name #. data/mp/stats/weapons.json: $.RailGun2-VTOL.name -#: po/custom/fromJson.txt:6177 +#: po/custom/fromJson.txt:6179 msgid "VTOL Rail Gun" msgstr "" @@ -14724,28 +14727,28 @@ msgstr "" #. data/base/stats/structure.json: $.A0VtolPad.name #. data/mp/stats/research.json: $.R-Struc-VTOLPad.name #. data/mp/stats/structure.json: $.A0VtolPad.name -#: po/custom/fromJson.txt:6183 +#: po/custom/fromJson.txt:6185 msgid "VTOL Rearming Pad" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessagesall.json: $.RES_ST_VF.text[2] #. data/mp/messages/resmessagesall.json: $.RES_ST_VF.text[2] -#: po/custom/fromJson.txt:6187 +#: po/custom/fromJson.txt:6189 msgid "VTOL rearming pads required to keep VTOLs flying" msgstr "" #. TRANSLATORS: #. data/base/stats/weapons.json: $.Missile-VTOL-AT.name #. data/mp/stats/weapons.json: $.Missile-VTOL-AT.name -#: po/custom/fromJson.txt:6197 +#: po/custom/fromJson.txt:6199 msgid "VTOL Scourge Missile" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages23.json: $.RES_SY_VSTW1.text[1] #. data/mp/messages/resmessages23.json: $.RES_SY_VSTW1.text[1] -#: po/custom/fromJson.txt:6207 +#: po/custom/fromJson.txt:6209 msgid "VTOL Strike Tower detects approaching enemies" msgstr "" @@ -14753,14 +14756,14 @@ msgstr "" #. data/base/stats/research.json: $.R-Sys-VTOLStrike-Tower01.name #. data/mp/stats/research.json: $.R-Sys-VTOLStrike-Tower01.name #. data/mp/stats/structure.json: $.Sys-VTOL-RadarTower01.name -#: po/custom/fromJson.txt:6212 +#: po/custom/fromJson.txt:6214 msgid "VTOL Strike Tower" msgstr "" #. TRANSLATORS: #. data/base/messages/resmessages23.json: $.RES_SY_VSTU1.text[1] #. data/mp/messages/resmessages23.json: $.RES_SY_VSTU1.text[1] -#: po/custom/fromJson.txt:6216 +#: po/custom/fromJson.txt:6218 msgid "VTOL Strike turret used to spot targets" msgstr "" @@ -14769,66 +14772,66 @@ msgstr "" #. data/base/stats/sensor.json: $.Sys-VstrikeTurret01.name #. data/mp/stats/research.json: $.R-Sys-VTOLStrike-Turret01.name #. data/mp/stats/sensor.json: $.Sys-VstrikeTurret01.name -#: po/custom/fromJson.txt:6222 +#: po/custom/fromJson.txt:6224 msgid "VTOL Strike Turret" msgstr "" #. TRANSLATORS: #. data/mp/stats/weapons.json: $.Rocket-VTOL-Sunburst.name -#: po/custom/fromJson.txt:6225 +#: po/custom/fromJson.txt:6227 msgid "VTOL Sunburst AA" msgstr "" #. TRANSLATORS: #. data/base/stats/weapons.json: $.Rocket-VTOL-HvyA-T.name #. data/mp/stats/weapons.json: $.Rocket-VTOL-HvyA-T.name -#: po/custom/fromJson.txt:6229 +#: po/custom/fromJson.txt:6231 msgid "VTOL Tank Killer" msgstr "" #. TRANSLATORS: #. data/base/stats/weapons.json: $.Bomb4-VTOL-HvyINC.name #. data/mp/stats/weapons.json: $.Bomb4-VTOL-HvyINC.name -#: po/custom/fromJson.txt:6233 +#: po/custom/fromJson.txt:6235 msgid "VTOL Thermite Bomb Bay" msgstr "" #. TRANSLATORS: #. data/base/stats/weapons.json: $.MG2-VTOL.name #. data/mp/stats/weapons.json: $.MG2-VTOL.name -#: po/custom/fromJson.txt:6237 +#: po/custom/fromJson.txt:6239 msgid "VTOL Twin Machinegun" msgstr "" #. TRANSLATORS: #. data/base/stats/propulsion.json: $.V-Tol.name #. data/mp/stats/propulsion.json: $.V-Tol.name -#: po/custom/fromJson.txt:6241 +#: po/custom/fromJson.txt:6243 #: src/hci/teamstrategy.cpp:92 msgid "VTOL" msgstr "" #. TRANSLATORS: #. data/base/stats/features.json: $.Wall.name -#: po/custom/fromJson.txt:6250 +#: po/custom/fromJson.txt:6252 msgid "Wall" msgstr "" #. TRANSLATORS: #. data/base/stats/features.json: $.WallCorner.name -#: po/custom/fromJson.txt:6253 +#: po/custom/fromJson.txt:6255 msgid "Wallcorner" msgstr "" #. TRANSLATORS: #. data/base/stats/features.json: $.BarbWarehouse1.name -#: po/custom/fromJson.txt:6256 +#: po/custom/fromJson.txt:6258 msgid "Warehouse" msgstr "" #. TRANSLATORS: #. data/base/messages/messages.json: $.MSG6.text[0] -#: po/custom/fromJson.txt:6259 +#: po/custom/fromJson.txt:6261 msgid "Weapon Research Completed" msgstr "" @@ -14837,26 +14840,26 @@ msgstr "" #. data/base/stats/research.json: $.R-Vehicle-Prop-Wheels.name #. data/mp/messages/resmessages1.json: $.RES_V_P_W1.text[1] #. data/mp/stats/research.json: $.R-Vehicle-Prop-Wheels.name -#: po/custom/fromJson.txt:6268 +#: po/custom/fromJson.txt:6270 msgid "Wheeled Propulsion" msgstr "" #. TRANSLATORS: #. data/base/stats/propulsion.json: $.wheeled02.name -#: po/custom/fromJson.txt:6271 +#: po/custom/fromJson.txt:6273 msgid "Wheels II" msgstr "" #. TRANSLATORS: #. data/base/stats/propulsion.json: $.wheeled03.name -#: po/custom/fromJson.txt:6274 +#: po/custom/fromJson.txt:6276 msgid "Wheels III" msgstr "" #. TRANSLATORS: #. data/base/stats/propulsion.json: $.wheeled01.name #. data/mp/stats/propulsion.json: $.wheeled01.name -#: po/custom/fromJson.txt:6278 +#: po/custom/fromJson.txt:6280 msgid "Wheels" msgstr "" @@ -14865,7 +14868,7 @@ msgstr "" #. data/base/stats/structure.json: $.AASite-QuadRotMg.name #. data/mp/stats/research.json: $.R-Defense-AASite-QuadRotMg.name #. data/mp/stats/structure.json: $.AASite-QuadRotMg.name -#: po/custom/fromJson.txt:6284 +#: po/custom/fromJson.txt:6286 msgid "Whirlwind AA Site" msgstr "" @@ -14874,64 +14877,64 @@ msgstr "" #. data/base/stats/weapons.json: $.QuadRotAAGun.name #. data/mp/stats/research.json: $.R-Wpn-AAGun04.name #. data/mp/stats/weapons.json: $.QuadRotAAGun.name -#: po/custom/fromJson.txt:6290 +#: po/custom/fromJson.txt:6292 msgid "Whirlwind AA Turret" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Defense-WallTower-QuadRotAA.name #. data/mp/stats/structure.json: $.WallTower-QuadRotAAGun.name -#: po/custom/fromJson.txt:6294 +#: po/custom/fromJson.txt:6296 msgid "Whirlwind Hardpoint" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Sys-Sensor-WSTower.name #. data/mp/stats/structure.json: $.Sys-SensoTowerWS.name -#: po/custom/fromJson.txt:6298 +#: po/custom/fromJson.txt:6300 msgid "Wide Spectrum Sensor Tower" msgstr "" #. TRANSLATORS: #. data/mp/stats/research.json: $.R-Sys-Sensor-WS.name #. data/mp/stats/sensor.json: $.Sensor-WideSpec.name -#: po/custom/fromJson.txt:6302 +#: po/custom/fromJson.txt:6304 msgid "Wide Spectrum Sensor" msgstr "" #. TRANSLATORS: #. data/base/stats/features.json: $.WreckedDroidHub.name -#: po/custom/fromJson.txt:6305 +#: po/custom/fromJson.txt:6307 msgid "Wreck" msgstr "" #. TRANSLATORS: #. data/base/stats/features.json: $.WreckedBridge.name -#: po/custom/fromJson.txt:6308 +#: po/custom/fromJson.txt:6310 msgid "Wrecked Bridge" msgstr "" #. TRANSLATORS: #. data/base/stats/features.json: $.WreckedTankerV.name -#: po/custom/fromJson.txt:6311 +#: po/custom/fromJson.txt:6313 msgid "Wrecked Tanker" msgstr "" #. TRANSLATORS: #. data/base/stats/features.json: $.WreckedVertCampVan.name -#: po/custom/fromJson.txt:6314 +#: po/custom/fromJson.txt:6316 msgid "Wrecked Van" msgstr "" #. TRANSLATORS: #. data/base/stats/features.json: $.WreckedSuzukiJeep.name -#: po/custom/fromJson.txt:6317 +#: po/custom/fromJson.txt:6319 msgid "Wrecked Vehicle" msgstr "" #. TRANSLATORS: #. data/mp/stats/body.json: $.Body13SUP.name -#: po/custom/fromJson.txt:6320 +#: po/custom/fromJson.txt:6322 msgid "Wyvern" msgstr "" @@ -14940,7 +14943,7 @@ msgstr "" #. data/base/stats/brain.json: $.ZNULLBRAIN.ranks[6] #. data/mp/stats/brain.json: $.CommandBrain01.ranks[6] #. data/mp/stats/brain.json: $.ZNULLBRAIN.ranks[6] -#: po/custom/fromJson.txt:6326 +#: po/custom/fromJson.txt:6328 msgctxt "rank" msgid "Elite" msgstr "" @@ -14950,7 +14953,7 @@ msgstr "" #. data/base/stats/brain.json: $.ZNULLBRAIN.ranks[1] #. data/mp/stats/brain.json: $.CommandBrain01.ranks[1] #. data/mp/stats/brain.json: $.ZNULLBRAIN.ranks[1] -#: po/custom/fromJson.txt:6332 +#: po/custom/fromJson.txt:6334 msgctxt "rank" msgid "Green" msgstr "" @@ -14960,7 +14963,7 @@ msgstr "" #. data/base/stats/brain.json: $.ZNULLBRAIN.ranks[8] #. data/mp/stats/brain.json: $.CommandBrain01.ranks[8] #. data/mp/stats/brain.json: $.ZNULLBRAIN.ranks[8] -#: po/custom/fromJson.txt:6338 +#: po/custom/fromJson.txt:6340 msgctxt "rank" msgid "Hero" msgstr "" @@ -14970,7 +14973,7 @@ msgstr "" #. data/base/stats/brain.json: $.ZNULLBRAIN.ranks[4] #. data/mp/stats/brain.json: $.CommandBrain01.ranks[4] #. data/mp/stats/brain.json: $.ZNULLBRAIN.ranks[4] -#: po/custom/fromJson.txt:6344 +#: po/custom/fromJson.txt:6346 msgctxt "rank" msgid "Professional" msgstr "" @@ -14980,7 +14983,7 @@ msgstr "" #. data/base/stats/brain.json: $.ZNULLBRAIN.ranks[3] #. data/mp/stats/brain.json: $.CommandBrain01.ranks[3] #. data/mp/stats/brain.json: $.ZNULLBRAIN.ranks[3] -#: po/custom/fromJson.txt:6350 +#: po/custom/fromJson.txt:6352 msgctxt "rank" msgid "Regular" msgstr "" @@ -14990,7 +14993,7 @@ msgstr "" #. data/base/stats/brain.json: $.ZNULLBRAIN.ranks[0] #. data/mp/stats/brain.json: $.CommandBrain01.ranks[0] #. data/mp/stats/brain.json: $.ZNULLBRAIN.ranks[0] -#: po/custom/fromJson.txt:6356 +#: po/custom/fromJson.txt:6358 msgctxt "rank" msgid "Rookie" msgstr "" @@ -15000,7 +15003,7 @@ msgstr "" #. data/base/stats/brain.json: $.ZNULLBRAIN.ranks[7] #. data/mp/stats/brain.json: $.CommandBrain01.ranks[7] #. data/mp/stats/brain.json: $.ZNULLBRAIN.ranks[7] -#: po/custom/fromJson.txt:6362 +#: po/custom/fromJson.txt:6364 msgctxt "rank" msgid "Special" msgstr "" @@ -15010,7 +15013,7 @@ msgstr "" #. data/base/stats/brain.json: $.ZNULLBRAIN.ranks[2] #. data/mp/stats/brain.json: $.CommandBrain01.ranks[2] #. data/mp/stats/brain.json: $.ZNULLBRAIN.ranks[2] -#: po/custom/fromJson.txt:6368 +#: po/custom/fromJson.txt:6370 msgctxt "rank" msgid "Trained" msgstr "" @@ -15020,7 +15023,7 @@ msgstr "" #. data/base/stats/brain.json: $.ZNULLBRAIN.ranks[5] #. data/mp/stats/brain.json: $.CommandBrain01.ranks[5] #. data/mp/stats/brain.json: $.ZNULLBRAIN.ranks[5] -#: po/custom/fromJson.txt:6374 +#: po/custom/fromJson.txt:6376 msgctxt "rank" msgid "Veteran" msgstr "" @@ -15070,31 +15073,31 @@ msgstr "" #: src/chat.cpp:63 #: src/hci/chatoptions.cpp:1290 -#: src/hci/quickchat.cpp:2280 -#: src/hci/quickchat.cpp:2718 +#: src/hci/quickchat.cpp:2288 +#: src/hci/quickchat.cpp:2819 msgid "Global" msgstr "" #: src/chat.cpp:67 #: src/chat.cpp:73 -#: src/hci/quickchat.cpp:2727 -#: src/hci/quickchat.cpp:2738 -#: src/hci/quickchat.cpp:2750 +#: src/hci/quickchat.cpp:2828 +#: src/hci/quickchat.cpp:2839 +#: src/hci/quickchat.cpp:2851 msgid "Allies" msgstr "" #: src/chat.cpp:75 -#: src/hci/quickchat.cpp:2773 +#: src/hci/quickchat.cpp:2874 msgid "private to " msgstr "" #: src/chat.cpp:86 -#: src/hci/quickchat.cpp:2784 +#: src/hci/quickchat.cpp:2885 msgid " and " msgstr "" #: src/chat.cpp:173 -#: src/multiint.cpp:3563 +#: src/multiint.cpp:3693 msgid "Spectators" msgstr "" @@ -15446,7 +15449,7 @@ msgstr "" msgid "Commander needs a higher level to command more units" msgstr "" -#: src/configuration.cpp:448 +#: src/configuration.cpp:449 msgid "My Game" msgstr "" @@ -15637,7 +15640,7 @@ msgid "Player dropped" msgstr "" #: src/display3d.cpp:964 -#: src/multiint.cpp:4341 +#: src/multiint.cpp:4472 msgid "Waiting for other players" msgstr "" @@ -15710,9 +15713,9 @@ msgstr "" #. TRANSLATORS: "Normal" Faction #: src/faction.cpp:214 #: src/frontend.cpp:945 -#: src/frontend.cpp:2553 -#: src/terrain.cpp:2588 -#: src/titleui/campaign.cpp:2150 +#: src/frontend.cpp:2606 +#: src/terrain.cpp:2589 +#: src/titleui/campaign.cpp:2160 msgid "Normal" msgstr "" @@ -15820,14 +15823,14 @@ msgstr "" #: src/frontend.cpp:393 #: src/frontend.cpp:546 #: src/frontend.cpp:661 -#: src/frontend.cpp:1178 -#: src/frontend.cpp:1422 -#: src/frontend.cpp:2189 -#: src/frontend.cpp:2489 -#: src/frontend.cpp:2788 -#: src/frontend.cpp:2927 -#: src/frontend.cpp:3368 -#: src/titleui/campaign.cpp:2753 +#: src/frontend.cpp:1230 +#: src/frontend.cpp:1474 +#: src/frontend.cpp:2241 +#: src/frontend.cpp:2542 +#: src/frontend.cpp:2841 +#: src/frontend.cpp:2980 +#: src/frontend.cpp:3421 +#: src/titleui/campaign.cpp:2763 msgctxt "menu" msgid "Return" msgstr "" @@ -15978,17 +15981,17 @@ msgid "2×" msgstr "" #: src/frontend.cpp:736 -#: src/frontend.cpp:1846 -#: src/frontend.cpp:2014 +#: src/frontend.cpp:1898 +#: src/frontend.cpp:2066 msgid "Fullscreen" msgstr "" #: src/frontend.cpp:737 #: src/frontend.cpp:748 -#: src/frontend.cpp:1306 -#: src/frontend.cpp:2557 -#: src/titleui/campaign.cpp:2154 -#: src/titleui/campaign.cpp:2167 +#: src/frontend.cpp:1358 +#: src/frontend.cpp:2610 +#: src/titleui/campaign.cpp:2164 +#: src/titleui/campaign.cpp:2177 msgid "Unsupported" msgstr "" @@ -15998,19 +16001,20 @@ msgstr "" #: src/frontend.cpp:764 #: src/frontend.cpp:769 #: src/frontend.cpp:779 -#: src/frontend.cpp:1572 -#: src/frontend.cpp:1616 -#: src/frontend.cpp:1970 -#: src/frontend.cpp:2359 -#: src/frontend.cpp:2364 -#: src/frontend.cpp:2369 -#: src/frontend.cpp:2379 -#: src/frontend.cpp:3056 -#: src/frontend.cpp:3105 -#: src/frontend.cpp:3163 -#: src/frontend.cpp:3288 -#: src/frontend.cpp:3357 -#: src/frontend.cpp:3403 +#: src/frontend.cpp:1070 +#: src/frontend.cpp:1624 +#: src/frontend.cpp:1668 +#: src/frontend.cpp:2022 +#: src/frontend.cpp:2412 +#: src/frontend.cpp:2417 +#: src/frontend.cpp:2422 +#: src/frontend.cpp:2432 +#: src/frontend.cpp:3109 +#: src/frontend.cpp:3158 +#: src/frontend.cpp:3216 +#: src/frontend.cpp:3341 +#: src/frontend.cpp:3410 +#: src/frontend.cpp:3456 msgid "Off" msgstr "" @@ -16019,7 +16023,7 @@ msgid "50%" msgstr "" #: src/frontend.cpp:747 -#: src/multiplay.cpp:2370 +#: src/multiplay.cpp:2469 msgid "Black" msgstr "" @@ -16028,14 +16032,15 @@ msgstr "" #: src/frontend.cpp:764 #: src/frontend.cpp:769 #: src/frontend.cpp:779 -#: src/frontend.cpp:1618 -#: src/frontend.cpp:2359 -#: src/frontend.cpp:2364 -#: src/frontend.cpp:2369 -#: src/frontend.cpp:2379 -#: src/frontend.cpp:3288 -#: src/frontend.cpp:3357 -#: src/frontend.cpp:3403 +#: src/frontend.cpp:1068 +#: src/frontend.cpp:1670 +#: src/frontend.cpp:2412 +#: src/frontend.cpp:2417 +#: src/frontend.cpp:2422 +#: src/frontend.cpp:2432 +#: src/frontend.cpp:3341 +#: src/frontend.cpp:3410 +#: src/frontend.cpp:3456 msgid "On" msgstr "" @@ -16066,7 +16071,7 @@ msgstr "" #: src/frontend.cpp:795 #: src/frontend.cpp:946 #: src/frontend.cpp:1006 -#: src/terrain.cpp:2590 +#: src/terrain.cpp:2591 msgid "High" msgstr "" @@ -16103,131 +16108,139 @@ msgstr "" msgid "Shadow filtering not available on this system." msgstr "" -#: src/frontend.cpp:1079 -#: src/frontend.cpp:2088 +#: src/frontend.cpp:1069 +msgid "Opacity: 50%" +msgstr "" + +#: src/frontend.cpp:1126 +#: src/frontend.cpp:2140 msgid "* Takes effect on game restart" msgstr "" -#: src/frontend.cpp:1086 +#: src/frontend.cpp:1133 msgid "Terrain Quality" msgstr "" -#: src/frontend.cpp:1091 +#: src/frontend.cpp:1138 msgid "Terrain Shading" msgstr "" -#: src/frontend.cpp:1097 +#: src/frontend.cpp:1144 #: src/ingameop.cpp:641 msgid "Shadows" msgstr "" -#: src/frontend.cpp:1106 +#: src/frontend.cpp:1153 msgid "Shadow Resolution" msgstr "" -#: src/frontend.cpp:1111 +#: src/frontend.cpp:1158 msgid "Shadow Filtering" msgstr "" -#: src/frontend.cpp:1118 +#: src/frontend.cpp:1165 msgid "Per Pixel point lights" msgstr "" #. TRANSLATORS: "LOD" = "Level of Detail" - this setting is used to describe how level of detail (in textures) is preserved as distance increases (examples: "Default", "High", etc) -#: src/frontend.cpp:1124 +#: src/frontend.cpp:1171 msgid "LOD Distance" msgstr "" -#: src/frontend.cpp:1131 +#: src/frontend.cpp:1178 msgid "Fog" msgstr "" -#: src/frontend.cpp:1136 +#: src/frontend.cpp:1183 #: src/ingameop.cpp:646 #: src/input/context.cpp:57 msgid "Radar" msgstr "" -#: src/frontend.cpp:1141 +#: src/frontend.cpp:1188 #: src/ingameop.cpp:651 msgid "Radar Jump" msgstr "" -#: src/frontend.cpp:1147 +#: src/frontend.cpp:1194 #: src/ingameop.cpp:656 msgid "Video Playback" msgstr "" -#: src/frontend.cpp:1152 +#: src/frontend.cpp:1199 #: src/ingameop.cpp:661 msgid "Scanlines" msgstr "" -#: src/frontend.cpp:1157 +#: src/frontend.cpp:1204 msgid "Screen Shake" msgstr "" -#: src/frontend.cpp:1162 +#: src/frontend.cpp:1209 #: src/ingameop.cpp:671 msgid "Groups Menu" msgstr "" -#: src/frontend.cpp:1174 +#: src/frontend.cpp:1214 +msgid "Options Button" +msgstr "" + +#: src/frontend.cpp:1226 msgid "GRAPHICS OPTIONS" msgstr "" -#: src/frontend.cpp:1309 +#: src/frontend.cpp:1361 msgid "Disabled" msgstr "" -#: src/frontend.cpp:1312 +#: src/frontend.cpp:1364 msgid "Enabled" msgstr "" -#: src/frontend.cpp:1316 -#: src/frontend.cpp:1322 -#: src/frontend.cpp:1969 +#: src/frontend.cpp:1368 +#: src/frontend.cpp:1374 +#: src/frontend.cpp:2021 msgid "Auto" msgstr "" -#: src/frontend.cpp:1367 +#: src/frontend.cpp:1419 #: src/ingameop.cpp:153 msgid "Voice Volume" msgstr "" -#: src/frontend.cpp:1372 +#: src/frontend.cpp:1424 #: src/ingameop.cpp:159 msgid "FX Volume" msgstr "" -#: src/frontend.cpp:1377 +#: src/frontend.cpp:1429 #: src/ingameop.cpp:165 msgid "Music Volume" msgstr "" -#: src/frontend.cpp:1383 +#: src/frontend.cpp:1435 #: src/ingameop.cpp:171 msgid "Subtitles" msgstr "" -#: src/frontend.cpp:1388 +#: src/frontend.cpp:1440 msgid "HRTF" msgstr "" -#: src/frontend.cpp:1394 -#: src/frontend.cpp:1396 +#: src/frontend.cpp:1446 +#: src/frontend.cpp:1448 msgid "HRTF is not supported on your device / system / OpenAL library" msgstr "" -#: src/frontend.cpp:1400 +#: src/frontend.cpp:1452 msgid "Map Zoom" msgstr "" -#: src/frontend.cpp:1405 +#: src/frontend.cpp:1457 msgid "Map Zoom Rate" msgstr "" -#: src/frontend.cpp:1410 +#: src/frontend.cpp:1462 msgid "Radar Zoom" msgstr "" @@ -16235,408 +16248,416 @@ msgstr "" #. "OPTIONS" means "SETTINGS". #. To break this message into two lines, you can use the delimiter "\n", #. e.g. "AUDIO / ZOOM\nOPTIONS" would show "OPTIONS" in a second line. -#: src/frontend.cpp:1429 +#: src/frontend.cpp:1481 msgid "AUDIO / ZOOM OPTIONS" msgstr "" -#: src/frontend.cpp:1541 +#: src/frontend.cpp:1593 msgid "" "In Desktop Fullscreen mode, the resolution matches that of your desktop \n" "(or what the window manager allows)." msgstr "" -#: src/frontend.cpp:1543 +#: src/frontend.cpp:1595 msgid "You can change the resolution by resizing the window normally. (Try dragging a corner / edge.)" msgstr "" -#: src/frontend.cpp:1582 +#: src/frontend.cpp:1634 msgid "Graphics Mode" msgstr "" -#: src/frontend.cpp:1587 +#: src/frontend.cpp:1639 msgid "Resolution" msgstr "" -#: src/frontend.cpp:1592 +#: src/frontend.cpp:1644 msgid "Display Scale" msgstr "" -#: src/frontend.cpp:1620 +#: src/frontend.cpp:1672 msgid "Adaptive" msgstr "" -#: src/frontend.cpp:1844 +#: src/frontend.cpp:1896 msgid "Windowed" msgstr "" -#: src/frontend.cpp:1845 -#: src/frontend.cpp:2013 +#: src/frontend.cpp:1897 +#: src/frontend.cpp:2065 msgid "Desktop Full" msgstr "" -#: src/frontend.cpp:1971 +#: src/frontend.cpp:2023 msgid "On (Fullscreen)" msgstr "" -#: src/frontend.cpp:2121 +#: src/frontend.cpp:2173 msgid "Texture size" msgstr "" -#: src/frontend.cpp:2126 +#: src/frontend.cpp:2178 #: src/ingameop.cpp:773 msgid "Vertical sync" msgstr "" -#: src/frontend.cpp:2131 +#: src/frontend.cpp:2183 msgid "Antialiasing*" msgstr "" -#: src/frontend.cpp:2139 +#: src/frontend.cpp:2191 msgid "Warning: Antialiasing can cause crashes, especially with values > 16" msgstr "" -#: src/frontend.cpp:2152 +#: src/frontend.cpp:2204 msgid "Graphics Backend*" msgstr "" #. TRANSLATORS: Shortened form of "Minimize on Focus Loss" #. An option describing when / whether WZ will auto-minimize the window when it loses focus. -#: src/frontend.cpp:2160 +#: src/frontend.cpp:2212 msgid "Min on Focus Loss" msgstr "" -#: src/frontend.cpp:2161 +#: src/frontend.cpp:2213 msgid "Whether the window should auto-minimize on focus loss" msgstr "" #. TRANSLATORS: The fullscreen mode used when toggling with keys: Alt + Enter -#: src/frontend.cpp:2171 +#: src/frontend.cpp:2223 msgid "Alt+Enter Toggle" msgstr "" -#: src/frontend.cpp:2172 +#: src/frontend.cpp:2224 msgid "The fullscreen mode used when toggling with keys: Alt + Enter" msgstr "" -#: src/frontend.cpp:2186 +#: src/frontend.cpp:2238 msgid "VIDEO OPTIONS" msgstr "" -#: src/frontend.cpp:2218 +#: src/frontend.cpp:2270 msgid "Unable to change Vertical Sync" msgstr "" -#: src/frontend.cpp:2218 +#: src/frontend.cpp:2270 msgid "" "Warzone failed to change the Vertical Sync mode.\n" "Your system / drivers may not support other modes." msgstr "" -#: src/frontend.cpp:2374 +#: src/frontend.cpp:2427 msgid "Middle Mouse" msgstr "" -#: src/frontend.cpp:2374 +#: src/frontend.cpp:2427 msgid "Right Mouse" msgstr "" -#: src/frontend.cpp:2447 +#: src/frontend.cpp:2500 #: src/ingameop.cpp:849 msgid "Reverse Rotation" msgstr "" -#: src/frontend.cpp:2452 +#: src/frontend.cpp:2505 #: src/ingameop.cpp:855 msgid "Trap Cursor" msgstr "" -#: src/frontend.cpp:2458 +#: src/frontend.cpp:2511 #: src/ingameop.cpp:861 msgid "Switch Mouse Buttons" msgstr "" -#: src/frontend.cpp:2464 +#: src/frontend.cpp:2517 #: src/ingameop.cpp:866 msgid "Rotate Screen" msgstr "" -#: src/frontend.cpp:2469 +#: src/frontend.cpp:2522 #: src/ingameop.cpp:871 msgid "Colored Cursors" msgstr "" -#: src/frontend.cpp:2474 +#: src/frontend.cpp:2527 msgid "Cursor Size" msgstr "" -#: src/frontend.cpp:2486 +#: src/frontend.cpp:2539 msgid "MOUSE OPTIONS" msgstr "" -#: src/frontend.cpp:2551 +#: src/frontend.cpp:2604 #: src/multiint.cpp:273 -#: src/titleui/campaign.cpp:2148 +#: src/titleui/campaign.cpp:2158 msgid "Super Easy" msgstr "" -#: src/frontend.cpp:2552 +#: src/frontend.cpp:2605 #: src/multiint.cpp:273 -#: src/titleui/campaign.cpp:2149 +#: src/titleui/campaign.cpp:2159 msgid "Easy" msgstr "" -#: src/frontend.cpp:2554 +#: src/frontend.cpp:2607 #: src/multiint.cpp:273 -#: src/titleui/campaign.cpp:2151 +#: src/titleui/campaign.cpp:2161 msgid "Hard" msgstr "" -#: src/frontend.cpp:2555 +#: src/frontend.cpp:2608 #: src/multiint.cpp:273 -#: src/titleui/campaign.cpp:2152 +#: src/titleui/campaign.cpp:2162 msgid "Insane" msgstr "" -#: src/frontend.cpp:2735 +#: src/frontend.cpp:2788 #: src/init.cpp:1412 #: src/intimage.cpp:127 #, c-format msgid "Unable to load: %s." msgstr "" -#: src/frontend.cpp:2739 +#: src/frontend.cpp:2792 #: src/init.cpp:1416 #: src/intimage.cpp:131 msgid "Please remove all incompatible mods." msgstr "" -#: src/frontend.cpp:2787 -#: src/frontend.cpp:2935 +#: src/frontend.cpp:2840 +#: src/frontend.cpp:2988 msgid "GAME OPTIONS" msgstr "" -#: src/frontend.cpp:2789 -#: src/frontend.cpp:2843 +#: src/frontend.cpp:2842 +#: src/frontend.cpp:2896 msgid "Language" msgstr "" -#: src/frontend.cpp:2790 -#: src/frontend.cpp:2860 +#: src/frontend.cpp:2843 +#: src/frontend.cpp:2913 msgid "Unit Colour:" msgstr "" -#: src/frontend.cpp:2792 -#: src/frontend.cpp:2913 +#: src/frontend.cpp:2845 +#: src/frontend.cpp:2966 msgid "Skirmish/Multiplayer" msgstr "" -#: src/frontend.cpp:2793 -#: src/frontend.cpp:2849 +#: src/frontend.cpp:2846 +#: src/frontend.cpp:2902 msgid "Campaign Difficulty" msgstr "" -#: src/frontend.cpp:2794 -#: src/frontend.cpp:2855 +#: src/frontend.cpp:2847 +#: src/frontend.cpp:2908 msgid "Camera Speed" msgstr "" -#: src/frontend.cpp:2930 +#: src/frontend.cpp:2983 #, c-format msgid "Help us improve translations of Warzone 2100: %s" msgstr "" -#: src/frontend.cpp:2932 +#: src/frontend.cpp:2985 msgid "Click to open webpage." msgstr "" -#: src/frontend.cpp:2961 +#: src/frontend.cpp:3014 msgid "Insane Difficulty" msgstr "" -#: src/frontend.cpp:2962 +#: src/frontend.cpp:3015 msgid "This difficulty is for very experienced players!" msgstr "" -#: src/frontend.cpp:3060 -#: src/frontend.cpp:3117 +#: src/frontend.cpp:3113 +#: src/frontend.cpp:3170 #, c-format msgid "%u minutes" msgstr "" -#: src/frontend.cpp:3113 +#: src/frontend.cpp:3166 #, c-format msgid "%s hours" msgstr "" -#: src/frontend.cpp:3174 -#: src/frontend.cpp:3182 +#: src/frontend.cpp:3227 +#: src/frontend.cpp:3235 #, c-format msgid "%u seconds" msgstr "" -#: src/frontend.cpp:3213 +#: src/frontend.cpp:3266 msgid "None" msgstr "" -#: src/frontend.cpp:3248 +#: src/frontend.cpp:3301 msgid "Distribute to Team" msgstr "" -#: src/frontend.cpp:3249 +#: src/frontend.cpp:3302 msgid "Destroy (Classic)" msgstr "" -#: src/frontend.cpp:3293 +#: src/frontend.cpp:3346 msgid "Allow All" msgstr "" -#: src/frontend.cpp:3293 +#: src/frontend.cpp:3346 msgid "Quick Chat Only" msgstr "" -#: src/frontend.cpp:3310 +#: src/frontend.cpp:3363 msgid "Hosting Options:" msgstr "" -#: src/frontend.cpp:3314 +#: src/frontend.cpp:3367 msgid "Game Port" msgstr "" -#: src/frontend.cpp:3319 +#: src/frontend.cpp:3372 msgid "Port Mapping" msgstr "" -#: src/frontend.cpp:3320 +#: src/frontend.cpp:3373 msgid "Use PCP, NAT-PMP, or UPnP to help configure your router / firewall to allow connections while hosting." msgstr "" -#: src/frontend.cpp:3326 +#: src/frontend.cpp:3379 msgid "Chat" msgstr "" -#: src/frontend.cpp:3331 +#: src/frontend.cpp:3384 msgid "Inactivity Timeout" msgstr "" -#: src/frontend.cpp:3336 +#: src/frontend.cpp:3389 msgid "Lag Kick" msgstr "" -#: src/frontend.cpp:3341 +#: src/frontend.cpp:3394 msgid "Spectator Slots" msgstr "" -#: src/frontend.cpp:3346 +#: src/frontend.cpp:3399 msgid "On Player Leave" msgstr "" -#: src/frontend.cpp:3351 +#: src/frontend.cpp:3404 msgid "Game Time Limit" msgstr "" -#: src/frontend.cpp:3356 +#: src/frontend.cpp:3409 msgid "Enable Rating" msgstr "" -#: src/frontend.cpp:3371 +#: src/frontend.cpp:3424 msgid "MULTIPLAY OPTIONS" msgstr "" -#: src/frontend.cpp:3441 -#: src/multiint.cpp:5503 +#: src/frontend.cpp:3494 +#: src/multiint.cpp:5634 msgid "Mod: " msgstr "" -#: src/frontend.cpp:3972 +#: src/frontend.cpp:4025 msgid "Increase Game Display Scale?" msgstr "" -#: src/frontend.cpp:3974 +#: src/frontend.cpp:4027 msgid "With your current resolution & display scale settings, the game's user interface may appear small, and the game perspective may appear distorted." msgstr "" -#: src/frontend.cpp:3976 +#: src/frontend.cpp:4029 msgid "You can fix this by increasing the game's Display Scale setting." msgstr "" -#: src/frontend.cpp:3978 +#: src/frontend.cpp:4031 #, c-format msgid "Would you like to increase the game's Display Scale to: %u%%?" msgstr "" -#: src/frontend.cpp:3980 +#: src/frontend.cpp:4033 msgid "Increase Display Scale" msgstr "" -#: src/frontend.cpp:3997 +#: src/frontend.cpp:4050 #, c-format msgid "Display Scale Increased to: %u%%" msgstr "" -#: src/frontend.cpp:3998 -#: src/frontend.cpp:4014 +#: src/frontend.cpp:4051 +#: src/frontend.cpp:4067 msgid "You can adjust the Display Scale at any time in the Video Options menu." msgstr "" -#: src/frontend.cpp:4013 +#: src/frontend.cpp:4066 msgid "Tip: Adjusting Display Scale" msgstr "" -#: src/hci.cpp:732 +#: src/hci.cpp:733 msgid "Replay" msgstr "" -#: src/hci.cpp:747 +#: src/hci.cpp:748 msgid "Pause" msgstr "" -#: src/hci.cpp:762 +#: src/hci.cpp:763 msgid "Resume" msgstr "" -#: src/hci.cpp:779 +#: src/hci.cpp:780 msgid "Fast-Forward" msgstr "" -#: src/hci.cpp:1367 +#: src/hci.cpp:1368 #: src/loop.cpp:262 #: src/loop.cpp:278 msgid "GAME SAVED: " msgstr "" -#: src/hci.cpp:1745 +#: src/hci.cpp:1746 #, c-format msgid "Player %u is cheating (debug menu) him/herself a new structure: %s." msgstr "" -#: src/hci.cpp:1754 +#: src/hci.cpp:1755 #, c-format msgid "Player %u is cheating (debug menu) him/herself a new feature: %s." msgstr "" -#: src/hci.cpp:1773 +#: src/hci.cpp:1774 #, c-format msgid "Player %u is cheating (debug menu) him/herself a new droid: %s." msgstr "" -#: src/hci.cpp:1781 +#: src/hci.cpp:1782 #, c-format msgid "Player %u is cheating (debug menu) him/herself a new droid." msgstr "" -#: src/hci.cpp:2309 +#: src/hci.cpp:2234 +msgid "Open In-Game Options" +msgstr "" + +#: src/hci.cpp:2238 +msgid "Close In-Game Options" +msgstr "" + +#: src/hci.cpp:2460 #: src/hci/build.cpp:603 #: src/hci/manufacture.cpp:682 msgid "Hiding Obsolete Tech" msgstr "" -#: src/hci.cpp:2311 +#: src/hci.cpp:2462 #: src/hci/build.cpp:605 #: src/hci/manufacture.cpp:684 msgid "Showing Obsolete Tech" msgstr "" -#: src/hci.cpp:2434 +#: src/hci.cpp:2585 #, c-format msgid "Cost: %u" msgstr "" @@ -16682,7 +16703,7 @@ msgid "Disable All" msgstr "" #: src/hci/chatoptions.cpp:1261 -#: src/multiint.cpp:4830 +#: src/multiint.cpp:4961 #: src/screens/chatscreen.cpp:394 msgid "Chat Options" msgstr "" @@ -16766,409 +16787,441 @@ msgstr "" msgid "Progress Bar" msgstr "" -#: src/hci/quickchat.cpp:901 +#: src/hci/quickchat.cpp:909 msgid "To:" msgstr "" -#: src/hci/quickchat.cpp:1000 +#: src/hci/quickchat.cpp:1008 msgid "All" msgstr "" -#: src/hci/quickchat.cpp:1009 -#: src/hci/quickchat.cpp:1019 -#: src/hci/quickchat.cpp:1034 -#: src/hci/quickchat.cpp:2321 -#: src/multiint.cpp:2190 +#: src/hci/quickchat.cpp:1017 +#: src/hci/quickchat.cpp:1027 +#: src/hci/quickchat.cpp:1042 +#: src/hci/quickchat.cpp:2329 +#: src/multiint.cpp:2223 msgid "Team" msgstr "" -#: src/hci/quickchat.cpp:1023 -#: src/hci/quickchat.cpp:1230 +#: src/hci/quickchat.cpp:1031 +#: src/hci/quickchat.cpp:1238 msgid "Human Teammates" msgstr "" -#: src/hci/quickchat.cpp:1038 -#: src/hci/quickchat.cpp:1262 +#: src/hci/quickchat.cpp:1046 +#: src/hci/quickchat.cpp:1270 msgid "Bot Teammates" msgstr "" -#: src/hci/quickchat.cpp:1062 +#: src/hci/quickchat.cpp:1070 #, c-format msgid "%u players" msgstr "" -#: src/hci/quickchat.cpp:1067 +#: src/hci/quickchat.cpp:1075 msgid "Choose a recipient" msgstr "" -#: src/hci/quickchat.cpp:2106 +#: src/hci/quickchat.cpp:2114 msgid "Quick Chat:" msgstr "" -#: src/hci/quickchat.cpp:2172 +#: src/hci/quickchat.cpp:2180 msgid "Lobby Chat" msgstr "" -#: src/hci/quickchat.cpp:2174 -#: src/hci/quickchat.cpp:2282 +#: src/hci/quickchat.cpp:2182 +#: src/hci/quickchat.cpp:2290 msgid "Requests" msgstr "" -#: src/hci/quickchat.cpp:2184 -#: src/hci/quickchat.cpp:2288 -#: src/hci/quickchat.cpp:2340 +#: src/hci/quickchat.cpp:2192 +#: src/hci/quickchat.cpp:2296 +#: src/hci/quickchat.cpp:2348 msgid "Notices" msgstr "" -#: src/hci/quickchat.cpp:2192 -#: src/hci/quickchat.cpp:2303 -#: src/hci/quickchat.cpp:2369 -#: src/hci/quickchat.cpp:2407 +#: src/hci/quickchat.cpp:2200 +#: src/hci/quickchat.cpp:2311 +#: src/hci/quickchat.cpp:2377 +#: src/hci/quickchat.cpp:2415 msgid "Reactions" msgstr "" -#: src/hci/quickchat.cpp:2296 +#: src/hci/quickchat.cpp:2304 msgid "Taunts" msgstr "" -#: src/hci/quickchat.cpp:2324 +#: src/hci/quickchat.cpp:2332 msgid "Coordination" msgstr "" -#: src/hci/quickchat.cpp:2355 +#: src/hci/quickchat.cpp:2363 msgid "Suggestions" msgstr "" -#: src/hci/quickchat.cpp:2395 +#: src/hci/quickchat.cpp:2403 msgid "Cheats" msgstr "" -#: src/hci/quickchat.cpp:2404 +#: src/hci/quickchat.cpp:2412 msgid "End-Game" msgstr "" -#: src/hci/quickchat.cpp:2425 +#: src/hci/quickchat.cpp:2456 +msgid "Host" +msgstr "" + +#: src/hci/quickchat.cpp:2460 +msgid "Admin" +msgstr "" + +#: src/hci/quickchat.cpp:2468 +#, c-format +msgid "%s (%s) changed team of player (%s) to: %d" +msgstr "" + +#: src/hci/quickchat.cpp:2470 +#, c-format +msgid "%s (%s) changed position of player (%s) to: %d" +msgstr "" + +#: src/hci/quickchat.cpp:2472 +#, c-format +msgid "%s (%s) changed color of player (%s) to: %s" +msgstr "" + +#: src/hci/quickchat.cpp:2474 +#, c-format +msgid "%s (%s) changed faction of player (%s) to: %s" +msgstr "" + +#: src/hci/quickchat.cpp:2519 msgid "Can someone please transfer me some units?" msgstr "" -#: src/hci/quickchat.cpp:2427 +#: src/hci/quickchat.cpp:2521 msgid "Can someone please transfer me trucks so I can rebuild?" msgstr "" -#: src/hci/quickchat.cpp:2429 +#: src/hci/quickchat.cpp:2523 msgid "Sorry, I don't understand. (Please use Quick Chat?)" msgstr "" #. TRANSLATORS: A suggestion to other player(s) -#: src/hci/quickchat.cpp:2434 +#: src/hci/quickchat.cpp:2528 msgid "I suggest: Building more units" msgstr "" #. TRANSLATORS: A suggestion to other player(s) -#: src/hci/quickchat.cpp:2437 +#: src/hci/quickchat.cpp:2531 msgid "I suggest: Building different units" msgstr "" #. TRANSLATORS: A suggestion to other player(s) -#: src/hci/quickchat.cpp:2440 +#: src/hci/quickchat.cpp:2534 msgid "I suggest: Checking the team strategy view" msgstr "" #. TRANSLATORS: A suggestion to other player(s) -#: src/hci/quickchat.cpp:2443 +#: src/hci/quickchat.cpp:2537 msgid "I suggest: Researching different tech" msgstr "" #. TRANSLATORS: A suggestion to other player(s) -#: src/hci/quickchat.cpp:2446 +#: src/hci/quickchat.cpp:2540 msgid "I suggest: Keeping research centers busy" msgstr "" #. TRANSLATORS: A suggestion to other player(s) -#: src/hci/quickchat.cpp:2449 +#: src/hci/quickchat.cpp:2543 msgid "I suggest: Building anti-air" msgstr "" #. TRANSLATORS: A suggestion to other player(s) -#: src/hci/quickchat.cpp:2452 +#: src/hci/quickchat.cpp:2546 msgid "I suggest: Repairing your units" msgstr "" #. TRANSLATORS: A suggestion to other player(s) -#: src/hci/quickchat.cpp:2455 +#: src/hci/quickchat.cpp:2549 msgid "I suggest: Building repair facilities" msgstr "" #. TRANSLATORS: A suggestion to other player(s) -#: src/hci/quickchat.cpp:2458 +#: src/hci/quickchat.cpp:2552 msgid "I suggest: Building power generators" msgstr "" #. TRANSLATORS: A suggestion to other player(s) -#: src/hci/quickchat.cpp:2461 +#: src/hci/quickchat.cpp:2555 msgid "I suggest: Capturing oil resources" msgstr "" -#: src/hci/quickchat.cpp:2474 +#: src/hci/quickchat.cpp:2573 msgid "Hey everyone!" msgstr "" -#: src/hci/quickchat.cpp:2476 +#: src/hci/quickchat.cpp:2575 msgid "Welcome!" msgstr "" -#: src/hci/quickchat.cpp:2478 +#: src/hci/quickchat.cpp:2577 msgid "I want to spectate" msgstr "" -#: src/hci/quickchat.cpp:2480 +#: src/hci/quickchat.cpp:2579 msgid "I want to play" msgstr "" -#: src/hci/quickchat.cpp:2482 +#: src/hci/quickchat.cpp:2581 msgid "I want to switch teams" msgstr "" -#: src/hci/quickchat.cpp:2484 +#: src/hci/quickchat.cpp:2583 msgid "Please check Ready so we can start" msgstr "" -#: src/hci/quickchat.cpp:2489 +#: src/hci/quickchat.cpp:2588 msgid "Please wait" msgstr "" -#: src/hci/quickchat.cpp:2491 +#: src/hci/quickchat.cpp:2590 msgid "Let's go!" msgstr "" #. TRANSLATORS: As in "I am almost ready" (but shorter, more informal) -#: src/hci/quickchat.cpp:2495 +#: src/hci/quickchat.cpp:2594 msgid "Almost ready" msgstr "" #. TRANSLATORS: As in "I am ready" (but shorter, more informal) -#: src/hci/quickchat.cpp:2498 +#: src/hci/quickchat.cpp:2597 msgid "Ready" msgstr "" -#: src/hci/quickchat.cpp:2500 +#: src/hci/quickchat.cpp:2599 msgid "Be right back" msgstr "" -#: src/hci/quickchat.cpp:2502 +#: src/hci/quickchat.cpp:2601 msgid "I'm back" msgstr "" -#: src/hci/quickchat.cpp:2505 +#: src/hci/quickchat.cpp:2604 msgid "Yes" msgstr "" -#: src/hci/quickchat.cpp:2507 +#: src/hci/quickchat.cpp:2606 msgid "No" msgstr "" -#: src/hci/quickchat.cpp:2509 +#: src/hci/quickchat.cpp:2608 msgid "Maybe" msgstr "" -#: src/hci/quickchat.cpp:2511 +#: src/hci/quickchat.cpp:2610 msgid "Not yet" msgstr "" -#: src/hci/quickchat.cpp:2513 +#: src/hci/quickchat.cpp:2612 msgid "Soon" msgstr "" -#: src/hci/quickchat.cpp:2515 +#: src/hci/quickchat.cpp:2614 msgid "Thank you" msgstr "" -#: src/hci/quickchat.cpp:2517 +#: src/hci/quickchat.cpp:2616 msgid "No problem" msgstr "" -#: src/hci/quickchat.cpp:2521 +#: src/hci/quickchat.cpp:2620 msgid "Well-played" msgstr "" #. TRANSLATORS: Should probably be left as-is, unless there is a better way of denoting a censored outburst in your language -#: src/hci/quickchat.cpp:2524 +#: src/hci/quickchat.cpp:2623 msgid "@#%*!" msgstr "" -#: src/hci/quickchat.cpp:2526 +#: src/hci/quickchat.cpp:2625 msgid "Sorry, I don't understand. (Use Quick Chat?)" msgstr "" -#: src/hci/quickchat.cpp:2530 +#: src/hci/quickchat.cpp:2629 msgid "Get ready..." msgstr "" -#: src/hci/quickchat.cpp:2532 +#: src/hci/quickchat.cpp:2631 msgid "You're going to regret that" msgstr "" -#: src/hci/quickchat.cpp:2534 +#: src/hci/quickchat.cpp:2633 msgid "Barely a scratch!" msgstr "" -#: src/hci/quickchat.cpp:2538 +#: src/hci/quickchat.cpp:2637 msgid "Attack now?" msgstr "" -#: src/hci/quickchat.cpp:2540 +#: src/hci/quickchat.cpp:2639 msgid "Group up" msgstr "" -#: src/hci/quickchat.cpp:2542 +#: src/hci/quickchat.cpp:2641 msgid "Split up" msgstr "" -#: src/hci/quickchat.cpp:2544 +#: src/hci/quickchat.cpp:2643 msgid "Focus attacks where marked" msgstr "" -#: src/hci/quickchat.cpp:2546 +#: src/hci/quickchat.cpp:2645 msgid "Retreat!" msgstr "" -#: src/hci/quickchat.cpp:2548 +#: src/hci/quickchat.cpp:2647 msgid "I need help!" msgstr "" -#: src/hci/quickchat.cpp:2550 +#: src/hci/quickchat.cpp:2649 msgid "Left side" msgstr "" -#: src/hci/quickchat.cpp:2552 +#: src/hci/quickchat.cpp:2651 msgid "Right side" msgstr "" -#: src/hci/quickchat.cpp:2554 +#: src/hci/quickchat.cpp:2653 msgid "Transfer Request: Units" msgstr "" -#: src/hci/quickchat.cpp:2556 +#: src/hci/quickchat.cpp:2655 msgid "Transfer Request: Trucks" msgstr "" #. TRANSLATORS: As in "I am attacking now!" (but shorter, more informal) -#: src/hci/quickchat.cpp:2560 +#: src/hci/quickchat.cpp:2659 msgid "Attacking now!" msgstr "" #. TRANSLATORS: As in "I am on my way!" (but shorter, more informal) -#: src/hci/quickchat.cpp:2563 +#: src/hci/quickchat.cpp:2662 msgid "On my way!" msgstr "" -#: src/hci/quickchat.cpp:2565 +#: src/hci/quickchat.cpp:2664 msgid "They're coming!" msgstr "" -#: src/hci/quickchat.cpp:2567 +#: src/hci/quickchat.cpp:2666 msgid "I'm being attacked!" msgstr "" -#: src/hci/quickchat.cpp:2569 +#: src/hci/quickchat.cpp:2668 msgid "I'm rushing oils" msgstr "" -#: src/hci/quickchat.cpp:2571 +#: src/hci/quickchat.cpp:2670 msgid "They're rushing oils!" msgstr "" -#: src/hci/quickchat.cpp:2573 +#: src/hci/quickchat.cpp:2672 msgid "I don't have enough power" msgstr "" #. TRANSLATORS: A suggestion to other player(s), as in "Suggestion: %s" -#: src/hci/quickchat.cpp:2577 +#: src/hci/quickchat.cpp:2676 msgid "Build more units" msgstr "" #. TRANSLATORS: A suggestion to other player(s), as in "Suggestion: %s" -#: src/hci/quickchat.cpp:2580 +#: src/hci/quickchat.cpp:2679 msgid "Build different units" msgstr "" #. TRANSLATORS: A suggestion to other player(s), as in "Suggestion: %s" -#: src/hci/quickchat.cpp:2583 +#: src/hci/quickchat.cpp:2682 msgid "Check team strategy view" msgstr "" #. TRANSLATORS: A suggestion to other player(s), as in "Suggestion: %s" -#: src/hci/quickchat.cpp:2586 +#: src/hci/quickchat.cpp:2685 msgid "Research different tech" msgstr "" #. TRANSLATORS: A suggestion to other player(s), as in "Suggestion: %s" -#: src/hci/quickchat.cpp:2589 +#: src/hci/quickchat.cpp:2688 msgid "Keep research centers busy" msgstr "" #. TRANSLATORS: A suggestion to other player(s), as in "Suggestion: %s" -#: src/hci/quickchat.cpp:2592 +#: src/hci/quickchat.cpp:2691 msgid "Build anti-air" msgstr "" #. TRANSLATORS: A suggestion to other player(s), as in "Suggestion: %s" -#: src/hci/quickchat.cpp:2595 +#: src/hci/quickchat.cpp:2694 msgid "Repair your units" msgstr "" #. TRANSLATORS: A suggestion to other player(s), as in "Suggestion: %s" -#: src/hci/quickchat.cpp:2598 +#: src/hci/quickchat.cpp:2697 msgid "Build repair facilities" msgstr "" #. TRANSLATORS: A suggestion to other player(s), as in "Suggestion: %s" -#: src/hci/quickchat.cpp:2601 +#: src/hci/quickchat.cpp:2700 msgid "Build power generators" msgstr "" #. TRANSLATORS: A suggestion to other player(s), as in "Suggestion: %s" -#: src/hci/quickchat.cpp:2604 +#: src/hci/quickchat.cpp:2703 msgid "Capture oil resources" msgstr "" -#: src/hci/quickchat.cpp:2608 +#: src/hci/quickchat.cpp:2707 msgid "That didn't go well..." msgstr "" -#: src/hci/quickchat.cpp:2610 +#: src/hci/quickchat.cpp:2709 msgid "I have another plan" msgstr "" -#: src/hci/quickchat.cpp:2614 +#: src/hci/quickchat.cpp:2713 msgid "Good game" msgstr "" -#: src/hci/quickchat.cpp:2616 +#: src/hci/quickchat.cpp:2715 msgid "I give up" msgstr "" -#: src/hci/quickchat.cpp:2618 +#: src/hci/quickchat.cpp:2717 msgid "Sorry, I have to leave" msgstr "" -#: src/hci/quickchat.cpp:2622 +#: src/hci/quickchat.cpp:2721 msgid "Message delivery failure - try again" msgstr "" -#: src/hci/quickchat.cpp:2624 +#: src/hci/quickchat.cpp:2723 msgid "Map Downloaded" msgstr "" -#: src/hci/quickchat.cpp:2734 +#: src/hci/quickchat.cpp:2725 +msgid "Admin modified a setting" +msgstr "" + +#: src/hci/quickchat.cpp:2835 msgid "Bot Allies" msgstr "" -#: src/hci/quickchat.cpp:2746 +#: src/hci/quickchat.cpp:2847 msgid "Human Allies" msgstr "" -#: src/hci/quickchat.cpp:2816 +#: src/hci/quickchat.cpp:2937 msgid "You have sent too many messages in the last few seconds. Please wait and try again." msgstr "" @@ -17256,7 +17309,7 @@ msgstr "" #: src/ingameop.cpp:260 #: src/ingameop.cpp:271 -#: src/mission.cpp:2547 +#: src/mission.cpp:2550 msgid "Save Game" msgstr "" @@ -18783,28 +18836,28 @@ msgstr "" msgid "Select Default" msgstr "" -#: src/loadsave.cpp:363 +#: src/loadsave.cpp:364 msgid "Parent directory" msgstr "" -#: src/loadsave.cpp:368 +#: src/loadsave.cpp:369 msgid "Autosave directory" msgstr "" -#: src/loadsave.cpp:368 +#: src/loadsave.cpp:369 msgid "Autosave directory (not allowed for saving)" msgstr "" -#: src/loadsave.cpp:663 +#: src/loadsave.cpp:664 msgid "cheated" msgstr "" -#: src/loadsave.cpp:1168 +#: src/loadsave.cpp:1169 #, c-format msgid "AutoSave %s" msgstr "" -#: src/loadsave.cpp:1173 +#: src/loadsave.cpp:1174 #, c-format msgid "AutoSave %s failed" msgstr "" @@ -18827,38 +18880,38 @@ msgstr "" msgid "Open the Transporter Load Menu" msgstr "" -#: src/mission.cpp:2372 +#: src/mission.cpp:2375 msgid "OBJECTIVE ACHIEVED by cheating!" msgstr "" -#: src/mission.cpp:2372 +#: src/mission.cpp:2375 msgid "OBJECTIVE ACHIEVED" msgstr "" -#: src/mission.cpp:2378 +#: src/mission.cpp:2381 msgid "OBJECTIVE FAILED--and you cheated!" msgstr "" -#: src/mission.cpp:2378 +#: src/mission.cpp:2381 msgid "OBJECTIVE FAILED" msgstr "" -#: src/mission.cpp:2407 +#: src/mission.cpp:2410 msgid "Continue Game" msgstr "" -#: src/mission.cpp:2417 -#: src/mission.cpp:2453 -#: src/mission.cpp:2566 +#: src/mission.cpp:2420 +#: src/mission.cpp:2456 +#: src/mission.cpp:2569 msgid "Quit To Main Menu" msgstr "" -#: src/mission.cpp:2447 -#: src/mission.cpp:2544 +#: src/mission.cpp:2450 +#: src/mission.cpp:2547 msgid "Load Saved Game" msgstr "" -#: src/mission.cpp:2512 +#: src/mission.cpp:2515 msgid "GAME SAVED :" msgstr "" @@ -18924,7 +18977,7 @@ msgstr "" #: src/multiint.cpp:449 #: src/multiint.cpp:454 -#: src/multiplay.cpp:607 +#: src/multiplay.cpp:699 msgid "Commander" msgstr "" @@ -19068,616 +19121,616 @@ msgstr "" msgid "Start Hosting Game" msgstr "" -#: src/multiint.cpp:1590 +#: src/multiint.cpp:1623 msgid "DIFFICULTY" msgstr "" -#: src/multiint.cpp:1620 +#: src/multiint.cpp:1653 msgid "Starts disadvantaged" msgstr "" -#: src/multiint.cpp:1621 +#: src/multiint.cpp:1654 msgid "Plays nice" msgstr "" -#: src/multiint.cpp:1622 +#: src/multiint.cpp:1655 msgid "No holds barred" msgstr "" -#: src/multiint.cpp:1623 +#: src/multiint.cpp:1656 msgid "Starts with advantages" msgstr "" -#: src/multiint.cpp:1658 +#: src/multiint.cpp:1691 msgid "CHOOSE AI" msgstr "" -#: src/multiint.cpp:1734 +#: src/multiint.cpp:1767 msgid "Allow human players to join in this slot" msgstr "" -#: src/multiint.cpp:1745 +#: src/multiint.cpp:1778 msgid "Leave this slot unused" msgstr "" -#: src/multiint.cpp:1765 +#: src/multiint.cpp:1798 msgid "Allow spectators to join in this slot" msgstr "" -#: src/multiint.cpp:1856 +#: src/multiint.cpp:1889 msgid "Click to change to this slot" msgstr "" -#: src/multiint.cpp:1883 +#: src/multiint.cpp:1916 #, c-format msgid "Click to take player slot %u" msgstr "" -#: src/multiint.cpp:1920 +#: src/multiint.cpp:1953 msgid "Click to swap player to this slot" msgstr "" -#: src/multiint.cpp:1937 -#: src/multiint.cpp:3041 +#: src/multiint.cpp:1970 +#: src/multiint.cpp:3171 #, c-format msgid "Spectator %s has moved to Players" msgstr "" -#: src/multiint.cpp:1943 +#: src/multiint.cpp:1976 msgid "Cannot swap with host" msgstr "" -#: src/multiint.cpp:2200 -#: src/multiint.cpp:4102 -#: src/multiint.cpp:7940 -#: src/multiint.cpp:8231 +#: src/multiint.cpp:2233 +#: src/multiint.cpp:4233 +#: src/multiint.cpp:8072 +#: src/multiint.cpp:8363 #: src/titleui/protocol.cpp:189 msgid "Spectator" msgstr "" -#: src/multiint.cpp:2212 -#: src/multiint.cpp:4394 +#: src/multiint.cpp:2245 +#: src/multiint.cpp:4525 #, c-format msgid "The host has kicked %s from the game!" msgstr "" -#: src/multiint.cpp:2213 -#: src/multiint.cpp:4396 +#: src/multiint.cpp:2246 +#: src/multiint.cpp:4527 #: src/multivote.cpp:677 #: src/screens/netpregamescreen.cpp:329 msgid "The host has kicked you from the game." msgstr "" -#: src/multiint.cpp:2232 +#: src/multiint.cpp:2265 #, c-format msgid "The host has banned %s from the game!" msgstr "" -#: src/multiint.cpp:2233 +#: src/multiint.cpp:2266 msgid "The host has banned you from the game." msgstr "" -#: src/multiint.cpp:2268 +#: src/multiint.cpp:2301 #, c-format msgid "Failed to move %s to Spectators" msgstr "" -#: src/multiint.cpp:2273 +#: src/multiint.cpp:2306 #, c-format msgid "The host has moved %s to Spectators!" msgstr "" -#: src/multiint.cpp:2296 +#: src/multiint.cpp:2329 msgid "Move to Spectators" msgstr "" -#: src/multiint.cpp:2317 +#: src/multiint.cpp:2350 msgid "Ask Spectator to Play" msgstr "" -#: src/multiint.cpp:2333 +#: src/multiint.cpp:2366 msgid "Ask to Play" msgstr "" -#: src/multiint.cpp:2924 +#: src/multiint.cpp:3054 #, c-format msgid "Spectator %s wants to remain a Spectator" msgstr "" -#: src/multiint.cpp:2928 +#: src/multiint.cpp:3058 #, c-format msgid "Player %s wants to remain a Player" msgstr "" -#: src/multiint.cpp:2936 +#: src/multiint.cpp:3066 msgid "Host has declined to switch you to a Player" msgstr "" -#: src/multiint.cpp:2940 +#: src/multiint.cpp:3070 msgid "Unable to switch to Spectator" msgstr "" -#: src/multiint.cpp:2968 +#: src/multiint.cpp:3098 msgid "Do you want to spectate?" msgstr "" -#: src/multiint.cpp:2969 +#: src/multiint.cpp:3099 msgid "The host of this game wants to know if you're willing to spectate?" msgstr "" -#: src/multiint.cpp:2971 +#: src/multiint.cpp:3101 msgid "You are currently a Player." msgstr "" -#: src/multiint.cpp:2972 +#: src/multiint.cpp:3102 msgid "Yes, I will spectate!" msgstr "" -#: src/multiint.cpp:2977 +#: src/multiint.cpp:3107 msgid "Do you want to play?" msgstr "" -#: src/multiint.cpp:2978 +#: src/multiint.cpp:3108 msgid "The host of this game wants to know if you'd like to play?" msgstr "" -#: src/multiint.cpp:2980 +#: src/multiint.cpp:3110 msgid "You are currently a Spectator." msgstr "" -#: src/multiint.cpp:2981 +#: src/multiint.cpp:3111 msgid "Yes, I want to play!" msgstr "" -#: src/multiint.cpp:3025 +#: src/multiint.cpp:3155 #, c-format msgid "Player %s has moved to Spectators" msgstr "" -#: src/multiint.cpp:3052 +#: src/multiint.cpp:3182 #, c-format msgid "Unable to move %s to Players - no available slot" msgstr "" -#: src/multiint.cpp:3073 +#: src/multiint.cpp:3203 msgid "Spectator would like to become a Player" msgstr "" -#: src/multiint.cpp:3074 +#: src/multiint.cpp:3204 #, c-format msgid "Spectator \"%s\" would like to become a player." msgstr "" -#: src/multiint.cpp:3076 +#: src/multiint.cpp:3206 msgid "However, there are currently no open Player slots." msgstr "" -#: src/multiint.cpp:3078 +#: src/multiint.cpp:3208 msgid "Would you like to swap this Spectator with a Player?" msgstr "" -#: src/multiint.cpp:3079 +#: src/multiint.cpp:3209 msgid "Yes, select Player slot" msgstr "" -#: src/multiint.cpp:3368 +#: src/multiint.cpp:3498 msgid "Joined:" msgstr "" -#: src/multiint.cpp:3371 +#: src/multiint.cpp:3501 msgid "Ready:" msgstr "" -#: src/multiint.cpp:3549 +#: src/multiint.cpp:3679 #: src/titleui/gamefind.cpp:283 msgid "Players" msgstr "" -#: src/multiint.cpp:3579 +#: src/multiint.cpp:3709 msgid "Host Options" msgstr "" -#: src/multiint.cpp:3860 +#: src/multiint.cpp:3990 msgid "Enable Spectator Join" msgstr "" -#: src/multiint.cpp:3870 +#: src/multiint.cpp:4000 msgid "Lock Teams" msgstr "" -#: src/multiint.cpp:4106 +#: src/multiint.cpp:4237 msgid "Choose Team" msgstr "" -#: src/multiint.cpp:4110 +#: src/multiint.cpp:4241 msgid "Teams locked" msgstr "" -#: src/multiint.cpp:4131 +#: src/multiint.cpp:4262 msgid "Click to change player colour" msgstr "" -#: src/multiint.cpp:4142 +#: src/multiint.cpp:4273 msgid "Click to change player position" msgstr "" -#: src/multiint.cpp:4151 +#: src/multiint.cpp:4282 msgid "Click to change AI, right click to distribute choice" msgstr "" -#: src/multiint.cpp:4155 +#: src/multiint.cpp:4286 msgid "Click to close spectator slot" msgstr "" -#: src/multiint.cpp:4174 +#: src/multiint.cpp:4305 msgid "Player ID: " msgstr "" -#: src/multiint.cpp:4175 +#: src/multiint.cpp:4306 msgid "(none)" msgstr "" -#: src/multiint.cpp:4196 +#: src/multiint.cpp:4327 msgid "Alt Name:" msgstr "" -#: src/multiint.cpp:4215 +#: src/multiint.cpp:4346 msgid "Player rating:" msgstr "" -#: src/multiint.cpp:4226 +#: src/multiint.cpp:4357 msgid "Host provided" msgstr "" -#: src/multiint.cpp:4230 +#: src/multiint.cpp:4361 #, c-format msgid "From: %s" msgstr "" -#: src/multiint.cpp:4303 +#: src/multiint.cpp:4434 msgid "Click to change difficulty" msgstr "" -#: src/multiint.cpp:4341 +#: src/multiint.cpp:4472 msgid "Waiting for player" msgstr "" -#: src/multiint.cpp:4341 +#: src/multiint.cpp:4472 msgid "Player is ready" msgstr "" -#: src/multiint.cpp:4341 +#: src/multiint.cpp:4472 msgid "Player is downloading" msgstr "" -#: src/multiint.cpp:4341 +#: src/multiint.cpp:4472 msgid "Click when ready" msgstr "" -#: src/multiint.cpp:4341 +#: src/multiint.cpp:4472 msgid "Waiting for download" msgstr "" -#: src/multiint.cpp:4413 +#: src/multiint.cpp:4544 msgid "READY?" msgstr "" -#: src/multiint.cpp:4497 +#: src/multiint.cpp:4628 msgid "For Spectator:" msgstr "" -#: src/multiint.cpp:4497 +#: src/multiint.cpp:4628 msgid "For Player:" msgstr "" -#: src/multiint.cpp:4515 +#: src/multiint.cpp:4646 msgid "Choose Player Slot" msgstr "" -#: src/multiint.cpp:4586 +#: src/multiint.cpp:4717 msgid "PLAYERS" msgstr "" -#: src/multiint.cpp:4690 +#: src/multiint.cpp:4821 msgid "Add spectator slot" msgstr "" -#: src/multiint.cpp:4774 +#: src/multiint.cpp:4905 msgid "Kicked from game" msgstr "" -#: src/multiint.cpp:4865 -#: src/multiint.cpp:4971 -#: src/multiint.cpp:5004 +#: src/multiint.cpp:4996 +#: src/multiint.cpp:5102 +#: src/multiint.cpp:5135 #: src/screens/chatscreen.cpp:157 msgid "The host has disabled free chat. Please use Quick Chat." msgstr "" -#: src/multiint.cpp:4955 -#: src/multiint.cpp:4958 +#: src/multiint.cpp:5086 +#: src/multiint.cpp:5089 msgid "Quick Chat" msgstr "" -#: src/multiint.cpp:4969 -#: src/multiint.cpp:4975 +#: src/multiint.cpp:5100 +#: src/multiint.cpp:5106 msgid "Press the Tab key to open Quick Chat." msgstr "" -#: src/multiint.cpp:4977 -#: src/multiint.cpp:5007 +#: src/multiint.cpp:5108 +#: src/multiint.cpp:5138 msgid "The host has disabled free chat. Please use Quick Chat or /hostmsg commands." msgstr "" -#: src/multiint.cpp:5010 +#: src/multiint.cpp:5141 msgid "The host has enabled free chat for you." msgstr "" -#: src/multiint.cpp:5376 +#: src/multiint.cpp:5507 msgid "Copy Text to Clipboard" msgstr "" -#: src/multiint.cpp:5391 +#: src/multiint.cpp:5522 #, c-format msgid "Mute Player: %s" msgstr "" -#: src/multiint.cpp:5395 +#: src/multiint.cpp:5526 #, c-format msgid "Unmute Player: %s" msgstr "" -#: src/multiint.cpp:5499 +#: src/multiint.cpp:5630 msgid "CHAT" msgstr "" -#: src/multiint.cpp:6170 +#: src/multiint.cpp:6301 #: src/titleui/gamefind.cpp:238 msgid "Multiplayer Lobby Support Unavailable" msgstr "" -#: src/multiint.cpp:6172 +#: src/multiint.cpp:6303 msgid "Your client cannot connect to the mutiplayer lobby." msgstr "" -#: src/multiint.cpp:6174 +#: src/multiint.cpp:6305 #: src/updatemanager.cpp:627 msgid "Please click the button below for more information on how to fix it." msgstr "" -#: src/multiint.cpp:6177 +#: src/multiint.cpp:6308 #: src/updatemanager.cpp:633 msgid "More Information" msgstr "" -#: src/multiint.cpp:6209 +#: src/multiint.cpp:6341 msgid "Sorry! Failed to host the game." msgstr "" -#: src/multiint.cpp:6275 +#: src/multiint.cpp:6407 msgid "Game Name Updated." msgstr "" -#: src/multiint.cpp:6387 +#: src/multiint.cpp:6519 #, c-format msgid "*** password [%s] is now required! ***" msgstr "" -#: src/multiint.cpp:6393 +#: src/multiint.cpp:6525 msgid "*** password is NOT required! ***" msgstr "" -#: src/multiint.cpp:6408 +#: src/multiint.cpp:6540 msgid "This is a map-mod, it can change your playing experience!" msgstr "" -#: src/multiint.cpp:6413 +#: src/multiint.cpp:6545 msgid "This is a random map, it can vary your playing experience!" msgstr "" -#: src/multiint.cpp:6568 +#: src/multiint.cpp:6700 msgid "Host is Starting Game" msgstr "" -#: src/multiint.cpp:6745 +#: src/multiint.cpp:6877 #: src/stdinreader.cpp:568 #, c-format msgid "Host: Free chat enabled for: %s" msgstr "" -#: src/multiint.cpp:6749 +#: src/multiint.cpp:6881 #: src/stdinreader.cpp:572 #, c-format msgid "Host: Free chat muted for: %s" msgstr "" -#: src/multiint.cpp:6782 +#: src/multiint.cpp:6914 #, c-format msgid "Moving %s to Spectators!" msgstr "" -#: src/multiint.cpp:6809 +#: src/multiint.cpp:6941 #, c-format msgid "Asking %s to move to Players..." msgstr "" -#: src/multiint.cpp:6993 -#: src/multiint.cpp:7022 -#: src/multiint.cpp:7349 +#: src/multiint.cpp:7125 +#: src/multiint.cpp:7154 +#: src/multiint.cpp:7481 msgid "Disconnected from host:" msgstr "" -#: src/multiint.cpp:6993 +#: src/multiint.cpp:7125 msgid "Host supplied invalid options" msgstr "" -#: src/multiint.cpp:7022 +#: src/multiint.cpp:7154 msgid "Host supplied invalid host config" msgstr "" -#: src/multiint.cpp:7255 +#: src/multiint.cpp:7387 msgid "You have been kicked: " msgstr "" -#: src/multiint.cpp:7269 -#: src/multiint.cpp:7618 +#: src/multiint.cpp:7401 +#: src/multiint.cpp:7750 msgid "Connection lost:" msgstr "" -#: src/multiint.cpp:7269 +#: src/multiint.cpp:7401 msgid "No connection to host." msgstr "" -#: src/multiint.cpp:7347 +#: src/multiint.cpp:7479 msgid "The host moved me to Players, but I never gave permission for this change. Bye!" msgstr "" -#: src/multiint.cpp:7349 +#: src/multiint.cpp:7481 msgid "The host tried to move us to Players, but we never gave permission." msgstr "" -#: src/multiint.cpp:7511 +#: src/multiint.cpp:7643 msgid "Cannot change to a map with too few slots for all players." msgstr "" -#: src/multiint.cpp:7516 +#: src/multiint.cpp:7648 msgid "Cannot change to a map with fewer slots." msgstr "" -#: src/multiint.cpp:7618 +#: src/multiint.cpp:7750 msgid "The host has quit." msgstr "" -#: src/multiint.cpp:7652 +#: src/multiint.cpp:7784 msgid "Hit the ready box to begin your challenge!" msgstr "" -#: src/multiint.cpp:7657 +#: src/multiint.cpp:7789 msgid "Press the start hosting button to begin hosting a game." msgstr "" -#: src/multiint.cpp:7672 +#: src/multiint.cpp:7804 msgid "Port mapping creation is in progress..." msgstr "" -#: src/multiint.cpp:7681 +#: src/multiint.cpp:7813 #, c-format msgid "Port mapping disabled by user. Autoconfig of port %d will not happen." msgstr "" -#: src/multiint.cpp:7751 +#: src/multiint.cpp:7883 msgid "Failed to load challenge:" msgstr "" -#: src/multiint.cpp:7751 +#: src/multiint.cpp:7883 msgid "Failed to load the challenge's map or config" msgstr "" -#: src/multiint.cpp:7756 +#: src/multiint.cpp:7888 msgid "Failed to process autohost config:" msgstr "" -#: src/multiint.cpp:7756 +#: src/multiint.cpp:7888 #, c-format msgid "Failed to load the autohost map or config from: %s" msgstr "" -#: src/multiint.cpp:7934 -#: src/multiint.cpp:8235 +#: src/multiint.cpp:8066 +#: src/multiint.cpp:8367 msgid "Closed" msgstr "" -#: src/multiint.cpp:7937 -#: src/multiint.cpp:8227 +#: src/multiint.cpp:8069 +#: src/multiint.cpp:8359 msgid "Open" msgstr "" -#: src/multiint.cpp:8032 +#: src/multiint.cpp:8164 #, c-format msgid "Sending Map: %u%% " msgstr "" -#: src/multiint.cpp:8032 +#: src/multiint.cpp:8164 #, c-format msgid "Map: %u%% downloaded" msgstr "" -#: src/multiint.cpp:8082 +#: src/multiint.cpp:8214 msgid "HOST" msgstr "" -#: src/multiint.cpp:8089 +#: src/multiint.cpp:8221 #: src/multimenu.cpp:835 msgid "Ping" msgstr "" -#: src/multiint.cpp:9037 +#: src/multiint.cpp:9179 msgid "The version of Warzone 2100 used to save this replay file does not match the currently-running version." msgstr "" -#: src/multiint.cpp:9039 +#: src/multiint.cpp:9181 #, c-format msgid "Replay File Saved With: \"%s\"" msgstr "" -#: src/multiint.cpp:9043 +#: src/multiint.cpp:9185 #, c-format msgid "Current Warzone 2100 Version: \"%s\"" msgstr "" -#: src/multiint.cpp:9053 +#: src/multiint.cpp:9195 msgid "Replays should usually be played back with the same version used to save the replay." msgstr "" -#: src/multiint.cpp:9055 +#: src/multiint.cpp:9197 msgid "The replay may not playback successfully, or there may be differences in the simulation." msgstr "" -#: src/multiint.cpp:9056 +#: src/multiint.cpp:9198 msgid "Replay Version Mismatch" msgstr "" -#: src/multijoin.cpp:408 +#: src/multijoin.cpp:410 #, c-format msgid "%s has Left the Game" msgstr "" -#: src/multijoin.cpp:417 +#: src/multijoin.cpp:419 #, c-format msgid "%s joined the Game" msgstr "" -#: src/multijoin.cpp:510 +#: src/multijoin.cpp:512 #, c-format msgid "File transfer has been aborted for %d." msgstr "" -#: src/multijoin.cpp:568 +#: src/multijoin.cpp:573 msgid "The game is already full." msgstr "" -#: src/multijoin.cpp:649 -#: src/multiplay.cpp:828 -#: src/multiplay.cpp:1013 +#: src/multijoin.cpp:654 +#: src/multiplay.cpp:920 +#: src/multiplay.cpp:1105 #, c-format msgid "%s (%u) has an incompatible mod, and has been kicked." msgstr "" -#: src/multijoin.cpp:653 -#: src/multiplay.cpp:833 -#: src/multiplay.cpp:1017 +#: src/multijoin.cpp:658 +#: src/multiplay.cpp:925 +#: src/multiplay.cpp:1109 msgid "Your data doesn't match the host's!" msgstr "" -#: src/multijoin.cpp:690 +#: src/multijoin.cpp:696 #, c-format msgid "%s is joining the game" msgstr "" -#: src/multijoin.cpp:702 +#: src/multijoin.cpp:708 msgid "Server message:" msgstr "" -#: src/multijoin.cpp:715 +#: src/multijoin.cpp:721 msgid "There is an update to the game, please visit https://wz2100.net to download new version." msgstr "" @@ -19711,7 +19764,7 @@ msgstr "" msgid "Limits Reset To Default Values" msgstr "" -#: src/multilobbycommands.cpp:357 +#: src/multilobbycommands.cpp:358 msgid "Administrator has kicked you from the game." msgstr "" @@ -19845,155 +19898,155 @@ msgid "MOD REQUESTED!" msgstr "" #: src/multiopt.cpp:479 -#: src/multiplay.cpp:2164 +#: src/multiplay.cpp:2263 msgid "Warning, this is a map-mod, it could alter normal gameplay." msgstr "" #: src/multiopt.cpp:480 -#: src/multiplay.cpp:2168 +#: src/multiplay.cpp:2267 msgid "Warning, HOST has altered the game code, and can't be trusted!" msgstr "" -#: src/multiopt.cpp:782 +#: src/multiopt.cpp:784 msgid "The host has enabled free chat for everyone." msgstr "" -#: src/multiopt.cpp:790 +#: src/multiopt.cpp:792 msgid "The host has muted free chat for everyone." msgstr "" -#: src/multiopt.cpp:815 +#: src/multiopt.cpp:817 #, c-format msgid "The host has enabled free chat for player: %s" msgstr "" -#: src/multiopt.cpp:821 +#: src/multiopt.cpp:823 #, c-format msgid "The host has muted free chat for player: %s" msgstr "" -#: src/multiplay.cpp:398 +#: src/multiplay.cpp:488 #, c-format msgid "Kicking player %s, because they tried to bypass data integrity check!" msgstr "" -#: src/multiplay.cpp:405 +#: src/multiplay.cpp:495 msgid "Invalid data!" msgstr "" -#: src/multiplay.cpp:1167 +#: src/multiplay.cpp:1266 #, c-format msgid "Auto kicking player %s, invalid command received: %u" msgstr "" -#: src/multiplay.cpp:1169 +#: src/multiplay.cpp:1268 msgid "Unauthorized network command" msgstr "" -#: src/multiplay.cpp:1278 +#: src/multiplay.cpp:1377 msgid "REPLAY HAS ENDED" msgstr "" -#: src/multiplay.cpp:1279 +#: src/multiplay.cpp:1378 msgid "(Press ESC to quit.)" msgstr "" -#: src/multiplay.cpp:1465 +#: src/multiplay.cpp:1564 #, c-format msgid "Auto kicking player %s, invalid command received." msgstr "" -#: src/multiplay.cpp:2033 +#: src/multiplay.cpp:2132 msgid "Map was requested: SENDING MAP!" msgstr "" -#: src/multiplay.cpp:2055 +#: src/multiplay.cpp:2154 msgid "Mod was requested: SENDING MOD!" msgstr "" -#: src/multiplay.cpp:2125 +#: src/multiplay.cpp:2224 msgid "FILE SENT!" msgstr "" -#: src/multiplay.cpp:2140 +#: src/multiplay.cpp:2239 msgid "MAP DOWNLOADED!" msgstr "" -#: src/multiplay.cpp:2200 +#: src/multiplay.cpp:2299 #, c-format msgid "Beacon %d" msgstr "" -#: src/multiplay.cpp:2309 +#: src/multiplay.cpp:2408 #, c-format msgid "Beacon received from %s!" msgstr "" -#: src/multiplay.cpp:2367 +#: src/multiplay.cpp:2466 msgid "Green" msgstr "" -#: src/multiplay.cpp:2368 +#: src/multiplay.cpp:2467 msgid "Orange" msgstr "" -#: src/multiplay.cpp:2369 +#: src/multiplay.cpp:2468 msgid "Grey" msgstr "" -#: src/multiplay.cpp:2371 +#: src/multiplay.cpp:2470 msgid "Red" msgstr "" -#: src/multiplay.cpp:2372 +#: src/multiplay.cpp:2471 msgid "Blue" msgstr "" -#: src/multiplay.cpp:2373 +#: src/multiplay.cpp:2472 msgid "Pink" msgstr "" -#: src/multiplay.cpp:2374 +#: src/multiplay.cpp:2473 msgid "Cyan" msgstr "" -#: src/multiplay.cpp:2375 +#: src/multiplay.cpp:2474 msgid "Yellow" msgstr "" -#: src/multiplay.cpp:2376 +#: src/multiplay.cpp:2475 msgid "Purple" msgstr "" -#: src/multiplay.cpp:2377 +#: src/multiplay.cpp:2476 msgid "White" msgstr "" -#: src/multiplay.cpp:2378 +#: src/multiplay.cpp:2477 msgid "Bright blue" msgstr "" -#: src/multiplay.cpp:2379 +#: src/multiplay.cpp:2478 msgid "Neon green" msgstr "" -#: src/multiplay.cpp:2380 +#: src/multiplay.cpp:2479 msgid "Infrared" msgstr "" -#: src/multiplay.cpp:2381 +#: src/multiplay.cpp:2480 msgid "Ultraviolet" msgstr "" -#: src/multiplay.cpp:2382 +#: src/multiplay.cpp:2481 msgid "Brown" msgstr "" -#: src/multiplay.cpp:2563 +#: src/multiplay.cpp:2662 msgid "Spectator Mode" msgstr "" -#: src/multiplay.cpp:2564 +#: src/multiplay.cpp:2663 msgid "You are a spectator. Enjoy watching the game!" msgstr "" @@ -20353,72 +20406,102 @@ msgstr "" msgid "Message from Host:" msgstr "" -#: src/screens/joiningscreen.cpp:807 +#: src/screens/joiningscreen.cpp:811 #: src/titleui/gamefind.cpp:700 msgid "Game is full" msgstr "" -#: src/screens/joiningscreen.cpp:810 +#: src/screens/joiningscreen.cpp:814 #: src/titleui/gamefind.cpp:704 msgid "You were kicked!" msgstr "" -#: src/screens/joiningscreen.cpp:813 +#: src/screens/joiningscreen.cpp:817 msgid "Your game version does not match the host" msgstr "" -#: src/screens/joiningscreen.cpp:816 +#: src/screens/joiningscreen.cpp:820 msgid "The host rejected your connection due to invalid data" msgstr "" -#: src/screens/joiningscreen.cpp:819 +#: src/screens/joiningscreen.cpp:823 #: src/titleui/gamefind.cpp:721 msgid "Host has dropped connection!" msgstr "" -#: src/screens/joiningscreen.cpp:828 +#: src/screens/joiningscreen.cpp:832 #: src/titleui/gamefind.cpp:725 msgid "Connection Error" msgstr "" -#: src/screens/joiningscreen.cpp:920 +#: src/screens/joiningscreen.cpp:924 msgid "No connections available" msgstr "" -#: src/screens/joiningscreen.cpp:929 +#: src/screens/joiningscreen.cpp:933 msgid "Synchronizing data with host ..." msgstr "" -#: src/screens/joiningscreen.cpp:964 +#: src/screens/joiningscreen.cpp:995 +msgid "Waiting for correct join password" +msgstr "" + +#: src/screens/joiningscreen.cpp:997 +msgid "Attempting to connect" +msgstr "" + +#: src/screens/joiningscreen.cpp:999 +msgid "Establishing connection handshake" +msgstr "" + +#: src/screens/joiningscreen.cpp:1001 +msgid "Coordinating join with host" +msgstr "" + +#: src/screens/joiningscreen.cpp:1003 +msgid "Join attempt failed" +msgstr "" + +#: src/screens/joiningscreen.cpp:1015 msgid "Host did not respond before timeout" msgstr "" -#: src/screens/joiningscreen.cpp:1088 +#: src/screens/joiningscreen.cpp:1020 +#, c-format +msgid "Failed at: [%s] - %s" +msgstr "" + +#: src/screens/joiningscreen.cpp:1024 +#, c-format +msgid "Failed at: [%s]" +msgstr "" + +#: src/screens/joiningscreen.cpp:1153 #, c-format msgid "Failed to open connection: [%d] %s" msgstr "" -#: src/screens/joiningscreen.cpp:1179 +#: src/screens/joiningscreen.cpp:1246 msgid "Establishing connection with host" msgstr "" -#: src/screens/joiningscreen.cpp:1265 -#: src/screens/joiningscreen.cpp:1416 +#: src/screens/joiningscreen.cpp:1333 +#: src/screens/joiningscreen.cpp:1484 msgid "An internal error occurred" msgstr "" -#: src/screens/joiningscreen.cpp:1356 +#: src/screens/joiningscreen.cpp:1424 msgid "Invalid host - disconnected" msgstr "" -#: src/screens/joiningscreen.cpp:1373 -#: src/screens/joiningscreen.cpp:1398 -#: src/screens/joiningscreen.cpp:1406 -#: src/screens/joiningscreen.cpp:1492 +#: src/screens/joiningscreen.cpp:1441 +#: src/screens/joiningscreen.cpp:1466 +#: src/screens/joiningscreen.cpp:1474 +#: src/screens/joiningscreen.cpp:1560 msgid "Invalid host response" msgstr "" -#: src/screens/joiningscreen.cpp:1461 +#: src/screens/joiningscreen.cpp:1529 msgid "Requesting to join game" msgstr "" @@ -20741,148 +20824,148 @@ msgstr "" msgid "Repair Facility Award - Nothing" msgstr "" -#: src/terrain.cpp:2586 -#: src/titleui/campaign.cpp:2276 -#: src/titleui/campaign.cpp:2332 +#: src/terrain.cpp:2587 +#: src/titleui/campaign.cpp:2286 +#: src/titleui/campaign.cpp:2342 msgid "Classic" msgstr "" -#: src/titleui/campaign.cpp:393 +#: src/titleui/campaign.cpp:403 msgid "Additional Campaigns" msgstr "" -#: src/titleui/campaign.cpp:568 +#: src/titleui/campaign.cpp:578 msgid "Start Game" msgstr "" -#: src/titleui/campaign.cpp:1234 +#: src/titleui/campaign.cpp:1244 msgid "Tweak Options:" msgstr "" -#: src/titleui/campaign.cpp:1259 +#: src/titleui/campaign.cpp:1269 msgid "Reset to Defaults" msgstr "" -#: src/titleui/campaign.cpp:1613 +#: src/titleui/campaign.cpp:1623 msgid "Command the forces of The Project in a battle to rebuild the world" msgstr "" -#: src/titleui/campaign.cpp:1753 +#: src/titleui/campaign.cpp:1763 msgid "Warzone 2100 Universe" msgstr "" -#: src/titleui/campaign.cpp:1758 +#: src/titleui/campaign.cpp:1768 msgid "WZ2100 Extended Universe" msgstr "" -#: src/titleui/campaign.cpp:1763 +#: src/titleui/campaign.cpp:1773 msgid "Unique Universe" msgstr "" -#: src/titleui/campaign.cpp:1795 +#: src/titleui/campaign.cpp:1805 #, c-format msgid "Requires %s" msgstr "" -#: src/titleui/campaign.cpp:1799 +#: src/titleui/campaign.cpp:1809 msgid "Compatible" msgstr "" -#: src/titleui/campaign.cpp:1812 +#: src/titleui/campaign.cpp:1822 #, c-format msgid "Compatible %s" msgstr "" -#: src/titleui/campaign.cpp:1922 +#: src/titleui/campaign.cpp:1932 msgid "Timer Power Bonus" msgstr "" -#: src/titleui/campaign.cpp:1923 +#: src/titleui/campaign.cpp:1933 msgid "Grant power based on the remaining level timer, so there's no need to wait out the clock." msgstr "" -#: src/titleui/campaign.cpp:1929 +#: src/titleui/campaign.cpp:1939 msgid "Classic Timers" msgstr "" -#: src/titleui/campaign.cpp:1930 +#: src/titleui/campaign.cpp:1940 msgid "Alter / disable timers on specific levels, like the original release. (Allows power-cheating.)" msgstr "" -#: src/titleui/campaign.cpp:1936 +#: src/titleui/campaign.cpp:1946 msgid "40 Unit Limit" msgstr "" -#: src/titleui/campaign.cpp:1937 +#: src/titleui/campaign.cpp:1947 msgid "Lower the player's unit limit to 40, matching the original PS1 release." msgstr "" -#: src/titleui/campaign.cpp:1943 +#: src/titleui/campaign.cpp:1953 msgid "Autosaves-Only" msgstr "" -#: src/titleui/campaign.cpp:1944 +#: src/titleui/campaign.cpp:1954 msgid "Disable the ability to manually save / quick-save, limit autosaves to the beginning of each level." msgstr "" -#: src/titleui/campaign.cpp:1950 +#: src/titleui/campaign.cpp:1960 msgid "PS1 Modifiers" msgstr "" -#: src/titleui/campaign.cpp:1951 +#: src/titleui/campaign.cpp:1961 msgid "Reduces the damage the enemy deals to a third of the current difficulty modifier." msgstr "" -#: src/titleui/campaign.cpp:2161 +#: src/titleui/campaign.cpp:2171 msgid "A more relaxed playthrough - easier than easy" msgstr "" -#: src/titleui/campaign.cpp:2162 +#: src/titleui/campaign.cpp:2172 msgid "A slightly easier challenge than Normal" msgstr "" -#: src/titleui/campaign.cpp:2163 +#: src/titleui/campaign.cpp:2173 msgid "A fun & challenging experience" msgstr "" -#: src/titleui/campaign.cpp:2164 +#: src/titleui/campaign.cpp:2174 msgid "A challenge for players who have beaten the game" msgstr "" -#: src/titleui/campaign.cpp:2165 +#: src/titleui/campaign.cpp:2175 msgid "An unforgiving challenge for experienced players only" msgstr "" -#: src/titleui/campaign.cpp:2276 -#: src/titleui/campaign.cpp:2332 +#: src/titleui/campaign.cpp:2286 +#: src/titleui/campaign.cpp:2342 msgid "\"Classic\" campaign balance" msgstr "" -#: src/titleui/campaign.cpp:2331 +#: src/titleui/campaign.cpp:2341 msgid "Remastered" msgstr "" -#: src/titleui/campaign.cpp:2331 +#: src/titleui/campaign.cpp:2341 msgid "The remastered campaign experience" msgstr "" -#: src/titleui/campaign.cpp:2624 +#: src/titleui/campaign.cpp:2634 msgid "Difficulty:" msgstr "" -#: src/titleui/campaign.cpp:2632 +#: src/titleui/campaign.cpp:2642 msgid "Balance:" msgstr "" -#: src/titleui/campaign.cpp:2648 +#: src/titleui/campaign.cpp:2658 msgid "Start at:" msgstr "" -#: src/titleui/campaign.cpp:2663 +#: src/titleui/campaign.cpp:2673 msgid "Tweaks:" msgstr "" -#: src/titleui/campaign.cpp:2749 +#: src/titleui/campaign.cpp:2759 msgid "CAMPAIGNS" msgstr "" From 7332fc166c40bf5418419a3cac05f25f7dbaeef7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 6 Nov 2024 02:26:17 +0000 Subject: [PATCH 16/38] New Crowdin translations --- po/ar_SA.po | 68 +++++++++++++++++++++++++++++++++++++++++++++++--- po/bg_BG.po | 68 +++++++++++++++++++++++++++++++++++++++++++++++--- po/ca_ES.po | 72 ++++++++++++++++++++++++++++++++++++++++++++++++----- po/cs.po | 68 +++++++++++++++++++++++++++++++++++++++++++++++--- po/da.po | 68 +++++++++++++++++++++++++++++++++++++++++++++++--- po/de.po | 68 +++++++++++++++++++++++++++++++++++++++++++++++--- po/el.po | 68 +++++++++++++++++++++++++++++++++++++++++++++++--- po/en_GB.po | 68 +++++++++++++++++++++++++++++++++++++++++++++++--- po/eo.po | 68 +++++++++++++++++++++++++++++++++++++++++++++++--- po/es.po | 68 +++++++++++++++++++++++++++++++++++++++++++++++--- po/et_EE.po | 68 +++++++++++++++++++++++++++++++++++++++++++++++--- po/fa_IR.po | 68 +++++++++++++++++++++++++++++++++++++++++++++++--- po/fi.po | 68 +++++++++++++++++++++++++++++++++++++++++++++++--- po/fr.po | 68 +++++++++++++++++++++++++++++++++++++++++++++++--- po/fy.po | 68 +++++++++++++++++++++++++++++++++++++++++++++++--- po/ga.po | 68 +++++++++++++++++++++++++++++++++++++++++++++++--- po/he_IL.po | 68 +++++++++++++++++++++++++++++++++++++++++++++++--- po/hr.po | 72 ++++++++++++++++++++++++++++++++++++++++++++++++----- po/hu.po | 68 +++++++++++++++++++++++++++++++++++++++++++++++--- po/id.po | 68 +++++++++++++++++++++++++++++++++++++++++++++++--- po/it.po | 68 +++++++++++++++++++++++++++++++++++++++++++++++--- po/ja_JP.po | 68 +++++++++++++++++++++++++++++++++++++++++++++++--- po/ko.po | 68 +++++++++++++++++++++++++++++++++++++++++++++++--- po/la.po | 68 +++++++++++++++++++++++++++++++++++++++++++++++--- po/lt.po | 68 +++++++++++++++++++++++++++++++++++++++++++++++--- po/my_MM.po | 68 +++++++++++++++++++++++++++++++++++++++++++++++--- po/nb.po | 68 +++++++++++++++++++++++++++++++++++++++++++++++--- po/nl.po | 68 +++++++++++++++++++++++++++++++++++++++++++++++--- po/pl.po | 68 +++++++++++++++++++++++++++++++++++++++++++++++--- po/pt.po | 68 +++++++++++++++++++++++++++++++++++++++++++++++--- po/pt_BR.po | 68 +++++++++++++++++++++++++++++++++++++++++++++++--- po/ro.po | 72 ++++++++++++++++++++++++++++++++++++++++++++++++----- po/ru.po | 68 +++++++++++++++++++++++++++++++++++++++++++++++--- po/sk.po | 68 +++++++++++++++++++++++++++++++++++++++++++++++--- po/sl.po | 68 +++++++++++++++++++++++++++++++++++++++++++++++--- po/tr.po | 72 ++++++++++++++++++++++++++++++++++++++++++++++++----- po/tt_RU.po | 68 +++++++++++++++++++++++++++++++++++++++++++++++--- po/uk_UA.po | 68 +++++++++++++++++++++++++++++++++++++++++++++++--- po/zh_CN.po | 70 +++++++++++++++++++++++++++++++++++++++++++++++---- po/zh_TW.po | 68 +++++++++++++++++++++++++++++++++++++++++++++++--- 40 files changed, 2569 insertions(+), 169 deletions(-) diff --git a/po/ar_SA.po b/po/ar_SA.po index 7d7b2045038..ccae8a897c7 100644 --- a/po/ar_SA.po +++ b/po/ar_SA.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" -"POT-Creation-Date: 2024-09-11 19:20+0000\n" -"PO-Revision-Date: 2024-09-11 19:59\n" +"POT-Creation-Date: 2024-11-01 21:02+0000\n" +"PO-Revision-Date: 2024-11-03 18:06\n" "Last-Translator: \n" "Language-Team: Arabic\n" "Language: ar_SA\n" @@ -6484,11 +6484,11 @@ msgid "Thermal Armor +35%" msgstr "زيادة الدرع الحراري 35%" #, no-c-format -msgid "Thermal armor +40%" +msgid "Thermal Armor +40%" msgstr "زيادة الدرع الحراري 40%" #, no-c-format -msgid "Thermal Armor +40%" +msgid "Thermal armor +40%" msgstr "زيادة الدرع الحراري 40%" #, no-c-format @@ -7754,6 +7754,9 @@ msgstr "" msgid "Shadow filtering not available on this system." msgstr "" +msgid "Opacity: 50%" +msgstr "" + msgid "* Takes effect on game restart" msgstr "* ستأخذ التغييرات مفعولها بعد إعادة تشغيل اللعبة" @@ -7799,6 +7802,9 @@ msgstr "اهتزاز الشاشة" msgid "Groups Menu" msgstr "" +msgid "Options Button" +msgstr "" + msgid "GRAPHICS OPTIONS" msgstr "إعدادات الرسوميات" @@ -8112,6 +8118,12 @@ msgstr "يحاول اللاعب %u أن يغش (باستخدام قائمة تص msgid "Player %u is cheating (debug menu) him/herself a new droid." msgstr "يحاول اللاعب %u أن يغش (باستخدام قائمة تصحيح الأخطاء) لكي يكسب وحدةً جديدة." +msgid "Open In-Game Options" +msgstr "" + +msgid "Close In-Game Options" +msgstr "" + msgid "Hiding Obsolete Tech" msgstr "" @@ -8268,6 +8280,28 @@ msgstr "" msgid "End-Game" msgstr "" +msgid "Host" +msgstr "" + +msgid "Admin" +msgstr "" + +#, c-format +msgid "%s (%s) changed team of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed position of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed color of player (%s) to: %s" +msgstr "" + +#, c-format +msgid "%s (%s) changed faction of player (%s) to: %s" +msgstr "" + msgid "Can someone please transfer me some units?" msgstr "" @@ -8484,6 +8518,9 @@ msgstr "لم ننجح في تسليم الرسالة - حاول مجدداً" msgid "Map Downloaded" msgstr "" +msgid "Admin modified a setting" +msgstr "" + msgid "Bot Allies" msgstr "" @@ -10851,9 +10888,32 @@ msgstr "" msgid "Synchronizing data with host ..." msgstr "" +msgid "Waiting for correct join password" +msgstr "" + +msgid "Attempting to connect" +msgstr "" + +msgid "Establishing connection handshake" +msgstr "" + +msgid "Coordinating join with host" +msgstr "" + +msgid "Join attempt failed" +msgstr "" + msgid "Host did not respond before timeout" msgstr "" +#, c-format +msgid "Failed at: [%s] - %s" +msgstr "" + +#, c-format +msgid "Failed at: [%s]" +msgstr "" + #, c-format msgid "Failed to open connection: [%d] %s" msgstr "" diff --git a/po/bg_BG.po b/po/bg_BG.po index da17899d6f1..2d722256f8c 100644 --- a/po/bg_BG.po +++ b/po/bg_BG.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" -"POT-Creation-Date: 2024-09-11 19:20+0000\n" -"PO-Revision-Date: 2024-09-11 19:59\n" +"POT-Creation-Date: 2024-11-01 21:02+0000\n" +"PO-Revision-Date: 2024-11-03 18:06\n" "Last-Translator: \n" "Language-Team: Bulgarian\n" "Language: bg_BG\n" @@ -6476,11 +6476,11 @@ msgid "Thermal Armor +35%" msgstr "" #, no-c-format -msgid "Thermal armor +40%" +msgid "Thermal Armor +40%" msgstr "" #, no-c-format -msgid "Thermal Armor +40%" +msgid "Thermal armor +40%" msgstr "" #, no-c-format @@ -7720,6 +7720,9 @@ msgstr "" msgid "Shadow filtering not available on this system." msgstr "" +msgid "Opacity: 50%" +msgstr "" + msgid "* Takes effect on game restart" msgstr "* Има ефект след рестартиране на играта" @@ -7765,6 +7768,9 @@ msgstr "Клатене на екрана" msgid "Groups Menu" msgstr "" +msgid "Options Button" +msgstr "" + msgid "GRAPHICS OPTIONS" msgstr "ГРАФИКА" @@ -8078,6 +8084,12 @@ msgstr "" msgid "Player %u is cheating (debug menu) him/herself a new droid." msgstr "" +msgid "Open In-Game Options" +msgstr "" + +msgid "Close In-Game Options" +msgstr "" + msgid "Hiding Obsolete Tech" msgstr "Скриване на остарялата техника" @@ -8234,6 +8246,28 @@ msgstr "" msgid "End-Game" msgstr "" +msgid "Host" +msgstr "" + +msgid "Admin" +msgstr "" + +#, c-format +msgid "%s (%s) changed team of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed position of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed color of player (%s) to: %s" +msgstr "" + +#, c-format +msgid "%s (%s) changed faction of player (%s) to: %s" +msgstr "" + msgid "Can someone please transfer me some units?" msgstr "" @@ -8450,6 +8484,9 @@ msgstr "" msgid "Map Downloaded" msgstr "" +msgid "Admin modified a setting" +msgstr "" + msgid "Bot Allies" msgstr "" @@ -10809,9 +10846,32 @@ msgstr "" msgid "Synchronizing data with host ..." msgstr "" +msgid "Waiting for correct join password" +msgstr "" + +msgid "Attempting to connect" +msgstr "" + +msgid "Establishing connection handshake" +msgstr "" + +msgid "Coordinating join with host" +msgstr "" + +msgid "Join attempt failed" +msgstr "" + msgid "Host did not respond before timeout" msgstr "" +#, c-format +msgid "Failed at: [%s] - %s" +msgstr "" + +#, c-format +msgid "Failed at: [%s]" +msgstr "" + #, c-format msgid "Failed to open connection: [%d] %s" msgstr "" diff --git a/po/ca_ES.po b/po/ca_ES.po index 0fa56a7e84b..13a1de211c6 100644 --- a/po/ca_ES.po +++ b/po/ca_ES.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" -"POT-Creation-Date: 2024-09-11 19:20+0000\n" -"PO-Revision-Date: 2024-09-11 19:59\n" +"POT-Creation-Date: 2024-11-01 21:02+0000\n" +"PO-Revision-Date: 2024-11-04 02:29\n" "Last-Translator: \n" "Language-Team: Catalan\n" "Language: ca_ES\n" @@ -1800,7 +1800,7 @@ msgid "Destroy the Nexus HQ to disable the Nexus Intruder Program" msgstr "Destruïu el QG de Nexus per a desactivar el programa d'intrusió Nexus" msgid "Warning: HQ shielded against VTOL attacks" -msgstr "" +msgstr "Atenció: el QG està protegit contra els atacs VTOL" msgid "Research resistance circuits and survive the assault from Nexus" msgstr "Acabeu la recerca dels circuits de resistència i sobreviviu a l'assalt de Nexus" @@ -2955,7 +2955,7 @@ msgid "Your external IP is: %s" msgstr "La seva IP externa és: %s" msgid "Failed to create port mapping (timeout)" -msgstr "" +msgstr "No s'ha pogut crear el mapatge dels ports (timeout)" msgid "Client failed to ack player index swap" msgstr "El client no ha confirmat el canvi de lloc del jugador" @@ -6486,11 +6486,11 @@ msgid "Thermal Armor +35%" msgstr "+35% d'armadura tèrmica" #, no-c-format -msgid "Thermal armor +40%" +msgid "Thermal Armor +40%" msgstr "+40% d'armadura tèrmica" #, no-c-format -msgid "Thermal Armor +40%" +msgid "Thermal armor +40%" msgstr "+40% d'armadura tèrmica" #, no-c-format @@ -7732,6 +7732,9 @@ msgstr "Ultra" msgid "Shadow filtering not available on this system." msgstr "El filtratge de les ombres no està disponible en aquest sistema." +msgid "Opacity: 50%" +msgstr "Opacitat: 50%" + msgid "* Takes effect on game restart" msgstr "* Té efecte quan reinicieu" @@ -7777,6 +7780,9 @@ msgstr "Sacsejada de pantalla" msgid "Groups Menu" msgstr "Menú dels grups" +msgid "Options Button" +msgstr "Botons d'opcions" + msgid "GRAPHICS OPTIONS" msgstr "OPCIONS GRÀFIQUES" @@ -8090,6 +8096,12 @@ msgstr "El jugador %u està fent trampes (mode depuració) amb un nou cíborg: % msgid "Player %u is cheating (debug menu) him/herself a new droid." msgstr "El jugador %u està fent trampes (mode depuració) amb un nou cíborg." +msgid "Open In-Game Options" +msgstr "Obre les opcions del joc" + +msgid "Close In-Game Options" +msgstr "Tanca les opcions del joc" + msgid "Hiding Obsolete Tech" msgstr "Amaga les tecnologies obsoletes" @@ -8250,6 +8262,28 @@ msgstr "Trampes" msgid "End-Game" msgstr "Fi del joc" +msgid "Host" +msgstr "Amfitrió" + +msgid "Admin" +msgstr "Administrador" + +#, c-format +msgid "%s (%s) changed team of player (%s) to: %d" +msgstr "%s (%s) ha canviat l'equip del jugador (%s) a: %d" + +#, c-format +msgid "%s (%s) changed position of player (%s) to: %d" +msgstr "%s (%s) ha canviat la posició del jugador (%s) a: %d" + +#, c-format +msgid "%s (%s) changed color of player (%s) to: %s" +msgstr "%s (%s) ha canviat el color del jugador (%s) a: %s" + +#, c-format +msgid "%s (%s) changed faction of player (%s) to: %s" +msgstr "%s (%s) ha canviat la facció del jugador (%s) a: %s" + msgid "Can someone please transfer me some units?" msgstr "Algú pot transferir-me unitats?" @@ -8466,6 +8500,9 @@ msgstr "No s'ha pogut enviar el missatge - torna a intentar-ho" msgid "Map Downloaded" msgstr "Mapes baixats" +msgid "Admin modified a setting" +msgstr "L'administrador ha modificat una opció" + msgid "Bot Allies" msgstr "Aliats bot" @@ -10832,9 +10869,32 @@ msgstr "Cap connexió disponible" msgid "Synchronizing data with host ..." msgstr "Sincronitzant dades amb l'amfitrió..." +msgid "Waiting for correct join password" +msgstr "S'espera la contrasenya correcta per unir-se" + +msgid "Attempting to connect" +msgstr "Intentant connectar-se" + +msgid "Establishing connection handshake" +msgstr "Establint una connexió de salutació" + +msgid "Coordinating join with host" +msgstr "Coordinant-se amb l'amfitrió" + +msgid "Join attempt failed" +msgstr "Intent per connectar-se fallit" + msgid "Host did not respond before timeout" msgstr "L'amfitrió no ha respost abans no acabi el temps" +#, c-format +msgid "Failed at: [%s] - %s" +msgstr "Fallat a: [%s] - %s" + +#, c-format +msgid "Failed at: [%s]" +msgstr "Fallat a: [%s]" + #, c-format msgid "Failed to open connection: [%d] %s" msgstr "No s'ha pogut obrir la connexió: [%d] %s" diff --git a/po/cs.po b/po/cs.po index c043b888be4..bacfec1bf0d 100644 --- a/po/cs.po +++ b/po/cs.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" -"POT-Creation-Date: 2024-09-11 19:20+0000\n" -"PO-Revision-Date: 2024-09-11 19:59\n" +"POT-Creation-Date: 2024-11-01 21:02+0000\n" +"PO-Revision-Date: 2024-11-03 18:06\n" "Last-Translator: \n" "Language-Team: Czech\n" "Language: cs_CZ\n" @@ -6476,11 +6476,11 @@ msgid "Thermal Armor +35%" msgstr "" #, no-c-format -msgid "Thermal armor +40%" +msgid "Thermal Armor +40%" msgstr "" #, no-c-format -msgid "Thermal Armor +40%" +msgid "Thermal armor +40%" msgstr "" #, no-c-format @@ -7732,6 +7732,9 @@ msgstr "" msgid "Shadow filtering not available on this system." msgstr "" +msgid "Opacity: 50%" +msgstr "" + msgid "* Takes effect on game restart" msgstr "* Projeví se až po restartu hry" @@ -7777,6 +7780,9 @@ msgstr "" msgid "Groups Menu" msgstr "" +msgid "Options Button" +msgstr "" + msgid "GRAPHICS OPTIONS" msgstr "" @@ -8086,6 +8092,12 @@ msgstr "" msgid "Player %u is cheating (debug menu) him/herself a new droid." msgstr "" +msgid "Open In-Game Options" +msgstr "" + +msgid "Close In-Game Options" +msgstr "" + msgid "Hiding Obsolete Tech" msgstr "" @@ -8242,6 +8254,28 @@ msgstr "" msgid "End-Game" msgstr "" +msgid "Host" +msgstr "" + +msgid "Admin" +msgstr "" + +#, c-format +msgid "%s (%s) changed team of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed position of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed color of player (%s) to: %s" +msgstr "" + +#, c-format +msgid "%s (%s) changed faction of player (%s) to: %s" +msgstr "" + msgid "Can someone please transfer me some units?" msgstr "" @@ -8458,6 +8492,9 @@ msgstr "" msgid "Map Downloaded" msgstr "" +msgid "Admin modified a setting" +msgstr "" + msgid "Bot Allies" msgstr "" @@ -10819,9 +10856,32 @@ msgstr "" msgid "Synchronizing data with host ..." msgstr "" +msgid "Waiting for correct join password" +msgstr "" + +msgid "Attempting to connect" +msgstr "" + +msgid "Establishing connection handshake" +msgstr "" + +msgid "Coordinating join with host" +msgstr "" + +msgid "Join attempt failed" +msgstr "" + msgid "Host did not respond before timeout" msgstr "" +#, c-format +msgid "Failed at: [%s] - %s" +msgstr "" + +#, c-format +msgid "Failed at: [%s]" +msgstr "" + #, c-format msgid "Failed to open connection: [%d] %s" msgstr "" diff --git a/po/da.po b/po/da.po index 30ba86bfcdb..693411d4c51 100644 --- a/po/da.po +++ b/po/da.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" -"POT-Creation-Date: 2024-09-11 19:20+0000\n" -"PO-Revision-Date: 2024-09-11 19:59\n" +"POT-Creation-Date: 2024-11-01 21:02+0000\n" +"PO-Revision-Date: 2024-11-03 18:06\n" "Last-Translator: \n" "Language-Team: Danish\n" "Language: da_DK\n" @@ -6476,11 +6476,11 @@ msgid "Thermal Armor +35%" msgstr "Termisk panser +35%" #, no-c-format -msgid "Thermal armor +40%" +msgid "Thermal Armor +40%" msgstr "Termisk panser +40%" #, no-c-format -msgid "Thermal Armor +40%" +msgid "Thermal armor +40%" msgstr "Termisk panser +40%" #, no-c-format @@ -7720,6 +7720,9 @@ msgstr "" msgid "Shadow filtering not available on this system." msgstr "" +msgid "Opacity: 50%" +msgstr "" + msgid "* Takes effect on game restart" msgstr "* Tager effekt, når spillet genstartes" @@ -7765,6 +7768,9 @@ msgstr "" msgid "Groups Menu" msgstr "" +msgid "Options Button" +msgstr "" + msgid "GRAPHICS OPTIONS" msgstr "GRAFIKINDSTILLINGER" @@ -8074,6 +8080,12 @@ msgstr "" msgid "Player %u is cheating (debug menu) him/herself a new droid." msgstr "" +msgid "Open In-Game Options" +msgstr "" + +msgid "Close In-Game Options" +msgstr "" + msgid "Hiding Obsolete Tech" msgstr "" @@ -8230,6 +8242,28 @@ msgstr "" msgid "End-Game" msgstr "" +msgid "Host" +msgstr "" + +msgid "Admin" +msgstr "" + +#, c-format +msgid "%s (%s) changed team of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed position of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed color of player (%s) to: %s" +msgstr "" + +#, c-format +msgid "%s (%s) changed faction of player (%s) to: %s" +msgstr "" + msgid "Can someone please transfer me some units?" msgstr "" @@ -8446,6 +8480,9 @@ msgstr "" msgid "Map Downloaded" msgstr "" +msgid "Admin modified a setting" +msgstr "" + msgid "Bot Allies" msgstr "" @@ -10805,9 +10842,32 @@ msgstr "" msgid "Synchronizing data with host ..." msgstr "" +msgid "Waiting for correct join password" +msgstr "" + +msgid "Attempting to connect" +msgstr "" + +msgid "Establishing connection handshake" +msgstr "" + +msgid "Coordinating join with host" +msgstr "" + +msgid "Join attempt failed" +msgstr "" + msgid "Host did not respond before timeout" msgstr "" +#, c-format +msgid "Failed at: [%s] - %s" +msgstr "" + +#, c-format +msgid "Failed at: [%s]" +msgstr "" + #, c-format msgid "Failed to open connection: [%d] %s" msgstr "" diff --git a/po/de.po b/po/de.po index f490ef5c647..072f631218d 100644 --- a/po/de.po +++ b/po/de.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" -"POT-Creation-Date: 2024-09-11 19:20+0000\n" -"PO-Revision-Date: 2024-09-11 19:59\n" +"POT-Creation-Date: 2024-11-01 21:02+0000\n" +"PO-Revision-Date: 2024-11-03 18:07\n" "Last-Translator: \n" "Language-Team: German\n" "Language: de_DE\n" @@ -6482,11 +6482,11 @@ msgid "Thermal Armor +35%" msgstr "Thermalpanzerung +35%" #, no-c-format -msgid "Thermal armor +40%" +msgid "Thermal Armor +40%" msgstr "Thermalpanzerung +40%" #, no-c-format -msgid "Thermal Armor +40%" +msgid "Thermal armor +40%" msgstr "Thermalpanzerung +40%" #, no-c-format @@ -7728,6 +7728,9 @@ msgstr "Ultra" msgid "Shadow filtering not available on this system." msgstr "Schattenfilterung ist auf diesem System nicht verfügbar." +msgid "Opacity: 50%" +msgstr "" + msgid "* Takes effect on game restart" msgstr "* Wirkt sich bei Spielneustart aus" @@ -7773,6 +7776,9 @@ msgstr "Bildschirmerschütterung" msgid "Groups Menu" msgstr "Gruppenmenü" +msgid "Options Button" +msgstr "" + msgid "GRAPHICS OPTIONS" msgstr "GRAFIKEINSTELLUNGEN" @@ -8088,6 +8094,12 @@ msgstr "Spieler %u erschummelt (Debugmenü) sich eine neue Einheit: %s." msgid "Player %u is cheating (debug menu) him/herself a new droid." msgstr "Spieler %u erschummelt (Debugmenü) sich eine neue Einheit." +msgid "Open In-Game Options" +msgstr "" + +msgid "Close In-Game Options" +msgstr "" + msgid "Hiding Obsolete Tech" msgstr "Veraltete Technologien ausblenden" @@ -8248,6 +8260,28 @@ msgstr "Cheats" msgid "End-Game" msgstr "Endspiel" +msgid "Host" +msgstr "" + +msgid "Admin" +msgstr "" + +#, c-format +msgid "%s (%s) changed team of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed position of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed color of player (%s) to: %s" +msgstr "" + +#, c-format +msgid "%s (%s) changed faction of player (%s) to: %s" +msgstr "" + msgid "Can someone please transfer me some units?" msgstr "Kann mir bitte jemand einige Einheiten geben?" @@ -8464,6 +8498,9 @@ msgstr "Nachrichtenzustellung fehlgeschlagen - erneut versuchen" msgid "Map Downloaded" msgstr "Karte heruntergeladen" +msgid "Admin modified a setting" +msgstr "" + msgid "Bot Allies" msgstr "Bot-Verbündete" @@ -10830,9 +10867,32 @@ msgstr "Keine Verbindungen verfügbar" msgid "Synchronizing data with host ..." msgstr "" +msgid "Waiting for correct join password" +msgstr "" + +msgid "Attempting to connect" +msgstr "" + +msgid "Establishing connection handshake" +msgstr "" + +msgid "Coordinating join with host" +msgstr "" + +msgid "Join attempt failed" +msgstr "" + msgid "Host did not respond before timeout" msgstr "" +#, c-format +msgid "Failed at: [%s] - %s" +msgstr "" + +#, c-format +msgid "Failed at: [%s]" +msgstr "" + #, c-format msgid "Failed to open connection: [%d] %s" msgstr "" diff --git a/po/el.po b/po/el.po index 48224c1aad2..10f2d3b68dd 100644 --- a/po/el.po +++ b/po/el.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" -"POT-Creation-Date: 2024-09-11 19:20+0000\n" -"PO-Revision-Date: 2024-09-11 19:59\n" +"POT-Creation-Date: 2024-11-01 21:02+0000\n" +"PO-Revision-Date: 2024-11-03 18:07\n" "Last-Translator: \n" "Language-Team: Greek\n" "Language: el_GR\n" @@ -6482,11 +6482,11 @@ msgid "Thermal Armor +35%" msgstr "Θερμική Θωράκιση +35%" #, no-c-format -msgid "Thermal armor +40%" +msgid "Thermal Armor +40%" msgstr "Θερμική Θωράκιση +40%" #, no-c-format -msgid "Thermal Armor +40%" +msgid "Thermal armor +40%" msgstr "Θερμική Θωράκιση +40%" #, no-c-format @@ -7728,6 +7728,9 @@ msgstr "" msgid "Shadow filtering not available on this system." msgstr "" +msgid "Opacity: 50%" +msgstr "" + msgid "* Takes effect on game restart" msgstr "* μετά από επανεκκίνηση του παιχνιδιού" @@ -7773,6 +7776,9 @@ msgstr "" msgid "Groups Menu" msgstr "" +msgid "Options Button" +msgstr "" + msgid "GRAPHICS OPTIONS" msgstr "ΕΠΙΛΟΓΕΣ ΤΩΝ ΓΡΑΦΙΚΩΝ" @@ -8082,6 +8088,12 @@ msgstr "Ο παίχτης %u , με ζαβολιά (κατάλογος αποσ msgid "Player %u is cheating (debug menu) him/herself a new droid." msgstr "Ο παίχτης %u , με ζαβολιά (κατάλογος αποσφαλμάτωσης), απέκτησε μία νέα ανθρωπομηχανή." +msgid "Open In-Game Options" +msgstr "" + +msgid "Close In-Game Options" +msgstr "" + msgid "Hiding Obsolete Tech" msgstr "Αποκρύβεται η Ξεπερασμένη Τεχνολογία" @@ -8242,6 +8254,28 @@ msgstr "" msgid "End-Game" msgstr "" +msgid "Host" +msgstr "" + +msgid "Admin" +msgstr "" + +#, c-format +msgid "%s (%s) changed team of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed position of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed color of player (%s) to: %s" +msgstr "" + +#, c-format +msgid "%s (%s) changed faction of player (%s) to: %s" +msgstr "" + msgid "Can someone please transfer me some units?" msgstr "" @@ -8458,6 +8492,9 @@ msgstr "" msgid "Map Downloaded" msgstr "" +msgid "Admin modified a setting" +msgstr "" + msgid "Bot Allies" msgstr "" @@ -10824,9 +10861,32 @@ msgstr "" msgid "Synchronizing data with host ..." msgstr "" +msgid "Waiting for correct join password" +msgstr "" + +msgid "Attempting to connect" +msgstr "" + +msgid "Establishing connection handshake" +msgstr "" + +msgid "Coordinating join with host" +msgstr "" + +msgid "Join attempt failed" +msgstr "" + msgid "Host did not respond before timeout" msgstr "" +#, c-format +msgid "Failed at: [%s] - %s" +msgstr "" + +#, c-format +msgid "Failed at: [%s]" +msgstr "" + #, c-format msgid "Failed to open connection: [%d] %s" msgstr "" diff --git a/po/en_GB.po b/po/en_GB.po index b4ce4dbd3ec..370f59c82fa 100644 --- a/po/en_GB.po +++ b/po/en_GB.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" -"POT-Creation-Date: 2024-09-11 19:20+0000\n" -"PO-Revision-Date: 2024-09-11 19:59\n" +"POT-Creation-Date: 2024-11-01 21:02+0000\n" +"PO-Revision-Date: 2024-11-03 18:06\n" "Last-Translator: \n" "Language-Team: English, United Kingdom\n" "Language: en_GB\n" @@ -6476,11 +6476,11 @@ msgid "Thermal Armor +35%" msgstr "" #, no-c-format -msgid "Thermal armor +40%" +msgid "Thermal Armor +40%" msgstr "" #, no-c-format -msgid "Thermal Armor +40%" +msgid "Thermal armor +40%" msgstr "" #, no-c-format @@ -7720,6 +7720,9 @@ msgstr "" msgid "Shadow filtering not available on this system." msgstr "" +msgid "Opacity: 50%" +msgstr "" + msgid "* Takes effect on game restart" msgstr "" @@ -7765,6 +7768,9 @@ msgstr "" msgid "Groups Menu" msgstr "" +msgid "Options Button" +msgstr "" + msgid "GRAPHICS OPTIONS" msgstr "" @@ -8074,6 +8080,12 @@ msgstr "" msgid "Player %u is cheating (debug menu) him/herself a new droid." msgstr "" +msgid "Open In-Game Options" +msgstr "" + +msgid "Close In-Game Options" +msgstr "" + msgid "Hiding Obsolete Tech" msgstr "" @@ -8230,6 +8242,28 @@ msgstr "" msgid "End-Game" msgstr "" +msgid "Host" +msgstr "" + +msgid "Admin" +msgstr "" + +#, c-format +msgid "%s (%s) changed team of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed position of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed color of player (%s) to: %s" +msgstr "" + +#, c-format +msgid "%s (%s) changed faction of player (%s) to: %s" +msgstr "" + msgid "Can someone please transfer me some units?" msgstr "" @@ -8446,6 +8480,9 @@ msgstr "" msgid "Map Downloaded" msgstr "" +msgid "Admin modified a setting" +msgstr "" + msgid "Bot Allies" msgstr "" @@ -10805,9 +10842,32 @@ msgstr "" msgid "Synchronizing data with host ..." msgstr "" +msgid "Waiting for correct join password" +msgstr "" + +msgid "Attempting to connect" +msgstr "" + +msgid "Establishing connection handshake" +msgstr "" + +msgid "Coordinating join with host" +msgstr "" + +msgid "Join attempt failed" +msgstr "" + msgid "Host did not respond before timeout" msgstr "" +#, c-format +msgid "Failed at: [%s] - %s" +msgstr "" + +#, c-format +msgid "Failed at: [%s]" +msgstr "" + #, c-format msgid "Failed to open connection: [%d] %s" msgstr "" diff --git a/po/eo.po b/po/eo.po index dc5c15a9ff8..acd932828e8 100644 --- a/po/eo.po +++ b/po/eo.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" -"POT-Creation-Date: 2024-09-11 19:20+0000\n" -"PO-Revision-Date: 2024-09-11 19:59\n" +"POT-Creation-Date: 2024-11-01 21:02+0000\n" +"PO-Revision-Date: 2024-11-03 18:06\n" "Last-Translator: \n" "Language-Team: Esperanto\n" "Language: eo_UY\n" @@ -6476,11 +6476,11 @@ msgid "Thermal Armor +35%" msgstr "" #, no-c-format -msgid "Thermal armor +40%" +msgid "Thermal Armor +40%" msgstr "" #, no-c-format -msgid "Thermal Armor +40%" +msgid "Thermal armor +40%" msgstr "" #, no-c-format @@ -7720,6 +7720,9 @@ msgstr "" msgid "Shadow filtering not available on this system." msgstr "" +msgid "Opacity: 50%" +msgstr "" + msgid "* Takes effect on game restart" msgstr "" @@ -7765,6 +7768,9 @@ msgstr "" msgid "Groups Menu" msgstr "" +msgid "Options Button" +msgstr "" + msgid "GRAPHICS OPTIONS" msgstr "" @@ -8074,6 +8080,12 @@ msgstr "" msgid "Player %u is cheating (debug menu) him/herself a new droid." msgstr "" +msgid "Open In-Game Options" +msgstr "" + +msgid "Close In-Game Options" +msgstr "" + msgid "Hiding Obsolete Tech" msgstr "" @@ -8230,6 +8242,28 @@ msgstr "" msgid "End-Game" msgstr "" +msgid "Host" +msgstr "" + +msgid "Admin" +msgstr "" + +#, c-format +msgid "%s (%s) changed team of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed position of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed color of player (%s) to: %s" +msgstr "" + +#, c-format +msgid "%s (%s) changed faction of player (%s) to: %s" +msgstr "" + msgid "Can someone please transfer me some units?" msgstr "" @@ -8446,6 +8480,9 @@ msgstr "" msgid "Map Downloaded" msgstr "" +msgid "Admin modified a setting" +msgstr "" + msgid "Bot Allies" msgstr "" @@ -10805,9 +10842,32 @@ msgstr "" msgid "Synchronizing data with host ..." msgstr "" +msgid "Waiting for correct join password" +msgstr "" + +msgid "Attempting to connect" +msgstr "" + +msgid "Establishing connection handshake" +msgstr "" + +msgid "Coordinating join with host" +msgstr "" + +msgid "Join attempt failed" +msgstr "" + msgid "Host did not respond before timeout" msgstr "" +#, c-format +msgid "Failed at: [%s] - %s" +msgstr "" + +#, c-format +msgid "Failed at: [%s]" +msgstr "" + #, c-format msgid "Failed to open connection: [%d] %s" msgstr "" diff --git a/po/es.po b/po/es.po index 8d2f63f9b38..35d2272f66c 100644 --- a/po/es.po +++ b/po/es.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" -"POT-Creation-Date: 2024-09-11 19:20+0000\n" -"PO-Revision-Date: 2024-09-11 19:59\n" +"POT-Creation-Date: 2024-11-01 21:02+0000\n" +"PO-Revision-Date: 2024-11-03 18:07\n" "Last-Translator: \n" "Language-Team: Spanish\n" "Language: es_ES\n" @@ -6482,11 +6482,11 @@ msgid "Thermal Armor +35%" msgstr "Armadura Termal +35%" #, no-c-format -msgid "Thermal armor +40%" +msgid "Thermal Armor +40%" msgstr "Armadura Termal +40%" #, no-c-format -msgid "Thermal Armor +40%" +msgid "Thermal armor +40%" msgstr "Armadura Termal +40%" #, no-c-format @@ -7728,6 +7728,9 @@ msgstr "" msgid "Shadow filtering not available on this system." msgstr "" +msgid "Opacity: 50%" +msgstr "" + msgid "* Takes effect on game restart" msgstr "* Tendrá efecto al reiniciar el juego" @@ -7773,6 +7776,9 @@ msgstr "Agitación de Pantalla" msgid "Groups Menu" msgstr "" +msgid "Options Button" +msgstr "" + msgid "GRAPHICS OPTIONS" msgstr "OPCIONES GRÁFICAS" @@ -8082,6 +8088,12 @@ msgstr "El jugador %u está haciendo trampas (menú depuración) con un nuevo an msgid "Player %u is cheating (debug menu) him/herself a new droid." msgstr "El jugador %u está haciendo trampas (menú depuración) con un nuevo androide." +msgid "Open In-Game Options" +msgstr "" + +msgid "Close In-Game Options" +msgstr "" + msgid "Hiding Obsolete Tech" msgstr "Ocultando Tecnología Obsoleta" @@ -8242,6 +8254,28 @@ msgstr "" msgid "End-Game" msgstr "" +msgid "Host" +msgstr "" + +msgid "Admin" +msgstr "" + +#, c-format +msgid "%s (%s) changed team of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed position of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed color of player (%s) to: %s" +msgstr "" + +#, c-format +msgid "%s (%s) changed faction of player (%s) to: %s" +msgstr "" + msgid "Can someone please transfer me some units?" msgstr "" @@ -8458,6 +8492,9 @@ msgstr "" msgid "Map Downloaded" msgstr "" +msgid "Admin modified a setting" +msgstr "" + msgid "Bot Allies" msgstr "" @@ -10824,9 +10861,32 @@ msgstr "" msgid "Synchronizing data with host ..." msgstr "" +msgid "Waiting for correct join password" +msgstr "" + +msgid "Attempting to connect" +msgstr "" + +msgid "Establishing connection handshake" +msgstr "" + +msgid "Coordinating join with host" +msgstr "" + +msgid "Join attempt failed" +msgstr "" + msgid "Host did not respond before timeout" msgstr "" +#, c-format +msgid "Failed at: [%s] - %s" +msgstr "" + +#, c-format +msgid "Failed at: [%s]" +msgstr "" + #, c-format msgid "Failed to open connection: [%d] %s" msgstr "" diff --git a/po/et_EE.po b/po/et_EE.po index 0d39e528ec2..9fbc2dff3be 100644 --- a/po/et_EE.po +++ b/po/et_EE.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" -"POT-Creation-Date: 2024-09-11 19:20+0000\n" -"PO-Revision-Date: 2024-09-11 19:59\n" +"POT-Creation-Date: 2024-11-01 21:02+0000\n" +"PO-Revision-Date: 2024-11-03 18:06\n" "Last-Translator: \n" "Language-Team: Estonian\n" "Language: et_EE\n" @@ -6476,11 +6476,11 @@ msgid "Thermal Armor +35%" msgstr "Soojussoomus +35%" #, no-c-format -msgid "Thermal armor +40%" +msgid "Thermal Armor +40%" msgstr "Soojussoomus +40%" #, no-c-format -msgid "Thermal Armor +40%" +msgid "Thermal armor +40%" msgstr "Soojussoomus +40%" #, no-c-format @@ -7720,6 +7720,9 @@ msgstr "" msgid "Shadow filtering not available on this system." msgstr "" +msgid "Opacity: 50%" +msgstr "" + msgid "* Takes effect on game restart" msgstr "* Võtab efekti kui mäng uuesti käivitatakse" @@ -7765,6 +7768,9 @@ msgstr "" msgid "Groups Menu" msgstr "" +msgid "Options Button" +msgstr "" + msgid "GRAPHICS OPTIONS" msgstr "GRAAFIKA SEADED" @@ -8074,6 +8080,12 @@ msgstr "Mängija %u teeb sohki(debug menu) talle uus droid: %s." msgid "Player %u is cheating (debug menu) him/herself a new droid." msgstr "" +msgid "Open In-Game Options" +msgstr "" + +msgid "Close In-Game Options" +msgstr "" + msgid "Hiding Obsolete Tech" msgstr "" @@ -8230,6 +8242,28 @@ msgstr "" msgid "End-Game" msgstr "" +msgid "Host" +msgstr "" + +msgid "Admin" +msgstr "" + +#, c-format +msgid "%s (%s) changed team of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed position of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed color of player (%s) to: %s" +msgstr "" + +#, c-format +msgid "%s (%s) changed faction of player (%s) to: %s" +msgstr "" + msgid "Can someone please transfer me some units?" msgstr "" @@ -8446,6 +8480,9 @@ msgstr "" msgid "Map Downloaded" msgstr "" +msgid "Admin modified a setting" +msgstr "" + msgid "Bot Allies" msgstr "" @@ -10805,9 +10842,32 @@ msgstr "" msgid "Synchronizing data with host ..." msgstr "" +msgid "Waiting for correct join password" +msgstr "" + +msgid "Attempting to connect" +msgstr "" + +msgid "Establishing connection handshake" +msgstr "" + +msgid "Coordinating join with host" +msgstr "" + +msgid "Join attempt failed" +msgstr "" + msgid "Host did not respond before timeout" msgstr "" +#, c-format +msgid "Failed at: [%s] - %s" +msgstr "" + +#, c-format +msgid "Failed at: [%s]" +msgstr "" + #, c-format msgid "Failed to open connection: [%d] %s" msgstr "" diff --git a/po/fa_IR.po b/po/fa_IR.po index b58af869f44..651024f2e68 100644 --- a/po/fa_IR.po +++ b/po/fa_IR.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" -"POT-Creation-Date: 2024-09-11 19:20+0000\n" -"PO-Revision-Date: 2024-09-11 19:59\n" +"POT-Creation-Date: 2024-11-01 21:02+0000\n" +"PO-Revision-Date: 2024-11-03 18:07\n" "Last-Translator: \n" "Language-Team: Persian\n" "Language: fa_IR\n" @@ -6476,11 +6476,11 @@ msgid "Thermal Armor +35%" msgstr "سپر حرارتی + ۳۵٪" #, no-c-format -msgid "Thermal armor +40%" +msgid "Thermal Armor +40%" msgstr "سپر حرارتی + ۴۰٪" #, no-c-format -msgid "Thermal Armor +40%" +msgid "Thermal armor +40%" msgstr "سپر حرارتی + ۴۰٪" #, no-c-format @@ -7720,6 +7720,9 @@ msgstr "" msgid "Shadow filtering not available on this system." msgstr "" +msgid "Opacity: 50%" +msgstr "" + msgid "* Takes effect on game restart" msgstr "" @@ -7765,6 +7768,9 @@ msgstr "" msgid "Groups Menu" msgstr "" +msgid "Options Button" +msgstr "" + msgid "GRAPHICS OPTIONS" msgstr "" @@ -8074,6 +8080,12 @@ msgstr "" msgid "Player %u is cheating (debug menu) him/herself a new droid." msgstr "" +msgid "Open In-Game Options" +msgstr "" + +msgid "Close In-Game Options" +msgstr "" + msgid "Hiding Obsolete Tech" msgstr "" @@ -8230,6 +8242,28 @@ msgstr "" msgid "End-Game" msgstr "" +msgid "Host" +msgstr "" + +msgid "Admin" +msgstr "" + +#, c-format +msgid "%s (%s) changed team of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed position of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed color of player (%s) to: %s" +msgstr "" + +#, c-format +msgid "%s (%s) changed faction of player (%s) to: %s" +msgstr "" + msgid "Can someone please transfer me some units?" msgstr "" @@ -8446,6 +8480,9 @@ msgstr "" msgid "Map Downloaded" msgstr "" +msgid "Admin modified a setting" +msgstr "" + msgid "Bot Allies" msgstr "" @@ -10805,9 +10842,32 @@ msgstr "" msgid "Synchronizing data with host ..." msgstr "" +msgid "Waiting for correct join password" +msgstr "" + +msgid "Attempting to connect" +msgstr "" + +msgid "Establishing connection handshake" +msgstr "" + +msgid "Coordinating join with host" +msgstr "" + +msgid "Join attempt failed" +msgstr "" + msgid "Host did not respond before timeout" msgstr "" +#, c-format +msgid "Failed at: [%s] - %s" +msgstr "" + +#, c-format +msgid "Failed at: [%s]" +msgstr "" + #, c-format msgid "Failed to open connection: [%d] %s" msgstr "" diff --git a/po/fi.po b/po/fi.po index 62870ec4833..128428935fd 100644 --- a/po/fi.po +++ b/po/fi.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" -"POT-Creation-Date: 2024-09-11 19:20+0000\n" -"PO-Revision-Date: 2024-09-11 19:59\n" +"POT-Creation-Date: 2024-11-01 21:02+0000\n" +"PO-Revision-Date: 2024-11-03 18:06\n" "Last-Translator: \n" "Language-Team: Finnish\n" "Language: fi_FI\n" @@ -6476,11 +6476,11 @@ msgid "Thermal Armor +35%" msgstr "" #, no-c-format -msgid "Thermal armor +40%" +msgid "Thermal Armor +40%" msgstr "" #, no-c-format -msgid "Thermal Armor +40%" +msgid "Thermal armor +40%" msgstr "" #, no-c-format @@ -7720,6 +7720,9 @@ msgstr "" msgid "Shadow filtering not available on this system." msgstr "" +msgid "Opacity: 50%" +msgstr "" + msgid "* Takes effect on game restart" msgstr "" @@ -7765,6 +7768,9 @@ msgstr "" msgid "Groups Menu" msgstr "" +msgid "Options Button" +msgstr "" + msgid "GRAPHICS OPTIONS" msgstr "Grafiikka asetukset" @@ -8074,6 +8080,12 @@ msgstr "" msgid "Player %u is cheating (debug menu) him/herself a new droid." msgstr "" +msgid "Open In-Game Options" +msgstr "" + +msgid "Close In-Game Options" +msgstr "" + msgid "Hiding Obsolete Tech" msgstr "" @@ -8230,6 +8242,28 @@ msgstr "" msgid "End-Game" msgstr "" +msgid "Host" +msgstr "" + +msgid "Admin" +msgstr "" + +#, c-format +msgid "%s (%s) changed team of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed position of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed color of player (%s) to: %s" +msgstr "" + +#, c-format +msgid "%s (%s) changed faction of player (%s) to: %s" +msgstr "" + msgid "Can someone please transfer me some units?" msgstr "" @@ -8446,6 +8480,9 @@ msgstr "" msgid "Map Downloaded" msgstr "" +msgid "Admin modified a setting" +msgstr "" + msgid "Bot Allies" msgstr "" @@ -10805,9 +10842,32 @@ msgstr "" msgid "Synchronizing data with host ..." msgstr "" +msgid "Waiting for correct join password" +msgstr "" + +msgid "Attempting to connect" +msgstr "" + +msgid "Establishing connection handshake" +msgstr "" + +msgid "Coordinating join with host" +msgstr "" + +msgid "Join attempt failed" +msgstr "" + msgid "Host did not respond before timeout" msgstr "" +#, c-format +msgid "Failed at: [%s] - %s" +msgstr "" + +#, c-format +msgid "Failed at: [%s]" +msgstr "" + #, c-format msgid "Failed to open connection: [%d] %s" msgstr "" diff --git a/po/fr.po b/po/fr.po index e8962bb449f..16e5fd44658 100644 --- a/po/fr.po +++ b/po/fr.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" -"POT-Creation-Date: 2024-09-11 19:20+0000\n" -"PO-Revision-Date: 2024-09-11 19:59\n" +"POT-Creation-Date: 2024-11-01 21:02+0000\n" +"PO-Revision-Date: 2024-11-03 18:07\n" "Last-Translator: \n" "Language-Team: French\n" "Language: fr_FR\n" @@ -6486,11 +6486,11 @@ msgid "Thermal Armor +35%" msgstr "Blindage thermique : +35%" #, no-c-format -msgid "Thermal armor +40%" +msgid "Thermal Armor +40%" msgstr "Blindage thermique : +40%" #, no-c-format -msgid "Thermal Armor +40%" +msgid "Thermal armor +40%" msgstr "Blindage thermique : +40%" #, no-c-format @@ -7732,6 +7732,9 @@ msgstr "Ultra" msgid "Shadow filtering not available on this system." msgstr "Le filtrage des ombres n'est pas disponible sur ce système." +msgid "Opacity: 50%" +msgstr "" + msgid "* Takes effect on game restart" msgstr "* Le jeu doit être redémarré pour que ces modifications s'appliquent" @@ -7777,6 +7780,9 @@ msgstr "Vibrations de l’écran" msgid "Groups Menu" msgstr "Menu des Groupes" +msgid "Options Button" +msgstr "" + msgid "GRAPHICS OPTIONS" msgstr "OPTIONS GRAPHIQUES" @@ -8090,6 +8096,12 @@ msgstr "Le joueur %u Triche (Il se sert du menu debug pour se faire une nouvelle msgid "Player %u is cheating (debug menu) him/herself a new droid." msgstr "Le joueur %u triche (Il se sert du menu debug pour se faire une nouvelle unité)" +msgid "Open In-Game Options" +msgstr "" + +msgid "Close In-Game Options" +msgstr "" + msgid "Hiding Obsolete Tech" msgstr "Cacher les technologies obsolètes" @@ -8250,6 +8262,28 @@ msgstr "Triche" msgid "End-Game" msgstr "Fin de partie" +msgid "Host" +msgstr "" + +msgid "Admin" +msgstr "" + +#, c-format +msgid "%s (%s) changed team of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed position of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed color of player (%s) to: %s" +msgstr "" + +#, c-format +msgid "%s (%s) changed faction of player (%s) to: %s" +msgstr "" + msgid "Can someone please transfer me some units?" msgstr "Quelqu'un peut-il me transférer des unités ?" @@ -8466,6 +8500,9 @@ msgstr "Échec d'envoi du message - essayez à nouveau" msgid "Map Downloaded" msgstr "Cartes téléchargées" +msgid "Admin modified a setting" +msgstr "" + msgid "Bot Allies" msgstr "Bot allié" @@ -10832,9 +10869,32 @@ msgstr "Aucune connexion disponible" msgid "Synchronizing data with host ..." msgstr "Synchronisation des données avec l'hôte..." +msgid "Waiting for correct join password" +msgstr "" + +msgid "Attempting to connect" +msgstr "" + +msgid "Establishing connection handshake" +msgstr "" + +msgid "Coordinating join with host" +msgstr "" + +msgid "Join attempt failed" +msgstr "" + msgid "Host did not respond before timeout" msgstr "L'hôte n'a pas répondu avant le délai d'attente" +#, c-format +msgid "Failed at: [%s] - %s" +msgstr "" + +#, c-format +msgid "Failed at: [%s]" +msgstr "" + #, c-format msgid "Failed to open connection: [%d] %s" msgstr "Impossible d'ouvrir la connexion : [%d] %s" diff --git a/po/fy.po b/po/fy.po index e4913d7584f..0c393e32f4e 100644 --- a/po/fy.po +++ b/po/fy.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" -"POT-Creation-Date: 2024-09-11 19:20+0000\n" -"PO-Revision-Date: 2024-09-11 19:59\n" +"POT-Creation-Date: 2024-11-01 21:02+0000\n" +"PO-Revision-Date: 2024-11-03 18:07\n" "Last-Translator: \n" "Language-Team: Frisian\n" "Language: fy_NL\n" @@ -6476,11 +6476,11 @@ msgid "Thermal Armor +35%" msgstr "" #, no-c-format -msgid "Thermal armor +40%" +msgid "Thermal Armor +40%" msgstr "" #, no-c-format -msgid "Thermal Armor +40%" +msgid "Thermal armor +40%" msgstr "" #, no-c-format @@ -7720,6 +7720,9 @@ msgstr "" msgid "Shadow filtering not available on this system." msgstr "" +msgid "Opacity: 50%" +msgstr "" + msgid "* Takes effect on game restart" msgstr "" @@ -7765,6 +7768,9 @@ msgstr "" msgid "Groups Menu" msgstr "" +msgid "Options Button" +msgstr "" + msgid "GRAPHICS OPTIONS" msgstr "" @@ -8074,6 +8080,12 @@ msgstr "Spiler %u is oan it fals spyljen (debugmenu)! Him of sij krijt in nije r msgid "Player %u is cheating (debug menu) him/herself a new droid." msgstr "" +msgid "Open In-Game Options" +msgstr "" + +msgid "Close In-Game Options" +msgstr "" + msgid "Hiding Obsolete Tech" msgstr "" @@ -8230,6 +8242,28 @@ msgstr "" msgid "End-Game" msgstr "" +msgid "Host" +msgstr "" + +msgid "Admin" +msgstr "" + +#, c-format +msgid "%s (%s) changed team of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed position of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed color of player (%s) to: %s" +msgstr "" + +#, c-format +msgid "%s (%s) changed faction of player (%s) to: %s" +msgstr "" + msgid "Can someone please transfer me some units?" msgstr "" @@ -8446,6 +8480,9 @@ msgstr "" msgid "Map Downloaded" msgstr "" +msgid "Admin modified a setting" +msgstr "" + msgid "Bot Allies" msgstr "" @@ -10805,9 +10842,32 @@ msgstr "" msgid "Synchronizing data with host ..." msgstr "" +msgid "Waiting for correct join password" +msgstr "" + +msgid "Attempting to connect" +msgstr "" + +msgid "Establishing connection handshake" +msgstr "" + +msgid "Coordinating join with host" +msgstr "" + +msgid "Join attempt failed" +msgstr "" + msgid "Host did not respond before timeout" msgstr "" +#, c-format +msgid "Failed at: [%s] - %s" +msgstr "" + +#, c-format +msgid "Failed at: [%s]" +msgstr "" + #, c-format msgid "Failed to open connection: [%d] %s" msgstr "" diff --git a/po/ga.po b/po/ga.po index f4af222ac07..57ff6225c02 100644 --- a/po/ga.po +++ b/po/ga.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" -"POT-Creation-Date: 2024-09-11 19:20+0000\n" -"PO-Revision-Date: 2024-09-11 19:59\n" +"POT-Creation-Date: 2024-11-01 21:02+0000\n" +"PO-Revision-Date: 2024-11-03 18:07\n" "Last-Translator: \n" "Language-Team: Irish\n" "Language: ga_IE\n" @@ -6476,11 +6476,11 @@ msgid "Thermal Armor +35%" msgstr "" #, no-c-format -msgid "Thermal armor +40%" +msgid "Thermal Armor +40%" msgstr "" #, no-c-format -msgid "Thermal Armor +40%" +msgid "Thermal armor +40%" msgstr "" #, no-c-format @@ -7738,6 +7738,9 @@ msgstr "" msgid "Shadow filtering not available on this system." msgstr "" +msgid "Opacity: 50%" +msgstr "" + msgid "* Takes effect on game restart" msgstr "" @@ -7783,6 +7786,9 @@ msgstr "" msgid "Groups Menu" msgstr "" +msgid "Options Button" +msgstr "" + msgid "GRAPHICS OPTIONS" msgstr "" @@ -8092,6 +8098,12 @@ msgstr "" msgid "Player %u is cheating (debug menu) him/herself a new droid." msgstr "" +msgid "Open In-Game Options" +msgstr "" + +msgid "Close In-Game Options" +msgstr "" + msgid "Hiding Obsolete Tech" msgstr "" @@ -8248,6 +8260,28 @@ msgstr "" msgid "End-Game" msgstr "" +msgid "Host" +msgstr "" + +msgid "Admin" +msgstr "" + +#, c-format +msgid "%s (%s) changed team of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed position of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed color of player (%s) to: %s" +msgstr "" + +#, c-format +msgid "%s (%s) changed faction of player (%s) to: %s" +msgstr "" + msgid "Can someone please transfer me some units?" msgstr "" @@ -8464,6 +8498,9 @@ msgstr "" msgid "Map Downloaded" msgstr "" +msgid "Admin modified a setting" +msgstr "" + msgid "Bot Allies" msgstr "" @@ -10826,9 +10863,32 @@ msgstr "" msgid "Synchronizing data with host ..." msgstr "" +msgid "Waiting for correct join password" +msgstr "" + +msgid "Attempting to connect" +msgstr "" + +msgid "Establishing connection handshake" +msgstr "" + +msgid "Coordinating join with host" +msgstr "" + +msgid "Join attempt failed" +msgstr "" + msgid "Host did not respond before timeout" msgstr "" +#, c-format +msgid "Failed at: [%s] - %s" +msgstr "" + +#, c-format +msgid "Failed at: [%s]" +msgstr "" + #, c-format msgid "Failed to open connection: [%d] %s" msgstr "" diff --git a/po/he_IL.po b/po/he_IL.po index 9e71f95fe22..bab3b9462e4 100644 --- a/po/he_IL.po +++ b/po/he_IL.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" -"POT-Creation-Date: 2024-09-11 19:20+0000\n" -"PO-Revision-Date: 2024-09-11 19:59\n" +"POT-Creation-Date: 2024-11-01 21:02+0000\n" +"PO-Revision-Date: 2024-11-03 18:07\n" "Last-Translator: \n" "Language-Team: Hebrew\n" "Language: he_IL\n" @@ -6476,11 +6476,11 @@ msgid "Thermal Armor +35%" msgstr "" #, no-c-format -msgid "Thermal armor +40%" +msgid "Thermal Armor +40%" msgstr "" #, no-c-format -msgid "Thermal Armor +40%" +msgid "Thermal armor +40%" msgstr "" #, no-c-format @@ -7732,6 +7732,9 @@ msgstr "" msgid "Shadow filtering not available on this system." msgstr "" +msgid "Opacity: 50%" +msgstr "" + msgid "* Takes effect on game restart" msgstr "" @@ -7777,6 +7780,9 @@ msgstr "" msgid "Groups Menu" msgstr "" +msgid "Options Button" +msgstr "" + msgid "GRAPHICS OPTIONS" msgstr "" @@ -8086,6 +8092,12 @@ msgstr "" msgid "Player %u is cheating (debug menu) him/herself a new droid." msgstr "" +msgid "Open In-Game Options" +msgstr "" + +msgid "Close In-Game Options" +msgstr "" + msgid "Hiding Obsolete Tech" msgstr "" @@ -8242,6 +8254,28 @@ msgstr "" msgid "End-Game" msgstr "" +msgid "Host" +msgstr "" + +msgid "Admin" +msgstr "" + +#, c-format +msgid "%s (%s) changed team of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed position of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed color of player (%s) to: %s" +msgstr "" + +#, c-format +msgid "%s (%s) changed faction of player (%s) to: %s" +msgstr "" + msgid "Can someone please transfer me some units?" msgstr "" @@ -8458,6 +8492,9 @@ msgstr "" msgid "Map Downloaded" msgstr "" +msgid "Admin modified a setting" +msgstr "" + msgid "Bot Allies" msgstr "" @@ -10819,9 +10856,32 @@ msgstr "" msgid "Synchronizing data with host ..." msgstr "" +msgid "Waiting for correct join password" +msgstr "" + +msgid "Attempting to connect" +msgstr "" + +msgid "Establishing connection handshake" +msgstr "" + +msgid "Coordinating join with host" +msgstr "" + +msgid "Join attempt failed" +msgstr "" + msgid "Host did not respond before timeout" msgstr "" +#, c-format +msgid "Failed at: [%s] - %s" +msgstr "" + +#, c-format +msgid "Failed at: [%s]" +msgstr "" + #, c-format msgid "Failed to open connection: [%d] %s" msgstr "" diff --git a/po/hr.po b/po/hr.po index 279fbbb2d3c..67877e5d16b 100644 --- a/po/hr.po +++ b/po/hr.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" -"POT-Creation-Date: 2024-09-11 19:20+0000\n" -"PO-Revision-Date: 2024-09-11 19:59\n" +"POT-Creation-Date: 2024-11-01 21:02+0000\n" +"PO-Revision-Date: 2024-11-03 18:06\n" "Last-Translator: \n" "Language-Team: Croatian\n" "Language: hr_HR\n" @@ -6475,14 +6475,14 @@ msgstr "" msgid "Thermal Armor +35%" msgstr "Toplinski Oklop +35%" -#, no-c-format -msgid "Thermal armor +40%" -msgstr "Toplinski oklop +40%" - #, no-c-format msgid "Thermal Armor +40%" msgstr "Toplinski Oklop +40%" +#, no-c-format +msgid "Thermal armor +40%" +msgstr "Toplinski oklop +40%" + #, no-c-format msgid "Thermal Armor +45%" msgstr "Toplinski Oklop +45%" @@ -7726,6 +7726,9 @@ msgstr "" msgid "Shadow filtering not available on this system." msgstr "" +msgid "Opacity: 50%" +msgstr "" + msgid "* Takes effect on game restart" msgstr "* Radi tek nakon ponovnog pokretanja igre" @@ -7771,6 +7774,9 @@ msgstr "" msgid "Groups Menu" msgstr "" +msgid "Options Button" +msgstr "" + msgid "GRAPHICS OPTIONS" msgstr "OPCIJE SLIKE" @@ -8080,6 +8086,12 @@ msgstr "Igrač %u vara, postavio si je : %s" msgid "Player %u is cheating (debug menu) him/herself a new droid." msgstr "" +msgid "Open In-Game Options" +msgstr "" + +msgid "Close In-Game Options" +msgstr "" + msgid "Hiding Obsolete Tech" msgstr "" @@ -8236,6 +8248,28 @@ msgstr "" msgid "End-Game" msgstr "" +msgid "Host" +msgstr "" + +msgid "Admin" +msgstr "" + +#, c-format +msgid "%s (%s) changed team of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed position of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed color of player (%s) to: %s" +msgstr "" + +#, c-format +msgid "%s (%s) changed faction of player (%s) to: %s" +msgstr "" + msgid "Can someone please transfer me some units?" msgstr "" @@ -8452,6 +8486,9 @@ msgstr "" msgid "Map Downloaded" msgstr "" +msgid "Admin modified a setting" +msgstr "" + msgid "Bot Allies" msgstr "" @@ -10812,9 +10849,32 @@ msgstr "" msgid "Synchronizing data with host ..." msgstr "" +msgid "Waiting for correct join password" +msgstr "" + +msgid "Attempting to connect" +msgstr "" + +msgid "Establishing connection handshake" +msgstr "" + +msgid "Coordinating join with host" +msgstr "" + +msgid "Join attempt failed" +msgstr "" + msgid "Host did not respond before timeout" msgstr "" +#, c-format +msgid "Failed at: [%s] - %s" +msgstr "" + +#, c-format +msgid "Failed at: [%s]" +msgstr "" + #, c-format msgid "Failed to open connection: [%d] %s" msgstr "" diff --git a/po/hu.po b/po/hu.po index 8a958bb3061..f970b531c45 100644 --- a/po/hu.po +++ b/po/hu.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" -"POT-Creation-Date: 2024-09-11 19:20+0000\n" -"PO-Revision-Date: 2024-09-13 02:24\n" +"POT-Creation-Date: 2024-11-01 21:02+0000\n" +"PO-Revision-Date: 2024-11-03 18:07\n" "Last-Translator: \n" "Language-Team: Hungarian\n" "Language: hu_HU\n" @@ -6482,11 +6482,11 @@ msgid "Thermal Armor +35%" msgstr "Hővédelem +35%" #, no-c-format -msgid "Thermal armor +40%" +msgid "Thermal Armor +40%" msgstr "Hővédelem +40%" #, no-c-format -msgid "Thermal Armor +40%" +msgid "Thermal armor +40%" msgstr "Hővédelem +40%" #, no-c-format @@ -7728,6 +7728,9 @@ msgstr "Ultra" msgid "Shadow filtering not available on this system." msgstr "Az árnyékszűrés nem érhető el ezen a rendszeren." +msgid "Opacity: 50%" +msgstr "" + msgid "* Takes effect on game restart" msgstr "* Játék újraindításakor effekteket bekapcsolja" @@ -7773,6 +7776,9 @@ msgstr "Képernyő Rázás" msgid "Groups Menu" msgstr "Csoportok menü" +msgid "Options Button" +msgstr "" + msgid "GRAPHICS OPTIONS" msgstr "GRAFIKA BEÁLLÍTÁS" @@ -8086,6 +8092,12 @@ msgstr "%u csalt (hibakeresés menü), egy új droidja lett: %s." msgid "Player %u is cheating (debug menu) him/herself a new droid." msgstr "%u csalt (hibakeresés menü), egy új droidja lett." +msgid "Open In-Game Options" +msgstr "" + +msgid "Close In-Game Options" +msgstr "" + msgid "Hiding Obsolete Tech" msgstr "Elavult technika elrejtése" @@ -8246,6 +8258,28 @@ msgstr "Csalások" msgid "End-Game" msgstr "Játék befejezése" +msgid "Host" +msgstr "" + +msgid "Admin" +msgstr "" + +#, c-format +msgid "%s (%s) changed team of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed position of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed color of player (%s) to: %s" +msgstr "" + +#, c-format +msgid "%s (%s) changed faction of player (%s) to: %s" +msgstr "" + msgid "Can someone please transfer me some units?" msgstr "Át tudna adni nekem valaki néhány egységet?" @@ -8462,6 +8496,9 @@ msgstr "Üzenetküldés sikertelen - próbálja újra" msgid "Map Downloaded" msgstr "Térkép letöltve" +msgid "Admin modified a setting" +msgstr "" + msgid "Bot Allies" msgstr "Bot szövetségesek" @@ -10828,9 +10865,32 @@ msgstr "" msgid "Synchronizing data with host ..." msgstr "" +msgid "Waiting for correct join password" +msgstr "" + +msgid "Attempting to connect" +msgstr "" + +msgid "Establishing connection handshake" +msgstr "" + +msgid "Coordinating join with host" +msgstr "" + +msgid "Join attempt failed" +msgstr "" + msgid "Host did not respond before timeout" msgstr "" +#, c-format +msgid "Failed at: [%s] - %s" +msgstr "" + +#, c-format +msgid "Failed at: [%s]" +msgstr "" + #, c-format msgid "Failed to open connection: [%d] %s" msgstr "" diff --git a/po/id.po b/po/id.po index bfe2ee6445a..d199c0f9ef2 100644 --- a/po/id.po +++ b/po/id.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" -"POT-Creation-Date: 2024-09-11 19:20+0000\n" -"PO-Revision-Date: 2024-09-11 19:59\n" +"POT-Creation-Date: 2024-11-01 21:02+0000\n" +"PO-Revision-Date: 2024-11-03 18:07\n" "Last-Translator: \n" "Language-Team: Indonesian\n" "Language: id_ID\n" @@ -6482,11 +6482,11 @@ msgid "Thermal Armor +35%" msgstr "Armor Termal +35%" #, no-c-format -msgid "Thermal armor +40%" +msgid "Thermal Armor +40%" msgstr "Armor Termal +40%" #, no-c-format -msgid "Thermal Armor +40%" +msgid "Thermal armor +40%" msgstr "Armor Termal +40%" #, no-c-format @@ -7722,6 +7722,9 @@ msgstr "" msgid "Shadow filtering not available on this system." msgstr "" +msgid "Opacity: 50%" +msgstr "" + msgid "* Takes effect on game restart" msgstr "* Efek dapat terlihat setelah memulai ulang permainan" @@ -7767,6 +7770,9 @@ msgstr "Getaran Layar" msgid "Groups Menu" msgstr "" +msgid "Options Button" +msgstr "" + msgid "GRAPHICS OPTIONS" msgstr "OPSI GRAFIK" @@ -8080,6 +8086,12 @@ msgstr "Pemain %u memunculkan unit baru yaitu %s melalui menu debug." msgid "Player %u is cheating (debug menu) him/herself a new droid." msgstr "Pemain %u memunculkan unit baru melalui menu debug." +msgid "Open In-Game Options" +msgstr "" + +msgid "Close In-Game Options" +msgstr "" + msgid "Hiding Obsolete Tech" msgstr "Menyembunyikan Teknologi Lawas" @@ -8240,6 +8252,28 @@ msgstr "" msgid "End-Game" msgstr "" +msgid "Host" +msgstr "" + +msgid "Admin" +msgstr "" + +#, c-format +msgid "%s (%s) changed team of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed position of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed color of player (%s) to: %s" +msgstr "" + +#, c-format +msgid "%s (%s) changed faction of player (%s) to: %s" +msgstr "" + msgid "Can someone please transfer me some units?" msgstr "" @@ -8456,6 +8490,9 @@ msgstr "Pengiriman pesan gagal - coba lagi" msgid "Map Downloaded" msgstr "" +msgid "Admin modified a setting" +msgstr "" + msgid "Bot Allies" msgstr "" @@ -10821,9 +10858,32 @@ msgstr "" msgid "Synchronizing data with host ..." msgstr "" +msgid "Waiting for correct join password" +msgstr "" + +msgid "Attempting to connect" +msgstr "" + +msgid "Establishing connection handshake" +msgstr "" + +msgid "Coordinating join with host" +msgstr "" + +msgid "Join attempt failed" +msgstr "" + msgid "Host did not respond before timeout" msgstr "" +#, c-format +msgid "Failed at: [%s] - %s" +msgstr "" + +#, c-format +msgid "Failed at: [%s]" +msgstr "" + #, c-format msgid "Failed to open connection: [%d] %s" msgstr "" diff --git a/po/it.po b/po/it.po index 5aedcb08bc9..909a7ec8a46 100644 --- a/po/it.po +++ b/po/it.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" -"POT-Creation-Date: 2024-09-11 19:20+0000\n" -"PO-Revision-Date: 2024-09-11 19:59\n" +"POT-Creation-Date: 2024-11-01 21:02+0000\n" +"PO-Revision-Date: 2024-11-03 18:07\n" "Last-Translator: \n" "Language-Team: Italian\n" "Language: it_IT\n" @@ -6482,11 +6482,11 @@ msgid "Thermal Armor +35%" msgstr "Armatura Termica +35%" #, no-c-format -msgid "Thermal armor +40%" +msgid "Thermal Armor +40%" msgstr "Armatura Termica +40%" #, no-c-format -msgid "Thermal Armor +40%" +msgid "Thermal armor +40%" msgstr "Armatura Termica +40%" #, no-c-format @@ -7728,6 +7728,9 @@ msgstr "" msgid "Shadow filtering not available on this system." msgstr "" +msgid "Opacity: 50%" +msgstr "" + msgid "* Takes effect on game restart" msgstr "* Ha effetto al riavvio del gioco" @@ -7773,6 +7776,9 @@ msgstr "Scuotimento dello schermo" msgid "Groups Menu" msgstr "" +msgid "Options Button" +msgstr "" + msgid "GRAPHICS OPTIONS" msgstr "OPZIONI GRAFICHE" @@ -8086,6 +8092,12 @@ msgstr "Il giocatore %u sta ottenendo una nuova unità per mezzo di trucchi (men msgid "Player %u is cheating (debug menu) him/herself a new droid." msgstr "Il giocatore %u sta ottenendo una nuova unità per mezzo di trucchi (menu di debug)." +msgid "Open In-Game Options" +msgstr "" + +msgid "Close In-Game Options" +msgstr "" + msgid "Hiding Obsolete Tech" msgstr "Nascondo Tecnologia Obsoleta" @@ -8246,6 +8258,28 @@ msgstr "" msgid "End-Game" msgstr "" +msgid "Host" +msgstr "" + +msgid "Admin" +msgstr "" + +#, c-format +msgid "%s (%s) changed team of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed position of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed color of player (%s) to: %s" +msgstr "" + +#, c-format +msgid "%s (%s) changed faction of player (%s) to: %s" +msgstr "" + msgid "Can someone please transfer me some units?" msgstr "" @@ -8462,6 +8496,9 @@ msgstr "Invio del messaggio non riuscito - riprova" msgid "Map Downloaded" msgstr "" +msgid "Admin modified a setting" +msgstr "" + msgid "Bot Allies" msgstr "" @@ -10828,9 +10865,32 @@ msgstr "" msgid "Synchronizing data with host ..." msgstr "" +msgid "Waiting for correct join password" +msgstr "" + +msgid "Attempting to connect" +msgstr "" + +msgid "Establishing connection handshake" +msgstr "" + +msgid "Coordinating join with host" +msgstr "" + +msgid "Join attempt failed" +msgstr "" + msgid "Host did not respond before timeout" msgstr "" +#, c-format +msgid "Failed at: [%s] - %s" +msgstr "" + +#, c-format +msgid "Failed at: [%s]" +msgstr "" + #, c-format msgid "Failed to open connection: [%d] %s" msgstr "" diff --git a/po/ja_JP.po b/po/ja_JP.po index a2a1bb2c168..04abadde6ae 100644 --- a/po/ja_JP.po +++ b/po/ja_JP.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" -"POT-Creation-Date: 2024-09-11 19:20+0000\n" -"PO-Revision-Date: 2024-09-11 19:59\n" +"POT-Creation-Date: 2024-11-01 21:02+0000\n" +"PO-Revision-Date: 2024-11-03 18:07\n" "Last-Translator: \n" "Language-Team: Japanese\n" "Language: ja_JP\n" @@ -6482,11 +6482,11 @@ msgid "Thermal Armor +35%" msgstr "サーマルアーマー +35%" #, no-c-format -msgid "Thermal armor +40%" +msgid "Thermal Armor +40%" msgstr "サーマルアーマー +40%" #, no-c-format -msgid "Thermal Armor +40%" +msgid "Thermal armor +40%" msgstr "サーマルアーマー +40%" #, no-c-format @@ -7722,6 +7722,9 @@ msgstr "ウルトラ" msgid "Shadow filtering not available on this system." msgstr "このシステムではシャドウフィルタリングは利用できません。" +msgid "Opacity: 50%" +msgstr "" + msgid "* Takes effect on game restart" msgstr "* ゲーム再開時に反映されます" @@ -7767,6 +7770,9 @@ msgstr "スクリーン振動" msgid "Groups Menu" msgstr "グループメニュー" +msgid "Options Button" +msgstr "" + msgid "GRAPHICS OPTIONS" msgstr "グラフィックス オプション" @@ -8080,6 +8086,12 @@ msgstr "プレイヤー %u は新しいドロイドのチート(デバッグ msgid "Player %u is cheating (debug menu) him/herself a new droid." msgstr "プレイヤー %u は新しいドロイドのチート(デバッグ・メニュー)を使用しています。" +msgid "Open In-Game Options" +msgstr "" + +msgid "Close In-Game Options" +msgstr "" + msgid "Hiding Obsolete Tech" msgstr "旧型の技術を隠す" @@ -8240,6 +8252,28 @@ msgstr "" msgid "End-Game" msgstr "" +msgid "Host" +msgstr "" + +msgid "Admin" +msgstr "" + +#, c-format +msgid "%s (%s) changed team of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed position of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed color of player (%s) to: %s" +msgstr "" + +#, c-format +msgid "%s (%s) changed faction of player (%s) to: %s" +msgstr "" + msgid "Can someone please transfer me some units?" msgstr "" @@ -8456,6 +8490,9 @@ msgstr "メッセージ配信に失敗しました - 再度お試しください msgid "Map Downloaded" msgstr "" +msgid "Admin modified a setting" +msgstr "" + msgid "Bot Allies" msgstr "" @@ -10821,9 +10858,32 @@ msgstr "" msgid "Synchronizing data with host ..." msgstr "" +msgid "Waiting for correct join password" +msgstr "" + +msgid "Attempting to connect" +msgstr "" + +msgid "Establishing connection handshake" +msgstr "" + +msgid "Coordinating join with host" +msgstr "" + +msgid "Join attempt failed" +msgstr "" + msgid "Host did not respond before timeout" msgstr "" +#, c-format +msgid "Failed at: [%s] - %s" +msgstr "" + +#, c-format +msgid "Failed at: [%s]" +msgstr "" + #, c-format msgid "Failed to open connection: [%d] %s" msgstr "" diff --git a/po/ko.po b/po/ko.po index 449897e0fb7..307da0bab1a 100644 --- a/po/ko.po +++ b/po/ko.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" -"POT-Creation-Date: 2024-09-11 19:20+0000\n" -"PO-Revision-Date: 2024-09-11 19:59\n" +"POT-Creation-Date: 2024-11-01 21:02+0000\n" +"PO-Revision-Date: 2024-11-03 18:07\n" "Last-Translator: \n" "Language-Team: Korean\n" "Language: ko_KR\n" @@ -6476,11 +6476,11 @@ msgid "Thermal Armor +35%" msgstr "내열성 장갑 +35%" #, no-c-format -msgid "Thermal armor +40%" +msgid "Thermal Armor +40%" msgstr "내열성 장갑 +40%" #, no-c-format -msgid "Thermal Armor +40%" +msgid "Thermal armor +40%" msgstr "내열성 장갑 +40%" #, no-c-format @@ -7716,6 +7716,9 @@ msgstr "" msgid "Shadow filtering not available on this system." msgstr "" +msgid "Opacity: 50%" +msgstr "" + msgid "* Takes effect on game restart" msgstr "*게임 재시작시 적용됩니다" @@ -7761,6 +7764,9 @@ msgstr "" msgid "Groups Menu" msgstr "" +msgid "Options Button" +msgstr "" + msgid "GRAPHICS OPTIONS" msgstr "그래픽 옵션" @@ -8070,6 +8076,12 @@ msgstr "플레이어 %u 가 치트(디버그 메뉴)를 사용해 새로운 병 msgid "Player %u is cheating (debug menu) him/herself a new droid." msgstr "" +msgid "Open In-Game Options" +msgstr "" + +msgid "Close In-Game Options" +msgstr "" + msgid "Hiding Obsolete Tech" msgstr "" @@ -8226,6 +8238,28 @@ msgstr "" msgid "End-Game" msgstr "" +msgid "Host" +msgstr "" + +msgid "Admin" +msgstr "" + +#, c-format +msgid "%s (%s) changed team of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed position of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed color of player (%s) to: %s" +msgstr "" + +#, c-format +msgid "%s (%s) changed faction of player (%s) to: %s" +msgstr "" + msgid "Can someone please transfer me some units?" msgstr "" @@ -8442,6 +8476,9 @@ msgstr "" msgid "Map Downloaded" msgstr "" +msgid "Admin modified a setting" +msgstr "" + msgid "Bot Allies" msgstr "" @@ -10803,9 +10840,32 @@ msgstr "" msgid "Synchronizing data with host ..." msgstr "" +msgid "Waiting for correct join password" +msgstr "" + +msgid "Attempting to connect" +msgstr "" + +msgid "Establishing connection handshake" +msgstr "" + +msgid "Coordinating join with host" +msgstr "" + +msgid "Join attempt failed" +msgstr "" + msgid "Host did not respond before timeout" msgstr "" +#, c-format +msgid "Failed at: [%s] - %s" +msgstr "" + +#, c-format +msgid "Failed at: [%s]" +msgstr "" + #, c-format msgid "Failed to open connection: [%d] %s" msgstr "" diff --git a/po/la.po b/po/la.po index a69775f05a9..df4e97ce93b 100644 --- a/po/la.po +++ b/po/la.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" -"POT-Creation-Date: 2024-09-11 19:20+0000\n" -"PO-Revision-Date: 2024-09-11 19:59\n" +"POT-Creation-Date: 2024-11-01 21:02+0000\n" +"PO-Revision-Date: 2024-11-03 18:07\n" "Last-Translator: \n" "Language-Team: Latin\n" "Language: la_LA\n" @@ -6476,11 +6476,11 @@ msgid "Thermal Armor +35%" msgstr "" #, no-c-format -msgid "Thermal armor +40%" +msgid "Thermal Armor +40%" msgstr "" #, no-c-format -msgid "Thermal Armor +40%" +msgid "Thermal armor +40%" msgstr "" #, no-c-format @@ -7720,6 +7720,9 @@ msgstr "" msgid "Shadow filtering not available on this system." msgstr "" +msgid "Opacity: 50%" +msgstr "" + msgid "* Takes effect on game restart" msgstr "" @@ -7765,6 +7768,9 @@ msgstr "" msgid "Groups Menu" msgstr "" +msgid "Options Button" +msgstr "" + msgid "GRAPHICS OPTIONS" msgstr "" @@ -8074,6 +8080,12 @@ msgstr "" msgid "Player %u is cheating (debug menu) him/herself a new droid." msgstr "" +msgid "Open In-Game Options" +msgstr "" + +msgid "Close In-Game Options" +msgstr "" + msgid "Hiding Obsolete Tech" msgstr "" @@ -8230,6 +8242,28 @@ msgstr "" msgid "End-Game" msgstr "" +msgid "Host" +msgstr "" + +msgid "Admin" +msgstr "" + +#, c-format +msgid "%s (%s) changed team of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed position of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed color of player (%s) to: %s" +msgstr "" + +#, c-format +msgid "%s (%s) changed faction of player (%s) to: %s" +msgstr "" + msgid "Can someone please transfer me some units?" msgstr "" @@ -8446,6 +8480,9 @@ msgstr "" msgid "Map Downloaded" msgstr "" +msgid "Admin modified a setting" +msgstr "" + msgid "Bot Allies" msgstr "" @@ -10805,9 +10842,32 @@ msgstr "" msgid "Synchronizing data with host ..." msgstr "" +msgid "Waiting for correct join password" +msgstr "" + +msgid "Attempting to connect" +msgstr "" + +msgid "Establishing connection handshake" +msgstr "" + +msgid "Coordinating join with host" +msgstr "" + +msgid "Join attempt failed" +msgstr "" + msgid "Host did not respond before timeout" msgstr "" +#, c-format +msgid "Failed at: [%s] - %s" +msgstr "" + +#, c-format +msgid "Failed at: [%s]" +msgstr "" + #, c-format msgid "Failed to open connection: [%d] %s" msgstr "" diff --git a/po/lt.po b/po/lt.po index 0e12eafca82..db3853bb908 100644 --- a/po/lt.po +++ b/po/lt.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" -"POT-Creation-Date: 2024-09-11 19:20+0000\n" -"PO-Revision-Date: 2024-09-11 19:59\n" +"POT-Creation-Date: 2024-11-01 21:02+0000\n" +"PO-Revision-Date: 2024-11-03 18:07\n" "Last-Translator: \n" "Language-Team: Lithuanian\n" "Language: lt_LT\n" @@ -6476,11 +6476,11 @@ msgid "Thermal Armor +35%" msgstr "" #, no-c-format -msgid "Thermal armor +40%" +msgid "Thermal Armor +40%" msgstr "" #, no-c-format -msgid "Thermal Armor +40%" +msgid "Thermal armor +40%" msgstr "" #, no-c-format @@ -7732,6 +7732,9 @@ msgstr "" msgid "Shadow filtering not available on this system." msgstr "" +msgid "Opacity: 50%" +msgstr "" + msgid "* Takes effect on game restart" msgstr "" @@ -7777,6 +7780,9 @@ msgstr "" msgid "Groups Menu" msgstr "" +msgid "Options Button" +msgstr "" + msgid "GRAPHICS OPTIONS" msgstr "" @@ -8086,6 +8092,12 @@ msgstr "Žaidėjas %u sukčiauja (debug meniu) jam/jai naujas droidas: %s." msgid "Player %u is cheating (debug menu) him/herself a new droid." msgstr "" +msgid "Open In-Game Options" +msgstr "" + +msgid "Close In-Game Options" +msgstr "" + msgid "Hiding Obsolete Tech" msgstr "" @@ -8242,6 +8254,28 @@ msgstr "" msgid "End-Game" msgstr "" +msgid "Host" +msgstr "" + +msgid "Admin" +msgstr "" + +#, c-format +msgid "%s (%s) changed team of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed position of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed color of player (%s) to: %s" +msgstr "" + +#, c-format +msgid "%s (%s) changed faction of player (%s) to: %s" +msgstr "" + msgid "Can someone please transfer me some units?" msgstr "" @@ -8458,6 +8492,9 @@ msgstr "" msgid "Map Downloaded" msgstr "" +msgid "Admin modified a setting" +msgstr "" + msgid "Bot Allies" msgstr "" @@ -10819,9 +10856,32 @@ msgstr "" msgid "Synchronizing data with host ..." msgstr "" +msgid "Waiting for correct join password" +msgstr "" + +msgid "Attempting to connect" +msgstr "" + +msgid "Establishing connection handshake" +msgstr "" + +msgid "Coordinating join with host" +msgstr "" + +msgid "Join attempt failed" +msgstr "" + msgid "Host did not respond before timeout" msgstr "" +#, c-format +msgid "Failed at: [%s] - %s" +msgstr "" + +#, c-format +msgid "Failed at: [%s]" +msgstr "" + #, c-format msgid "Failed to open connection: [%d] %s" msgstr "" diff --git a/po/my_MM.po b/po/my_MM.po index 28a2674c5df..58453358c6f 100644 --- a/po/my_MM.po +++ b/po/my_MM.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" -"POT-Creation-Date: 2024-09-11 19:20+0000\n" -"PO-Revision-Date: 2024-09-11 19:59\n" +"POT-Creation-Date: 2024-11-01 21:02+0000\n" +"PO-Revision-Date: 2024-11-03 18:06\n" "Last-Translator: \n" "Language-Team: Burmese\n" "Language: my_MM\n" @@ -6476,11 +6476,11 @@ msgid "Thermal Armor +35%" msgstr "" #, no-c-format -msgid "Thermal armor +40%" +msgid "Thermal Armor +40%" msgstr "" #, no-c-format -msgid "Thermal Armor +40%" +msgid "Thermal armor +40%" msgstr "" #, no-c-format @@ -7714,6 +7714,9 @@ msgstr "" msgid "Shadow filtering not available on this system." msgstr "" +msgid "Opacity: 50%" +msgstr "" + msgid "* Takes effect on game restart" msgstr "" @@ -7759,6 +7762,9 @@ msgstr "" msgid "Groups Menu" msgstr "" +msgid "Options Button" +msgstr "" + msgid "GRAPHICS OPTIONS" msgstr "" @@ -8068,6 +8074,12 @@ msgstr "" msgid "Player %u is cheating (debug menu) him/herself a new droid." msgstr "" +msgid "Open In-Game Options" +msgstr "" + +msgid "Close In-Game Options" +msgstr "" + msgid "Hiding Obsolete Tech" msgstr "" @@ -8224,6 +8236,28 @@ msgstr "" msgid "End-Game" msgstr "" +msgid "Host" +msgstr "" + +msgid "Admin" +msgstr "" + +#, c-format +msgid "%s (%s) changed team of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed position of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed color of player (%s) to: %s" +msgstr "" + +#, c-format +msgid "%s (%s) changed faction of player (%s) to: %s" +msgstr "" + msgid "Can someone please transfer me some units?" msgstr "" @@ -8440,6 +8474,9 @@ msgstr "" msgid "Map Downloaded" msgstr "" +msgid "Admin modified a setting" +msgstr "" + msgid "Bot Allies" msgstr "" @@ -10798,9 +10835,32 @@ msgstr "" msgid "Synchronizing data with host ..." msgstr "" +msgid "Waiting for correct join password" +msgstr "" + +msgid "Attempting to connect" +msgstr "" + +msgid "Establishing connection handshake" +msgstr "" + +msgid "Coordinating join with host" +msgstr "" + +msgid "Join attempt failed" +msgstr "" + msgid "Host did not respond before timeout" msgstr "" +#, c-format +msgid "Failed at: [%s] - %s" +msgstr "" + +#, c-format +msgid "Failed at: [%s]" +msgstr "" + #, c-format msgid "Failed to open connection: [%d] %s" msgstr "" diff --git a/po/nb.po b/po/nb.po index 55c1ec9136e..eebcb9c6443 100644 --- a/po/nb.po +++ b/po/nb.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" -"POT-Creation-Date: 2024-09-11 19:20+0000\n" -"PO-Revision-Date: 2024-09-11 19:59\n" +"POT-Creation-Date: 2024-11-01 21:02+0000\n" +"PO-Revision-Date: 2024-11-03 18:07\n" "Last-Translator: \n" "Language-Team: Norwegian Bokmal\n" "Language: nb_NO\n" @@ -6476,11 +6476,11 @@ msgid "Thermal Armor +35%" msgstr "" #, no-c-format -msgid "Thermal armor +40%" +msgid "Thermal Armor +40%" msgstr "" #, no-c-format -msgid "Thermal Armor +40%" +msgid "Thermal armor +40%" msgstr "" #, no-c-format @@ -7720,6 +7720,9 @@ msgstr "" msgid "Shadow filtering not available on this system." msgstr "" +msgid "Opacity: 50%" +msgstr "" + msgid "* Takes effect on game restart" msgstr "" @@ -7765,6 +7768,9 @@ msgstr "" msgid "Groups Menu" msgstr "" +msgid "Options Button" +msgstr "" + msgid "GRAPHICS OPTIONS" msgstr "" @@ -8074,6 +8080,12 @@ msgstr "" msgid "Player %u is cheating (debug menu) him/herself a new droid." msgstr "" +msgid "Open In-Game Options" +msgstr "" + +msgid "Close In-Game Options" +msgstr "" + msgid "Hiding Obsolete Tech" msgstr "" @@ -8230,6 +8242,28 @@ msgstr "" msgid "End-Game" msgstr "" +msgid "Host" +msgstr "" + +msgid "Admin" +msgstr "" + +#, c-format +msgid "%s (%s) changed team of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed position of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed color of player (%s) to: %s" +msgstr "" + +#, c-format +msgid "%s (%s) changed faction of player (%s) to: %s" +msgstr "" + msgid "Can someone please transfer me some units?" msgstr "" @@ -8446,6 +8480,9 @@ msgstr "" msgid "Map Downloaded" msgstr "" +msgid "Admin modified a setting" +msgstr "" + msgid "Bot Allies" msgstr "" @@ -10805,9 +10842,32 @@ msgstr "" msgid "Synchronizing data with host ..." msgstr "" +msgid "Waiting for correct join password" +msgstr "" + +msgid "Attempting to connect" +msgstr "" + +msgid "Establishing connection handshake" +msgstr "" + +msgid "Coordinating join with host" +msgstr "" + +msgid "Join attempt failed" +msgstr "" + msgid "Host did not respond before timeout" msgstr "" +#, c-format +msgid "Failed at: [%s] - %s" +msgstr "" + +#, c-format +msgid "Failed at: [%s]" +msgstr "" + #, c-format msgid "Failed to open connection: [%d] %s" msgstr "" diff --git a/po/nl.po b/po/nl.po index 8f9e338e394..c7c1e373dbb 100644 --- a/po/nl.po +++ b/po/nl.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" -"POT-Creation-Date: 2024-09-11 19:20+0000\n" -"PO-Revision-Date: 2024-09-11 19:59\n" +"POT-Creation-Date: 2024-11-01 21:02+0000\n" +"PO-Revision-Date: 2024-11-03 18:06\n" "Last-Translator: \n" "Language-Team: Dutch\n" "Language: nl_NL\n" @@ -6476,11 +6476,11 @@ msgid "Thermal Armor +35%" msgstr "Thermisch Pantser +35%" #, no-c-format -msgid "Thermal armor +40%" +msgid "Thermal Armor +40%" msgstr "Thermisch Pantser +40%" #, no-c-format -msgid "Thermal Armor +40%" +msgid "Thermal armor +40%" msgstr "Thermisch Pantser +40%" #, no-c-format @@ -7720,6 +7720,9 @@ msgstr "" msgid "Shadow filtering not available on this system." msgstr "" +msgid "Opacity: 50%" +msgstr "" + msgid "* Takes effect on game restart" msgstr "* Gaat in na herstart" @@ -7765,6 +7768,9 @@ msgstr "" msgid "Groups Menu" msgstr "" +msgid "Options Button" +msgstr "" + msgid "GRAPHICS OPTIONS" msgstr "GRAFISCHE INSTELLINGEN" @@ -8074,6 +8080,12 @@ msgstr "Speler %u heeft zichzelf met cheats (debugmenu) een nieuw eenheid gegeve msgid "Player %u is cheating (debug menu) him/herself a new droid." msgstr "Speler %u heeft zichzelf met cheats (debugmenu) een nieuw eenheid gegeven." +msgid "Open In-Game Options" +msgstr "" + +msgid "Close In-Game Options" +msgstr "" + msgid "Hiding Obsolete Tech" msgstr "" @@ -8230,6 +8242,28 @@ msgstr "" msgid "End-Game" msgstr "" +msgid "Host" +msgstr "" + +msgid "Admin" +msgstr "" + +#, c-format +msgid "%s (%s) changed team of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed position of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed color of player (%s) to: %s" +msgstr "" + +#, c-format +msgid "%s (%s) changed faction of player (%s) to: %s" +msgstr "" + msgid "Can someone please transfer me some units?" msgstr "" @@ -8446,6 +8480,9 @@ msgstr "" msgid "Map Downloaded" msgstr "" +msgid "Admin modified a setting" +msgstr "" + msgid "Bot Allies" msgstr "" @@ -10808,9 +10845,32 @@ msgstr "" msgid "Synchronizing data with host ..." msgstr "" +msgid "Waiting for correct join password" +msgstr "" + +msgid "Attempting to connect" +msgstr "" + +msgid "Establishing connection handshake" +msgstr "" + +msgid "Coordinating join with host" +msgstr "" + +msgid "Join attempt failed" +msgstr "" + msgid "Host did not respond before timeout" msgstr "" +#, c-format +msgid "Failed at: [%s] - %s" +msgstr "" + +#, c-format +msgid "Failed at: [%s]" +msgstr "" + #, c-format msgid "Failed to open connection: [%d] %s" msgstr "" diff --git a/po/pl.po b/po/pl.po index 738b7e750db..578217e59bf 100644 --- a/po/pl.po +++ b/po/pl.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" -"POT-Creation-Date: 2024-09-11 19:20+0000\n" -"PO-Revision-Date: 2024-09-11 19:59\n" +"POT-Creation-Date: 2024-11-01 21:02+0000\n" +"PO-Revision-Date: 2024-11-03 18:07\n" "Last-Translator: \n" "Language-Team: Polish\n" "Language: pl_PL\n" @@ -6486,11 +6486,11 @@ msgid "Thermal Armor +35%" msgstr "Pancerz termiczny +35%" #, no-c-format -msgid "Thermal armor +40%" +msgid "Thermal Armor +40%" msgstr "Pancerz termiczny +40%" #, no-c-format -msgid "Thermal Armor +40%" +msgid "Thermal armor +40%" msgstr "Pancerz termiczny +40%" #, no-c-format @@ -7744,6 +7744,9 @@ msgstr "" msgid "Shadow filtering not available on this system." msgstr "" +msgid "Opacity: 50%" +msgstr "" + msgid "* Takes effect on game restart" msgstr "* Wymaga restartu gry" @@ -7789,6 +7792,9 @@ msgstr "Wstrząśnięcia ekranem" msgid "Groups Menu" msgstr "" +msgid "Options Button" +msgstr "" + msgid "GRAPHICS OPTIONS" msgstr "USTAWIENIA GRAFIKI" @@ -8100,6 +8106,12 @@ msgstr "Gracz %u oszukuje (menu odpluskwiania) by zdobyć nową jednostkę: %s." msgid "Player %u is cheating (debug menu) him/herself a new droid." msgstr "Gracz %u oszukuje (menu odpluskwiania) by zdobyć nową jednostkę." +msgid "Open In-Game Options" +msgstr "" + +msgid "Close In-Game Options" +msgstr "" + msgid "Hiding Obsolete Tech" msgstr "Ukrywanie przestarzałej technologii" @@ -8260,6 +8272,28 @@ msgstr "" msgid "End-Game" msgstr "" +msgid "Host" +msgstr "" + +msgid "Admin" +msgstr "" + +#, c-format +msgid "%s (%s) changed team of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed position of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed color of player (%s) to: %s" +msgstr "" + +#, c-format +msgid "%s (%s) changed faction of player (%s) to: %s" +msgstr "" + msgid "Can someone please transfer me some units?" msgstr "" @@ -8476,6 +8510,9 @@ msgstr "" msgid "Map Downloaded" msgstr "Mapa pobrana" +msgid "Admin modified a setting" +msgstr "" + msgid "Bot Allies" msgstr "" @@ -10842,9 +10879,32 @@ msgstr "" msgid "Synchronizing data with host ..." msgstr "" +msgid "Waiting for correct join password" +msgstr "" + +msgid "Attempting to connect" +msgstr "" + +msgid "Establishing connection handshake" +msgstr "" + +msgid "Coordinating join with host" +msgstr "" + +msgid "Join attempt failed" +msgstr "" + msgid "Host did not respond before timeout" msgstr "" +#, c-format +msgid "Failed at: [%s] - %s" +msgstr "" + +#, c-format +msgid "Failed at: [%s]" +msgstr "" + #, c-format msgid "Failed to open connection: [%d] %s" msgstr "" diff --git a/po/pt.po b/po/pt.po index 9589f134ca5..ba748c9ee3a 100644 --- a/po/pt.po +++ b/po/pt.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" -"POT-Creation-Date: 2024-09-11 19:20+0000\n" -"PO-Revision-Date: 2024-10-03 02:27\n" +"POT-Creation-Date: 2024-11-01 21:02+0000\n" +"PO-Revision-Date: 2024-11-03 18:07\n" "Last-Translator: \n" "Language-Team: Portuguese\n" "Language: pt_PT\n" @@ -6486,11 +6486,11 @@ msgid "Thermal Armor +35%" msgstr "Protecção Térmica +35%" #, no-c-format -msgid "Thermal armor +40%" +msgid "Thermal Armor +40%" msgstr "Protecção Térmica +40%" #, no-c-format -msgid "Thermal Armor +40%" +msgid "Thermal armor +40%" msgstr "Protecção Térmica +40%" #, no-c-format @@ -7732,6 +7732,9 @@ msgstr "Ultra" msgid "Shadow filtering not available on this system." msgstr "" +msgid "Opacity: 50%" +msgstr "" + msgid "* Takes effect on game restart" msgstr "* Tem efeito quando o jogo for reiniciado" @@ -7777,6 +7780,9 @@ msgstr "Agitar tela" msgid "Groups Menu" msgstr "Menu de grupos" +msgid "Options Button" +msgstr "" + msgid "GRAPHICS OPTIONS" msgstr "OPÇÕES DE GRÁFICOS" @@ -8090,6 +8096,12 @@ msgstr "Jogador %u está a fazer batota (menu debug) para obter uma nova unidade msgid "Player %u is cheating (debug menu) him/herself a new droid." msgstr "Jogador %u está a fazer batota (menu debug) para obter uma nova unidade." +msgid "Open In-Game Options" +msgstr "" + +msgid "Close In-Game Options" +msgstr "" + msgid "Hiding Obsolete Tech" msgstr "Esconder Tecnologia Obsoleta" @@ -8250,6 +8262,28 @@ msgstr "" msgid "End-Game" msgstr "" +msgid "Host" +msgstr "" + +msgid "Admin" +msgstr "" + +#, c-format +msgid "%s (%s) changed team of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed position of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed color of player (%s) to: %s" +msgstr "" + +#, c-format +msgid "%s (%s) changed faction of player (%s) to: %s" +msgstr "" + msgid "Can someone please transfer me some units?" msgstr "" @@ -8466,6 +8500,9 @@ msgstr "Falha ao enviar mensagem - tente novamente" msgid "Map Downloaded" msgstr "" +msgid "Admin modified a setting" +msgstr "" + msgid "Bot Allies" msgstr "" @@ -10832,9 +10869,32 @@ msgstr "" msgid "Synchronizing data with host ..." msgstr "" +msgid "Waiting for correct join password" +msgstr "" + +msgid "Attempting to connect" +msgstr "" + +msgid "Establishing connection handshake" +msgstr "" + +msgid "Coordinating join with host" +msgstr "" + +msgid "Join attempt failed" +msgstr "" + msgid "Host did not respond before timeout" msgstr "" +#, c-format +msgid "Failed at: [%s] - %s" +msgstr "" + +#, c-format +msgid "Failed at: [%s]" +msgstr "" + #, c-format msgid "Failed to open connection: [%d] %s" msgstr "" diff --git a/po/pt_BR.po b/po/pt_BR.po index 21dcfee09b0..390caa94123 100644 --- a/po/pt_BR.po +++ b/po/pt_BR.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" -"POT-Creation-Date: 2024-09-11 19:20+0000\n" -"PO-Revision-Date: 2024-10-07 02:29\n" +"POT-Creation-Date: 2024-11-01 21:02+0000\n" +"PO-Revision-Date: 2024-11-04 02:29\n" "Last-Translator: \n" "Language-Team: Portuguese, Brazilian\n" "Language: pt_BR\n" @@ -6486,11 +6486,11 @@ msgid "Thermal Armor +35%" msgstr "Armadura Térmica +35%" #, no-c-format -msgid "Thermal armor +40%" +msgid "Thermal Armor +40%" msgstr "Armadura Térmica +40%" #, no-c-format -msgid "Thermal Armor +40%" +msgid "Thermal armor +40%" msgstr "Armadura Térmica +40%" #, no-c-format @@ -7732,6 +7732,9 @@ msgstr "Ultra" msgid "Shadow filtering not available on this system." msgstr "A filtragem por sombra não está disponível neste sistema." +msgid "Opacity: 50%" +msgstr "Opacidade: 50%" + msgid "* Takes effect on game restart" msgstr "* Precisa reiniciar o jogo" @@ -7777,6 +7780,9 @@ msgstr "Agitar Tela" msgid "Groups Menu" msgstr "Menu de Grupos" +msgid "Options Button" +msgstr "Botão de Opções" + msgid "GRAPHICS OPTIONS" msgstr "OPÇÕES GRÁFICAS" @@ -8090,6 +8096,12 @@ msgstr "Jogador %u trapaceou (menu de depuração) dando a ele mesmo um novo dr msgid "Player %u is cheating (debug menu) him/herself a new droid." msgstr "Jogador %u está trapaceando (menu de depuração)! Ele/ela ganhou um novo droide." +msgid "Open In-Game Options" +msgstr "Exibir Opções de Jogo" + +msgid "Close In-Game Options" +msgstr "Fechar opções de jogo" + msgid "Hiding Obsolete Tech" msgstr "Escondendo Tecn. Obsoletas" @@ -8250,6 +8262,28 @@ msgstr "Trapaças" msgid "End-Game" msgstr "Fim de jogo" +msgid "Host" +msgstr "" + +msgid "Admin" +msgstr "Administrador" + +#, c-format +msgid "%s (%s) changed team of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed position of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed color of player (%s) to: %s" +msgstr "" + +#, c-format +msgid "%s (%s) changed faction of player (%s) to: %s" +msgstr "" + msgid "Can someone please transfer me some units?" msgstr "Alguém pode me transferir algumas unidades, por favor?" @@ -8466,6 +8500,9 @@ msgstr "Falha ao enviar mensagem - tente novamente" msgid "Map Downloaded" msgstr "Mapa Baixado" +msgid "Admin modified a setting" +msgstr "" + msgid "Bot Allies" msgstr "Aliados de IA" @@ -10832,9 +10869,32 @@ msgstr "Nenhuma conexão disponível" msgid "Synchronizing data with host ..." msgstr "Sincronizando dados com o host ..." +msgid "Waiting for correct join password" +msgstr "" + +msgid "Attempting to connect" +msgstr "" + +msgid "Establishing connection handshake" +msgstr "" + +msgid "Coordinating join with host" +msgstr "" + +msgid "Join attempt failed" +msgstr "" + msgid "Host did not respond before timeout" msgstr "O anfitrião não respondeu no tempo limite" +#, c-format +msgid "Failed at: [%s] - %s" +msgstr "" + +#, c-format +msgid "Failed at: [%s]" +msgstr "" + #, c-format msgid "Failed to open connection: [%d] %s" msgstr "Falha ao abrir a conexão: [%d] %s" diff --git a/po/ro.po b/po/ro.po index 9b76c0d6e6b..e6fa1d82cdd 100644 --- a/po/ro.po +++ b/po/ro.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" -"POT-Creation-Date: 2024-09-11 19:20+0000\n" -"PO-Revision-Date: 2024-09-11 19:59\n" +"POT-Creation-Date: 2024-11-01 21:02+0000\n" +"PO-Revision-Date: 2024-11-03 18:07\n" "Last-Translator: \n" "Language-Team: Romanian\n" "Language: ro_RO\n" @@ -6481,14 +6481,14 @@ msgstr "DAV-ul se întoarce la stația selectată pentru reînarmare" msgid "Thermal Armor +35%" msgstr "Armură termală +35%" -#, no-c-format -msgid "Thermal armor +40%" -msgstr "Blindaj Termal +40%" - #, no-c-format msgid "Thermal Armor +40%" msgstr "Armură termală +40%" +#, no-c-format +msgid "Thermal armor +40%" +msgstr "Blindaj Termal +40%" + #, no-c-format msgid "Thermal Armor +45%" msgstr "Blindaj Termal +45%" @@ -7734,6 +7734,9 @@ msgstr "" msgid "Shadow filtering not available on this system." msgstr "" +msgid "Opacity: 50%" +msgstr "" + msgid "* Takes effect on game restart" msgstr "* Are efect doar la repornirea jocului" @@ -7779,6 +7782,9 @@ msgstr "" msgid "Groups Menu" msgstr "" +msgid "Options Button" +msgstr "" + msgid "GRAPHICS OPTIONS" msgstr "OPȚIUNI DE GRAFICĂ" @@ -8088,6 +8094,12 @@ msgstr "" msgid "Player %u is cheating (debug menu) him/herself a new droid." msgstr "" +msgid "Open In-Game Options" +msgstr "" + +msgid "Close In-Game Options" +msgstr "" + msgid "Hiding Obsolete Tech" msgstr "Ascunde Tehnologia Învechită" @@ -8244,6 +8256,28 @@ msgstr "" msgid "End-Game" msgstr "" +msgid "Host" +msgstr "" + +msgid "Admin" +msgstr "" + +#, c-format +msgid "%s (%s) changed team of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed position of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed color of player (%s) to: %s" +msgstr "" + +#, c-format +msgid "%s (%s) changed faction of player (%s) to: %s" +msgstr "" + msgid "Can someone please transfer me some units?" msgstr "" @@ -8460,6 +8494,9 @@ msgstr "Trimiterea mesajului a eșuat - încercați din nou" msgid "Map Downloaded" msgstr "" +msgid "Admin modified a setting" +msgstr "" + msgid "Bot Allies" msgstr "Bot Aliați" @@ -10825,9 +10862,32 @@ msgstr "" msgid "Synchronizing data with host ..." msgstr "" +msgid "Waiting for correct join password" +msgstr "" + +msgid "Attempting to connect" +msgstr "" + +msgid "Establishing connection handshake" +msgstr "" + +msgid "Coordinating join with host" +msgstr "" + +msgid "Join attempt failed" +msgstr "" + msgid "Host did not respond before timeout" msgstr "" +#, c-format +msgid "Failed at: [%s] - %s" +msgstr "" + +#, c-format +msgid "Failed at: [%s]" +msgstr "" + #, c-format msgid "Failed to open connection: [%d] %s" msgstr "" diff --git a/po/ru.po b/po/ru.po index 510dbce0ac8..b8f6741abb4 100644 --- a/po/ru.po +++ b/po/ru.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" -"POT-Creation-Date: 2024-09-11 19:20+0000\n" -"PO-Revision-Date: 2024-09-18 02:24\n" +"POT-Creation-Date: 2024-11-01 21:02+0000\n" +"PO-Revision-Date: 2024-11-06 02:25\n" "Last-Translator: \n" "Language-Team: Russian\n" "Language: ru_RU\n" @@ -6486,11 +6486,11 @@ msgid "Thermal Armor +35%" msgstr "Термоброня +35%" #, no-c-format -msgid "Thermal armor +40%" +msgid "Thermal Armor +40%" msgstr "Термоброня +40%" #, no-c-format -msgid "Thermal Armor +40%" +msgid "Thermal armor +40%" msgstr "Термоброня +40%" #, no-c-format @@ -7744,6 +7744,9 @@ msgstr "Ультра" msgid "Shadow filtering not available on this system." msgstr "Фильтрация теней недоступна в этой системе." +msgid "Opacity: 50%" +msgstr "Прозрачность: 50%" + msgid "* Takes effect on game restart" msgstr "* Вступит в силу после перезагрузки игры" @@ -7789,6 +7792,9 @@ msgstr "Тряска экрана" msgid "Groups Menu" msgstr "Меню групп" +msgid "Options Button" +msgstr "Кнопка настроек" + msgid "GRAPHICS OPTIONS" msgstr "НАСТРОЙКИ ГРАФИКИ" @@ -8102,6 +8108,12 @@ msgstr "Игрок %u считерил (меню отладки) себе нов msgid "Player %u is cheating (debug menu) him/herself a new droid." msgstr "Игрок %u считерил (меню отладки) себе нового юнита." +msgid "Open In-Game Options" +msgstr "Открыть настройки игры" + +msgid "Close In-Game Options" +msgstr "Закрыть настройки игры" + msgid "Hiding Obsolete Tech" msgstr "Скрыть устаревшие технологии" @@ -8262,6 +8274,28 @@ msgstr "Читы" msgid "End-Game" msgstr "Окончание игры" +msgid "Host" +msgstr "Хост" + +msgid "Admin" +msgstr "Администратор" + +#, c-format +msgid "%s (%s) changed team of player (%s) to: %d" +msgstr "%s (%s) изменил команду игрока (%s) на: %d" + +#, c-format +msgid "%s (%s) changed position of player (%s) to: %d" +msgstr "%s (%s) изменил позицию игрока (%s) на: %d" + +#, c-format +msgid "%s (%s) changed color of player (%s) to: %s" +msgstr "%s (%s) изменил цвет игрока (%s) на: %s" + +#, c-format +msgid "%s (%s) changed faction of player (%s) to: %s" +msgstr "%s (%s) изменил фракцию игрока (%s) на: %s" + msgid "Can someone please transfer me some units?" msgstr "Может кто-нибудь передать мне юнитов?" @@ -8478,6 +8512,9 @@ msgstr "Ошибка доставки сообщения - попробуйте msgid "Map Downloaded" msgstr "Карта загружена" +msgid "Admin modified a setting" +msgstr "Администратор изменил настройки" + msgid "Bot Allies" msgstr "Боты-союзники" @@ -10846,9 +10883,32 @@ msgstr "Нет доступных подключений" msgid "Synchronizing data with host ..." msgstr "Синхронизация данных с хостом..." +msgid "Waiting for correct join password" +msgstr "Ожидание правильного пароля для входа" + +msgid "Attempting to connect" +msgstr "Попытка подключения" + +msgid "Establishing connection handshake" +msgstr "Установка соединения" + +msgid "Coordinating join with host" +msgstr "Присоединение к хосту" + +msgid "Join attempt failed" +msgstr "Не удалось присоединиться" + msgid "Host did not respond before timeout" msgstr "Время ожидания ответа от хоста истекло" +#, c-format +msgid "Failed at: [%s] - %s" +msgstr "Ошибка: [%s] - %s" + +#, c-format +msgid "Failed at: [%s]" +msgstr "Ошибка: [%s]" + #, c-format msgid "Failed to open connection: [%d] %s" msgstr "Не удалось открыть соединение: [%d] %s" diff --git a/po/sk.po b/po/sk.po index 42d8b5d8e81..0923753eef2 100644 --- a/po/sk.po +++ b/po/sk.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" -"POT-Creation-Date: 2024-09-11 19:20+0000\n" -"PO-Revision-Date: 2024-09-26 02:28\n" +"POT-Creation-Date: 2024-11-01 21:02+0000\n" +"PO-Revision-Date: 2024-11-03 18:07\n" "Last-Translator: \n" "Language-Team: Slovak\n" "Language: sk_SK\n" @@ -6476,11 +6476,11 @@ msgid "Thermal Armor +35%" msgstr "Tepelné brnenie +35%" #, no-c-format -msgid "Thermal armor +40%" +msgid "Thermal Armor +40%" msgstr "Tepelné brnenie +40%" #, no-c-format -msgid "Thermal Armor +40%" +msgid "Thermal armor +40%" msgstr "Tepelné brnenie +40%" #, no-c-format @@ -7734,6 +7734,9 @@ msgstr "" msgid "Shadow filtering not available on this system." msgstr "" +msgid "Opacity: 50%" +msgstr "" + msgid "* Takes effect on game restart" msgstr "* Prejaví sa po reštarte hry" @@ -7779,6 +7782,9 @@ msgstr "" msgid "Groups Menu" msgstr "" +msgid "Options Button" +msgstr "" + msgid "GRAPHICS OPTIONS" msgstr "NASTAVENIA GRAFIKY" @@ -8088,6 +8094,12 @@ msgstr "" msgid "Player %u is cheating (debug menu) him/herself a new droid." msgstr "" +msgid "Open In-Game Options" +msgstr "" + +msgid "Close In-Game Options" +msgstr "" + msgid "Hiding Obsolete Tech" msgstr "" @@ -8244,6 +8256,28 @@ msgstr "" msgid "End-Game" msgstr "" +msgid "Host" +msgstr "" + +msgid "Admin" +msgstr "" + +#, c-format +msgid "%s (%s) changed team of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed position of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed color of player (%s) to: %s" +msgstr "" + +#, c-format +msgid "%s (%s) changed faction of player (%s) to: %s" +msgstr "" + msgid "Can someone please transfer me some units?" msgstr "" @@ -8460,6 +8494,9 @@ msgstr "" msgid "Map Downloaded" msgstr "" +msgid "Admin modified a setting" +msgstr "" + msgid "Bot Allies" msgstr "" @@ -10821,9 +10858,32 @@ msgstr "" msgid "Synchronizing data with host ..." msgstr "" +msgid "Waiting for correct join password" +msgstr "" + +msgid "Attempting to connect" +msgstr "" + +msgid "Establishing connection handshake" +msgstr "" + +msgid "Coordinating join with host" +msgstr "" + +msgid "Join attempt failed" +msgstr "" + msgid "Host did not respond before timeout" msgstr "" +#, c-format +msgid "Failed at: [%s] - %s" +msgstr "" + +#, c-format +msgid "Failed at: [%s]" +msgstr "" + #, c-format msgid "Failed to open connection: [%d] %s" msgstr "" diff --git a/po/sl.po b/po/sl.po index 3eadebb26c0..4aaaebeea32 100644 --- a/po/sl.po +++ b/po/sl.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" -"POT-Creation-Date: 2024-09-11 19:20+0000\n" -"PO-Revision-Date: 2024-09-11 19:59\n" +"POT-Creation-Date: 2024-11-01 21:02+0000\n" +"PO-Revision-Date: 2024-11-03 18:07\n" "Last-Translator: \n" "Language-Team: Slovenian\n" "Language: sl_SI\n" @@ -6482,11 +6482,11 @@ msgid "Thermal Armor +35%" msgstr "Toplotni oklep +35%" #, no-c-format -msgid "Thermal armor +40%" +msgid "Thermal Armor +40%" msgstr "Toplotni oklep +40%" #, no-c-format -msgid "Thermal Armor +40%" +msgid "Thermal armor +40%" msgstr "Toplotni oklep +40%" #, no-c-format @@ -7740,6 +7740,9 @@ msgstr "" msgid "Shadow filtering not available on this system." msgstr "" +msgid "Opacity: 50%" +msgstr "" + msgid "* Takes effect on game restart" msgstr "* Začne delovati po ponovnem zagonu" @@ -7785,6 +7788,9 @@ msgstr "" msgid "Groups Menu" msgstr "" +msgid "Options Button" +msgstr "" + msgid "GRAPHICS OPTIONS" msgstr "GRAFIČNE NASTAVITVE" @@ -8094,6 +8100,12 @@ msgstr "Igralec/ka %u si je prigoljufal/a (razhroščevalni meni) novega droida: msgid "Player %u is cheating (debug menu) him/herself a new droid." msgstr "Igralec/ka %u si je prigoljufal/a (razhroščevalni meni) novega droida." +msgid "Open In-Game Options" +msgstr "" + +msgid "Close In-Game Options" +msgstr "" + msgid "Hiding Obsolete Tech" msgstr "Odvečna tehnologija skrita" @@ -8250,6 +8262,28 @@ msgstr "" msgid "End-Game" msgstr "" +msgid "Host" +msgstr "" + +msgid "Admin" +msgstr "" + +#, c-format +msgid "%s (%s) changed team of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed position of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed color of player (%s) to: %s" +msgstr "" + +#, c-format +msgid "%s (%s) changed faction of player (%s) to: %s" +msgstr "" + msgid "Can someone please transfer me some units?" msgstr "" @@ -8466,6 +8500,9 @@ msgstr "" msgid "Map Downloaded" msgstr "" +msgid "Admin modified a setting" +msgstr "" + msgid "Bot Allies" msgstr "" @@ -10832,9 +10869,32 @@ msgstr "" msgid "Synchronizing data with host ..." msgstr "" +msgid "Waiting for correct join password" +msgstr "" + +msgid "Attempting to connect" +msgstr "" + +msgid "Establishing connection handshake" +msgstr "" + +msgid "Coordinating join with host" +msgstr "" + +msgid "Join attempt failed" +msgstr "" + msgid "Host did not respond before timeout" msgstr "" +#, c-format +msgid "Failed at: [%s] - %s" +msgstr "" + +#, c-format +msgid "Failed at: [%s]" +msgstr "" + #, c-format msgid "Failed to open connection: [%d] %s" msgstr "" diff --git a/po/tr.po b/po/tr.po index 0d7a4443862..36f66586830 100644 --- a/po/tr.po +++ b/po/tr.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" -"POT-Creation-Date: 2024-09-11 19:20+0000\n" -"PO-Revision-Date: 2024-09-11 19:59\n" +"POT-Creation-Date: 2024-11-01 21:02+0000\n" +"PO-Revision-Date: 2024-11-03 18:07\n" "Last-Translator: \n" "Language-Team: Turkish\n" "Language: tr_TR\n" @@ -6481,14 +6481,14 @@ msgstr "DİvK seçilen rampaya silahlandırma için geri döner" msgid "Thermal Armor +35%" msgstr "Termal Zırh +%35" -#, no-c-format -msgid "Thermal armor +40%" -msgstr "Termal zırh +%40" - #, no-c-format msgid "Thermal Armor +40%" msgstr "Termal Zırh +%40" +#, no-c-format +msgid "Thermal armor +40%" +msgstr "Termal zırh +%40" + #, no-c-format msgid "Thermal Armor +45%" msgstr "Termal Zırh +%45" @@ -7728,6 +7728,9 @@ msgstr "Çok Yüksek" msgid "Shadow filtering not available on this system." msgstr "Gölge filtreleme bu sistemde kullanılamaz." +msgid "Opacity: 50%" +msgstr "" + msgid "* Takes effect on game restart" msgstr "* Ayarlar oyun tekrar başlatıldığında etkili olacaktır" @@ -7773,6 +7776,9 @@ msgstr "Ekran Sarsıntısı" msgid "Groups Menu" msgstr "" +msgid "Options Button" +msgstr "" + msgid "GRAPHICS OPTIONS" msgstr "GRAFİK AYARLARI" @@ -8084,6 +8090,12 @@ msgstr "Oyuncu %u hile ile (debug menü) yeni birimini oluşturdu: %s." msgid "Player %u is cheating (debug menu) him/herself a new droid." msgstr "Oyuncu %u hile ile (debug menü) yeni birimini oluşturdu." +msgid "Open In-Game Options" +msgstr "" + +msgid "Close In-Game Options" +msgstr "" + msgid "Hiding Obsolete Tech" msgstr "Eski Teknoloji Gizleniyor" @@ -8244,6 +8256,28 @@ msgstr "" msgid "End-Game" msgstr "" +msgid "Host" +msgstr "" + +msgid "Admin" +msgstr "" + +#, c-format +msgid "%s (%s) changed team of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed position of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed color of player (%s) to: %s" +msgstr "" + +#, c-format +msgid "%s (%s) changed faction of player (%s) to: %s" +msgstr "" + msgid "Can someone please transfer me some units?" msgstr "" @@ -8460,6 +8494,9 @@ msgstr "Mesaj iletim hatası - tekrar deneyin" msgid "Map Downloaded" msgstr "" +msgid "Admin modified a setting" +msgstr "" + msgid "Bot Allies" msgstr "" @@ -10826,9 +10863,32 @@ msgstr "" msgid "Synchronizing data with host ..." msgstr "" +msgid "Waiting for correct join password" +msgstr "" + +msgid "Attempting to connect" +msgstr "" + +msgid "Establishing connection handshake" +msgstr "" + +msgid "Coordinating join with host" +msgstr "" + +msgid "Join attempt failed" +msgstr "" + msgid "Host did not respond before timeout" msgstr "" +#, c-format +msgid "Failed at: [%s] - %s" +msgstr "" + +#, c-format +msgid "Failed at: [%s]" +msgstr "" + #, c-format msgid "Failed to open connection: [%d] %s" msgstr "" diff --git a/po/tt_RU.po b/po/tt_RU.po index e0c9fdbbfad..9fd3fd5b497 100644 --- a/po/tt_RU.po +++ b/po/tt_RU.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" -"POT-Creation-Date: 2024-09-11 19:20+0000\n" -"PO-Revision-Date: 2024-09-11 19:59\n" +"POT-Creation-Date: 2024-11-01 21:02+0000\n" +"PO-Revision-Date: 2024-11-03 18:07\n" "Last-Translator: \n" "Language-Team: Tatar\n" "Language: tt_RU\n" @@ -6476,11 +6476,11 @@ msgid "Thermal Armor +35%" msgstr "" #, no-c-format -msgid "Thermal armor +40%" +msgid "Thermal Armor +40%" msgstr "" #, no-c-format -msgid "Thermal Armor +40%" +msgid "Thermal armor +40%" msgstr "" #, no-c-format @@ -7714,6 +7714,9 @@ msgstr "" msgid "Shadow filtering not available on this system." msgstr "" +msgid "Opacity: 50%" +msgstr "" + msgid "* Takes effect on game restart" msgstr "" @@ -7759,6 +7762,9 @@ msgstr "" msgid "Groups Menu" msgstr "" +msgid "Options Button" +msgstr "" + msgid "GRAPHICS OPTIONS" msgstr "" @@ -8068,6 +8074,12 @@ msgstr "" msgid "Player %u is cheating (debug menu) him/herself a new droid." msgstr "" +msgid "Open In-Game Options" +msgstr "" + +msgid "Close In-Game Options" +msgstr "" + msgid "Hiding Obsolete Tech" msgstr "" @@ -8224,6 +8236,28 @@ msgstr "" msgid "End-Game" msgstr "" +msgid "Host" +msgstr "" + +msgid "Admin" +msgstr "" + +#, c-format +msgid "%s (%s) changed team of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed position of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed color of player (%s) to: %s" +msgstr "" + +#, c-format +msgid "%s (%s) changed faction of player (%s) to: %s" +msgstr "" + msgid "Can someone please transfer me some units?" msgstr "" @@ -8440,6 +8474,9 @@ msgstr "" msgid "Map Downloaded" msgstr "" +msgid "Admin modified a setting" +msgstr "" + msgid "Bot Allies" msgstr "" @@ -10798,9 +10835,32 @@ msgstr "" msgid "Synchronizing data with host ..." msgstr "" +msgid "Waiting for correct join password" +msgstr "" + +msgid "Attempting to connect" +msgstr "" + +msgid "Establishing connection handshake" +msgstr "" + +msgid "Coordinating join with host" +msgstr "" + +msgid "Join attempt failed" +msgstr "" + msgid "Host did not respond before timeout" msgstr "" +#, c-format +msgid "Failed at: [%s] - %s" +msgstr "" + +#, c-format +msgid "Failed at: [%s]" +msgstr "" + #, c-format msgid "Failed to open connection: [%d] %s" msgstr "" diff --git a/po/uk_UA.po b/po/uk_UA.po index 2363c89f140..e2d3eeb8262 100644 --- a/po/uk_UA.po +++ b/po/uk_UA.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" -"POT-Creation-Date: 2024-09-11 19:20+0000\n" -"PO-Revision-Date: 2024-09-11 19:59\n" +"POT-Creation-Date: 2024-11-01 21:02+0000\n" +"PO-Revision-Date: 2024-11-03 18:07\n" "Last-Translator: \n" "Language-Team: Ukrainian\n" "Language: uk_UA\n" @@ -6484,11 +6484,11 @@ msgid "Thermal Armor +35%" msgstr "Термальна Броня +35%" #, no-c-format -msgid "Thermal armor +40%" +msgid "Thermal Armor +40%" msgstr "Термальна Броня +40%" #, no-c-format -msgid "Thermal Armor +40%" +msgid "Thermal armor +40%" msgstr "Термальна Броня +40%" #, no-c-format @@ -7742,6 +7742,9 @@ msgstr "" msgid "Shadow filtering not available on this system." msgstr "" +msgid "Opacity: 50%" +msgstr "" + msgid "* Takes effect on game restart" msgstr "* Зміни всупають в силу після перезавантаження гри" @@ -7787,6 +7790,9 @@ msgstr "Тремтіння екрану" msgid "Groups Menu" msgstr "Меню підрозділів" +msgid "Options Button" +msgstr "" + msgid "GRAPHICS OPTIONS" msgstr "ОПЦІЇ ГРАФІКИ" @@ -8100,6 +8106,12 @@ msgstr "Гравець %u за допомогою шахрайства (меню msgid "Player %u is cheating (debug menu) him/herself a new droid." msgstr "Гравець %u за допомогою шахрайства (меню налагодження) здобув(ла) нову одиницю : ." +msgid "Open In-Game Options" +msgstr "" + +msgid "Close In-Game Options" +msgstr "" + msgid "Hiding Obsolete Tech" msgstr "Хідінг застаріла технології" @@ -8260,6 +8272,28 @@ msgstr "Чіти" msgid "End-Game" msgstr "Ендшпиль" +msgid "Host" +msgstr "" + +msgid "Admin" +msgstr "" + +#, c-format +msgid "%s (%s) changed team of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed position of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed color of player (%s) to: %s" +msgstr "" + +#, c-format +msgid "%s (%s) changed faction of player (%s) to: %s" +msgstr "" + msgid "Can someone please transfer me some units?" msgstr "Чи може хтось, будь ласка, передати мені кілька Бойових Одиниць?" @@ -8476,6 +8510,9 @@ msgstr "Збій доставки повідомлення - повторіть msgid "Map Downloaded" msgstr "" +msgid "Admin modified a setting" +msgstr "" + msgid "Bot Allies" msgstr "" @@ -10844,9 +10881,32 @@ msgstr "" msgid "Synchronizing data with host ..." msgstr "" +msgid "Waiting for correct join password" +msgstr "" + +msgid "Attempting to connect" +msgstr "" + +msgid "Establishing connection handshake" +msgstr "" + +msgid "Coordinating join with host" +msgstr "" + +msgid "Join attempt failed" +msgstr "" + msgid "Host did not respond before timeout" msgstr "" +#, c-format +msgid "Failed at: [%s] - %s" +msgstr "" + +#, c-format +msgid "Failed at: [%s]" +msgstr "" + #, c-format msgid "Failed to open connection: [%d] %s" msgstr "" diff --git a/po/zh_CN.po b/po/zh_CN.po index b208ebc4cac..a2f0826854e 100644 --- a/po/zh_CN.po +++ b/po/zh_CN.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" -"POT-Creation-Date: 2024-09-11 19:20+0000\n" -"PO-Revision-Date: 2024-10-07 02:29\n" +"POT-Creation-Date: 2024-11-01 21:02+0000\n" +"PO-Revision-Date: 2024-11-05 02:26\n" "Last-Translator: \n" "Language-Team: Chinese Simplified\n" "Language: zh_CN\n" @@ -6488,11 +6488,11 @@ msgid "Thermal Armor +35%" msgstr "热能装甲 +35%" #, no-c-format -msgid "Thermal armor +40%" +msgid "Thermal Armor +40%" msgstr "热能装甲 +40%" #, no-c-format -msgid "Thermal Armor +40%" +msgid "Thermal armor +40%" msgstr "热能装甲 +40%" #, no-c-format @@ -7728,6 +7728,9 @@ msgstr "最高" msgid "Shadow filtering not available on this system." msgstr "阴影过滤在此系统上不可用。" +msgid "Opacity: 50%" +msgstr "透明度:50%" + msgid "* Takes effect on game restart" msgstr "*重启游戏后生效" @@ -7773,6 +7776,9 @@ msgstr "屏幕晃动" msgid "Groups Menu" msgstr "编队菜单" +msgid "Options Button" +msgstr "选项按钮" + msgid "GRAPHICS OPTIONS" msgstr "图形选项" @@ -8086,6 +8092,12 @@ msgstr "玩家 %u 利用作弊 (调式菜单) 模式建立了一个新单位:% msgid "Player %u is cheating (debug menu) him/herself a new droid." msgstr "玩家 %u 利用作弊 (调式菜单) 模式建立了一个新机器人" +msgid "Open In-Game Options" +msgstr "打开游戏内选项" + +msgid "Close In-Game Options" +msgstr "关闭游戏内选项" + msgid "Hiding Obsolete Tech" msgstr "隐藏过时技术" @@ -8246,6 +8258,28 @@ msgstr "作弊" msgid "End-Game" msgstr "结束游戏" +msgid "Host" +msgstr "主机" + +msgid "Admin" +msgstr "管理员" + +#, c-format +msgid "%s (%s) changed team of player (%s) to: %d" +msgstr "%s (%s) 将玩家 (%s) 的团队更改为: %d" + +#, c-format +msgid "%s (%s) changed position of player (%s) to: %d" +msgstr "%s (%s) 将玩家 (%s) 的位置更改为: %d" + +#, c-format +msgid "%s (%s) changed color of player (%s) to: %s" +msgstr "%s (%s) 将玩家 (%s) 的颜色更改为: %s" + +#, c-format +msgid "%s (%s) changed faction of player (%s) to: %s" +msgstr "%s (%s) 将玩家 (%s) 的阵营更改为: %s" + msgid "Can someone please transfer me some units?" msgstr "有人能给我一些单位吗?" @@ -8358,7 +8392,7 @@ msgid "You're going to regret that" msgstr "你会后悔的" msgid "Barely a scratch!" -msgstr "太弱了!" +msgstr "刮痧呢?" msgid "Attack now?" msgstr "现在攻击吗?" @@ -8462,6 +8496,9 @@ msgstr "消息发送失败 - 请重试" msgid "Map Downloaded" msgstr "地图已下载" +msgid "Admin modified a setting" +msgstr "管理员修改了一个设置" + msgid "Bot Allies" msgstr "电脑盟友" @@ -10827,9 +10864,32 @@ msgstr "无可用连接" msgid "Synchronizing data with host ..." msgstr "正在与主机同步数据..." +msgid "Waiting for correct join password" +msgstr "等待正确的加入密码" + +msgid "Attempting to connect" +msgstr "尝试连接" + +msgid "Establishing connection handshake" +msgstr "建立连接握手" + +msgid "Coordinating join with host" +msgstr "与主机协调加入游戏" + +msgid "Join attempt failed" +msgstr "尝试加入游戏失败" + msgid "Host did not respond before timeout" msgstr "主机未在超时前响应" +#, c-format +msgid "Failed at: [%s] - %s" +msgstr "失败原因: [%s] - %s" + +#, c-format +msgid "Failed at: [%s]" +msgstr "失败原因: [%s]" + #, c-format msgid "Failed to open connection: [%d] %s" msgstr "打开连接失败: [%d] %s" diff --git a/po/zh_TW.po b/po/zh_TW.po index c767f358056..41bb4ce1d83 100644 --- a/po/zh_TW.po +++ b/po/zh_TW.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" -"POT-Creation-Date: 2024-09-11 19:20+0000\n" -"PO-Revision-Date: 2024-09-11 19:59\n" +"POT-Creation-Date: 2024-11-01 21:02+0000\n" +"PO-Revision-Date: 2024-11-03 18:06\n" "Last-Translator: \n" "Language-Team: Chinese Traditional\n" "Language: zh_TW\n" @@ -6486,11 +6486,11 @@ msgid "Thermal Armor +35%" msgstr "熱能裝甲 +35%" #, no-c-format -msgid "Thermal armor +40%" +msgid "Thermal Armor +40%" msgstr "熱能裝甲 +40%" #, no-c-format -msgid "Thermal Armor +40%" +msgid "Thermal armor +40%" msgstr "熱能裝甲 +40%" #, no-c-format @@ -7726,6 +7726,9 @@ msgstr "極高" msgid "Shadow filtering not available on this system." msgstr "陰影過濾在此系統上不可用." +msgid "Opacity: 50%" +msgstr "" + msgid "* Takes effect on game restart" msgstr "*重新啟動遊戲後生效" @@ -7771,6 +7774,9 @@ msgstr "螢幕晃動" msgid "Groups Menu" msgstr "小組功能表" +msgid "Options Button" +msgstr "" + msgid "GRAPHICS OPTIONS" msgstr "圖形選項" @@ -8080,6 +8086,12 @@ msgstr "玩家 %u 利用作弊(除錯)模式建立了一個新droid: %s." msgid "Player %u is cheating (debug menu) him/herself a new droid." msgstr "玩家 %u 正在作弊(偵錯功能表) 他/她自己是一個新的生化人." +msgid "Open In-Game Options" +msgstr "" + +msgid "Close In-Game Options" +msgstr "" + msgid "Hiding Obsolete Tech" msgstr "隱藏過時的技術" @@ -8236,6 +8248,28 @@ msgstr "作弊" msgid "End-Game" msgstr "遊戲結束" +msgid "Host" +msgstr "" + +msgid "Admin" +msgstr "" + +#, c-format +msgid "%s (%s) changed team of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed position of player (%s) to: %d" +msgstr "" + +#, c-format +msgid "%s (%s) changed color of player (%s) to: %s" +msgstr "" + +#, c-format +msgid "%s (%s) changed faction of player (%s) to: %s" +msgstr "" + msgid "Can someone please transfer me some units?" msgstr "有人可以給我轉移一些裝備嗎?" @@ -8452,6 +8486,9 @@ msgstr "訊息發送失敗 - 重試" msgid "Map Downloaded" msgstr "地圖已下載" +msgid "Admin modified a setting" +msgstr "" + msgid "Bot Allies" msgstr "生化人同盟" @@ -10817,9 +10854,32 @@ msgstr "無可用的連線" msgid "Synchronizing data with host ..." msgstr "與主持端同步資料數據 ..." +msgid "Waiting for correct join password" +msgstr "" + +msgid "Attempting to connect" +msgstr "" + +msgid "Establishing connection handshake" +msgstr "" + +msgid "Coordinating join with host" +msgstr "" + +msgid "Join attempt failed" +msgstr "" + msgid "Host did not respond before timeout" msgstr "超時前主持端未回應" +#, c-format +msgid "Failed at: [%s] - %s" +msgstr "" + +#, c-format +msgid "Failed at: [%s]" +msgstr "" + #, c-format msgid "Failed to open connection: [%d] %s" msgstr "無法開啟連線: [%d] %s" From ac75d9cf25b63527935c3184474ae3c3ae8743ee Mon Sep 17 00:00:00 2001 From: past-due <30942300+past-due@users.noreply.github.com> Date: Wed, 6 Nov 2024 13:42:06 -0500 Subject: [PATCH 17/38] wzmaplib: Always include all HQ stats ids (even in MP) --- lib/wzmaplib/src/map_stats.cpp | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/lib/wzmaplib/src/map_stats.cpp b/lib/wzmaplib/src/map_stats.cpp index fa1b52572e3..396c71ab6e7 100644 --- a/lib/wzmaplib/src/map_stats.cpp +++ b/lib/wzmaplib/src/map_stats.cpp @@ -372,15 +372,9 @@ MapStatsConfiguration::MapStatsConfiguration(MapType mapType) researchCenters = {"A0ResearchFacility"}; // the names (ids) of the HQ struct(s) // - "type": "HQ" - if (mapType == MapType::CAMPAIGN) - { - // There are some campaign-only additional ids (A0CommandCentreNP, A0CommandCentreCO, A0CommandCentreNE) - hqStructs = {"A0CommandCentre", "A0CommandCentreNP", "A0CommandCentreCO", "A0CommandCentreNE"}; - } - else - { - hqStructs = {"A0CommandCentre"}; - } + // > NOTE: Prior to WZ 4.5.4, only "A0CommandCentre" was available in multiplayer stats + // > With 4.5.4, the remaining campaign-only HQs were also added to MP stats + hqStructs = {"A0CommandCentre", "A0CommandCentreNP", "A0CommandCentreCO", "A0CommandCentreNE"}; // the names (ids) of defense structs (i.e. bunkers, towers, hardpoints) // - "type": "DEFENSE" // extracted from the appropriate base/stats/structure.json or mp/stats/structure.json file using: @@ -441,6 +435,9 @@ MapStatsConfiguration::MapStatsConfiguration(MapType mapType) {"A0BaBaVtolFactory", StructureSize(2, 2)}, {"A0ComDroidControl", StructureSize(2, 2)}, {"A0CommandCentre", StructureSize(2, 2)}, + {"A0CommandCentreCO", StructureSize(2, 2)}, + {"A0CommandCentreNE", StructureSize(2, 2)}, + {"A0CommandCentreNP", StructureSize(2, 2)}, {"A0CyborgFactory", StructureSize(1, 2)}, {"A0FacMod1", StructureSize(3, 3)}, {"A0LasSatCommand", StructureSize(2, 2)}, From b9d065ca4fe40b6523fa66691169302404ffa1c6 Mon Sep 17 00:00:00 2001 From: past-due <30942300+past-due@users.noreply.github.com> Date: Wed, 6 Nov 2024 13:43:04 -0500 Subject: [PATCH 18/38] wzmaplib: Bump version to 1.2.8 --- lib/wzmaplib/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/wzmaplib/CMakeLists.txt b/lib/wzmaplib/CMakeLists.txt index 3d7bd3b40c1..2e10661de43 100644 --- a/lib/wzmaplib/CMakeLists.txt +++ b/lib/wzmaplib/CMakeLists.txt @@ -3,7 +3,7 @@ set(WZMAPLIB_VERSION_MAJOR 1) set(WZMAPLIB_VERSION_MINOR 2) -set(WZMAPLIB_VERSION_REV 7) +set(WZMAPLIB_VERSION_REV 8) ################### # Determine minimum CMake version From 37bed99d224949a9ba107d697e03d79223cc719f Mon Sep 17 00:00:00 2001 From: past-due <30942300+past-due@users.noreply.github.com> Date: Wed, 6 Nov 2024 14:46:58 -0500 Subject: [PATCH 19/38] Update the ChangeLog for 4.5.4 --- ChangeLog | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/ChangeLog b/ChangeLog index 5b51f26315f..41219888359 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,28 @@ +2024-11-06: Version 4.5.4: + * General: + * Add: In-game options button (too many commits, #4106, #4113) + * Fix: Transporter timer capacity label area should be clickable (commit:29343d2de5e835c51d08c67c2fbc8a72ccf806e5, #4106) + * Fix: Do not remove vision from transporters when loading saves (commit:e8530d5828d488523d09a475f012452cb428e2f9, #4094) + * Fix: Various potential crashes (too many commits, #4069, #4103) + * Graphics: + * Change: Improve high-quality terrain water (commit:adcadc8a5ce709e72fc53997ce5cb56c9540930d, #4101) + * Fix: Loading high-quality terrain water diffuse textures (commit:3a0bc57e8429d77a21af06e15a015076c498f4d5, commit:9008a3bf9fb0f2ff7295b44f87941ade1545121d, #4093) + * Campaign: + * Change: Convert Brief and Proximity files to JSON (too many commits, #4068, #4114) + * Multiplayer: + * Add: Initial support for admins changing settings via UI (commit:4e7f99ed92e2022f0793372f617511b60147daa8, #4110) + * Add: Host auto-kick on sustained desync (commit:f8ec4d844335ac70004861202db217f46f2cfab7, #4112) + * Fix: Refactor socket operations error code return (too many commits, #4092, #4097) + * Fix: Add campaign HQs to MP stats (commit:b9508a4ba5501d7cee69163807bcacb66c88b108, #4100) + * Fix: Display and log connection state on joining screen timeout (commit:cc6a1f30d6625e56d2d67305dbf198990cfd522c, #4112) + * Fix: Only play "Player is exiting" audio when player slot drops, ignore spectators (commit:b9c37598bc48ca1eb9017ea2e740a91e09b098dc, #4112) + * Scripting: + * Add: Research field for Stats object (commit:e09daaa63be94463850d8328cc8ce39cd7c660e9, #4091) + * Balance MP: + * Change: Plasmite Flamer boost (commit:b0eedf4f57b96a53aecbf8fa3ef0e73d3df816b6, #3989) + * Translations: + * Change: Numerous translation updates (commit:98f1a4801b60388685c8bd610b9b33048c0eb6e4, commit:7332fc166c40bf5418419a3cac05f25f7dbaeef7, #4066, #4117) + 2024-09-12: Version 4.5.3: * General: * Change: Give experience when squishing a scavenger (commit:736fae8e874744a7156de54ad4330cb22ab9ec01, #4046) From 7f8bb2772be83f57a41cd7caf05d84be87a57194 Mon Sep 17 00:00:00 2001 From: past-due <30942300+past-due@users.noreply.github.com> Date: Thu, 7 Nov 2024 11:03:59 -0500 Subject: [PATCH 20/38] [Vulkan] Fix compatibility with VK_HEADER_VERSION >= 301 --- lib/ivis_opengl/3rdparty/vkh_info.cpp | 8 ++--- lib/ivis_opengl/3rdparty/vkh_info.hpp | 13 +++++--- lib/ivis_opengl/gfx_api_vk.cpp | 48 +++++++++++++-------------- lib/ivis_opengl/gfx_api_vk.h | 43 +++++++++++++----------- 4 files changed, 61 insertions(+), 51 deletions(-) diff --git a/lib/ivis_opengl/3rdparty/vkh_info.cpp b/lib/ivis_opengl/3rdparty/vkh_info.cpp index 46aa8c47fa7..68ba5904775 100644 --- a/lib/ivis_opengl/3rdparty/vkh_info.cpp +++ b/lib/ivis_opengl/3rdparty/vkh_info.cpp @@ -1,8 +1,8 @@ // // VkhInfo -// Version: 1.3.2 +// Version: 1.3.3 // -// Copyright (c) 2019-2021 past-due +// Copyright (c) 2019-2024 past-due // // https://github.com/past-due/vulkan-helpers // @@ -180,7 +180,7 @@ void VkhInfo::Output_InstanceLayerProperties(PFN_vkGetInstanceProcAddr _vkGetIns } } -void VkhInfo::Output_SurfaceInformation(const vk::PhysicalDevice& physicalDevice, const vk::SurfaceKHR& surface, const vk::DispatchLoaderDynamic& vkDynLoader) +void VkhInfo::Output_SurfaceInformation(const vk::PhysicalDevice& physicalDevice, const vk::SurfaceKHR& surface, const VkhInfo::DispatchLoaderDynamic& vkDynLoader) { std::stringstream buf; @@ -237,7 +237,7 @@ void VkhInfo::Output_SurfaceInformation(const vk::PhysicalDevice& physicalDevice } // If `getProperties2` is true, the instance `inst` *must* have been created with the "VK_KHR_get_physical_device_properties2" extension enabled -void VkhInfo::Output_PhysicalDevices(const vk::Instance& inst, const vk::ApplicationInfo& appInfo, std::vector instanceExtensions, const vk::DispatchLoaderDynamic& vkDynLoader) +void VkhInfo::Output_PhysicalDevices(const vk::Instance& inst, const vk::ApplicationInfo& appInfo, std::vector instanceExtensions, const VkhInfo::DispatchLoaderDynamic& vkDynLoader) { std::stringstream buf; diff --git a/lib/ivis_opengl/3rdparty/vkh_info.hpp b/lib/ivis_opengl/3rdparty/vkh_info.hpp index 367af7a783b..31a0772a218 100644 --- a/lib/ivis_opengl/3rdparty/vkh_info.hpp +++ b/lib/ivis_opengl/3rdparty/vkh_info.hpp @@ -1,8 +1,8 @@ // // VkhInfo -// Version: 1.3.2 +// Version: 1.3.3 // -// Copyright (c) 2019-2021 past-due +// Copyright (c) 2019-2024 past-due // // https://github.com/past-due/vulkan-helpers // @@ -47,6 +47,11 @@ class VkhInfo { public: typedef std::function outputHandlerFuncType; +#if VK_HEADER_VERSION >= 301 + using DispatchLoaderDynamic = vk::detail::DispatchLoaderDynamic; +#else + using DispatchLoaderDynamic = vk::DispatchLoaderDynamic; +#endif VkhInfo() {} VkhInfo(const outputHandlerFuncType& outputHandler); @@ -58,10 +63,10 @@ class VkhInfo void Output_GlobalInstanceExtensions(PFN_vkGetInstanceProcAddr _vkGetInstanceProcAddr); void Output_InstanceLayerProperties(PFN_vkGetInstanceProcAddr _vkGetInstanceProcAddr); - void Output_SurfaceInformation(const vk::PhysicalDevice& physicalDevice, const vk::SurfaceKHR& surface, const vk::DispatchLoaderDynamic& vkDynLoader); + void Output_SurfaceInformation(const vk::PhysicalDevice& physicalDevice, const vk::SurfaceKHR& surface, const VkhInfo::DispatchLoaderDynamic& vkDynLoader); // If `getProperties2` is true, the instance `inst` *must* have been created with the "VK_KHR_get_physical_device_properties2" extension enabled - void Output_PhysicalDevices(const vk::Instance& inst, const vk::ApplicationInfo& appInfo, std::vector instanceExtensions, const vk::DispatchLoaderDynamic& vkDynLoader); + void Output_PhysicalDevices(const vk::Instance& inst, const vk::ApplicationInfo& appInfo, std::vector instanceExtensions, const VkhInfo::DispatchLoaderDynamic& vkDynLoader); public: diff --git a/lib/ivis_opengl/gfx_api_vk.cpp b/lib/ivis_opengl/gfx_api_vk.cpp index 3b713d3480a..eac41b56ee7 100644 --- a/lib/ivis_opengl/gfx_api_vk.cpp +++ b/lib/ivis_opengl/gfx_api_vk.cpp @@ -24,7 +24,7 @@ // To maintain compatibility with as many systems as possible: // 1.) Ensure Vulkan 1.0 compatibility // 2.) Avoid *requiring* anything outside of the scope of the "Vulkan Portable Subset" -// 3.) All calls to Vulkan APIs should use dynamic dispatch (see the uses of vk::DispatchLoaderDynamic in this file) +// 3.) All calls to Vulkan APIs should use dynamic dispatch (see the uses of WZ_vk::DispatchLoaderDynamic in this file) // 4.) Test with the Vulkan validation layers enabled (run WZ with --gfxdebug) // // #2 means the following things are currently best avoided: @@ -258,7 +258,7 @@ static uint32_t findProperties(const vk::PhysicalDeviceMemoryProperties& memprop abort(); } -bool checkFormatSupport(const vk::PhysicalDevice& physicalDevice, vk::Format format, vk::ImageTiling tiling, vk::FormatFeatureFlags features, const vk::DispatchLoaderDynamic& vkDynLoader) +bool checkFormatSupport(const vk::PhysicalDevice& physicalDevice, vk::Format format, vk::ImageTiling tiling, vk::FormatFeatureFlags features, const WZ_vk::DispatchLoaderDynamic& vkDynLoader) { vk::FormatProperties props; physicalDevice.getFormatProperties(format, &props, vkDynLoader); @@ -274,7 +274,7 @@ bool checkFormatSupport(const vk::PhysicalDevice& physicalDevice, vk::Format for return false; } -vk::Format findSupportedFormat(const vk::PhysicalDevice& physicalDevice, const std::vector& candidates, vk::ImageTiling tiling, vk::FormatFeatureFlags features, const vk::DispatchLoaderDynamic& vkDynLoader) { +vk::Format findSupportedFormat(const vk::PhysicalDevice& physicalDevice, const std::vector& candidates, vk::ImageTiling tiling, vk::FormatFeatureFlags features, const WZ_vk::DispatchLoaderDynamic& vkDynLoader) { for (vk::Format format : candidates) { if (checkFormatSupport(physicalDevice, format, tiling, features, vkDynLoader)) @@ -286,7 +286,7 @@ vk::Format findSupportedFormat(const vk::PhysicalDevice& physicalDevice, const s throw std::runtime_error("failed to find supported format!"); } -QueueFamilyIndices findQueueFamilies(const vk::PhysicalDevice &device, const vk::SurfaceKHR &surface, const vk::DispatchLoaderDynamic &vkDynLoader) +QueueFamilyIndices findQueueFamilies(const vk::PhysicalDevice &device, const vk::SurfaceKHR &surface, const WZ_vk::DispatchLoaderDynamic &vkDynLoader) { QueueFamilyIndices indices; @@ -327,7 +327,7 @@ QueueFamilyIndices findQueueFamilies(const vk::PhysicalDevice &device, const vk: return indices; } -SwapChainSupportDetails querySwapChainSupport(const vk::PhysicalDevice &device, const vk::SurfaceKHR &surface, const vk::DispatchLoaderDynamic &vkDynLoader) +SwapChainSupportDetails querySwapChainSupport(const vk::PhysicalDevice &device, const vk::SurfaceKHR &surface, const WZ_vk::DispatchLoaderDynamic &vkDynLoader) { SwapChainSupportDetails details; @@ -338,7 +338,7 @@ SwapChainSupportDetails querySwapChainSupport(const vk::PhysicalDevice &device, return details; } -std::vector findSupportedDeviceExtensions(const vk::PhysicalDevice &device, const std::vector &desiredExtensions, const vk::DispatchLoaderDynamic &vkDynLoader) +std::vector findSupportedDeviceExtensions(const vk::PhysicalDevice &device, const std::vector &desiredExtensions, const WZ_vk::DispatchLoaderDynamic &vkDynLoader) { const auto availableExtensions = device.enumerateDeviceExtensionProperties(nullptr, vkDynLoader); // TODO: handle thrown error? std::unordered_set supportedExtensionNames; @@ -363,7 +363,7 @@ std::vector findSupportedDeviceExtensions(const vk::PhysicalDevice return foundExtensions; } -bool checkDeviceExtensionSupport(const vk::PhysicalDevice &device, const std::vector &desiredExtensions, const vk::DispatchLoaderDynamic &vkDynLoader) +bool checkDeviceExtensionSupport(const vk::PhysicalDevice &device, const std::vector &desiredExtensions, const WZ_vk::DispatchLoaderDynamic &vkDynLoader) { try { const auto availableExtensions = device.enumerateDeviceExtensionProperties(nullptr, vkDynLoader); @@ -449,7 +449,7 @@ vk::SampleCountFlagBits getMaxUsableSampleCount(const vk::PhysicalDeviceProperti return vk::SampleCountFlagBits::e1; } -vk::Format findDepthStencilFormat(const vk::PhysicalDevice& physicalDevice, const vk::DispatchLoaderDynamic& vkDynLoader) +vk::Format findDepthStencilFormat(const vk::PhysicalDevice& physicalDevice, const WZ_vk::DispatchLoaderDynamic& vkDynLoader) { return findSupportedFormat( physicalDevice, @@ -460,7 +460,7 @@ vk::Format findDepthStencilFormat(const vk::PhysicalDevice& physicalDevice, cons ); } -vk::Format findDepthBufferFormat(const vk::PhysicalDevice& physicalDevice, const vk::DispatchLoaderDynamic& vkDynLoader) +vk::Format findDepthBufferFormat(const vk::PhysicalDevice& physicalDevice, const WZ_vk::DispatchLoaderDynamic& vkDynLoader) { std::vector depthFormats = { vk::Format::eD32SfloatS8Uint, vk::Format::eD32Sfloat, vk::Format::eD24UnormS8Uint }; return findSupportedFormat( @@ -472,7 +472,7 @@ vk::Format findDepthBufferFormat(const vk::PhysicalDevice& physicalDevice, const ); } -vk::Format findSceneColorBufferFormat(const vk::PhysicalDevice& physicalDevice, const vk::DispatchLoaderDynamic& vkDynLoader) +vk::Format findSceneColorBufferFormat(const vk::PhysicalDevice& physicalDevice, const WZ_vk::DispatchLoaderDynamic& vkDynLoader) { std::vector sceneColorFormats = { vk::Format::eA2B10G10R10UnormPack32, vk::Format::eR8G8B8A8Unorm }; return findSupportedFormat( @@ -750,7 +750,7 @@ void BlockBufferAllocator::clean() constexpr uint32_t descriptorPoolMaxSetsDefault = 10000; constexpr uint32_t descriptorPoolSizeDescriptorCountDefault = 10000; -perFrameResources_t::perFrameResources_t(vk::Device& _dev, const VmaAllocator& allocator, const uint32_t& graphicsQueueFamilyIndex, const vk::DispatchLoaderDynamic& vkDynLoader) +perFrameResources_t::perFrameResources_t(vk::Device& _dev, const VmaAllocator& allocator, const uint32_t& graphicsQueueFamilyIndex, const WZ_vk::DispatchLoaderDynamic& vkDynLoader) : dev(_dev) , allocator(allocator) , stagingBufferAllocator(allocator, 1024 * 1024, vk::BufferUsageFlagBits::eTransferSrc, VMA_MEMORY_USAGE_CPU_ONLY) @@ -939,7 +939,7 @@ perFrameResources_t::~perFrameResources_t() clean(); } -void perFrameResources_t::DescriptorPoolsContainer::reset(vk::Device dev, const vk::DispatchLoaderDynamic& vkDynLoader) +void perFrameResources_t::DescriptorPoolsContainer::reset(vk::Device dev, const WZ_vk::DispatchLoaderDynamic& vkDynLoader) { for (auto& descriptorPool : pools) { @@ -973,7 +973,7 @@ bool buffering_mechanism::isInitialized() return !perFrameResources.empty(); } -perSwapchainImageResources_t::perSwapchainImageResources_t(vk::Device& _dev, const vk::DispatchLoaderDynamic& vkDynLoader) +perSwapchainImageResources_t::perSwapchainImageResources_t(vk::Device& _dev, const WZ_vk::DispatchLoaderDynamic& vkDynLoader) : dev(_dev) , pVkDynLoader(&vkDynLoader) { @@ -989,7 +989,7 @@ perSwapchainImageResources_t::~perSwapchainImageResources_t() // MARK: buffering_mechanism -void buffering_mechanism::init(vk::Device dev, const VmaAllocator& allocator, size_t swapChainImageCount, const uint32_t& graphicsQueueFamilyIndex, const vk::DispatchLoaderDynamic& vkDynLoader) +void buffering_mechanism::init(vk::Device dev, const VmaAllocator& allocator, size_t swapChainImageCount, const uint32_t& graphicsQueueFamilyIndex, const WZ_vk::DispatchLoaderDynamic& vkDynLoader) { currentFrame = 0; currentSwapchainImageResourcesFrame = 0; @@ -1014,7 +1014,7 @@ size_t buffering_mechanism::numFrames() return perFrameResources.size(); } -void buffering_mechanism::destroy(vk::Device dev, const vk::DispatchLoaderDynamic& vkDynLoader) +void buffering_mechanism::destroy(vk::Device dev, const WZ_vk::DispatchLoaderDynamic& vkDynLoader) { perFrameResources.clear(); perSwapchainImageResources.clear(); @@ -1022,7 +1022,7 @@ void buffering_mechanism::destroy(vk::Device dev, const vk::DispatchLoaderDynami currentSwapchainImageResourcesFrame = 0; } -void buffering_mechanism::swap(vk::Device dev, const vk::DispatchLoaderDynamic& vkDynLoader, bool skipAcquireNewSwapchainImage) +void buffering_mechanism::swap(vk::Device dev, const WZ_vk::DispatchLoaderDynamic& vkDynLoader, bool skipAcquireNewSwapchainImage) { currentFrame = (currentFrame < (perFrameResources.size() - 1)) ? currentFrame + 1 : 0; if (!skipAcquireNewSwapchainImage) @@ -1209,7 +1209,7 @@ std::vector VkPSO::readShaderBuf(const std::string& name) return buffer; } -vk::ShaderModule VkPSO::get_module(const std::string& name, const vk::DispatchLoaderDynamic& vkDynLoader) +vk::ShaderModule VkPSO::get_module(const std::string& name, const WZ_vk::DispatchLoaderDynamic& vkDynLoader) { const auto tmp = readShaderBuf(name); ASSERT_OR_RETURN(vk::ShaderModule(), tmp.size() > 0, "Failed to read shader: %s", name.c_str()); @@ -1627,7 +1627,7 @@ VkPSO::VkPSO(vk::Device _dev, vk::RenderPass rp, const std::shared_ptr& renderpass_compat, vk::SampleCountFlagBits rasterizationSamples, - const vk::DispatchLoaderDynamic& _vkDynLoader, + const WZ_vk::DispatchLoaderDynamic& _vkDynLoader, const VkRoot& _root ) : dev(_dev), pVkDynLoader(&_vkDynLoader), renderpass_compat(renderpass_compat), root(&_root) { @@ -2147,7 +2147,7 @@ VkDepthMapImage::~VkDepthMapImage() } } -void VkDepthMapImage::destroy(vk::Device _dev, const VmaAllocator& allocator, const vk::DispatchLoaderDynamic& vkDynLoader) +void VkDepthMapImage::destroy(vk::Device _dev, const VmaAllocator& allocator, const WZ_vk::DispatchLoaderDynamic& vkDynLoader) { if (buffering_mechanism::isInitialized()) { @@ -2372,7 +2372,7 @@ VkRenderedImage::~VkRenderedImage() } } -void VkRenderedImage::destroy(vk::Device _dev, const VmaAllocator& allocator, const vk::DispatchLoaderDynamic& vkDynLoader) +void VkRenderedImage::destroy(vk::Device _dev, const VmaAllocator& allocator, const WZ_vk::DispatchLoaderDynamic& vkDynLoader) { if (buffering_mechanism::isInitialized()) { @@ -2664,7 +2664,7 @@ static bool createGPUImageAndViewInternal(const vk::PhysicalDevice& physicalDevi const vk::Extent2D& extent, vk::SampleCountFlagBits msaaSamples, vk::Format imageFormat, const vk::ImageUsageFlags imageUsageFlags, const vk::ImageAspectFlags& subresourceAspectFlags, vk::Image& outputImage, vk::DeviceMemory& outputMemory, vk::ImageView& outputView, - const vk::DispatchLoaderDynamic& vkDynLoader, const char *loggingKey) + const WZ_vk::DispatchLoaderDynamic& vkDynLoader, const char *loggingKey) { if (loggingKey == nullptr) { @@ -2746,7 +2746,7 @@ static bool createGPUImageAndViewInternal(const vk::PhysicalDevice& physicalDevi static bool createColorAttachmentImage(const vk::PhysicalDevice& physicalDevice, const vk::PhysicalDeviceMemoryProperties& memprops, const vk::Device& dev, const vk::Extent2D& swapchainSize, vk::SampleCountFlagBits msaaSamples, vk::Format colorFormat, vk::Image& colorImage, vk::DeviceMemory& colorImageMemory, vk::ImageView& colorImageView, - const vk::DispatchLoaderDynamic& vkDynLoader, const char *loggingKey = "colorImage") + const WZ_vk::DispatchLoaderDynamic& vkDynLoader, const char *loggingKey = "colorImage") { return createGPUImageAndViewInternal(physicalDevice, memprops, dev, swapchainSize, msaaSamples, colorFormat, @@ -2759,7 +2759,7 @@ static bool createColorAttachmentImage(const vk::PhysicalDevice& physicalDevice, static bool createDepthStencilImage(const vk::PhysicalDevice& physicalDevice, const vk::PhysicalDeviceMemoryProperties& memprops, const vk::Device& dev, const vk::Extent2D& swapchainSize, vk::SampleCountFlagBits msaaSamples, vk::Format depthFormat, vk::Image& depthStencilImage, vk::DeviceMemory& depthStencilMemory, vk::ImageView& depthStencilView, - const vk::DispatchLoaderDynamic& vkDynLoader, const char *loggingKey = "depthStencilImage") + const WZ_vk::DispatchLoaderDynamic& vkDynLoader, const char *loggingKey = "depthStencilImage") { return createGPUImageAndViewInternal(physicalDevice, memprops, dev, swapchainSize, msaaSamples, depthFormat, @@ -3510,7 +3510,7 @@ bool VkRoot::createVulkanInstance(uint32_t apiVersion, const std::vector; - using UniqueDeviceMemory = vk::UniqueHandle; - using UniqueImage = vk::UniqueHandle; - using UniqueImageView = vk::UniqueHandle; - using UniqueSemaphore = vk::UniqueHandle; +#if VK_HEADER_VERSION >= 301 + using DispatchLoaderDynamic = vk::detail::DispatchLoaderDynamic; +#else + using DispatchLoaderDynamic = vk::DispatchLoaderDynamic; +#endif + using UniqueBuffer = vk::UniqueHandle; + using UniqueDeviceMemory = vk::UniqueHandle; + using UniqueImage = vk::UniqueHandle; + using UniqueImageView = vk::UniqueHandle; + using UniqueSemaphore = vk::UniqueHandle; } inline void hash_combine(std::size_t& seed) { } @@ -222,7 +227,7 @@ struct perFrameResources_t { pools.push_back(pool); } - void reset(vk::Device dev, const vk::DispatchLoaderDynamic& vkDynLoader); + void reset(vk::Device dev, const WZ_vk::DispatchLoaderDynamic& vkDynLoader); inline DescriptorPoolDetails& current() { return pools.at(currPool); } bool nextPool() { if (!pools.empty() && (currPool < (pools.size() - 1))) { ++currPool; return true; } else { return false; } } public: @@ -252,7 +257,7 @@ struct perFrameResources_t perFrameResources_t( const perFrameResources_t& other ) = delete; // non construction-copyable perFrameResources_t& operator=( const perFrameResources_t& ) = delete; // non copyable - perFrameResources_t(vk::Device& _dev, const VmaAllocator& allocator, const uint32_t& graphicsQueueIndex, const vk::DispatchLoaderDynamic& vkDynLoader); + perFrameResources_t(vk::Device& _dev, const VmaAllocator& allocator, const uint32_t& graphicsQueueIndex, const WZ_vk::DispatchLoaderDynamic& vkDynLoader); ~perFrameResources_t(); public: @@ -295,7 +300,7 @@ struct perFrameResources_t DescriptorPoolDetails createNewDescriptorPool(vk::DescriptorType type, uint32_t maxSets, uint32_t descriptorCount); private: - const vk::DispatchLoaderDynamic *pVkDynLoader; + const WZ_vk::DispatchLoaderDynamic *pVkDynLoader; vk::CommandBuffer *pCurrentDrawCmdBuffer = nullptr; }; @@ -308,7 +313,7 @@ struct perSwapchainImageResources_t perSwapchainImageResources_t( const perSwapchainImageResources_t& other ) = delete; // non construction-copyable perSwapchainImageResources_t& operator=( const perSwapchainImageResources_t& ) = delete; // non copyable - perSwapchainImageResources_t(vk::Device& _dev, const vk::DispatchLoaderDynamic& vkDynLoader); + perSwapchainImageResources_t(vk::Device& _dev, const WZ_vk::DispatchLoaderDynamic& vkDynLoader); ~perSwapchainImageResources_t(); protected: @@ -316,7 +321,7 @@ struct perSwapchainImageResources_t void clean(); private: - const vk::DispatchLoaderDynamic *pVkDynLoader; + const WZ_vk::DispatchLoaderDynamic *pVkDynLoader; }; struct buffering_mechanism @@ -329,9 +334,9 @@ struct buffering_mechanism static perFrameResources_t& get_current_resources(); static perSwapchainImageResources_t& get_current_swapchain_resources(); - static void init(vk::Device dev, const VmaAllocator& allocator, size_t swapchainImageCount, const uint32_t& graphicsQueueFamilyIndex, const vk::DispatchLoaderDynamic& vkDynLoader); - static void destroy(vk::Device dev, const vk::DispatchLoaderDynamic& vkDynLoader); - static void swap(vk::Device dev, const vk::DispatchLoaderDynamic& vkDynLoader, bool skipAcquireNewSwapchainImage); + static void init(vk::Device dev, const VmaAllocator& allocator, size_t swapchainImageCount, const uint32_t& graphicsQueueFamilyIndex, const WZ_vk::DispatchLoaderDynamic& vkDynLoader); + static void destroy(vk::Device dev, const WZ_vk::DispatchLoaderDynamic& vkDynLoader); + static void swap(vk::Device dev, const WZ_vk::DispatchLoaderDynamic& vkDynLoader, bool skipAcquireNewSwapchainImage); static bool isInitialized(); static size_t get_current_frame_num(); static size_t numFrames(); @@ -369,7 +374,7 @@ struct VkPSO final vk::ShaderModule vertexShader; vk::ShaderModule fragmentShader; vk::Device dev; - const vk::DispatchLoaderDynamic* pVkDynLoader; + const WZ_vk::DispatchLoaderDynamic* pVkDynLoader; std::vector samplers; std::shared_ptr renderpass_compat; @@ -380,7 +385,7 @@ struct VkPSO final // Read shader into text buffer static std::vector readShaderBuf(const std::string& name); - vk::ShaderModule get_module(const std::string& name, const vk::DispatchLoaderDynamic& vkDynLoader); + vk::ShaderModule get_module(const std::string& name, const WZ_vk::DispatchLoaderDynamic& vkDynLoader); static std::array get_stages(const vk::ShaderModule& vertexModule, const vk::ShaderModule& fragmentModule); @@ -405,7 +410,7 @@ struct VkPSO final vk::RenderPass rp, const std::shared_ptr& renderpass_compat, vk::SampleCountFlagBits rasterizationSamples, - const vk::DispatchLoaderDynamic& _vkDynLoader, + const WZ_vk::DispatchLoaderDynamic& _vkDynLoader, const VkRoot& root ); @@ -552,7 +557,7 @@ struct VkDepthMapImage final : public gfx_api::abstract_texture virtual bool isArray() const override; virtual size_t backend_internal_value() const override; - void destroy(vk::Device dev, const VmaAllocator& allocator, const vk::DispatchLoaderDynamic& vkDynLoader); + void destroy(vk::Device dev, const VmaAllocator& allocator, const WZ_vk::DispatchLoaderDynamic& vkDynLoader); VkDepthMapImage( const VkDepthMapImage& other ) = delete; // non construction-copyable VkDepthMapImage& operator=( const VkDepthMapImage& ) = delete; // non copyable @@ -579,7 +584,7 @@ struct VkRenderedImage final : public gfx_api::abstract_texture virtual bool isArray() const override; virtual size_t backend_internal_value() const override; - void destroy(vk::Device dev, const VmaAllocator& allocator, const vk::DispatchLoaderDynamic& vkDynLoader); + void destroy(vk::Device dev, const VmaAllocator& allocator, const WZ_vk::DispatchLoaderDynamic& vkDynLoader); VkRenderedImage( const VkRenderedImage& other ) = delete; // non construction-copyable VkRenderedImage& operator=( const VkRenderedImage& ) = delete; // non copyable @@ -617,7 +622,7 @@ struct VkRoot final : gfx_api::context vk::InstanceCreateInfo instanceCreateInfo; vk::Instance inst; std::vector layers; - vk::DispatchLoaderDynamic vkDynLoader; + WZ_vk::DispatchLoaderDynamic vkDynLoader; // physical device (and info) vk::PhysicalDevice physicalDevice; From 845dee0c21bf70cbff540aab2e277ba24999d6be Mon Sep 17 00:00:00 2001 From: Pavel Solodovnikov Date: Fri, 8 Nov 2024 21:49:41 +0300 Subject: [PATCH 21/38] netplay: more strict checks for error codes from socket operations There isn't any guarantee that `getSockErr()`/`setSockErr()` won't return `0` in all corner cases where something bad happens with an underlying socket. Provide more strict checks for socket write errors and for checking the result of connection opening routines, allowing to catch error conditions even in presence of error code == 0. Signed-off-by: Pavel Solodovnikov --- lib/netplay/netsocket.cpp | 8 ++++---- lib/netplay/netsocket.h | 12 ++++++------ src/screens/joiningscreen.cpp | 5 +++-- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/lib/netplay/netsocket.cpp b/lib/netplay/netsocket.cpp index 47a45a053a0..b449acb9783 100644 --- a/lib/netplay/netsocket.cpp +++ b/lib/netplay/netsocket.cpp @@ -72,7 +72,7 @@ struct Socket SOCKET fd[SOCK_COUNT]; bool ready; - std::error_code writeErrorCode = make_network_error_code(0); + nonstd::optional writeErrorCode; bool deleteLater; char textAddress[40] = {}; @@ -650,9 +650,9 @@ net::result writeAll(Socket& sock, const void *buf, size_t size, size_t return tl::make_unexpected(make_network_error_code(EBADF)); } - if (sock.writeErrorCode) + if (sock.writeErrorCode.has_value()) { - return tl::make_unexpected(sock.writeErrorCode); + return tl::make_unexpected(sock.writeErrorCode.value()); } if (size > 0) @@ -731,7 +731,7 @@ void socketFlush(Socket& sock, uint8_t player, size_t *rawByteCount) return; // Not compressed, so don't mess with zlib. } - ASSERT(!sock.writeErrorCode, "Socket write error?? (Player: %" PRIu8 "", player); + ASSERT(!sock.writeErrorCode.has_value(), "Socket write error?? (Player: %" PRIu8 "", player); // Flush data out of zlib compression state. do diff --git a/lib/netplay/netsocket.h b/lib/netplay/netsocket.h index 32fff7019d8..a660a744645 100644 --- a/lib/netplay/netsocket.h +++ b/lib/netplay/netsocket.h @@ -26,6 +26,7 @@ #include #include +#include #include namespace net @@ -137,7 +138,6 @@ int checkSockets(const SocketSet& set, unsigned int timeout); ///< Checks which // Higher-level functions for opening a connection / socket struct OpenConnectionResult { -public: OpenConnectionResult(std::error_code ec, std::string errorString) : errorCode(ec) , errorString(errorString) @@ -146,19 +146,19 @@ struct OpenConnectionResult OpenConnectionResult(Socket* open_socket) : open_socket(open_socket) { } -public: - bool hasError() const { return static_cast(errorCode); } -public: + + bool hasError() const { return errorCode.has_value(); } + OpenConnectionResult( const OpenConnectionResult& other ) = delete; // non construction-copyable OpenConnectionResult& operator=( const OpenConnectionResult& ) = delete; // non copyable OpenConnectionResult(OpenConnectionResult&&) = default; OpenConnectionResult& operator=(OpenConnectionResult&&) = default; -public: + struct SocketDeleter { void operator()(Socket* b) { if (b) { socketClose(b); } } }; std::unique_ptr open_socket; - std::error_code errorCode; + nonstd::optional errorCode; std::string errorString; }; typedef std::function OpenConnectionToHostResultCallback; diff --git a/src/screens/joiningscreen.cpp b/src/screens/joiningscreen.cpp index c3ad785edb4..1f18c884aff 100644 --- a/src/screens/joiningscreen.cpp +++ b/src/screens/joiningscreen.cpp @@ -1149,8 +1149,9 @@ void WzJoiningGameScreen_HandlerRoot::processOpenConnectionResult(size_t connect { debug(LOG_ERROR, "%s", result.errorString.c_str()); // Done trying connections - all failed - const auto sockErrorMsg = result.errorCode.message(); - auto localizedError = astringf(_("Failed to open connection: [%d] %s"), result.errorCode.value(), sockErrorMsg.c_str()); + const auto errCode = result.errorCode.value(); + const auto sockErrorMsg = errCode.message(); + auto localizedError = astringf(_("Failed to open connection: [%d] %s"), errCode.value(), sockErrorMsg.c_str()); handleFailure(FailureDetails::makeFromInternalError(WzString::fromUtf8(localizedError))); } return; From ed6c845a8cd2be6336eb3915b99a3fd34f381895 Mon Sep 17 00:00:00 2001 From: past-due <30942300+past-due@users.noreply.github.com> Date: Tue, 12 Nov 2024 16:17:49 -0500 Subject: [PATCH 22/38] netplay: Tweak optional.hpp usage --- lib/netplay/netsocket.cpp | 2 +- lib/netplay/netsocket.h | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/netplay/netsocket.cpp b/lib/netplay/netsocket.cpp index b449acb9783..f03be08e7e1 100644 --- a/lib/netplay/netsocket.cpp +++ b/lib/netplay/netsocket.cpp @@ -72,7 +72,7 @@ struct Socket SOCKET fd[SOCK_COUNT]; bool ready; - nonstd::optional writeErrorCode; + optional writeErrorCode = nullopt; bool deleteLater; char textAddress[40] = {}; diff --git a/lib/netplay/netsocket.h b/lib/netplay/netsocket.h index a660a744645..01413011cd3 100644 --- a/lib/netplay/netsocket.h +++ b/lib/netplay/netsocket.h @@ -27,6 +27,8 @@ #include #include +using nonstd::optional; +using nonstd::nullopt; #include namespace net @@ -158,7 +160,7 @@ struct OpenConnectionResult void operator()(Socket* b) { if (b) { socketClose(b); } } }; std::unique_ptr open_socket; - nonstd::optional errorCode; + optional errorCode = nullopt; std::string errorString; }; typedef std::function OpenConnectionToHostResultCallback; From 4492b117880929b5ac951f3c5df5cfa8e98d7b81 Mon Sep 17 00:00:00 2001 From: past-due <30942300+past-due@users.noreply.github.com> Date: Tue, 12 Nov 2024 13:30:19 -0500 Subject: [PATCH 23/38] multistruct: Improve sanity checks --- src/multistruct.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/multistruct.cpp b/src/multistruct.cpp index 8234dc8f1f4..80781283e15 100644 --- a/src/multistruct.cpp +++ b/src/multistruct.cpp @@ -225,7 +225,7 @@ bool recvLasSat(NETQUEUE queue) return false; } - if (psStruct && psObj && psStruct->pStructureType->psWeapStat[0]->weaponSubClass == WSC_LAS_SAT) + if (psStruct && psObj && isLasSat(psStruct->pStructureType)) { // Lassats have just one weapon unsigned firePause = weaponFirePause(*psStruct->getWeaponStats(0), player); From d75654e9605cceb77799c04b47f5898f49a55365 Mon Sep 17 00:00:00 2001 From: past-due <30942300+past-due@users.noreply.github.com> Date: Tue, 12 Nov 2024 13:36:13 -0500 Subject: [PATCH 24/38] displayProximityMsgs: Additional sanity checks --- src/display3d.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/display3d.cpp b/src/display3d.cpp index 6ece53e1847..5588583487d 100644 --- a/src/display3d.cpp +++ b/src/display3d.cpp @@ -2320,7 +2320,15 @@ static void displayProximityMsgs(const glm::mat4& viewMatrix, const glm::mat4 &p unsigned x, y; if (psProxDisp->type == POS_PROXDATA) { + if (!psProxDisp->psMessage->pViewData) + { + continue; + } VIEW_PROXIMITY *pViewProximity = (VIEW_PROXIMITY *)psProxDisp->psMessage->pViewData->pData; + if (!pViewProximity) + { + continue; + } x = pViewProximity->x; y = pViewProximity->y; } From 258e608808ff371a72c3562b5310d150f626f541 Mon Sep 17 00:00:00 2001 From: past-due <30942300+past-due@users.noreply.github.com> Date: Tue, 12 Nov 2024 17:45:19 -0500 Subject: [PATCH 25/38] Fix: Add missing space in WZEVENT output for hostChatPermissions and playerLeft --- src/multiint.cpp | 2 +- src/multijoin.cpp | 2 +- src/stdinreader.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/multiint.cpp b/src/multiint.cpp index 69d84621be2..e3e3ece0cf7 100644 --- a/src/multiint.cpp +++ b/src/multiint.cpp @@ -6889,7 +6889,7 @@ class WzHostLobbyOperationsInterface : public HostLobbyOperationsInterface std::string playerVerifiedStatus = (ingame.VerifiedIdentity[player]) ? "V" : "?"; std::string playerName = NetPlay.players[player].name; std::string playerNameB64 = base64Encode(std::vector(playerName.begin(), playerName.end())); - wz_command_interface_output("WZEVENT: hostChatPermissions=%s: %" PRIu32 " %" PRIu32 "%s %s %s %s %s\n", (freeChatEnabled) ? "Y" : "N", player, gameTime, playerPublicKeyB64.c_str(), playerIdentityHash.c_str(), playerVerifiedStatus.c_str(), playerNameB64.c_str(), NetPlay.players[player].IPtextAddress); + wz_command_interface_output("WZEVENT: hostChatPermissions=%s: %" PRIu32 " %" PRIu32 " %s %s %s %s %s\n", (freeChatEnabled) ? "Y" : "N", player, gameTime, playerPublicKeyB64.c_str(), playerIdentityHash.c_str(), playerVerifiedStatus.c_str(), playerNameB64.c_str(), NetPlay.players[player].IPtextAddress); } return true; diff --git a/src/multijoin.cpp b/src/multijoin.cpp index 8ee450cd032..9454216a6b7 100644 --- a/src/multijoin.cpp +++ b/src/multijoin.cpp @@ -479,7 +479,7 @@ bool MultiPlayerLeave(UDWORD playerIndex) std::string playerVerifiedStatus = (ingame.VerifiedIdentity[playerIndex]) ? "V" : "?"; std::string playerName = NetPlay.players[playerIndex].name; std::string playerNameB64 = base64Encode(std::vector(playerName.begin(), playerName.end())); - wz_command_interface_output("WZEVENT: playerLeft: %" PRIu32 " %" PRIu32 "%s %s %s %s %s\n", playerIndex, gameTime, playerPublicKeyB64.c_str(), playerIdentityHash.c_str(), playerVerifiedStatus.c_str(), playerNameB64.c_str(), NetPlay.players[playerIndex].IPtextAddress); + wz_command_interface_output("WZEVENT: playerLeft: %" PRIu32 " %" PRIu32 " %s %s %s %s %s\n", playerIndex, gameTime, playerPublicKeyB64.c_str(), playerIdentityHash.c_str(), playerVerifiedStatus.c_str(), playerNameB64.c_str(), NetPlay.players[playerIndex].IPtextAddress); } if (ingame.localJoiningInProgress) diff --git a/src/stdinreader.cpp b/src/stdinreader.cpp index 8fba6f4db70..7b05b94c857 100644 --- a/src/stdinreader.cpp +++ b/src/stdinreader.cpp @@ -578,7 +578,7 @@ static bool changeHostChatPermissionsForActivePlayerWithIdentity(const std::stri std::string playerVerifiedStatus = (ingame.VerifiedIdentity[i]) ? "V" : "?"; std::string playerName = NetPlay.players[i].name; std::string playerNameB64 = base64Encode(std::vector(playerName.begin(), playerName.end())); - wz_command_interface_output("WZEVENT: hostChatPermissions=%s: %" PRIu32 " %" PRIu32 "%s %s %s %s %s\n", (freeChatEnabled) ? "Y" : "N", i, gameTime, playerPublicKeyB64.c_str(), playerIdentityHash.c_str(), playerVerifiedStatus.c_str(), playerNameB64.c_str(), NetPlay.players[i].IPtextAddress); + wz_command_interface_output("WZEVENT: hostChatPermissions=%s: %" PRIu32 " %" PRIu32 " %s %s %s %s %s\n", (freeChatEnabled) ? "Y" : "N", i, gameTime, playerPublicKeyB64.c_str(), playerIdentityHash.c_str(), playerVerifiedStatus.c_str(), playerNameB64.c_str(), NetPlay.players[i].IPtextAddress); }); if (result) From 1762fb1cc006e1e14f0ea4bcec5b264dc7eea643 Mon Sep 17 00:00:00 2001 From: past-due <30942300+past-due@users.noreply.github.com> Date: Tue, 12 Nov 2024 19:06:36 -0500 Subject: [PATCH 26/38] cmdinterface: Add readyStatus and playerResponding events --- src/multiint.cpp | 27 ++++++++++++++++++++++++--- src/multiplay.cpp | 14 +++++++++++++- 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/src/multiint.cpp b/src/multiint.cpp index e3e3ece0cf7..0106a881f7b 100644 --- a/src/multiint.cpp +++ b/src/multiint.cpp @@ -2606,7 +2606,17 @@ static bool SendReadyRequest(UBYTE player, bool bReady) { if (NetPlay.isHost) // do or request the change. { - return changeReadyStatus(player, bReady); + bool changedValue = changeReadyStatus(player, bReady); + if (changedValue && wz_command_interface_enabled()) + { + std::string playerPublicKeyB64 = base64Encode(getMultiStats(player).identity.toBytes(EcKey::Public)); + std::string playerIdentityHash = getMultiStats(player).identity.publicHashString(); + std::string playerVerifiedStatus = (ingame.VerifiedIdentity[player]) ? "V" : "?"; + std::string playerName = NetPlay.players[player].name; + std::string playerNameB64 = base64Encode(std::vector(playerName.begin(), playerName.end())); + wz_command_interface_output("WZEVENT: readyStatus=%d: %" PRIu32 " %s %s %s %s %s\n", bReady ? 1 : 0, player, playerPublicKeyB64.c_str(), playerIdentityHash.c_str(), playerVerifiedStatus.c_str(), playerNameB64.c_str(), NetPlay.players[player].IPtextAddress); + } + return changedValue; } else { @@ -2662,11 +2672,22 @@ bool recvReadyRequest(NETQUEUE queue) return false; } - return changeReadyStatus((UBYTE)player, bReady); + bool changedValue = changeReadyStatus((UBYTE)player, bReady); + if (changedValue && wz_command_interface_enabled()) + { + std::string playerPublicKeyB64 = base64Encode(stats.identity.toBytes(EcKey::Public)); + std::string playerIdentityHash = stats.identity.publicHashString(); + std::string playerVerifiedStatus = (ingame.VerifiedIdentity[player]) ? "V" : "?"; + std::string playerName = NetPlay.players[player].name; + std::string playerNameB64 = base64Encode(std::vector(playerName.begin(), playerName.end())); + wz_command_interface_output("WZEVENT: readyStatus=%d: %" PRIu32 " %s %s %s %s %s\n", bReady ? 1 : 0, player, playerPublicKeyB64.c_str(), playerIdentityHash.c_str(), playerVerifiedStatus.c_str(), playerNameB64.c_str(), NetPlay.players[player].IPtextAddress); + } + return changedValue; } bool changeReadyStatus(UBYTE player, bool bReady) { + bool changedValue = NetPlay.players[player].ready != bReady; NetPlay.players[player].ready = bReady; NETBroadcastPlayerInfo(player); netPlayersUpdated = true; @@ -2674,7 +2695,7 @@ bool changeReadyStatus(UBYTE player, bool bReady) // change PingTime to some value less than PING_LIMIT, so that multiplayPlayersReady // doesnt block ingame.PingTimes[player] = ingame.PingTimes[player] == PING_LIMIT ? 1 : ingame.PingTimes[player]; - return true; + return changedValue; } static void informIfAdminChangedOtherPosition(uint32_t targetPlayerIdx, uint32_t responsibleIdx) diff --git a/src/multiplay.cpp b/src/multiplay.cpp index dda732db93d..96a0a03f166 100644 --- a/src/multiplay.cpp +++ b/src/multiplay.cpp @@ -1450,8 +1450,18 @@ bool recvMessage() if (ingame.JoiningInProgress[player_id]) { addKnownPlayer(NetPlay.players[player_id].name, getMultiStats(player_id).identity); + ingame.JoiningInProgress[player_id] = false; + + if (wz_command_interface_enabled()) + { + std::string playerPublicKeyB64 = base64Encode(getMultiStats(player_id).identity.toBytes(EcKey::Public)); + std::string playerIdentityHash = getMultiStats(player_id).identity.publicHashString(); + std::string playerVerifiedStatus = (ingame.VerifiedIdentity[player_id]) ? "V" : "?"; + std::string playerName = NetPlay.players[player_id].name; + std::string playerNameB64 = base64Encode(std::vector(playerName.begin(), playerName.end())); + wz_command_interface_output("WZEVENT: playerResponding: %" PRIu32 " %s %s %s %s %s\n", player_id, playerPublicKeyB64.c_str(), playerIdentityHash.c_str(), playerVerifiedStatus.c_str(), playerNameB64.c_str(), NetPlay.players[player_id].IPtextAddress); + } } - ingame.JoiningInProgress[player_id] = false; break; } case GAME_ALLIANCE: @@ -2505,6 +2515,8 @@ void resetReadyStatus(bool bSendOptions, bool ignoreReadyReset) //Really reset ready status if (NetPlay.isHost && !ignoreReadyReset) { + wz_command_interface_output("WZEVENT: readyStatus=RESET\n"); + for (unsigned int i = 0; i < MAX_CONNECTED_PLAYERS; ++i) { //Ignore for autohost launch option. From 259e0234386325be91a29f1c2566f0882b0cab72 Mon Sep 17 00:00:00 2001 From: past-due <30942300+past-due@users.noreply.github.com> Date: Tue, 12 Nov 2024 19:08:24 -0500 Subject: [PATCH 27/38] cmdinterface: Output room status json on various events --- lib/netplay/netplay.cpp | 22 +++++ lib/netplay/netplay.h | 1 + src/multiint.cpp | 16 ++++ src/multijoin.cpp | 2 + src/multiplay.cpp | 5 + src/stdinreader.cpp | 204 +++++++++++++++++++++++++++++++++++++++- src/stdinreader.h | 2 + 7 files changed, 251 insertions(+), 1 deletion(-) diff --git a/lib/netplay/netplay.cpp b/lib/netplay/netplay.cpp index d3e3e1d1dd7..2a74a231660 100644 --- a/lib/netplay/netplay.cpp +++ b/lib/netplay/netplay.cpp @@ -412,6 +412,11 @@ void NET_setLobbyDisabled(const std::string& infoLinkURL) lobby_disabled_info_link_url = infoLinkURL; } +uint32_t NET_getCurrentHostedLobbyGameId() +{ + return gamestruct.gameId; +} + // Sets if the game is password protected or not void NETGameLocked(bool flag) { @@ -991,12 +996,19 @@ static void NETplayerLeaving(UDWORD index, bool quietSocketClose) sync_counter.left++; bool wasSpectator = NetPlay.players[index].isSpectator; MultiPlayerLeave(index); // more cleanup + bool resetReadyCalled = false; if (ingame.localJoiningInProgress) // Only if game hasn't actually started yet. { NET_DestroyPlayer(index); // sets index player's array to false if (!wasSpectator) { resetReadyStatus(false); // reset ready status for all players + resetReadyCalled = true; + } + + if (!resetReadyCalled) + { + wz_command_interface_output_room_status_json(); } } } @@ -1020,6 +1032,7 @@ static void NETplayerDropped(UDWORD index) sync_counter.drops++; bool wasSpectator = NetPlay.players[index].isSpectator; MultiPlayerLeave(id); // more cleanup + bool resetReadyCalled = false; if (ingame.localJoiningInProgress) // Only if game hasn't actually started yet. { // Send message type specifically for dropped / disconnects @@ -1031,6 +1044,12 @@ static void NETplayerDropped(UDWORD index) if (!wasSpectator) { resetReadyStatus(false); // reset ready status for all players + resetReadyCalled = true; + } + + if (!resetReadyCalled) + { + wz_command_interface_output_room_status_json(); } } @@ -4361,6 +4380,9 @@ static void NETallowJoining() { ASSERT(false, "wzFiles is uninitialized?? (Player: %" PRIu8 ")", index); } + + wz_command_interface_output_room_status_json(); + continue; // continue to next tmp_socket } diff --git a/lib/netplay/netplay.h b/lib/netplay/netplay.h index 04c56310fc6..6cfaf64846c 100644 --- a/lib/netplay/netplay.h +++ b/lib/netplay/netplay.h @@ -487,6 +487,7 @@ void NET_clearDownloadingWZFiles(); bool NET_getLobbyDisabled(); const std::string& NET_getLobbyDisabledInfoLinkURL(); void NET_setLobbyDisabled(const std::string& infoLinkURL); +uint32_t NET_getCurrentHostedLobbyGameId(); bool NETGameIsLocked(); void NETGameLocked(bool flag); diff --git a/src/multiint.cpp b/src/multiint.cpp index 0106a881f7b..533c2856154 100644 --- a/src/multiint.cpp +++ b/src/multiint.cpp @@ -2615,6 +2615,8 @@ static bool SendReadyRequest(UBYTE player, bool bReady) std::string playerName = NetPlay.players[player].name; std::string playerNameB64 = base64Encode(std::vector(playerName.begin(), playerName.end())); wz_command_interface_output("WZEVENT: readyStatus=%d: %" PRIu32 " %s %s %s %s %s\n", bReady ? 1 : 0, player, playerPublicKeyB64.c_str(), playerIdentityHash.c_str(), playerVerifiedStatus.c_str(), playerNameB64.c_str(), NetPlay.players[player].IPtextAddress); + + wz_command_interface_output_room_status_json(); } return changedValue; } @@ -2681,6 +2683,8 @@ bool recvReadyRequest(NETQUEUE queue) std::string playerName = NetPlay.players[player].name; std::string playerNameB64 = base64Encode(std::vector(playerName.begin(), playerName.end())); wz_command_interface_output("WZEVENT: readyStatus=%d: %" PRIu32 " %s %s %s %s %s\n", bReady ? 1 : 0, player, playerPublicKeyB64.c_str(), playerIdentityHash.c_str(), playerVerifiedStatus.c_str(), playerNameB64.c_str(), NetPlay.players[player].IPtextAddress); + + wz_command_interface_output_room_status_json(); } return changedValue; } @@ -7318,6 +7322,18 @@ void WzMultiplayerOptionsTitleUI::frontendMultiMessages(bool running) NETuint32_t(&player_id); NETend(); + if (player_id >= MAX_CONNECTED_PLAYERS) + { + debug(LOG_ERROR, "Bad NET_PLAYERRESPONDING received, ID is %d", (int)player_id); + break; + } + + if (whosResponsible(player_id) != queue.index && queue.index != NetPlay.hostPlayer) + { + HandleBadParam("NET_PLAYERRESPONDING given incorrect params.", player_id, queue.index); + break; + } + ingame.JoiningInProgress[player_id] = false; ingame.DataIntegrity[player_id] = false; break; diff --git a/src/multijoin.cpp b/src/multijoin.cpp index 9454216a6b7..fc6ec32be1b 100644 --- a/src/multijoin.cpp +++ b/src/multijoin.cpp @@ -449,6 +449,8 @@ void recvPlayerLeft(NETQUEUE queue) debug(LOG_INFO, "** player %u has dropped, in-game! (gameTime: %" PRIu32 ")", playerIndex, gameTime); ActivityManager::instance().updateMultiplayGameData(game, ingame, NETGameIsLocked()); + + wz_command_interface_output_room_status_json(); } // //////////////////////////////////////////////////////////////////////////// diff --git a/src/multiplay.cpp b/src/multiplay.cpp index 96a0a03f166..dc0cab35fea 100644 --- a/src/multiplay.cpp +++ b/src/multiplay.cpp @@ -461,6 +461,7 @@ bool multiPlayerLoop() } ingame.lastPlayerDataCheck2 = std::chrono::steady_clock::now(); wz_command_interface_output("WZEVENT: allPlayersJoined\n"); + wz_command_interface_output_room_status_json(); } if (NetPlay.bComms) { @@ -1460,6 +1461,8 @@ bool recvMessage() std::string playerName = NetPlay.players[player_id].name; std::string playerNameB64 = base64Encode(std::vector(playerName.begin(), playerName.end())); wz_command_interface_output("WZEVENT: playerResponding: %" PRIu32 " %s %s %s %s %s\n", player_id, playerPublicKeyB64.c_str(), playerIdentityHash.c_str(), playerVerifiedStatus.c_str(), playerNameB64.c_str(), NetPlay.players[player_id].IPtextAddress); + + wz_command_interface_output_room_status_json(); } } break; @@ -2530,6 +2533,8 @@ void resetReadyStatus(bool bSendOptions, bool ignoreReadyReset) changeReadyStatus(i, false); } } + + wz_command_interface_output_room_status_json(); } } diff --git a/src/stdinreader.cpp b/src/stdinreader.cpp index 7b05b94c857..0ea9f33ddd3 100644 --- a/src/stdinreader.cpp +++ b/src/stdinreader.cpp @@ -1,6 +1,6 @@ /* This file is part of Warzone 2100. - Copyright (C) 2020-2021 Warzone 2100 Project + Copyright (C) 2020-2024 Warzone 2100 Project Warzone 2100 is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -26,6 +26,7 @@ #include "multistat.h" #include "multilobbycommands.h" #include "clparse.h" +#include "main.h" #include #include @@ -1451,3 +1452,204 @@ void configSetCmdInterface(WZ_Command_Interface mode, std::string value) } wz_cmd_interface_param = value; } + +// MARK: - Output Room Status JSON + +static void WzCmdInterfaceDumpHumanPlayerVarsImpl(uint32_t player, bool gameHasFiredUp, nlohmann::ordered_json& j) +{ + PLAYER const &p = NetPlay.players[player]; + + j["name"] = p.name; + + if (!gameHasFiredUp) + { + // in lobby, output "ready" status + j["ready"] = static_cast(p.ready); + } + else + { + // once game has fired up, output loading / connection status + if (p.allocated) + { + if (ingame.JoiningInProgress[player]) + { + j["status"] = "loading"; + } + else + { + j["status"] = "active"; + } + if (ingame.PendingDisconnect[player]) + { + j["status"] = "pendingleave"; + } + } + else + { + j["status"] = "left"; + } + } + + const auto& identity = getMultiStats(player).identity; + if (!identity.empty()) + { + j["pk"] = base64Encode(identity.toBytes(EcKey::Public)); + } + else + { + j["pk"] = ""; + } + j["ip"] = NetPlay.players[player].IPtextAddress; + + if (ingame.PingTimes[player] != PING_LIMIT) + { + j["ping"] = ingame.PingTimes[player]; + } + else + { + j["ping"] = -1; // for "infinite" ping + } + + j["admin"] = static_cast(NetPlay.players[player].isAdmin || (player == NetPlay.hostPlayer)); + + if (player == NetPlay.hostPlayer) + { + j["host"] = 1; + } +} + +void wz_command_interface_output_room_status_json() +{ + if (!wz_command_interface_enabled()) + { + return; + } + + bool gameHasFiredUp = (GetGameMode() == GS_NORMAL); + + auto root = nlohmann::ordered_json::object(); + root["ver"] = 1; + + auto data = nlohmann::ordered_json::object(); + if (gameHasFiredUp) + { + if (ingame.TimeEveryoneIsInGame.has_value()) + { + data["state"] = "started"; + } + else + { + data["state"] = "starting"; + } + } + else + { + data["state"] = "lobby"; + } + if (NetPlay.isHost) + { + auto lobbyGameId = NET_getCurrentHostedLobbyGameId(); + if (lobbyGameId != 0) + { + data["lobbyid"] = lobbyGameId; + } + } + data["map"] = game.map; + + root["data"] = std::move(data); + + if (NetPlay.isHost) + { + auto players = nlohmann::ordered_json::array(); + for (uint8_t player = 0; player < game.maxPlayers; ++player) + { + PLAYER const &p = NetPlay.players[player]; + auto j = nlohmann::ordered_json::object(); + + j["pos"] = p.position; + j["team"] = p.team; + j["col"] = p.colour; + j["fact"] = static_cast(p.faction); + + if (p.ai == AI_CLOSED) + { + // closed slot + j["type"] = "closed"; + } + else if (p.ai == AI_OPEN) + { + if (!gameHasFiredUp && !p.allocated) + { + // available / open slot (in lobby) + j["type"] = "open"; + } + else + { + if (!p.allocated) + { + // if game has fired up and this slot is no longer allocated, skip it entirely if it wasn't initially a human player + if (p.difficulty != AIDifficulty::HUMAN) + { + continue; + } + } + + // human (or host) slot + j["type"] = (p.isSpectator) ? "spec" : "player"; + + WzCmdInterfaceDumpHumanPlayerVarsImpl(player, gameHasFiredUp, j); + } + } + else + { + // bot player + j["type"] = "bot"; + + j["name"] = getAIName(player); + j["difficulty"] = static_cast(NetPlay.players[player].difficulty); + } + + players.push_back(std::move(j)); + } + root["players"] = std::move(players); + + auto spectators = nlohmann::ordered_json::array(); + for (uint32_t i = MAX_PLAYER_SLOTS; i < MAX_CONNECTED_PLAYERS; ++i) + { + PLAYER const &p = NetPlay.players[i]; + if (p.ai == AI_CLOSED) + { + continue; + } + + auto j = nlohmann::ordered_json::object(); + if (!p.allocated) + { + if (!gameHasFiredUp) + { + // available / open spectator slot + j["type"] = "open"; + } + else + { + // no spectator connected to this slot - skip + continue; + } + } + else + { + // human (or host) slot + j["type"] = (p.isSpectator) ? "spec" : "player"; + + WzCmdInterfaceDumpHumanPlayerVarsImpl(i, gameHasFiredUp, j); + } + + spectators.push_back(std::move(j)); + } + root["specs"] = std::move(spectators); + } + + std::string statusJSONStr = std::string("__WZROOMSTATUS__") + root.dump(-1, ' ', false, nlohmann::ordered_json::error_handler_t::replace) + "__ENDWZROOMSTATUS__"; + statusJSONStr.append("\n"); + wz_command_interface_output_str(statusJSONStr.c_str()); +} diff --git a/src/stdinreader.h b/src/stdinreader.h index 0f53a1e9950..8e9331a3fed 100644 --- a/src/stdinreader.h +++ b/src/stdinreader.h @@ -45,3 +45,5 @@ void wz_command_interface_output(const char *str, ...) WZ_DECL_FORMAT(printf, 1, #endif void wz_command_interface_output_str(const char *str); + +void wz_command_interface_output_room_status_json(); From e79c28ebde9ca6b804f42c1ec4640726e077094c Mon Sep 17 00:00:00 2001 From: past-due <30942300+past-due@users.noreply.github.com> Date: Tue, 12 Nov 2024 19:22:55 -0500 Subject: [PATCH 28/38] cmdinterface: Support "status" command to trigger room status json --- src/stdinreader.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/stdinreader.cpp b/src/stdinreader.cpp index 0ea9f33ddd3..63087279948 100644 --- a/src/stdinreader.cpp +++ b/src/stdinreader.cpp @@ -1062,6 +1062,12 @@ int cmdInputThreadFunc(void *) } }); } + else if(!strncmpl(line, "status")) + { + wzAsyncExecOnMainThread([] { + wz_command_interface_output_room_status_json(); + }); + } else if(!strncmpl(line, "shutdown now")) { inexit = true; From 5a891f4b7d0bf110a38694514c6bbbfd6e6da95a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 10 Nov 2024 02:28:42 +0000 Subject: [PATCH 29/38] New Crowdin translations --- pkg/nsis/i18n/win_installer-it_IT.nsh | 4 +- po/it.po | 364 +++++++++++++------------- po/zh_CN.po | 12 +- 3 files changed, 192 insertions(+), 188 deletions(-) diff --git a/pkg/nsis/i18n/win_installer-it_IT.nsh b/pkg/nsis/i18n/win_installer-it_IT.nsh index 6fc63456bd9..62bb7ea0a5e 100644 --- a/pkg/nsis/i18n/win_installer-it_IT.nsh +++ b/pkg/nsis/i18n/win_installer-it_IT.nsh @@ -33,8 +33,8 @@ ${LangFileString} DESC_SecFMVs_Ger "Scarica e installa i filmati di gioco in ted ${LangFileString} TEXT_SecNLS "File della lingua" ${LangFileString} DESC_SecNLS "Supporto per altre lingue diverse dall'inglese." -${LangFileString} TEXT_SecNLS_WinFonts "Caratteri di Windows" -${LangFileString} DESC_SecNLS_WinFonts "Includi la cartella dei caratteri di Windows nel percorso di ricerca. Abilitalo se vuoi usare dei caratteri personalizzati nel file di configurazione o se hai problemi con il quello standard. Può essere lento su Vista e versioni successive!" +${LangFileString} TEXT_SecNLS_WinFonts "Font di Windows" +${LangFileString} DESC_SecNLS_WinFonts "Includi la cartella font di Windows nel percorso di ricerca. Abilitalo se vuoi usare font personalizzati nel file di configurazione o hai problemi con il font standard. Può essere lento su Vista e versioni successive!" ${LangFileString} TEXT_SecMSSysLibraries "Importanti DLL Runtime di Microsoft" ${LangFileString} DESC_SecMSSysLibraries "Scarica e installa (o aggiorna) le librerie di sistema Microsoft Visual C++ redistributable, che alcuni componenti potrebbero richiedere per funzionare." diff --git a/po/it.po b/po/it.po index 909a7ec8a46..f732629c278 100644 --- a/po/it.po +++ b/po/it.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" "POT-Creation-Date: 2024-11-01 21:02+0000\n" -"PO-Revision-Date: 2024-11-03 18:07\n" +"PO-Revision-Date: 2024-11-10 02:28\n" "Last-Translator: \n" "Language-Team: Italian\n" "Language: it_IT\n" @@ -1020,7 +1020,7 @@ msgid "Automated Vehicle Repair Mk2" msgstr "Riparazione automatizzata di veicoli Mk2" msgid "Automated Vehicle Repair Mk3" -msgstr "Riparazione automatizzata di veicoli Mk3" +msgstr "Riparazione automatizzata dei veicoli Mk3" msgid "Heavy Mobile Repair Turret" msgstr "Torretta Riparatrice Mobile Pesante" @@ -1134,7 +1134,7 @@ msgid "Cyborg Materials Improved" msgstr "Materiali dei cyborg migliorati" msgid "Layered dense composite alloys and energy-absorbing fibres" -msgstr "Leghe composite dense stratificate e fibre ad assorbimento di energia" +msgstr "Leghe composite dense e fibre ad assorbimento di energia" msgid "Increases Kinetic Armor and Body Points" msgstr "Aumenta l'armatura cinetica e i punti corazza" @@ -2793,10 +2793,10 @@ msgid "Super Heavy-Gunner" msgstr "Cannoniere super pesante" msgid "Super Auto-Cannon Cyborg" -msgstr "Super Cyborg con Cannone Automatico" +msgstr "Super Cyborg con cannone automatico" msgid "Super HPV Cyborg" -msgstr "Super Cyborg con Cannone a Ipervelocità" +msgstr "Super Cyborg con cannone ad ipervelocità" msgid "Super Tank-Killer Cyborg" msgstr "Super Cyborg con Tank Killer" @@ -2808,7 +2808,7 @@ msgid "Super Pulse Laser Cyborg" msgstr "Super Cyborg con Laser a Impulso" msgid "Super Rail-Gunner" -msgstr "Super Cyborg con Cannone a massa" +msgstr "Super Cyborg con cannone a massa" msgid "Super Scourge Cyborg" msgstr "Super Cyborg con Scourge" @@ -2940,22 +2940,22 @@ msgid "System locale" msgstr "Lingua di sistema" msgid "Failed to create port mapping" -msgstr "" +msgstr "Impossibile creare la mappatura porte" #, c-format msgid "Manually configure your router/firewall to open port %d!" -msgstr "" +msgstr "Configura manualmente il router/firewall per aprire la porta %d!" #, c-format msgid "Port mapping opened external port: %d" -msgstr "" +msgstr "Porta esterna aperta nella mappatura porte: %d" #, c-format msgid "Your external IP is: %s" -msgstr "" +msgstr "Il tuo IP esterno è: %s" msgid "Failed to create port mapping (timeout)" -msgstr "" +msgstr "Impossibile creare la mappatura porte (timeout)" msgid "Client failed to ack player index swap" msgstr "Il client non ha potuto riconoscere il cambio d'indice del giocatore" @@ -2971,6 +2971,10 @@ msgid "" "If you're using a router configure it to enable UPnP/NAT-PMP/PCP\n" " or to forward the port to your system." msgstr "" +"Errore nella connessione al server della lobby: %s.\n" +"Fai in modo che la porta %d possa ricevere connessioni in entrata.\n" +"Se stai usando un router configuralo per usare l'UPnP, o esegui il\n" +"port forward al tuo sistema." msgid "Failed to get a lobby response!" msgstr "Impossibile avere risposte della lobby!" @@ -3876,13 +3880,13 @@ msgid "Complete battlefield visibility" msgstr "Visibilità completa del campo di battaglia" msgid "Composite Alloys Mk2" -msgstr "Leghe Composite Mk2" +msgstr "Leghe composite Mk2" msgid "Composite Alloys Mk3" -msgstr "Leghe Composite Mk3" +msgstr "Leghe composite Mk3" msgid "Composite Alloys" -msgstr "Leghe Composite" +msgstr "Leghe composite" msgid "Computer guided shells" msgstr "Colpi guidati dal computer" @@ -3935,22 +3939,22 @@ msgid "Crane2" msgstr "Gru2" msgid "Cyborg Composite Alloys Mk2" -msgstr "Leghe Composite Cyborg Mk2" +msgstr "Leghe composite cyborg Mk2" msgid "Cyborg Composite Alloys Mk3" -msgstr "Leghe Composite Cyborg Mk3" +msgstr "Leghe composite cyborg Mk3" msgid "Cyborg Composite Alloys" -msgstr "Leghe Composite Cyborg" +msgstr "Leghe composite cyborg" msgid "Cyborg Dense Composite Alloys Mk2" -msgstr "Leghe Composite Dense Mk2" +msgstr "Leghe composite dense Mk2" msgid "Cyborg Dense Composite Alloys Mk3" -msgstr "Leghe Composite Dense Cyborg Mk3" +msgstr "Leghe composite dense cyborg Mk3" msgid "Cyborg Dense Composite Alloys" -msgstr "Leghe Composite Dense Cyborg" +msgstr "Leghe composite dense cyborg" msgid "Cyborg Factory" msgstr "Fabbrica di cyborg" @@ -3980,13 +3984,13 @@ msgid "Cyborg Propulsion Improved" msgstr "Propulsione Cyborg migliorata" msgid "Cyborg Superdense Composite Alloys Mk2" -msgstr "Leghe Composite Superdense Cyborg Mk2" +msgstr "Leghe composite superdense cyborg Mk2" msgid "Cyborg Superdense Composite Alloys Mk3" -msgstr "Leghe Composite Superdense Cyborg Mk3" +msgstr "Leghe composite superdense cyborg Mk3" msgid "Cyborg Superdense Composite Alloys" -msgstr "Leghe composite super dense Cyborg" +msgstr "Leghe composite superdense cyborg" msgid "Cyborg Superdense Thermal Armor Mk2" msgstr "Cyborg con armatura termica super densa Mk2" @@ -4043,13 +4047,13 @@ msgid "Demolish Structure" msgstr "Demolisci struttura" msgid "Dense Composite Alloys Mk2" -msgstr "Leghe Composite Dense Mk2" +msgstr "Leghe composite dense Mk2" msgid "Dense Composite Alloys Mk3" -msgstr "Leghe Composite Dense Mk3" +msgstr "Leghe composite dense Mk3" msgid "Dense Composite Alloys" -msgstr "Leghe Composite Dense" +msgstr "Leghe composite dense" msgid "Depleted uranium kinetic energy bullets" msgstr "Proiettili ad energia cinetica ad uranio impoverito" @@ -4157,7 +4161,7 @@ msgid "Factory module enables medium and large bodies" msgstr "Il modulo di fabbrica permette di produrre corpi medi e pesanti" msgid "Factory Module" -msgstr "Modulo Fabbrica" +msgstr "Modulo fabbrica" #, no-c-format msgid "Factory output speed +100%% per module" @@ -4385,7 +4389,7 @@ msgid "Hardcrete Corner Wall" msgstr "Muro ad angolo in cemento" msgid "Hardcrete Gate" -msgstr "Cancello di Cemento" +msgstr "Cancello di cemento" msgid "Hardcrete Wall" msgstr "Muro di Cemento" @@ -4667,7 +4671,7 @@ msgid "Heavy Rocket Bastion" msgstr "Bastione con Razzi Pesanti" msgid "Heavy Rocket Battery" -msgstr "" +msgstr "Batteria di razzi pesanti" msgid "Heavy surface-to-air missile" msgstr "Missile terra-aria pesante" @@ -5632,13 +5636,13 @@ msgid "Objects become difficult to locate near it" msgstr "Gli oggetti diventano difficili da trovare vicino ad esso" msgid "Oil Derrick" -msgstr "Derrick" +msgstr "Torre petrolifera" msgid "Oil Drum" msgstr "Barile di petrolio" msgid "Oil Resource" -msgstr "Risorsa di Petrolio" +msgstr "Risorsa petrolifera" msgid "On-board computer predicts target movement" msgstr "Il computer di bordo prevede i movimenti del bersaglio" @@ -6265,7 +6269,7 @@ msgid "Smashedwall" msgstr "Murofracassato" msgid "Sniper Cyborg" -msgstr "" +msgstr "Cyborg cecchino" msgid "Speed: Fast" msgstr "Velocità: Alta" @@ -6364,16 +6368,16 @@ msgid "Supercrete" msgstr "Supertitan" msgid "Superdense composite alloys and energy-absorbing fibres" -msgstr "Leghe composite superdense stratificate e fibre ad assorbimento di energia" +msgstr "Leghe composite superdense e fibre ad assorbimento di energia" msgid "Superdense Composite Alloys Mk2" -msgstr "Leghe Composite Superdense Mk2" +msgstr "Leghe composite superdense Mk2" msgid "Superdense Composite Alloys Mk3" -msgstr "Leghe Composite Superdense Mk3" +msgstr "Leghe composite superdense Mk3" msgid "Superdense Composite Alloys" -msgstr "Leghe Composite Superdense" +msgstr "Leghe composite superdense" msgid "Superhot Flamer Gel Mk2" msgstr "Gel Supercaldo Mk2" @@ -7240,10 +7244,10 @@ msgid "port" msgstr "porta" msgid "Enable / disable port mapping when hosting" -msgstr "" +msgstr "Abilita / disabilita la mappatura porte durante l'host" msgid "[1, true, 0, false]" -msgstr "" +msgstr "[1, vero, 0, falso]" msgid "Enable lobby slash commands (for connecting clients)" msgstr "Abilita i comandi slash della lobby (per connettere i client)" @@ -7285,13 +7289,13 @@ msgid "Game history log frame interval" msgstr "" msgid "interval in seconds" -msgstr "" +msgstr "intervallo in secondi" msgid "Multiplayer game time limit (in minutes)" msgstr "" msgid "number of minutes" -msgstr "" +msgstr "numero di minuti" msgid "Convert a specular-map .png to a luma, single-channel, grayscale .png (and exit)" msgstr "" @@ -7402,7 +7406,7 @@ msgid "Store Design" msgstr "Salva Progetto" msgid "Cannot Build. Oil Resource Burning." -msgstr "Impossibile costruire. Risorsa d'olio in fiamme." +msgstr "Impossibile costruire. Risorsa petrolifera in fiamme." #, c-format msgid "%s - Hitpoints %d/%d - Experience %.1f, %s, Kills %d" @@ -7505,7 +7509,7 @@ msgid "Single Player" msgstr "Giocatore singolo" msgid "Multi Player" -msgstr "Più giocatori" +msgstr "Multigiocatore" msgid "Tutorial" msgstr "Esercitazione" @@ -7520,7 +7524,7 @@ msgid "Videos are missing, download them from http://wz2100.net" msgstr "I video della campagna non sono presenti, scaricali da http://wz2100.net" msgid "Continue Last Save" -msgstr "Continua dall'ultimo salvataggio" +msgstr "Continua ultimo salvataggio" msgid "No last save available" msgstr "Ultimo salvataggio non disponibile" @@ -7596,7 +7600,7 @@ msgid "Load Skirmish Replay" msgstr "Carica replay della schermaglia" msgid "MULTI PLAYER" -msgstr "PIÙ GIOCATORI" +msgstr "MULTIGIOCATORE" msgid "Host Game" msgstr "Ospita una partita" @@ -7636,7 +7640,7 @@ msgid "Music Manager" msgstr "Gestore della musica" msgid "Multiplay Options" -msgstr "Opzioni multigiocatore" +msgstr "Opzioni multi giocatore" msgid "OPTIONS" msgstr "OPZIONI" @@ -7684,7 +7688,7 @@ msgid "On" msgstr "Acceso" msgid "Per Pixel" -msgstr "" +msgstr "Per pixel" msgid "Lightmap" msgstr "" @@ -7711,34 +7715,34 @@ msgid "Terrain quality mode not available." msgstr "" msgid "Medium Quality" -msgstr "" +msgstr "Media qualità" msgid "High Quality" -msgstr "" +msgstr "Alta qualità" msgid "Shadow mapping not available on this system." msgstr "" msgid "Low" -msgstr "" +msgstr "Basso" msgid "Ultra" -msgstr "" +msgstr "Ultra" msgid "Shadow filtering not available on this system." msgstr "" msgid "Opacity: 50%" -msgstr "" +msgstr "Opacità: 50%" msgid "* Takes effect on game restart" msgstr "* Ha effetto al riavvio del gioco" msgid "Terrain Quality" -msgstr "" +msgstr "Qualità del terreno" msgid "Terrain Shading" -msgstr "" +msgstr "Ombreggiatura del terreno" msgid "Shadows" msgstr "Ombre" @@ -7774,10 +7778,10 @@ msgid "Screen Shake" msgstr "Scuotimento dello schermo" msgid "Groups Menu" -msgstr "" +msgstr "Menu gruppi" msgid "Options Button" -msgstr "" +msgstr "Pulsante opzioni" msgid "GRAPHICS OPTIONS" msgstr "OPZIONI GRAFICHE" @@ -7975,7 +7979,7 @@ msgstr "%u minuti" #, c-format msgid "%s hours" -msgstr "" +msgstr "%s ore" #, c-format msgid "%u seconds" @@ -7985,7 +7989,7 @@ msgid "None" msgstr "Nessuno" msgid "Distribute to Team" -msgstr "" +msgstr "Distribuisci alla squadra" msgid "Destroy (Classic)" msgstr "" @@ -8003,13 +8007,13 @@ msgid "Game Port" msgstr "Porta del gioco" msgid "Port Mapping" -msgstr "" +msgstr "Mappatura porte" msgid "Use PCP, NAT-PMP, or UPnP to help configure your router / firewall to allow connections while hosting." msgstr "" msgid "Chat" -msgstr "" +msgstr "Chat" msgid "Inactivity Timeout" msgstr "Timeout d'Inattività" @@ -8024,7 +8028,7 @@ msgid "On Player Leave" msgstr "" msgid "Game Time Limit" -msgstr "" +msgstr "Limite tempo di gioco" msgid "Enable Rating" msgstr "Abilita valutazioni" @@ -8093,10 +8097,10 @@ msgid "Player %u is cheating (debug menu) him/herself a new droid." msgstr "Il giocatore %u sta ottenendo una nuova unità per mezzo di trucchi (menu di debug)." msgid "Open In-Game Options" -msgstr "" +msgstr "Apri le opzioni in gioco" msgid "Close In-Game Options" -msgstr "" +msgstr "Chiudi le opzioni in gioco" msgid "Hiding Obsolete Tech" msgstr "Nascondo Tecnologia Obsoleta" @@ -8135,16 +8139,16 @@ msgid "Host Chat Options" msgstr "" msgid "Global Options:" -msgstr "" +msgstr "Opzioni globali:" msgid "Enable All" -msgstr "" +msgstr "Attiva tutto" msgid "Disable All" -msgstr "" +msgstr "Disabilita tutto" msgid "Chat Options" -msgstr "" +msgstr "Opzioni chat" msgid "Mute or configure player free chat." msgstr "" @@ -8153,25 +8157,25 @@ msgid "The host has globally muted 1+ players." msgstr "" msgid "Local" -msgstr "" +msgstr "Locale" msgid "Select / Assign Group Number: " msgstr "" #, c-format msgid "Group %u" -msgstr "" +msgstr "Gruppo %u" #, c-format msgid "Select the Units in Group %u" -msgstr "" +msgstr "Seleziona le unità nel gruppo %u" #, c-format msgid "Assign Selected Units to Group %u" -msgstr "" +msgstr "Assegna unità selezionate al gruppo %u" msgid "Center Camera on this Group by clicking or tapping twice" -msgstr "" +msgstr "Centra la vista su questo gruppo facendo click o toccando due volte" msgid "View and configure groups of units, which can be quickly selected and ordered." msgstr "" @@ -8180,10 +8184,10 @@ msgid "Group buttons will glow red when units are lost (or taking lots of damage msgstr "" msgid "Unit Groups" -msgstr "" +msgstr "Gruppi di unità" msgid "Select a Group" -msgstr "" +msgstr "Seleziona gruppo" msgid "Assign Selected Units to a Group" msgstr "" @@ -8192,7 +8196,7 @@ msgid "Center Camera on a Group by clicking or tapping twice on the group button msgstr "" msgid "Unit Groups:" -msgstr "" +msgstr "Gruppi di unità:" msgid "Construction Progress" msgstr "Progresso della costruzione" @@ -8207,35 +8211,35 @@ msgid "Progress Bar" msgstr "Barra del Progresso" msgid "To:" -msgstr "" +msgstr "A:" msgid "All" -msgstr "" +msgstr "Tutti" msgid "Team" msgstr "Squadra" msgid "Human Teammates" -msgstr "" +msgstr "Compagni di squadra umani" msgid "Bot Teammates" -msgstr "" +msgstr "Compagni di squadra bot" #, c-format msgid "%u players" -msgstr "" +msgstr "%u giocatori" msgid "Choose a recipient" -msgstr "" +msgstr "Scegli un destinatario" msgid "Quick Chat:" -msgstr "" +msgstr "Chat rapida:" msgid "Lobby Chat" -msgstr "" +msgstr "Chat lobby" msgid "Requests" -msgstr "" +msgstr "Richieste" msgid "Notices" msgstr "" @@ -8250,19 +8254,19 @@ msgid "Coordination" msgstr "" msgid "Suggestions" -msgstr "" +msgstr "Suggerimenti" msgid "Cheats" -msgstr "" +msgstr "Cheat" msgid "End-Game" -msgstr "" +msgstr "Fine partita" msgid "Host" -msgstr "" +msgstr "Host" msgid "Admin" -msgstr "" +msgstr "Amministratore" #, c-format msgid "%s (%s) changed team of player (%s) to: %d" @@ -8287,37 +8291,37 @@ msgid "Can someone please transfer me trucks so I can rebuild?" msgstr "" msgid "Sorry, I don't understand. (Please use Quick Chat?)" -msgstr "" +msgstr "Mi dispiace, non capisco. (Puoi usare la chat rapida?)" msgid "I suggest: Building more units" -msgstr "" +msgstr "Suggerisco: Costruire più unità" msgid "I suggest: Building different units" -msgstr "" +msgstr "Suggerisco: Costruire unità diverse" msgid "I suggest: Checking the team strategy view" -msgstr "" +msgstr "Suggerisco: Controllare la vista della strategia del team" msgid "I suggest: Researching different tech" -msgstr "" +msgstr "Suggerisco: Ricercare tecnologie diverse" msgid "I suggest: Keeping research centers busy" -msgstr "" +msgstr "Suggerisco: Mantenere i centri di ricerca impegnati" msgid "I suggest: Building anti-air" -msgstr "" +msgstr "Suggerisco: Costruire antiaerei" msgid "I suggest: Repairing your units" -msgstr "" +msgstr "Suggerisco: Riparare le unità" msgid "I suggest: Building repair facilities" -msgstr "" +msgstr "Suggerisco: Costruire strutture di riparazione" msgid "I suggest: Building power generators" -msgstr "" +msgstr "Suggerisco: Costruire generatori di energia" msgid "I suggest: Capturing oil resources" -msgstr "" +msgstr "Suggerisco: Catturare le risorse petrolifere" msgid "Hey everyone!" msgstr "" @@ -8326,73 +8330,73 @@ msgid "Welcome!" msgstr "" msgid "I want to spectate" -msgstr "" +msgstr "Vorrei essere uno spettatore" msgid "I want to play" -msgstr "" +msgstr "Vorrei giocare" msgid "I want to switch teams" -msgstr "" +msgstr "Vorrei cambiare squadra" msgid "Please check Ready so we can start" -msgstr "" +msgstr "Per favore spunta pronto così possiamo iniziare" msgid "Please wait" -msgstr "" +msgstr "Attendere per favore" msgid "Let's go!" -msgstr "" +msgstr "Andiamo!" msgid "Almost ready" -msgstr "" +msgstr "Quasi pronto" msgid "Ready" -msgstr "" +msgstr "Pronto" msgid "Be right back" -msgstr "" +msgstr "Torno subito" msgid "I'm back" -msgstr "" +msgstr "Sono tornato" msgid "Yes" -msgstr "" +msgstr "Sì" msgid "No" -msgstr "" +msgstr "No" msgid "Maybe" -msgstr "" +msgstr "Forse" msgid "Not yet" -msgstr "" +msgstr "Non ancora" msgid "Soon" -msgstr "" +msgstr "Presto" msgid "Thank you" -msgstr "" +msgstr "Grazie" msgid "No problem" -msgstr "" +msgstr "Nessun problema" msgid "Well-played" -msgstr "" +msgstr "Ben fatto" msgid "@#%*!" -msgstr "" +msgstr "@#%*!" msgid "Sorry, I don't understand. (Use Quick Chat?)" -msgstr "" +msgstr "Mi dispiace, non capisco. (Puoi usare la chat rapida?)" msgid "Get ready..." -msgstr "" +msgstr "Preparatevi..." msgid "You're going to regret that" -msgstr "" +msgstr "Te ne pentirai" msgid "Barely a scratch!" -msgstr "" +msgstr "Appena un graffio!" msgid "Attack now?" msgstr "" @@ -8473,7 +8477,7 @@ msgid "Build power generators" msgstr "" msgid "Capture oil resources" -msgstr "" +msgstr "Cattura risorse petrolifere" msgid "That didn't go well..." msgstr "" @@ -8500,10 +8504,10 @@ msgid "Admin modified a setting" msgstr "" msgid "Bot Allies" -msgstr "" +msgstr "Bot alleati" msgid "Human Allies" -msgstr "" +msgstr "Umani alleati" msgid "You have sent too many messages in the last few seconds. Please wait and try again." msgstr "" @@ -8515,22 +8519,22 @@ msgid "Ally progress" msgstr "Progresso degli alleati" msgid "Tanks" -msgstr "" +msgstr "Carri" msgid "Cyborgs" -msgstr "" +msgstr "Cyborg" msgid "No teammates." -msgstr "" +msgstr "Nessun compagno di squadra." msgid "Waiting for other teams to finish planning." msgstr "" msgid "Weapons:" -msgstr "" +msgstr "Armi:" msgid "Units:" -msgstr "" +msgstr "Unità:" msgid "Resume Game" msgstr "Riprendi la partita" @@ -8551,7 +8555,7 @@ msgid "Go Back" msgstr "Indietro" msgid "View Guide" -msgstr "" +msgstr "Visualizza guida" msgid "Load Game" msgstr "Carica Partita" @@ -8627,13 +8631,13 @@ msgid "Please try removing any new mods - they may have issues or be incompatibl msgstr "" msgid "Loaded mod(s):" -msgstr "" +msgstr "Mod caricata/e:" msgid "Base game files may be corrupt or outdated - please try reinstalling the game." -msgstr "" +msgstr "I file di gioco potrebbero essere corrotti od obsoleti - prova a reinstallare il gioco." msgid "Error Loading Game Data" -msgstr "" +msgstr "Errore nel caricamento dei dati di gioco" msgid "Global Hotkeys" msgstr "Scorciatoie globali" @@ -10073,7 +10077,7 @@ msgid "Alt Name:" msgstr "" msgid "Player rating:" -msgstr "Valutazione del giocatore:" +msgstr "Valutazione giocatore:" msgid "Host provided" msgstr "Host fornito" @@ -10092,7 +10096,7 @@ msgid "Player is ready" msgstr "Il giocatore è pronto" msgid "Player is downloading" -msgstr "Il giocatore sta eseguendo lo scaricamento" +msgstr "Il giocatore sta scaricando" msgid "Click when ready" msgstr "Fai clic quando sei pronto" @@ -10145,7 +10149,7 @@ msgstr "Silenzia il giocatore: %s" #, c-format msgid "Unmute Player: %s" -msgstr "Riattiva chat con il giocatore: %s" +msgstr "Smuta giocatore: %s" msgid "CHAT" msgstr "CHAT" @@ -10213,7 +10217,7 @@ msgid "You have been kicked: " msgstr "Sei stato cacciato: " msgid "Connection lost:" -msgstr "" +msgstr "Connessione persa:" msgid "No connection to host." msgstr "Nessuna connessione con l'host." @@ -10240,11 +10244,11 @@ msgid "Press the start hosting button to begin hosting a game." msgstr "Premi il pulsante \"Inizia ad ospitare la partita\" per iniziare ad ospitare una partita." msgid "Port mapping creation is in progress..." -msgstr "" +msgstr "Creazione mappatura porta in corso..." #, c-format msgid "Port mapping disabled by user. Autoconfig of port %d will not happen." -msgstr "" +msgstr "Mappatura porte disattivata dall'utente. L'auto configurazione della porta %d non avverrà." msgid "Failed to load challenge:" msgstr "" @@ -10779,67 +10783,67 @@ msgid "Did not send message - free chat is disabled by host. Please use Quick Ch msgstr "" msgid "See Also:" -msgstr "" +msgstr "Vedi anche:" msgid "Game Guide" -msgstr "" +msgstr "Guida del gioco" msgid "Toggle Sidebar" -msgstr "" +msgstr "Commuta barra laterale" msgid "Disable Topic Pop-ups" msgstr "" msgid "Close Help Mode" -msgstr "" +msgstr "Chiudi modalità aiuto" msgid "Click/Tap" -msgstr "" +msgstr "Click/Tap" msgid "Right-Click" -msgstr "" +msgstr "Click destro" msgid "Click/Tap and Hold" -msgstr "" +msgstr "Clicka/tocca e tieni premuto" msgid "Other" msgstr "" msgid "Interactions:" -msgstr "" +msgstr "Interazioni:" msgid "Related Keymappings:" msgstr "" msgid "Enter password" -msgstr "" +msgstr "Inserisci password" msgid "OK" msgstr "OK" msgid "Connecting to Game" -msgstr "" +msgstr "Connessione alla partita" msgid "Status:" -msgstr "" +msgstr "Stato:" msgid "Cancel" msgstr "Cancella" msgid "Game requires a password to join" -msgstr "" +msgstr "La partita richiede una password per entrare" msgid "Unable to Join Game" -msgstr "" +msgstr "Impossibile unirsi alla partita" msgid "Error:" -msgstr "" +msgstr "Errore:" msgid "Join Attempt Rejected" -msgstr "" +msgstr "Tentativo di partecipazione rifiutato" msgid "Message from Host:" -msgstr "" +msgstr "Messaggio dall'host:" msgid "Game is full" msgstr "La partita è piena" @@ -10848,10 +10852,10 @@ msgid "You were kicked!" msgstr "Sei stato kickato!" msgid "Your game version does not match the host" -msgstr "" +msgstr "La tua versione di gioco non corrisponde all'host" msgid "The host rejected your connection due to invalid data" -msgstr "" +msgstr "L'host ha rifiutato la connessione a causa di dati non validi" msgid "Host has dropped connection!" msgstr "L'host ha terminato la connessione!" @@ -10860,25 +10864,25 @@ msgid "Connection Error" msgstr "Errore di connessione" msgid "No connections available" -msgstr "" +msgstr "Nessuna connessione disponibile" msgid "Synchronizing data with host ..." -msgstr "" +msgstr "Sincronizzazione dati con l'host..." msgid "Waiting for correct join password" -msgstr "" +msgstr "In attesa di una password di accesso corretta" msgid "Attempting to connect" -msgstr "" +msgstr "Tentativo di connessione" msgid "Establishing connection handshake" msgstr "" msgid "Coordinating join with host" -msgstr "" +msgstr "Coordinando l'accesso con l'host" msgid "Join attempt failed" -msgstr "" +msgstr "Tentativo di accesso fallito" msgid "Host did not respond before timeout" msgstr "" @@ -10902,28 +10906,28 @@ msgid "An internal error occurred" msgstr "" msgid "Invalid host - disconnected" -msgstr "" +msgstr "Host non valido - disconnesso" msgid "Invalid host response" -msgstr "" +msgstr "Risposta host invalida" msgid "Requesting to join game" -msgstr "" +msgstr "Richiesta di partecipare alla partita" msgid "Kick Spectator" -msgstr "" +msgstr "Rimuovi spettatore" msgid "Kick Player" -msgstr "" +msgstr "Espelli giocatore" msgid "Loading Status:" -msgstr "" +msgstr "Stato caricamento:" msgid "TEAM STRATEGY" -msgstr "" +msgstr "STRATEGIA DI SQUADRA" msgid "Game will start in ..." -msgstr "" +msgstr "La partita inizierà in..." msgid "Waiting for other players ..." msgstr "" @@ -10977,22 +10981,22 @@ msgid "(Tanks / Cyborgs)" msgstr "(Carri Armati / Cyborg)" msgid "Cannons" -msgstr "" +msgstr "Cannoni" msgid "Mortars" -msgstr "" +msgstr "Mortai" msgid "Missiles" -msgstr "" +msgstr "Missili" msgid "Rockets" -msgstr "" +msgstr "Razzi" msgid "Energy" -msgstr "" +msgstr "Energia" msgid "Gauss" -msgstr "" +msgstr "Gauss" msgid "Flame" msgstr "" @@ -11001,10 +11005,10 @@ msgid "Howitzers" msgstr "" msgid "MG" -msgstr "" +msgstr "MG" msgid "Machine Guns" -msgstr "" +msgstr "Mitragliatrici" msgid "Electronic" msgstr "" diff --git a/po/zh_CN.po b/po/zh_CN.po index a2f0826854e..4ad9cb058ea 100644 --- a/po/zh_CN.po +++ b/po/zh_CN.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: warzone2100\n" "Report-Msgid-Bugs-To: warzone2100-project@lists.sourceforge.net\n" "POT-Creation-Date: 2024-11-01 21:02+0000\n" -"PO-Revision-Date: 2024-11-05 02:26\n" +"PO-Revision-Date: 2024-11-09 02:23\n" "Last-Translator: \n" "Language-Team: Chinese Simplified\n" "Language: zh_CN\n" @@ -3840,7 +3840,7 @@ msgid "Combat engineer with construction ability" msgstr "战斗工程师拥有建造的能力" msgid "Combines standard, counter battery and VTOL sensors" -msgstr "包涵了标准雷达、反炮兵雷达及VTOL侦测雷达的功能" +msgstr "整合了标准雷达、反炮兵雷达及 VTOL 雷达" msgid "Command Center" msgstr "指挥中心" @@ -8093,10 +8093,10 @@ msgid "Player %u is cheating (debug menu) him/herself a new droid." msgstr "玩家 %u 利用作弊 (调式菜单) 模式建立了一个新机器人" msgid "Open In-Game Options" -msgstr "打开游戏内选项" +msgstr "打开游戏菜单" msgid "Close In-Game Options" -msgstr "关闭游戏内选项" +msgstr "关闭游戏菜单" msgid "Hiding Obsolete Tech" msgstr "隐藏过时技术" @@ -11216,7 +11216,7 @@ msgid "An unforgiving challenge for experienced players only" msgstr "仅适合有经验玩家的极限挑战" msgid "\"Classic\" campaign balance" -msgstr "“经典“战役平衡" +msgstr "“经典”战役平衡" msgid "Remastered" msgstr "重制版" @@ -11316,7 +11316,7 @@ msgid "Wrong Game Version!" msgstr "错误的游戏版本" msgid "You have an incompatible mod." -msgstr "你有一个不兼容的mod" +msgstr "您有一个不兼容的模组" msgid "Host couldn't send file?" msgstr "主玩家不能发送文件?" From 96ce8bf73a90498895b4fa6c2b98eb76a6852cfb Mon Sep 17 00:00:00 2001 From: past-due <30942300+past-due@users.noreply.github.com> Date: Wed, 13 Nov 2024 12:18:07 -0500 Subject: [PATCH 30/38] Update the ChangeLog for 4.5.5 --- ChangeLog | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/ChangeLog b/ChangeLog index 41219888359..4427cb76c90 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2024-11-13: Version 4.5.5: + * General: + * Fix: Various potential crashes (too many commits, #4124, #4127) + * Multiplayer: + * Fix: Handling certain socket disconnects and error states (commit:845dee0c21bf70cbff540aab2e277ba24999d6be, #4124) + * Translations: + * Change: Translation updates (commit:5a891f4b7d0bf110a38694514c6bbbfd6e6da95a, #4123) + * Other: + * Add: cmdinterface: New event output, room status json output (too many commits, #4128) + * Fix: Compilation with Vulkan SDK headers >= 301 (commit:7f8bb2772be83f57a41cd7caf05d84be87a57194, #4122) + 2024-11-06: Version 4.5.4: * General: * Add: In-game options button (too many commits, #4106, #4113) From 43220313d64d1d33bf739a0b930e5a2fda6319c1 Mon Sep 17 00:00:00 2001 From: KJeff01 Date: Wed, 4 Dec 2024 21:06:01 -0600 Subject: [PATCH 31/38] Improve Pylon model Co-authored-by: MaNGusT- --- data/base/features/mipylon.pie | 92 ++++++++++++++++++++-------------- 1 file changed, 55 insertions(+), 37 deletions(-) diff --git a/data/base/features/mipylon.pie b/data/base/features/mipylon.pie index 14fd5142f75..544dab40e93 100644 --- a/data/base/features/mipylon.pie +++ b/data/base/features/mipylon.pie @@ -1,41 +1,59 @@ -PIE 2 +PIE 3 TYPE 200 -TEXTURE 0 page-7-barbarians-arizona.png 256 256 +TEXTURE 0 page-7-barbarians-arizona.png 0 0 LEVELS 1 LEVEL 1 -POINTS 14 - -9 191 0 - -35 0 -23 - 35 0 -23 - 9 191 0 - -35 0 23 - 35 0 23 - 18 124 -8 - 75 151 0 - 15 152 0 - 18 124 8 - -18 124 -8 - -75 151 0 - -15 152 0 +POINTS 28 + 9 191 -0 + -35 0 -23 + -9 191 -0 + 35 0 -23 + -35 0 23 + 35 0 23 + 7.79014 188.826 -0 + -30.295 0 -19.9081 + 30.295 0 -19.9081 + -7.79014 188.826 -0 + -30.295 0 19.9081 + 30.295 0 19.9081 + 14 152 -0 + 75 151 -0 + 18 124 -8 + 18 124 8 + 14.2969 149.891 -0 + 17.7037 126.044 -6.81344 + 66.2494 149.039 -0 + 17.7037 126.044 6.81344 + -14 152 -0 + -18 124 -8 + -75 151 -0 -18 124 8 -POLYGONS 20 - 200 3 0 1 2 180 194 174 249 195 249 - 200 3 0 2 3 180 194 195 249 189 194 - 200 3 3 2 1 189 194 195 249 174 249 - 200 3 3 1 0 189 194 174 249 180 194 - 200 3 0 4 1 185 194 174 249 195 249 - 200 3 1 4 0 195 249 174 249 185 194 - 200 3 0 3 5 212 194 203 194 197 249 - 200 3 0 5 4 212 194 197 249 218 249 - 200 3 4 5 3 218 249 197 249 203 194 - 200 3 4 3 0 218 249 203 194 212 194 - 200 3 2 5 3 174 249 195 249 185 194 - 200 3 3 5 2 185 194 195 249 174 249 - 200 3 6 7 8 175 242 194 222 194 245 - 200 3 8 7 6 194 245 194 222 175 242 - 200 3 8 7 9 194 245 194 222 175 242 - 200 3 9 7 8 175 242 194 222 194 245 - 200 3 10 11 12 175 242 194 222 194 245 - 200 3 12 11 10 194 245 194 222 175 242 - 200 3 12 11 13 194 245 194 222 175 242 - 200 3 13 11 12 175 242 194 222 194 245 \ No newline at end of file + -14.2969 149.891 -0 + -66.2494 149.039 -0 + -17.7037 126.044 -6.81344 + -17.7037 126.044 6.81344 +POLYGONS 24 + 200 3 0 1 2 0.732163 0.759159 0.682297 0.97482 0.712981 0.759159 + 200 3 1 0 3 0.682297 0.97482 0.732163 0.759159 0.762847 0.97482 + 200 3 1 4 2 0.748702 0.97482 0.69577 0.97482 0.722607 0.759071 + 200 3 4 0 2 0.852521 0.97507 0.802196 0.755933 0.822784 0.755933 + 200 3 0 4 5 0.802196 0.755933 0.852521 0.97507 0.772458 0.97507 + 200 3 0 5 3 0.722613 0.759071 0.695776 0.97482 0.748709 0.97482 + 200 3 6 7 8 0.714262 0.761539 0.757423 0.974883 0.687702 0.974883 + 200 3 7 6 9 0.757423 0.974883 0.714262 0.761539 0.730865 0.761539 + 200 3 7 9 10 0.699345 0.97482 0.722623 0.763265 0.745162 0.97482 + 200 3 10 6 11 0.777622 0.974802 0.821438 0.756884 0.84733 0.974802 + 200 3 6 10 9 0.821438 0.756884 0.777622 0.974802 0.803514 0.756884 + 200 3 6 8 11 0.722624 0.762953 0.699346 0.974508 0.745163 0.974508 + 200 3 12 13 14 0.757812 0.957031 0.720928 0.867188 0.683594 0.956982 + 200 3 15 13 12 0.683594 0.956982 0.720928 0.867188 0.757812 0.957031 + 200 3 15 14 13 0.757793 0.957088 0.683519 0.957088 0.720928 0.867188 + 200 3 16 17 18 0.757812 0.957031 0.683594 0.956982 0.720928 0.867188 + 200 3 19 16 18 0.683594 0.956982 0.757812 0.957031 0.720928 0.867188 + 200 3 19 18 17 0.757793 0.957088 0.720928 0.867188 0.683519 0.957088 + 200 3 20 21 22 0.757812 0.957031 0.683594 0.956982 0.720928 0.867188 + 200 3 23 20 22 0.683594 0.956982 0.757812 0.957031 0.720928 0.867188 + 200 3 23 22 21 0.757793 0.957088 0.720928 0.867188 0.683519 0.957088 + 200 3 24 25 26 0.757812 0.957031 0.720928 0.867188 0.683594 0.956982 + 200 3 27 25 24 0.683594 0.956982 0.720928 0.867188 0.757812 0.957031 + 200 3 27 26 25 0.757793 0.957088 0.683519 0.957088 0.720928 0.867188 From d6f0bf93a422dd81544400b7798ccda218adab09 Mon Sep 17 00:00:00 2001 From: KJeff01 Date: Wed, 4 Dec 2024 21:09:11 -0600 Subject: [PATCH 32/38] Improve Crane model Co-authored-by: MaNGusT- --- data/base/features/micrane.pie | 267 ++++++++++++++++++--------------- 1 file changed, 150 insertions(+), 117 deletions(-) diff --git a/data/base/features/micrane.pie b/data/base/features/micrane.pie index 1fb5665cd0c..3713f1816e3 100644 --- a/data/base/features/micrane.pie +++ b/data/base/features/micrane.pie @@ -1,9 +1,20 @@ -PIE 2 +PIE 4 TYPE 200 -TEXTURE 0 page-7-barbarians-arizona.png 256 256 +TEXTURE 0 page-7-barbarians-arizona.png 0 0 +TEXTURE 1 page-7-barbarians-urban.png 0 0 +TEXTURE 2 page-7-barbarians-kevlar.png 0 0 LEVELS 1 LEVEL 1 -POINTS 50 +POINTS 71 + -58.943 200.092 -0 + 50.0408 181.908 9.67393 + -58.943 181.908 9.67393 + 50.0408 200.092 -0 + -58.943 181.908 -9.67393 + 50.0408 181.908 -9.67393 + -140.639 200.092 -0 + -159.279 181.908 9.67393 + -159.279 181.908 -9.67393 89 205 18 89 167 18 89 167 -17 @@ -12,136 +23,158 @@ POINTS 50 50 205 -17 50 167 -17 50 167 18 - -6 151 9 - -6 180 9 - -32 180 9 - -32 157 9 - -32 180 -9 - -6 180 -9 - -6 151 -9 - -32 157 -9 - 48 202 0 - 48 180 12 + -5.51657 150.577 9 + -31.5166 179.577 9 + -31.5166 156.577 9 + -5.51657 179.577 9 + -31.5166 179.577 -9 + -5.51657 150.577 -9 + -31.5166 156.577 -9 + -5.51657 179.577 -9 + -59 202 -0 + 50.0408 180 12 + 50.0408 202 -0 -59 180 12 - -59 202 0 - 48 180 -12 -59 180 -12 - 19 8 12 + 50.0408 180 -12 + 19 95 12 -5 8 12 + 19 8 12 -5 95 12 - 19 95 12 -5 8 -12 -5 95 -12 19 8 -12 19 95 -12 - -5 181 12 19 181 12 + -5 181 12 -5 181 -12 19 181 -12 + -142 202 -0 -164 180 12 - -142 202 0 -164 180 -12 - 27 8 0 - 17 8 18 + 27 8 -0 17 0 18 - 27 0 0 + 27 0 -0 + 17 8 18 -3 8 18 - -14 8 0 - -14 0 0 + -14 0 -0 -3 0 18 - -3 8 -18 + -14 8 -0 -3 0 -18 + -3 8 -18 17 8 -18 17 0 -18 - 6 8 0 -POLYGONS 90 - 200 3 0 1 2 140 62 140 74 125 74 - 200 3 0 2 3 140 62 125 74 125 62 - 200 3 4 5 6 125 62 140 62 140 74 - 200 3 4 6 7 125 62 140 74 125 74 - 200 3 4 7 1 52 127 38 127 38 113 - 200 3 4 1 0 52 127 38 113 52 113 - 200 3 5 4 0 38 127 24 127 24 113 - 200 3 5 0 3 38 127 24 113 38 113 - 200 3 6 5 3 52 127 38 127 38 113 - 200 3 6 3 2 52 127 38 113 52 113 - 200 3 8 9 10 59 226 59 211 52 211 - 200 3 8 10 11 59 226 52 211 52 223 - 200 3 12 13 14 59 211 52 211 52 226 - 200 3 12 14 15 59 211 52 226 59 223 - 200 3 14 13 9 29 226 29 211 35 211 - 200 3 14 9 8 29 226 35 211 35 226 - 200 3 12 15 11 210 173 210 183 203 183 - 200 3 12 11 10 210 173 203 183 203 173 - 200 3 10 9 13 96 211 105 211 105 219 - 200 3 10 13 12 96 211 105 219 96 219 - 200 3 16 17 18 190 194 179 194 174 249 - 200 3 16 18 19 190 194 174 249 195 249 - 200 3 19 18 17 195 249 174 249 179 194 - 200 3 19 17 16 195 249 179 194 190 194 - 200 3 20 16 19 190 194 179 194 174 249 - 200 3 20 19 21 190 194 174 249 195 249 - 200 3 21 19 16 195 249 174 249 179 194 - 200 3 21 16 20 195 249 179 194 190 194 - 200 3 20 17 18 213 194 202 194 197 249 - 200 3 20 18 21 213 194 197 249 218 249 - 200 3 21 18 17 218 249 197 249 202 194 - 200 3 21 17 20 218 249 202 194 213 194 - 200 3 22 23 24 174 249 195 249 191 194 - 200 3 22 24 25 174 249 191 194 178 194 - 200 3 25 24 23 178 194 191 194 195 249 - 200 3 25 23 22 178 194 195 249 174 249 - 200 3 23 26 27 197 249 218 249 214 194 - 200 3 23 27 24 197 249 214 194 201 194 - 200 3 24 27 26 201 194 214 194 218 249 - 200 3 24 26 23 201 194 218 249 197 249 - 200 3 26 28 29 174 249 195 249 191 194 - 200 3 26 29 27 174 249 191 194 178 194 - 200 3 27 29 28 178 194 191 194 195 249 - 200 3 27 28 26 178 194 195 249 174 249 - 200 3 28 22 25 174 249 195 249 191 194 - 200 3 28 25 29 174 249 191 194 178 194 - 200 3 29 25 22 178 194 191 194 195 249 - 200 3 29 22 28 178 194 195 249 174 249 - 200 3 25 24 30 174 249 195 249 191 194 - 200 3 25 30 31 174 249 191 194 178 194 - 200 3 31 30 24 178 194 191 194 195 249 - 200 3 31 24 25 178 194 195 249 174 249 - 200 3 24 27 32 197 249 218 249 214 194 - 200 3 24 32 30 197 249 214 194 201 194 - 200 3 30 32 27 201 194 214 194 218 249 - 200 3 30 27 24 201 194 218 249 197 249 - 200 3 27 29 33 174 249 195 249 191 194 - 200 3 27 33 32 174 249 191 194 178 194 - 200 3 32 33 29 178 194 191 194 195 249 - 200 3 32 29 27 178 194 195 249 174 249 - 200 3 29 25 31 174 249 195 249 191 194 - 200 3 29 31 33 174 249 191 194 178 194 - 200 3 33 31 25 178 194 191 194 195 249 - 200 3 33 25 29 178 194 195 249 174 249 - 200 3 19 18 34 190 194 179 194 174 247 - 200 3 19 34 35 190 194 174 247 195 236 - 200 3 35 34 18 195 236 174 247 179 194 - 200 3 35 18 19 195 236 179 194 190 194 - 200 3 21 19 35 190 194 179 194 174 236 - 200 3 21 35 36 190 194 174 236 195 247 - 200 3 36 35 19 195 247 174 236 179 194 - 200 3 36 19 21 195 247 179 194 190 194 - 200 3 21 18 34 213 194 202 194 197 247 - 200 3 21 34 36 213 194 197 247 218 247 - 200 3 36 34 18 218 247 197 247 202 194 - 200 3 36 18 21 218 247 202 194 213 194 - 200 3 37 38 39 196 250 217 250 217 256 - 200 3 37 39 40 196 250 217 256 196 256 - 200 3 41 42 43 217 250 196 250 196 256 - 200 3 41 43 44 217 250 196 256 217 256 - 200 3 42 45 46 196 250 175 250 175 256 - 200 3 42 46 43 196 250 175 256 196 256 - 200 3 47 37 40 175 250 196 250 196 256 - 200 3 47 40 48 175 250 196 256 175 256 - 200 3 38 37 47 166 144 170 152 166 160 - 200 3 38 47 49 166 144 166 160 162 152 - 200 3 42 41 38 154 152 158 144 166 144 - 200 3 42 38 49 154 152 166 144 162 152 - 200 3 47 45 42 166 160 158 160 154 152 - 200 3 47 42 49 166 160 154 152 162 152 \ No newline at end of file + 6 8 -0 + 17.5832 95 10.5832 + -3.58322 8 10.5832 + -3.58322 95 10.5832 + 17.5832 8 10.5832 + -3.58322 8 -10.5832 + -3.58322 95 -10.5832 + 17.5832 8 -10.5832 + 17.5832 95 -10.5832 + 17.5832 181 10.5832 + -3.58322 181 10.5832 + -3.58322 181 -10.5832 + 17.5832 181 -10.5832 +POLYGONS 100 + 200 3 0 1 2 0.761719 0.972656 0.699219 0.757812 0.679688 0.972656 + 200 3 1 0 3 0.699219 0.757812 0.761719 0.972656 0.742188 0.757812 + 200 3 4 3 0 0.761719 0.972656 0.699219 0.757812 0.679688 0.972656 + 200 3 3 4 5 0.699219 0.757812 0.761719 0.972656 0.742188 0.757812 + 200 3 4 1 5 0.851562 0.972656 0.789062 0.757812 0.832031 0.757812 + 200 3 1 4 2 0.789062 0.757812 0.851562 0.972656 0.769531 0.972656 + 200 3 6 2 7 0.761719 0.921875 0.699219 0.757812 0.679688 0.964844 + 200 3 2 6 0 0.699219 0.757812 0.761719 0.921875 0.742188 0.757812 + 200 3 8 0 6 0.761719 0.964844 0.699219 0.757812 0.679688 0.921875 + 200 3 0 8 4 0.699219 0.757812 0.761719 0.964844 0.742188 0.757812 + 200 3 8 2 4 0.851562 0.964844 0.789062 0.757812 0.832031 0.757812 + 200 3 2 8 7 0.789062 0.757812 0.851562 0.964844 0.769531 0.964844 + 200 3 7 8 6 0.681027 0.959275 0.760734 0.959275 0.720948 0.932114 + 200 3 9 10 11 0.546875 0.242188 0.546875 0.289062 0.488281 0.289062 + 200 3 9 11 12 0.546875 0.242188 0.488281 0.289062 0.488281 0.242188 + 200 3 13 14 15 0.488281 0.242188 0.546875 0.242188 0.546875 0.289062 + 200 3 13 15 16 0.488281 0.242188 0.546875 0.289062 0.488281 0.289062 + 200 3 13 16 10 0.203125 0.496094 0.148438 0.496094 0.148438 0.441406 + 200 3 13 10 9 0.203125 0.496094 0.148438 0.441406 0.203125 0.441406 + 200 3 14 13 9 0.148438 0.496094 0.09375 0.496094 0.09375 0.441406 + 200 3 14 9 12 0.148438 0.496094 0.09375 0.441406 0.148438 0.441406 + 200 3 15 14 12 0.203125 0.496094 0.148438 0.496094 0.148438 0.441406 + 200 3 15 12 11 0.203125 0.496094 0.148438 0.441406 0.203125 0.441406 + 200 3 17 18 19 0.230469 0.882812 0.203125 0.824219 0.203125 0.871094 + 200 3 18 17 20 0.203125 0.824219 0.230469 0.882812 0.230469 0.824219 + 200 3 21 22 23 0.230469 0.824219 0.203125 0.882812 0.230469 0.871094 + 200 3 22 21 24 0.203125 0.882812 0.230469 0.824219 0.203125 0.824219 + 200 3 22 20 17 0.113281 0.882812 0.136719 0.824219 0.136719 0.882812 + 200 3 20 22 24 0.136719 0.824219 0.113281 0.882812 0.113281 0.824219 + 200 3 21 19 18 0.820312 0.675781 0.792969 0.714844 0.792969 0.675781 + 200 3 19 21 23 0.792969 0.714844 0.820312 0.675781 0.820312 0.714844 + 200 3 18 24 21 0.375 0.824219 0.410156 0.855469 0.375 0.855469 + 200 3 24 18 20 0.410156 0.855469 0.375 0.824219 0.410156 0.824219 + 200 3 25 26 27 0.761719 0.972656 0.699219 0.757812 0.742188 0.757812 + 200 3 26 25 28 0.699219 0.757812 0.761719 0.972656 0.679688 0.972656 + 200 3 29 27 30 0.761719 0.972656 0.699219 0.757812 0.742188 0.757812 + 200 3 27 29 25 0.699219 0.757812 0.761719 0.972656 0.679688 0.972656 + 200 3 29 26 28 0.851562 0.972656 0.789062 0.757812 0.769531 0.972656 + 200 3 26 29 30 0.789062 0.757812 0.851562 0.972656 0.832031 0.757812 + 200 3 31 32 33 0.695312 0.757812 0.761719 0.972656 0.679688 0.972656 + 200 3 32 31 34 0.761719 0.972656 0.695312 0.757812 0.746094 0.757812 + 200 3 34 35 32 0.785156 0.757812 0.851562 0.972656 0.769531 0.972656 + 200 3 35 34 36 0.851562 0.972656 0.785156 0.757812 0.835938 0.757812 + 200 3 36 37 35 0.695312 0.757812 0.761719 0.972656 0.679688 0.972656 + 200 3 37 36 38 0.761719 0.972656 0.695312 0.757812 0.746094 0.757812 + 200 3 38 33 37 0.695312 0.757812 0.761719 0.972656 0.679688 0.972656 + 200 3 33 38 31 0.761719 0.972656 0.695312 0.757812 0.746094 0.757812 + 200 3 39 34 31 0.695312 0.757812 0.761719 0.972656 0.679688 0.972656 + 200 3 34 39 40 0.761719 0.972656 0.695312 0.757812 0.746094 0.757812 + 200 3 40 36 34 0.785156 0.757812 0.851562 0.972656 0.769531 0.972656 + 200 3 36 40 41 0.851562 0.972656 0.785156 0.757812 0.835938 0.757812 + 200 3 41 38 36 0.695312 0.757812 0.761719 0.972656 0.679688 0.972656 + 200 3 38 41 42 0.761719 0.972656 0.695312 0.757812 0.746094 0.757812 + 200 3 42 31 38 0.695312 0.757812 0.761719 0.972656 0.679688 0.972656 + 200 3 31 42 39 0.761719 0.972656 0.695312 0.757812 0.746094 0.757812 + 200 3 43 28 25 0.761719 0.921875 0.699219 0.757812 0.742188 0.757812 + 200 3 28 43 44 0.699219 0.757812 0.761719 0.921875 0.679688 0.964844 + 200 3 45 25 29 0.761719 0.964844 0.699219 0.757812 0.742188 0.757812 + 200 3 25 45 43 0.699219 0.757812 0.761719 0.964844 0.679688 0.921875 + 200 3 45 28 44 0.851562 0.964844 0.789062 0.757812 0.769531 0.964844 + 200 3 28 45 29 0.789062 0.757812 0.851562 0.964844 0.832031 0.757812 + 200 3 46 47 48 0.765625 0.978486 0.853574 0.998185 0.765625 0.998185 + 200 3 47 46 49 0.853574 0.998185 0.765625 0.978486 0.853574 0.978486 + 200 3 50 51 52 0.853574 0.978486 0.765625 0.998185 0.853574 0.998185 + 200 3 51 50 53 0.765625 0.998185 0.853574 0.978486 0.765625 0.978486 + 200 3 53 54 51 0.765625 0.978486 0.678084 0.998185 0.765625 0.998185 + 200 3 54 53 55 0.678084 0.998185 0.765625 0.978486 0.678084 0.978486 + 200 3 56 48 57 0.678084 0.978486 0.765625 0.998185 0.678084 0.998185 + 200 3 48 56 46 0.765625 0.998185 0.678084 0.978486 0.765625 0.978486 + 200 3 49 46 56 0.648438 0.5625 0.664062 0.59375 0.648438 0.625 + 200 3 49 56 58 0.648438 0.5625 0.648438 0.625 0.632812 0.59375 + 200 3 53 50 49 0.601562 0.59375 0.617188 0.5625 0.648438 0.5625 + 200 3 53 49 58 0.601562 0.59375 0.648438 0.5625 0.632812 0.59375 + 200 3 56 55 53 0.648438 0.625 0.617188 0.625 0.601562 0.59375 + 200 3 56 53 58 0.648438 0.625 0.601562 0.59375 0.632812 0.59375 + 200 3 56 54 55 0.678084 0.978486 0.732638 0.998185 0.732638 0.978486 + 200 3 54 56 57 0.732638 0.998185 0.678084 0.978486 0.678084 0.998185 + 200 3 50 47 49 0.853574 0.978486 0.790876 0.998185 0.790876 0.978486 + 200 3 47 50 52 0.790876 0.998185 0.853574 0.978486 0.853574 0.998185 + 200 3 15 10 16 0.546875 0.289062 0.488281 0.223772 0.488281 0.289062 + 200 3 10 15 11 0.488281 0.223772 0.546875 0.289062 0.546875 0.223772 + 200 3 22 19 23 0.426591 0.861178 0.357394 0.797518 0.426591 0.797518 + 200 3 19 22 17 0.357394 0.797518 0.426591 0.861178 0.357394 0.861178 + 200 3 44 43 45 0.681027 0.959275 0.720948 0.932114 0.760734 0.959275 + 200 3 59 60 61 0.695312 0.757812 0.761719 0.972656 0.746094 0.757812 + 200 3 60 59 62 0.761719 0.972656 0.695312 0.757812 0.679688 0.972656 + 200 3 61 63 64 0.785156 0.757812 0.851562 0.972656 0.835938 0.757812 + 200 3 63 61 60 0.851562 0.972656 0.785156 0.757812 0.769531 0.972656 + 200 3 64 65 66 0.695312 0.757812 0.761719 0.972656 0.746094 0.757812 + 200 3 65 64 63 0.761719 0.972656 0.695312 0.757812 0.679688 0.972656 + 200 3 66 62 59 0.695312 0.757812 0.761719 0.972656 0.746094 0.757812 + 200 3 62 66 65 0.761719 0.972656 0.695312 0.757812 0.679688 0.972656 + 200 3 67 61 68 0.695312 0.757812 0.761719 0.972656 0.746094 0.757812 + 200 3 61 67 59 0.761719 0.972656 0.695312 0.757812 0.679688 0.972656 + 200 3 68 64 69 0.785156 0.757812 0.851562 0.972656 0.835938 0.757812 + 200 3 64 68 61 0.851562 0.972656 0.785156 0.757812 0.769531 0.972656 + 200 3 69 66 70 0.695312 0.757812 0.761719 0.972656 0.746094 0.757812 + 200 3 66 69 64 0.761719 0.972656 0.695312 0.757812 0.679688 0.972656 + 200 3 70 59 67 0.695312 0.757812 0.761719 0.972656 0.746094 0.757812 + 200 3 59 70 66 0.761719 0.972656 0.695312 0.757812 0.679688 0.972656 From ab1120b4ec0ebb0a16c31c3c0da2632cccc0f583 Mon Sep 17 00:00:00 2001 From: KJeff01 Date: Wed, 4 Dec 2024 21:11:18 -0600 Subject: [PATCH 33/38] Improve Big Cooling Tower Co-authored-by: MaNGusT- --- data/base/features/micoolbig.pie | 314 ++++++++++++++++++------------- 1 file changed, 181 insertions(+), 133 deletions(-) diff --git a/data/base/features/micoolbig.pie b/data/base/features/micoolbig.pie index 22e3be56337..09ee774b777 100644 --- a/data/base/features/micoolbig.pie +++ b/data/base/features/micoolbig.pie @@ -1,137 +1,185 @@ -PIE 2 +PIE 3 TYPE 200 -TEXTURE 0 page-10-laboratories.png 256 256 +TEXTURE 0 page-10-laboratories.png 0 0 LEVELS 1 LEVEL 1 -POINTS 32 - 53 0 130 - -53 0 130 - -43 93 103 - 43 93 103 - -53 0 -130 - 53 0 -130 - 43 93 -103 - -43 93 -103 - -38 202 92 - 38 202 92 - 38 202 -92 - -38 202 -92 - -43 287 104 - 43 287 104 - 43 287 -104 - -43 287 -104 - -130 0 53 - -103 93 43 - 130 0 -53 - 103 93 -43 - -92 202 38 - 92 202 -38 - -104 287 43 - 104 287 -43 - 130 0 53 - 103 93 43 - -130 0 -53 - -103 93 -43 - 92 202 38 - -92 202 -38 - 104 287 43 - -104 287 -43 -POLYGONS 96 - 200 3 3 2 1 75 186 51 186 48 208 - 200 3 3 1 0 75 186 48 208 78 208 - 200 3 7 6 5 51 186 75 186 78 208 - 200 3 7 5 4 51 186 78 208 48 208 - 200 3 9 8 2 74 160 52 160 51 186 - 200 3 9 2 3 74 160 51 186 75 186 - 200 3 11 10 6 52 160 74 160 75 186 - 200 3 11 6 7 52 160 75 186 51 186 - 200 3 13 12 8 75 140 51 140 52 160 - 200 3 13 8 9 75 140 52 160 74 160 - 200 3 15 14 10 51 140 75 140 74 160 - 200 3 15 10 11 51 140 74 160 52 160 - 200 3 2 17 16 75 186 51 186 48 208 - 200 3 2 16 1 75 186 48 208 78 208 - 200 3 6 19 18 51 186 75 186 78 208 - 200 3 6 18 5 51 186 78 208 48 208 - 200 3 8 20 17 74 160 52 160 51 186 - 200 3 8 17 2 74 160 51 186 75 186 - 200 3 10 21 19 52 160 74 160 75 186 - 200 3 10 19 6 52 160 75 186 51 186 - 200 3 12 22 20 75 140 51 140 52 160 - 200 3 12 20 8 75 140 52 160 74 160 - 200 3 14 23 21 51 140 75 140 74 160 - 200 3 14 21 10 51 140 74 160 52 160 - 200 3 25 3 0 75 186 51 186 48 208 - 200 3 25 0 24 75 186 48 208 78 208 - 200 3 27 7 4 51 186 75 186 78 208 - 200 3 27 4 26 51 186 78 208 48 208 - 200 3 28 9 3 74 160 52 160 51 186 - 200 3 28 3 25 74 160 51 186 75 186 - 200 3 29 11 7 52 160 74 160 75 186 - 200 3 29 7 27 52 160 75 186 51 186 - 200 3 30 13 9 75 140 51 140 52 160 - 200 3 30 9 28 75 140 52 160 74 160 - 200 3 31 15 11 51 140 75 140 74 160 - 200 3 31 11 29 51 140 74 160 52 160 - 200 3 19 25 24 51 186 75 186 78 208 - 200 3 19 24 18 51 186 78 208 48 208 - 200 3 17 27 26 75 186 51 186 48 208 - 200 3 17 26 16 75 186 48 208 78 208 - 200 3 21 28 25 52 160 74 160 75 186 - 200 3 21 25 19 52 160 75 186 51 186 - 200 3 20 29 27 74 160 52 160 51 186 - 200 3 20 27 17 74 160 51 186 75 186 - 200 3 23 30 28 51 140 75 140 74 160 - 200 3 23 28 21 51 140 74 160 52 160 - 200 3 22 31 29 75 140 51 140 52 160 - 200 3 22 29 20 75 140 52 160 74 160 - 200 3 2 1 16 253 164 256 186 226 186 - 200 3 2 16 17 253 164 226 186 229 164 - 200 3 6 5 18 229 164 226 186 256 186 - 200 3 6 18 19 229 164 256 186 253 164 - 200 3 8 2 17 252 138 253 164 229 164 - 200 3 8 17 20 252 138 229 164 230 138 - 200 3 10 6 19 230 138 229 164 253 164 - 200 3 10 19 21 230 138 253 164 252 138 - 200 3 12 8 20 253 118 252 138 230 138 - 200 3 12 20 22 253 118 230 138 229 118 - 200 3 14 10 21 229 118 230 138 252 138 - 200 3 14 21 23 229 118 252 138 253 118 - 200 3 3 0 1 253 164 256 186 226 186 - 200 3 3 1 2 253 164 226 186 229 164 - 200 3 7 4 5 229 164 226 186 256 186 - 200 3 7 5 6 229 164 256 186 253 164 - 200 3 9 3 2 252 138 253 164 229 164 - 200 3 9 2 8 252 138 229 164 230 138 - 200 3 11 7 6 230 138 229 164 253 164 - 200 3 11 6 10 230 138 253 164 252 138 - 200 3 13 9 8 253 118 252 138 230 138 - 200 3 13 8 12 253 118 230 138 229 118 - 200 3 15 11 10 229 118 230 138 252 138 - 200 3 15 10 14 229 118 252 138 253 118 - 200 3 25 24 0 253 164 256 186 226 186 - 200 3 25 0 3 253 164 226 186 229 164 - 200 3 27 26 4 229 164 226 186 256 186 - 200 3 27 4 7 229 164 256 186 253 164 - 200 3 28 25 3 252 138 253 164 229 164 - 200 3 28 3 9 252 138 229 164 230 138 - 200 3 29 27 7 230 138 229 164 253 164 - 200 3 29 7 11 230 138 253 164 252 138 - 200 3 30 28 9 253 118 252 138 230 138 - 200 3 30 9 13 253 118 230 138 229 118 - 200 3 31 29 11 229 118 230 138 252 138 - 200 3 31 11 15 229 118 252 138 253 118 - 200 3 19 18 24 229 164 226 186 256 186 - 200 3 19 24 25 229 164 256 186 253 164 - 200 3 17 16 26 253 164 256 186 226 186 - 200 3 17 26 27 253 164 226 186 229 164 - 200 3 21 19 25 230 138 229 164 253 164 - 200 3 21 25 28 230 138 253 164 252 138 - 200 3 20 17 27 252 138 253 164 229 164 - 200 3 20 27 29 252 138 229 164 230 138 - 200 3 23 21 28 229 118 230 138 252 138 - 200 3 23 28 30 229 118 252 138 253 118 - 200 3 22 20 29 253 118 252 138 230 138 - 200 3 22 29 31 253 118 230 138 229 118 +POINTS 64 + 102.255 92.23 -42.105 + 102.255 92.23 42.105 + 130.325 0 52.13 + 130.325 0 -52.13 + -102.255 92.23 42.105 + -102.255 92.23 -42.105 + -130.325 0 -52.13 + -130.325 0 52.13 + 92.23 202.505 -38.095 + 92.23 202.505 38.095 + -92.23 202.505 38.095 + -92.23 202.505 -38.095 + 104.26 286.715 -42.105 + 104.26 286.715 42.105 + -104.26 286.715 42.105 + -104.26 286.715 -42.105 + 42.105 92.23 102.255 + -42.105 92.23 102.255 + -52.13 0 130.325 + 52.13 0 130.325 + -42.105 92.23 -102.255 + 42.105 92.23 -102.255 + 52.13 0 -130.325 + -52.13 0 -130.325 + 38.095 202.505 92.23 + -38.095 202.505 92.23 + -38.095 202.505 -92.23 + 38.095 202.505 -92.23 + 42.105 286.715 104.26 + -42.105 286.715 104.26 + -42.105 286.715 -104.26 + 42.105 286.715 -104.26 + 90.8189 92.23 -37.396 + 115.75 0 46.2998 + 90.8189 92.23 37.396 + 115.75 0 -46.2998 + -90.8189 92.23 37.396 + -115.75 0 -46.2998 + -90.8189 92.23 -37.396 + -115.75 0 46.2998 + 81.9151 202.505 -33.8345 + 81.9151 202.505 33.8345 + -81.9151 202.505 33.8345 + -81.9151 202.505 -33.8345 + 92.5997 286.715 -37.396 + 92.5997 286.715 37.396 + -92.5997 286.715 37.396 + -92.5997 286.715 -37.396 + 37.396 92.23 90.8189 + -46.2998 0 115.75 + -37.396 92.23 90.8189 + 46.2998 0 115.75 + -37.396 92.23 -90.8189 + 46.2998 0 -115.75 + 37.396 92.23 -90.8189 + -46.2998 0 -115.75 + 33.8345 202.505 81.9151 + -33.8345 202.505 81.9151 + -33.8345 202.505 -81.9151 + 33.8345 202.505 -81.9151 + 37.396 286.715 92.5997 + -37.396 286.715 92.5997 + -37.396 286.715 -92.5997 + 37.396 286.715 -92.5997 +POLYGONS 112 + 200 3 0 1 2 0.894647 0.637002 0.988397 0.637002 0.998365 0.720899 + 200 3 0 2 3 0.199219 0.726562 0.302938 0.810459 0.18925 0.810459 + 200 3 4 5 6 0.292969 0.726562 0.199219 0.726562 0.18925 0.810459 + 200 3 4 6 7 0.292969 0.726562 0.18925 0.810459 0.302938 0.810459 + 200 3 8 9 1 0.203125 0.625 0.289062 0.625 0.292969 0.726562 + 200 3 8 1 0 0.203125 0.625 0.292969 0.726562 0.199219 0.726562 + 200 3 10 11 5 0.289062 0.625 0.203125 0.625 0.199219 0.726562 + 200 3 10 5 4 0.289062 0.625 0.199219 0.726562 0.292969 0.726562 + 200 3 12 13 9 0.199219 0.548599 0.292969 0.548599 0.289062 0.625 + 200 3 12 9 8 0.199219 0.548599 0.289062 0.625 0.203125 0.625 + 200 3 14 15 11 0.292969 0.548599 0.199219 0.548599 0.203125 0.625 + 200 3 14 11 10 0.292969 0.548599 0.203125 0.625 0.289062 0.625 + 200 3 16 17 18 0.292969 0.726562 0.199219 0.726562 0.18925 0.810459 + 200 3 16 18 19 0.292969 0.726562 0.18925 0.810459 0.302938 0.810459 + 200 3 20 21 22 0.199219 0.726562 0.292969 0.726562 0.302938 0.810459 + 200 3 20 22 23 0.199219 0.726562 0.302938 0.810459 0.18925 0.810459 + 200 3 24 25 17 0.289062 0.625 0.203125 0.625 0.199219 0.726562 + 200 3 24 17 16 0.289062 0.625 0.199219 0.726562 0.292969 0.726562 + 200 3 26 27 21 0.203125 0.625 0.289062 0.625 0.292969 0.726562 + 200 3 26 21 20 0.203125 0.625 0.292969 0.726562 0.199219 0.726562 + 200 3 28 29 25 0.292969 0.548599 0.199219 0.548599 0.203125 0.625 + 200 3 28 25 24 0.292969 0.548599 0.203125 0.625 0.289062 0.625 + 200 3 30 31 27 0.199219 0.548599 0.292969 0.548599 0.289062 0.625 + 200 3 30 27 26 0.199219 0.548599 0.289062 0.625 0.203125 0.625 + 200 3 17 4 7 0.292969 0.726562 0.199219 0.726562 0.18925 0.810459 + 200 3 17 7 18 0.292969 0.726562 0.18925 0.810459 0.302938 0.810459 + 200 3 21 0 3 0.199219 0.726562 0.292969 0.726562 0.302938 0.810459 + 200 3 21 3 22 0.199219 0.726562 0.302938 0.810459 0.18925 0.810459 + 200 3 25 10 4 0.289062 0.625 0.203125 0.625 0.199219 0.726562 + 200 3 25 4 17 0.289062 0.625 0.199219 0.726562 0.292969 0.726562 + 200 3 27 8 0 0.203125 0.625 0.289062 0.625 0.292969 0.726562 + 200 3 27 0 21 0.203125 0.625 0.292969 0.726562 0.199219 0.726562 + 200 3 29 14 10 0.292969 0.548599 0.199219 0.548599 0.203125 0.625 + 200 3 29 10 25 0.292969 0.548599 0.203125 0.625 0.289062 0.625 + 200 3 31 12 8 0.199219 0.548599 0.292969 0.548599 0.289062 0.625 + 200 3 31 8 27 0.199219 0.548599 0.289062 0.625 0.203125 0.625 + 200 3 1 16 19 0.292969 0.726562 0.199219 0.726562 0.18925 0.810459 + 200 3 1 19 2 0.292969 0.726562 0.18925 0.810459 0.302938 0.810459 + 200 3 5 20 23 0.199219 0.726562 0.292969 0.726562 0.302938 0.810459 + 200 3 5 23 6 0.199219 0.726562 0.302938 0.810459 0.18925 0.810459 + 200 3 9 24 16 0.289062 0.625 0.203125 0.625 0.199219 0.726562 + 200 3 9 16 1 0.289062 0.625 0.199219 0.726562 0.292969 0.726562 + 200 3 11 26 20 0.203125 0.625 0.289062 0.625 0.292969 0.726562 + 200 3 11 20 5 0.203125 0.625 0.292969 0.726562 0.199219 0.726562 + 200 3 13 28 24 0.292969 0.548599 0.199219 0.548599 0.203125 0.625 + 200 3 13 24 9 0.292969 0.548599 0.203125 0.625 0.289062 0.625 + 200 3 15 30 26 0.199219 0.548599 0.292969 0.548599 0.289062 0.625 + 200 3 15 26 11 0.199219 0.548599 0.289062 0.625 0.203125 0.625 + 200 3 32 33 34 0.894647 0.637002 0.998365 0.720899 0.988397 0.637002 + 200 3 32 35 33 0.894647 0.637002 0.884678 0.720899 0.998365 0.720899 + 200 3 36 37 38 0.988397 0.637002 0.884678 0.720899 0.894647 0.637002 + 200 3 36 39 37 0.988397 0.637002 0.998365 0.720899 0.884678 0.720899 + 200 3 40 34 41 0.898553 0.53544 0.988397 0.637002 0.98449 0.53544 + 200 3 40 32 34 0.898553 0.53544 0.894647 0.637002 0.988397 0.637002 + 200 3 42 38 43 0.98449 0.53544 0.894647 0.637002 0.898553 0.53544 + 200 3 42 36 38 0.98449 0.53544 0.988397 0.637002 0.894647 0.637002 + 200 3 44 41 45 0.894647 0.459039 0.98449 0.53544 0.988397 0.459039 + 200 3 44 40 41 0.894647 0.459039 0.898553 0.53544 0.98449 0.53544 + 200 3 46 43 47 0.988397 0.459039 0.898553 0.53544 0.894647 0.459039 + 200 3 46 42 43 0.988397 0.459039 0.98449 0.53544 0.898553 0.53544 + 200 3 48 49 50 0.988397 0.637002 0.884678 0.720899 0.894647 0.637002 + 200 3 48 51 49 0.988397 0.637002 0.998365 0.720899 0.884678 0.720899 + 200 3 52 53 54 0.894647 0.637002 0.998365 0.720899 0.988397 0.637002 + 200 3 52 55 53 0.894647 0.637002 0.884678 0.720899 0.998365 0.720899 + 200 3 56 50 57 0.98449 0.53544 0.894647 0.637002 0.898553 0.53544 + 200 3 56 48 50 0.98449 0.53544 0.988397 0.637002 0.894647 0.637002 + 200 3 58 54 59 0.898553 0.53544 0.988397 0.637002 0.98449 0.53544 + 200 3 58 52 54 0.898553 0.53544 0.894647 0.637002 0.988397 0.637002 + 200 3 60 57 61 0.988397 0.459039 0.898553 0.53544 0.894647 0.459039 + 200 3 60 56 57 0.988397 0.459039 0.98449 0.53544 0.898553 0.53544 + 200 3 62 59 63 0.894647 0.459039 0.98449 0.53544 0.988397 0.459039 + 200 3 62 58 59 0.894647 0.459039 0.898553 0.53544 0.98449 0.53544 + 200 3 50 39 36 0.988397 0.637002 0.884678 0.720899 0.894647 0.637002 + 200 3 50 49 39 0.988397 0.637002 0.998365 0.720899 0.884678 0.720899 + 200 3 54 35 32 0.894647 0.637002 0.998365 0.720899 0.988397 0.637002 + 200 3 54 53 35 0.894647 0.637002 0.884678 0.720899 0.998365 0.720899 + 200 3 57 36 42 0.98449 0.53544 0.894647 0.637002 0.898553 0.53544 + 200 3 57 50 36 0.98449 0.53544 0.988397 0.637002 0.894647 0.637002 + 200 3 59 32 40 0.898553 0.53544 0.988397 0.637002 0.98449 0.53544 + 200 3 59 54 32 0.898553 0.53544 0.894647 0.637002 0.988397 0.637002 + 200 3 61 42 46 0.988397 0.459039 0.898553 0.53544 0.894647 0.459039 + 200 3 61 57 42 0.988397 0.459039 0.98449 0.53544 0.898553 0.53544 + 200 3 63 40 44 0.894647 0.459039 0.98449 0.53544 0.988397 0.459039 + 200 3 63 59 40 0.894647 0.459039 0.898553 0.53544 0.98449 0.53544 + 200 3 34 51 48 0.988397 0.637002 0.884678 0.720899 0.894647 0.637002 + 200 3 34 33 51 0.988397 0.637002 0.998365 0.720899 0.884678 0.720899 + 200 3 38 55 52 0.894647 0.637002 0.998365 0.720899 0.988397 0.637002 + 200 3 38 37 55 0.894647 0.637002 0.884678 0.720899 0.998365 0.720899 + 200 3 41 48 56 0.98449 0.53544 0.894647 0.637002 0.898553 0.53544 + 200 3 41 34 48 0.98449 0.53544 0.988397 0.637002 0.894647 0.637002 + 200 3 43 52 58 0.898553 0.53544 0.988397 0.637002 0.98449 0.53544 + 200 3 43 38 52 0.898553 0.53544 0.894647 0.637002 0.988397 0.637002 + 200 3 45 56 60 0.988397 0.459039 0.898553 0.53544 0.894647 0.459039 + 200 3 45 41 56 0.988397 0.459039 0.98449 0.53544 0.898553 0.53544 + 200 3 47 58 62 0.894647 0.459039 0.98449 0.53544 0.988397 0.459039 + 200 3 47 43 58 0.894647 0.459039 0.898553 0.53544 0.98449 0.53544 + 200 3 12 45 13 0.199219 0.548599 0.292969 0.548599 0.292969 0.548599 + 200 3 45 12 44 0.292969 0.548599 0.199219 0.548599 0.199219 0.548599 + 200 3 13 60 28 0.292969 0.548599 0.199219 0.548599 0.199219 0.548599 + 200 3 60 13 45 0.199219 0.548599 0.292969 0.548599 0.292969 0.548599 + 200 3 28 61 29 0.292969 0.548599 0.199219 0.548599 0.199219 0.548599 + 200 3 61 28 60 0.199219 0.548599 0.292969 0.548599 0.292969 0.548599 + 200 3 29 46 14 0.292969 0.548599 0.199219 0.548599 0.199219 0.548599 + 200 3 46 29 61 0.199219 0.548599 0.292969 0.548599 0.292969 0.548599 + 200 3 14 47 15 0.292969 0.548599 0.199219 0.548599 0.199219 0.548599 + 200 3 47 14 46 0.199219 0.548599 0.292969 0.548599 0.292969 0.548599 + 200 3 15 62 30 0.199219 0.548599 0.292969 0.548599 0.292969 0.548599 + 200 3 62 15 47 0.292969 0.548599 0.199219 0.548599 0.199219 0.548599 + 200 3 30 63 31 0.199219 0.548599 0.292969 0.548599 0.292969 0.548599 + 200 3 63 30 62 0.292969 0.548599 0.199219 0.548599 0.199219 0.548599 + 200 3 31 44 12 0.199219 0.548599 0.292969 0.548599 0.292969 0.548599 + 200 3 44 31 63 0.292969 0.548599 0.199219 0.548599 0.199219 0.548599 CONNECTORS 1 - 0 0 202 + 0 0 200 From 2e4d91bc238b9283554592865e1ab5033216fe62 Mon Sep 17 00:00:00 2001 From: KJeff01 Date: Wed, 4 Dec 2024 21:12:34 -0600 Subject: [PATCH 34/38] Improve Water Tower model Co-authored-by: MaNGusT- --- data/base/features/miwatow.pie | 141 ++++++++++++++------------------- 1 file changed, 60 insertions(+), 81 deletions(-) diff --git a/data/base/features/miwatow.pie b/data/base/features/miwatow.pie index 069a0fae78e..da8e2a7c22e 100644 --- a/data/base/features/miwatow.pie +++ b/data/base/features/miwatow.pie @@ -1,92 +1,71 @@ -PIE 2 +PIE 3 TYPE 200 -TEXTURE 0 page-7-barbarians-arizona.png 256 256 +TEXTURE 0 page-7-barbarians-arizona.png 0 0 LEVELS 1 LEVEL 1 -POINTS 33 - 13 65 13 - 13 65 12 - 13 67 13 - 13 71 -13 - 13 70 -13 - 19 1 -3 - 19 1 20 - 13 71 13 - 15 108 9 - 21 65 0 - 21 108 0 - -13 71 -13 - -13 71 13 - -20 1 20 - -20 1 -3 - -13 64 -13 - -22 108 0 - -22 65 0 - -14 65 13 - -16 108 9 +POINTS 28 + 19 0 20 + 13 65.099 -13 + 13 65.099 13 + 19 0 -19 + -20 0 20 + -13 65.099 13 + -13 65.099 -13 + -20 0 -19 + 16.3555 0 17.2868 + 11.1798 65.099 -11.1798 + 16.3555 0 -16.3555 + 11.1798 65.099 11.2484 + -17.2868 0 17.2868 + -11.2484 65.099 11.2484 + -11.2484 65.099 -11.1798 + -17.2868 0 -16.3555 10 108 19 + 21 65 -0 + 21 108 -0 10 65 19 + -22 108 -0 -11 65 19 -11 108 19 - 12 65 -13 - 14 108 -9 - 19 1 -19 - -10 1 -19 + -22 65 -0 10 65 -18 10 108 -18 -11 108 -18 -11 65 -18 - -20 1 -19 -POLYGONS 52 - 200 3 0 1 2 210 254 209 254 209 253 - 200 3 3 4 5 176 192 175 192 182 232 - 200 3 3 5 6 176 192 182 232 194 232 - 200 3 6 5 4 194 232 182 232 175 192 - 200 3 6 4 3 194 232 175 192 176 192 - 200 3 7 3 6 191 192 176 192 194 232 - 200 3 6 3 7 194 232 176 192 191 192 - 200 3 8 2 1 206 251 209 253 209 254 - 200 3 8 1 9 206 251 209 254 200 254 - 200 3 8 9 10 206 251 200 254 200 251 - 200 3 11 12 13 177 192 192 192 194 232 - 200 3 12 11 13 192 192 177 192 194 232 - 200 3 13 14 15 194 232 182 232 176 195 - 200 3 13 15 11 194 232 176 195 177 192 - 200 3 11 15 14 177 192 176 195 182 232 - 200 3 11 14 13 177 192 182 232 194 232 - 200 3 16 17 18 195 251 195 254 209 254 - 200 3 16 18 19 195 251 209 254 204 251 - 200 3 12 6 13 177 192 195 248 173 248 - 200 3 6 12 7 195 248 177 192 192 192 - 200 3 7 12 13 192 192 177 192 173 248 - 200 3 6 7 13 195 248 192 192 173 248 - 200 3 20 21 0 214 251 214 254 210 254 - 200 3 20 0 8 214 251 210 254 206 251 - 200 3 22 23 19 215 254 215 251 204 251 - 200 3 22 19 18 215 254 204 251 209 254 - 200 3 20 23 22 215 251 199 251 199 254 - 200 3 20 22 21 215 251 199 254 215 254 - 200 3 10 9 24 194 251 194 254 178 254 - 200 3 10 24 25 194 251 178 254 183 251 - 200 3 5 4 26 182 232 175 192 174 232 - 200 3 26 4 5 174 232 175 192 182 232 - 200 3 11 15 27 199 192 198 197 201 248 - 200 3 11 27 26 199 192 201 248 218 248 - 200 3 26 27 15 218 248 201 248 198 197 - 200 3 26 15 11 218 248 198 197 199 192 - 200 3 3 11 26 214 192 199 192 218 248 - 200 3 26 11 3 218 248 199 192 214 192 - 200 3 28 29 25 174 254 174 251 183 251 - 200 3 28 25 24 174 254 183 251 178 254 - 200 3 30 29 28 199 251 215 251 215 254 - 200 3 30 28 31 199 251 215 254 199 254 - 200 3 16 30 31 199 251 184 251 184 254 - 200 3 16 31 17 199 251 184 254 199 254 - 200 3 27 15 32 201 248 198 197 196 248 - 200 3 32 15 27 196 248 198 197 201 248 - 200 3 15 14 32 176 195 182 232 174 232 - 200 3 32 14 15 174 232 182 232 176 195 - 200 3 10 29 23 168 148 169 155 156 150 - 200 3 10 23 20 168 148 156 150 161 146 - 200 3 23 29 30 156 150 169 155 164 159 - 200 3 23 30 16 156 150 164 159 157 157 \ No newline at end of file +POLYGONS 36 + 200 3 0 1 2 0.757812 0.90625 0.6875 0.75 0.746094 0.75 + 200 3 1 0 3 0.6875 0.75 0.757812 0.90625 0.679688 0.90625 + 200 3 2 4 0 0.75 0.75 0.675781 0.96875 0.761719 0.96875 + 200 3 4 2 5 0.675781 0.96875 0.75 0.75 0.691406 0.75 + 200 3 3 6 1 0.851562 0.96875 0.773438 0.769531 0.835938 0.75 + 200 3 6 3 7 0.773438 0.769531 0.851562 0.96875 0.765625 0.96875 + 200 3 6 4 5 0.6875 0.761719 0.757812 0.90625 0.75 0.75 + 200 3 4 6 7 0.757812 0.90625 0.6875 0.761719 0.679688 0.90625 + 200 3 8 9 10 0.757812 0.90625 0.6875 0.75 0.679688 0.90625 + 200 3 9 8 11 0.6875 0.75 0.757812 0.90625 0.746094 0.75 + 200 3 11 12 13 0.75 0.75 0.675781 0.96875 0.691406 0.75 + 200 3 12 11 8 0.675781 0.96875 0.75 0.75 0.761719 0.96875 + 200 3 10 14 15 0.851562 0.96875 0.773438 0.769531 0.765625 0.96875 + 200 3 14 10 9 0.773438 0.769531 0.851562 0.96875 0.835938 0.75 + 200 3 14 12 15 0.6875 0.761719 0.757812 0.90625 0.679688 0.90625 + 200 3 12 14 13 0.757812 0.90625 0.6875 0.761719 0.75 0.75 + 200 3 16 17 18 0.848569 0.978612 0.789022 0.997697 0.789022 0.978612 + 200 3 17 16 19 0.789022 0.997697 0.848569 0.978612 0.848596 0.997697 + 200 3 20 21 22 0.767755 0.978612 0.852822 0.997697 0.852822 0.978612 + 200 3 21 20 23 0.852822 0.997697 0.767755 0.978612 0.767755 0.997697 + 200 3 16 21 19 0.852822 0.978612 0.784768 0.997697 0.852822 0.997697 + 200 3 21 16 22 0.784768 0.997697 0.852822 0.978612 0.784768 0.978612 + 200 3 18 24 25 0.763501 0.978612 0.678436 0.997697 0.678436 0.978612 + 200 3 24 18 17 0.678436 0.997697 0.763501 0.978612 0.763501 0.997697 + 200 3 26 24 27 0.784768 0.978612 0.852822 0.997697 0.784768 0.997697 + 200 3 24 26 25 0.852822 0.997697 0.784768 0.978612 0.852822 0.978612 + 200 3 20 27 23 0.784768 0.978612 0.720968 0.997697 0.784768 0.997697 + 200 3 27 20 26 0.720968 0.997697 0.784768 0.978612 0.720968 0.978612 + 200 3 18 25 22 0.654557 0.576447 0.658542 0.604338 0.606745 0.584416 + 200 3 18 22 16 0.654557 0.576447 0.606745 0.584416 0.626667 0.568478 + 200 3 22 25 26 0.606745 0.584416 0.658542 0.604338 0.63862 0.620275 + 200 3 22 26 20 0.606745 0.584416 0.63862 0.620275 0.610729 0.612306 + 200 3 24 23 27 0.661289 0.594221 0.618672 0.568974 0.647123 0.569684 + 200 3 23 19 21 0.618672 0.568974 0.618059 0.61918 0.603893 0.594643 + 200 3 24 19 23 0.661289 0.594221 0.618059 0.61918 0.618672 0.568974 + 200 3 17 19 24 0.647679 0.619215 0.618059 0.61918 0.661289 0.594221 From 7856e43afc784e1e61796ad464775db37e0e945d Mon Sep 17 00:00:00 2001 From: KJeff01 Date: Wed, 4 Dec 2024 21:14:21 -0600 Subject: [PATCH 35/38] Improve Cooling Tower Co-authored-by: MaNGusT- --- data/base/structs/micool.pie | 310 ++++++++++++++++++++--------------- 1 file changed, 179 insertions(+), 131 deletions(-) diff --git a/data/base/structs/micool.pie b/data/base/structs/micool.pie index 3de9db0e537..a481de7b4e5 100644 --- a/data/base/structs/micool.pie +++ b/data/base/structs/micool.pie @@ -1,135 +1,183 @@ -PIE 2 +PIE 3 TYPE 200 -TEXTURE 0 page-10-laboratories.png 256 256 +TEXTURE 0 page-10-laboratories.png 0 0 LEVELS 1 LEVEL 1 -POINTS 32 - 65 0 -26 - 65 0 26 - 51 46 21 - 51 46 -21 - -65 0 26 - -65 0 -26 - -51 46 -21 - -51 46 21 - 46 101 19 - 46 101 -19 - -46 101 -19 - -46 101 19 - 52 143 21 - 52 143 -21 - -52 143 -21 - -52 143 21 - 26 0 65 - -26 0 65 - -21 46 51 - 21 46 51 - -26 0 -65 - 26 0 -65 - 21 46 -51 - -21 46 -51 - -19 101 46 - 19 101 46 - 19 101 -46 - -19 101 -46 - -21 143 52 - 21 143 52 - 21 143 -52 +POINTS 64 + 51 46 -21 + 51 46 21 + 65 0 26 + 65 0 -26 + -51 46 21 + -51 46 -21 + -65 0 -26 + -65 0 26 + 46 101 -19 + 46 101 19 + -46 101 19 + -46 101 -19 + 52 143 -21 + 52 143 21 + -52 143 21 + -52 143 -21 + 21 46 51 + -21 46 51 + -26 0 65 + 26 0 65 + -21 46 -51 + 21 46 -51 + 26 0 -65 + -26 0 -65 + 19 101 46 + -19 101 46 + -19 101 -46 + 19 101 -46 + 21 143 52 + -21 143 52 -21 143 -52 -POLYGONS 96 - 200 3 0 1 2 48 208 78 208 75 186 - 200 3 0 2 3 48 208 75 186 51 186 - 200 3 3 2 1 51 186 75 186 78 208 - 200 3 3 1 0 51 186 78 208 48 208 - 200 3 4 5 6 78 208 48 208 51 186 - 200 3 4 6 7 78 208 51 186 75 186 - 200 3 7 6 5 75 186 51 186 48 208 - 200 3 7 5 4 75 186 48 208 78 208 - 200 3 3 2 8 51 186 75 186 74 160 - 200 3 3 8 9 51 186 74 160 52 160 - 200 3 9 8 2 52 160 74 160 75 186 - 200 3 9 2 3 52 160 75 186 51 186 - 200 3 7 6 10 75 186 51 186 52 160 - 200 3 7 10 11 75 186 52 160 74 160 - 200 3 11 10 6 74 160 52 160 51 186 - 200 3 11 6 7 74 160 51 186 75 186 - 200 3 9 8 12 52 160 74 160 75 140 - 200 3 9 12 13 52 160 75 140 51 140 - 200 3 13 12 8 51 140 75 140 74 160 - 200 3 13 8 9 51 140 74 160 52 160 - 200 3 11 10 14 74 160 52 160 51 140 - 200 3 11 14 15 74 160 51 140 75 140 - 200 3 15 14 10 75 140 51 140 52 160 - 200 3 15 10 11 75 140 52 160 74 160 - 200 3 16 17 18 78 208 48 208 51 186 - 200 3 16 18 19 78 208 51 186 75 186 - 200 3 19 18 17 75 186 51 186 48 208 - 200 3 19 17 16 75 186 48 208 78 208 - 200 3 20 21 22 48 208 78 208 75 186 - 200 3 20 22 23 48 208 75 186 51 186 - 200 3 23 22 21 51 186 75 186 78 208 - 200 3 23 21 20 51 186 78 208 48 208 - 200 3 19 18 24 75 186 51 186 52 160 - 200 3 19 24 25 75 186 52 160 74 160 - 200 3 25 24 18 74 160 52 160 51 186 - 200 3 25 18 19 74 160 51 186 75 186 - 200 3 23 22 26 51 186 75 186 74 160 - 200 3 23 26 27 51 186 74 160 52 160 - 200 3 27 26 22 52 160 74 160 75 186 - 200 3 27 22 23 52 160 75 186 51 186 - 200 3 25 24 28 74 160 52 160 51 140 - 200 3 25 28 29 74 160 51 140 75 140 - 200 3 29 28 24 75 140 51 140 52 160 - 200 3 29 24 25 75 140 52 160 74 160 - 200 3 27 26 30 52 160 74 160 75 140 - 200 3 27 30 31 52 160 75 140 51 140 - 200 3 31 30 26 51 140 75 140 74 160 - 200 3 31 26 27 51 140 74 160 52 160 - 200 3 17 4 7 78 208 48 208 51 186 - 200 3 17 7 18 78 208 51 186 75 186 - 200 3 18 7 4 75 186 51 186 48 208 - 200 3 18 4 17 75 186 48 208 78 208 - 200 3 21 0 3 48 208 78 208 75 186 - 200 3 21 3 22 48 208 75 186 51 186 - 200 3 22 3 0 51 186 75 186 78 208 - 200 3 22 0 21 51 186 78 208 48 208 - 200 3 18 7 11 75 186 51 186 52 160 - 200 3 18 11 24 75 186 52 160 74 160 - 200 3 24 11 7 74 160 52 160 51 186 - 200 3 24 7 18 74 160 51 186 75 186 - 200 3 22 3 9 51 186 75 186 74 160 - 200 3 22 9 26 51 186 74 160 52 160 - 200 3 26 9 3 52 160 74 160 75 186 - 200 3 26 3 22 52 160 75 186 51 186 - 200 3 24 11 15 74 160 52 160 51 140 - 200 3 24 15 28 74 160 51 140 75 140 - 200 3 28 15 11 75 140 51 140 52 160 - 200 3 28 11 24 75 140 52 160 74 160 - 200 3 26 9 13 52 160 74 160 75 140 - 200 3 26 13 30 52 160 75 140 51 140 - 200 3 30 13 9 51 140 75 140 74 160 - 200 3 30 9 26 51 140 74 160 52 160 - 200 3 1 16 19 78 208 48 208 51 186 - 200 3 1 19 2 78 208 51 186 75 186 - 200 3 2 19 16 75 186 51 186 48 208 - 200 3 2 16 1 75 186 48 208 78 208 - 200 3 5 20 23 48 208 78 208 75 186 - 200 3 5 23 6 48 208 75 186 51 186 - 200 3 6 23 20 51 186 75 186 78 208 - 200 3 6 20 5 51 186 78 208 48 208 - 200 3 2 19 25 75 186 51 186 52 160 - 200 3 2 25 8 75 186 52 160 74 160 - 200 3 8 25 19 74 160 52 160 51 186 - 200 3 8 19 2 74 160 51 186 75 186 - 200 3 6 23 27 51 186 75 186 74 160 - 200 3 6 27 10 51 186 74 160 52 160 - 200 3 10 27 23 52 160 74 160 75 186 - 200 3 10 23 6 52 160 75 186 51 186 - 200 3 8 25 29 74 160 52 160 51 140 - 200 3 8 29 12 74 160 51 140 75 140 - 200 3 12 29 25 75 140 51 140 52 160 - 200 3 12 25 8 75 140 52 160 74 160 - 200 3 10 27 31 52 160 74 160 75 140 - 200 3 10 31 14 52 160 75 140 51 140 - 200 3 14 31 27 51 140 75 140 74 160 - 200 3 14 27 10 51 140 74 160 52 160 \ No newline at end of file + 21 143 -52 + 45.2962 46 -18.6514 + 57.7305 0 23.0922 + 45.2962 46 18.6514 + 57.7305 0 -23.0922 + -45.2962 46 18.6514 + -57.7305 0 -23.0922 + -45.2962 46 -18.6514 + -57.7305 0 23.0922 + 40.8554 101 -16.8751 + 40.8554 101 16.8751 + -40.8554 101 16.8751 + -40.8554 101 -16.8751 + 46.1844 143 -18.6514 + 46.1844 143 18.6514 + -46.1844 143 18.6514 + -46.1844 143 -18.6514 + 18.6514 46 45.2962 + -23.0922 0 57.7305 + -18.6514 46 45.2962 + 23.0922 0 57.7305 + -18.6514 46 -45.2962 + 23.0922 0 -57.7305 + 18.6514 46 -45.2962 + -23.0922 0 -57.7305 + 16.8751 101 40.8554 + -16.8751 101 40.8554 + -16.8751 101 -40.8554 + 16.8751 101 -40.8554 + 18.6514 143 46.1844 + -18.6514 143 46.1844 + -18.6514 143 -46.1844 + 18.6514 143 -46.1844 +POLYGONS 112 + 200 3 0 1 2 0.199219 0.726562 0.292969 0.726562 0.30293 0.81093 + 200 3 0 2 3 0.199219 0.726562 0.30293 0.81093 0.189258 0.81093 + 200 3 4 5 6 0.292969 0.726562 0.199219 0.726562 0.189258 0.81093 + 200 3 4 6 7 0.292969 0.726562 0.189258 0.81093 0.30293 0.81093 + 200 3 8 9 1 0.203125 0.625 0.289062 0.625 0.292969 0.726562 + 200 3 8 1 0 0.203125 0.625 0.292969 0.726562 0.199219 0.726562 + 200 3 10 11 5 0.289062 0.625 0.203125 0.625 0.199219 0.726562 + 200 3 10 5 4 0.289062 0.625 0.199219 0.726562 0.292969 0.726562 + 200 3 12 13 9 0.199219 0.548712 0.292969 0.548712 0.289062 0.625 + 200 3 12 9 8 0.199219 0.548712 0.289062 0.625 0.203125 0.625 + 200 3 14 15 11 0.292969 0.548712 0.199219 0.548712 0.203125 0.625 + 200 3 14 11 10 0.292969 0.548712 0.203125 0.625 0.289062 0.625 + 200 3 16 17 18 0.292969 0.726562 0.199219 0.726562 0.189258 0.81093 + 200 3 16 18 19 0.292969 0.726562 0.189258 0.81093 0.30293 0.81093 + 200 3 20 21 22 0.199219 0.726562 0.292969 0.726562 0.30293 0.81093 + 200 3 20 22 23 0.199219 0.726562 0.30293 0.81093 0.189258 0.81093 + 200 3 24 25 17 0.289062 0.625 0.203125 0.625 0.199219 0.726562 + 200 3 24 17 16 0.289062 0.625 0.199219 0.726562 0.292969 0.726562 + 200 3 26 27 21 0.203125 0.625 0.289062 0.625 0.292969 0.726562 + 200 3 26 21 20 0.203125 0.625 0.292969 0.726562 0.199219 0.726562 + 200 3 28 29 25 0.292969 0.548712 0.199219 0.548712 0.203125 0.625 + 200 3 28 25 24 0.292969 0.548712 0.203125 0.625 0.289062 0.625 + 200 3 30 31 27 0.199219 0.548712 0.292969 0.548712 0.289062 0.625 + 200 3 30 27 26 0.199219 0.548712 0.289062 0.625 0.203125 0.625 + 200 3 17 4 7 0.292969 0.726562 0.199219 0.726562 0.189258 0.81093 + 200 3 17 7 18 0.292969 0.726562 0.189258 0.81093 0.30293 0.81093 + 200 3 21 0 3 0.199219 0.726562 0.292969 0.726562 0.30293 0.81093 + 200 3 21 3 22 0.199219 0.726562 0.30293 0.81093 0.189258 0.81093 + 200 3 25 10 4 0.289062 0.625 0.203125 0.625 0.199219 0.726562 + 200 3 25 4 17 0.289062 0.625 0.199219 0.726562 0.292969 0.726562 + 200 3 27 8 0 0.203125 0.625 0.289062 0.625 0.292969 0.726562 + 200 3 27 0 21 0.203125 0.625 0.292969 0.726562 0.199219 0.726562 + 200 3 29 14 10 0.292969 0.548712 0.199219 0.548712 0.203125 0.625 + 200 3 29 10 25 0.292969 0.548712 0.203125 0.625 0.289062 0.625 + 200 3 31 12 8 0.199219 0.548712 0.292969 0.548712 0.289062 0.625 + 200 3 31 8 27 0.199219 0.548712 0.289062 0.625 0.203125 0.625 + 200 3 1 16 19 0.292969 0.726562 0.199219 0.726562 0.189258 0.81093 + 200 3 1 19 2 0.292969 0.726562 0.189258 0.81093 0.30293 0.81093 + 200 3 5 20 23 0.199219 0.726562 0.292969 0.726562 0.30293 0.81093 + 200 3 5 23 6 0.199219 0.726562 0.30293 0.81093 0.189258 0.81093 + 200 3 9 24 16 0.289062 0.625 0.203125 0.625 0.199219 0.726562 + 200 3 9 16 1 0.289062 0.625 0.199219 0.726562 0.292969 0.726562 + 200 3 11 26 20 0.203125 0.625 0.289062 0.625 0.292969 0.726562 + 200 3 11 20 5 0.203125 0.625 0.292969 0.726562 0.199219 0.726562 + 200 3 13 28 24 0.292969 0.548712 0.199219 0.548712 0.203125 0.625 + 200 3 13 24 9 0.292969 0.548712 0.203125 0.625 0.289062 0.625 + 200 3 15 30 26 0.199219 0.548712 0.292969 0.548712 0.289062 0.625 + 200 3 15 26 11 0.199219 0.548712 0.289062 0.625 0.203125 0.625 + 200 3 32 33 34 0.894734 0.637451 0.998445 0.721034 0.988484 0.637451 + 200 3 32 35 33 0.894734 0.637451 0.884772 0.721034 0.998445 0.721034 + 200 3 36 37 38 0.988484 0.637451 0.884772 0.721034 0.894734 0.637451 + 200 3 36 39 37 0.988484 0.637451 0.998445 0.721034 0.884772 0.721034 + 200 3 40 34 41 0.89864 0.535889 0.988484 0.637451 0.984577 0.535889 + 200 3 40 32 34 0.89864 0.535889 0.894734 0.637451 0.988484 0.637451 + 200 3 42 38 43 0.984577 0.535889 0.894734 0.637451 0.89864 0.535889 + 200 3 42 36 38 0.984577 0.535889 0.988484 0.637451 0.894734 0.637451 + 200 3 44 41 45 0.894734 0.458918 0.984577 0.535889 0.988484 0.458918 + 200 3 44 40 41 0.894734 0.458918 0.89864 0.535889 0.984577 0.535889 + 200 3 46 43 47 0.988484 0.458918 0.89864 0.535889 0.894734 0.458918 + 200 3 46 42 43 0.988484 0.458918 0.984577 0.535889 0.89864 0.535889 + 200 3 48 49 50 0.988484 0.637451 0.884772 0.721034 0.894734 0.637451 + 200 3 48 51 49 0.988484 0.637451 0.998445 0.721034 0.884772 0.721034 + 200 3 52 53 54 0.894734 0.637451 0.998445 0.721034 0.988484 0.637451 + 200 3 52 55 53 0.894734 0.637451 0.884772 0.721034 0.998445 0.721034 + 200 3 56 50 57 0.984577 0.535889 0.894734 0.637451 0.89864 0.535889 + 200 3 56 48 50 0.984577 0.535889 0.988484 0.637451 0.894734 0.637451 + 200 3 58 54 59 0.89864 0.535889 0.988484 0.637451 0.984577 0.535889 + 200 3 58 52 54 0.89864 0.535889 0.894734 0.637451 0.988484 0.637451 + 200 3 60 57 61 0.988484 0.458918 0.89864 0.535889 0.894734 0.458918 + 200 3 60 56 57 0.988484 0.458918 0.984577 0.535889 0.89864 0.535889 + 200 3 62 59 63 0.894734 0.458918 0.984577 0.535889 0.988484 0.458918 + 200 3 62 58 59 0.894734 0.458918 0.89864 0.535889 0.984577 0.535889 + 200 3 50 39 36 0.988484 0.637451 0.884772 0.721034 0.894734 0.637451 + 200 3 50 49 39 0.988484 0.637451 0.998445 0.721034 0.884772 0.721034 + 200 3 54 35 32 0.894734 0.637451 0.998445 0.721034 0.988484 0.637451 + 200 3 54 53 35 0.894734 0.637451 0.884772 0.721034 0.998445 0.721034 + 200 3 57 36 42 0.984577 0.535889 0.894734 0.637451 0.89864 0.535889 + 200 3 57 50 36 0.984577 0.535889 0.988484 0.637451 0.894734 0.637451 + 200 3 59 32 40 0.89864 0.535889 0.988484 0.637451 0.984577 0.535889 + 200 3 59 54 32 0.89864 0.535889 0.894734 0.637451 0.988484 0.637451 + 200 3 61 42 46 0.988484 0.458918 0.89864 0.535889 0.894734 0.458918 + 200 3 61 57 42 0.988484 0.458918 0.984577 0.535889 0.89864 0.535889 + 200 3 63 40 44 0.894734 0.458918 0.984577 0.535889 0.988484 0.458918 + 200 3 63 59 40 0.894734 0.458918 0.89864 0.535889 0.984577 0.535889 + 200 3 34 51 48 0.988484 0.637451 0.884772 0.721034 0.894734 0.637451 + 200 3 34 33 51 0.988484 0.637451 0.998445 0.721034 0.884772 0.721034 + 200 3 38 55 52 0.894734 0.637451 0.998445 0.721034 0.988484 0.637451 + 200 3 38 37 55 0.894734 0.637451 0.884772 0.721034 0.998445 0.721034 + 200 3 41 48 56 0.984577 0.535889 0.894734 0.637451 0.89864 0.535889 + 200 3 41 34 48 0.984577 0.535889 0.988484 0.637451 0.894734 0.637451 + 200 3 43 52 58 0.89864 0.535889 0.988484 0.637451 0.984577 0.535889 + 200 3 43 38 52 0.89864 0.535889 0.894734 0.637451 0.988484 0.637451 + 200 3 45 56 60 0.988484 0.458918 0.89864 0.535889 0.894734 0.458918 + 200 3 45 41 56 0.988484 0.458918 0.984577 0.535889 0.89864 0.535889 + 200 3 47 58 62 0.894734 0.458918 0.984577 0.535889 0.988484 0.458918 + 200 3 47 43 58 0.894734 0.458918 0.89864 0.535889 0.984577 0.535889 + 200 3 12 45 13 0.199219 0.548712 0.292969 0.548712 0.292969 0.548712 + 200 3 45 12 44 0.292969 0.548712 0.199219 0.548712 0.199219 0.548712 + 200 3 13 60 28 0.292969 0.548712 0.199219 0.548712 0.199219 0.548712 + 200 3 60 13 45 0.199219 0.548712 0.292969 0.548712 0.292969 0.548712 + 200 3 28 61 29 0.292969 0.548712 0.199219 0.548712 0.199219 0.548712 + 200 3 61 28 60 0.199219 0.548712 0.292969 0.548712 0.292969 0.548712 + 200 3 29 46 14 0.292969 0.548712 0.199219 0.548712 0.199219 0.548712 + 200 3 46 29 61 0.199219 0.548712 0.292969 0.548712 0.292969 0.548712 + 200 3 14 47 15 0.292969 0.548712 0.199219 0.548712 0.199219 0.548712 + 200 3 47 14 46 0.199219 0.548712 0.292969 0.548712 0.292969 0.548712 + 200 3 15 62 30 0.199219 0.548712 0.292969 0.548712 0.292969 0.548712 + 200 3 62 15 47 0.292969 0.548712 0.199219 0.548712 0.199219 0.548712 + 200 3 30 63 31 0.199219 0.548712 0.292969 0.548712 0.292969 0.548712 + 200 3 63 30 62 0.292969 0.548712 0.199219 0.548712 0.199219 0.548712 + 200 3 31 44 12 0.199219 0.548712 0.292969 0.548712 0.292969 0.548712 + 200 3 44 31 63 0.292969 0.548712 0.199219 0.548712 0.199219 0.548712 From 0506f44a8b06315ba4dcfcf48d3ff7be96ea22b4 Mon Sep 17 00:00:00 2001 From: Nikolay Borodin Date: Fri, 22 Nov 2024 14:42:40 +0200 Subject: [PATCH 36/38] Fixed bug: can't build if the droid is centered in the tile --- src/action.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/action.cpp b/src/action.cpp index 2452cb95cf0..ff6d10b7660 100644 --- a/src/action.cpp +++ b/src/action.cpp @@ -2495,7 +2495,15 @@ static void actionDroidBase(DROID *psDroid, DROID_ACTION_DATA *psAction) psDroid->action = DACTION_MOVETOBUILD; psDroid->actionPos.x = psAction->x; psDroid->actionPos.y = psAction->y; - moveDroidToNoFormation(psDroid, psDroid->actionPos.x, psDroid->actionPos.y); + // Move a droid in a tile if it has never been moved before + if (psDroid->actionPos == psDroid->pos.xy()) + { + actionRemoveDroidsFromBuildPos(psDroid->player, psDroid->actionPos, order->direction, order->psStats); + } + else + { + moveDroidToNoFormation(psDroid, psDroid->actionPos.x, psDroid->actionPos.y); + } break; case DACTION_DEMOLISH: ASSERT_OR_RETURN(, order->type == DORDER_DEMOLISH, "cannot start demolish action without a demolish order"); From 2638082843e114a4a2ef0739282b34fcbf9ef8e8 Mon Sep 17 00:00:00 2001 From: Nikolay Borodin Date: Wed, 20 Nov 2024 23:42:44 +0200 Subject: [PATCH 37/38] Fixed wall gate flickering when in construction state --- src/hci.cpp | 2 +- src/structure.cpp | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/hci.cpp b/src/hci.cpp index bb4f0aeed91..0a39e5ebd11 100644 --- a/src/hci.cpp +++ b/src/hci.cpp @@ -1714,7 +1714,6 @@ INT_RETVAL intRunWidgets() if (psBuilding->type == REF_DEMOLISH) { - STRUCTURE tmp(0, selectedPlayer); MAPTILE *psTile = mapTile(map_coord(pos.x), map_coord(pos.y)); FEATURE *psFeature = (FEATURE *)psTile->psObject; STRUCTURE *psStructure = (STRUCTURE *)psTile->psObject; @@ -1733,6 +1732,7 @@ INT_RETVAL intRunWidgets() { STRUCTURE tmp(generateNewObjectId(), selectedPlayer); STRUCTURE *psStructure = &tmp; + tmp.state = SAS_NORMAL; tmp.pStructureType = (STRUCTURE_STATS *)psPositionStats; tmp.pos = {pos.x, pos.y, map_Height(pos.x, pos.y) + world_coord(1) / 10}; diff --git a/src/structure.cpp b/src/structure.cpp index 6e5b4477a58..9c81fa1500a 100644 --- a/src/structure.cpp +++ b/src/structure.cpp @@ -1971,6 +1971,7 @@ optional buildBlueprint(STRUCTURE_STATS const *psStats, Vector3i pos, } STRUCTURE blueprint(0, ownerPlayer); + blueprint.state = SAS_NORMAL; // construct the fake structure blueprint.pStructureType = const_cast(psStats); // Couldn't be bothered to fix const correctness everywhere. if (selectedPlayer < MAX_PLAYERS) From 0d580d2c68fe6ce5192fae2c03f33434c3d96d3f Mon Sep 17 00:00:00 2001 From: Monsterovich Date: Wed, 11 Dec 2024 04:06:52 +0200 Subject: [PATCH 38/38] Added check for droid distance when working on structure --- src/droid.cpp | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/droid.cpp b/src/droid.cpp index e3e0ed75179..8d49baf58b0 100644 --- a/src/droid.cpp +++ b/src/droid.cpp @@ -1135,6 +1135,14 @@ bool droidUpdateBuild(DROID *psDroid) ASSERT_OR_RETURN(false, psStruct->type == OBJ_STRUCTURE, "target is not a structure"); ASSERT_OR_RETURN(false, psDroid->asBits[COMP_CONSTRUCT] < asConstructStats.size(), "Invalid construct pointer for unit"); + // droid distance sanity check + unsigned distanceSq = droidSqDist(psDroid, psStruct); + if (distanceSq > REPAIR_MAXDIST * REPAIR_MAXDIST) + { + psDroid->action = DACTION_NONE; + return false; + } + // First check the structure hasn't been completed by another droid if (psStruct->status == SS_BUILT) { @@ -1183,6 +1191,14 @@ bool droidUpdateDemolishing(DROID *psDroid) STRUCTURE *psStruct = (STRUCTURE *)psDroid->order.psObj; ASSERT_OR_RETURN(false, psStruct->type == OBJ_STRUCTURE, "target is not a structure"); + // droid distance sanity check + unsigned distanceSq = droidSqDist(psDroid, psStruct); + if (distanceSq > REPAIR_MAXDIST * REPAIR_MAXDIST) + { + psDroid->action = DACTION_NONE; + return false; + } + int constructRate = 5 * constructorPoints(*psDroid->getConstructStats(), psDroid->player); int pointsToAdd = gameTimeAdjustedAverage(constructRate); @@ -1217,6 +1233,14 @@ bool droidUpdateRestore(DROID *psDroid) ASSERT_OR_RETURN(false, psStats->weaponSubClass == WSC_ELECTRONIC, "unit's weapon is not EW"); + // droid distance sanity check + unsigned distanceSq = droidSqDist(psDroid, psStruct); + if (distanceSq > REPAIR_MAXDIST * REPAIR_MAXDIST) + { + psDroid->action = DACTION_NONE; + return false; + } + unsigned restorePoints = calcDamage(weaponDamage(*psStats, psDroid->player), psStats->weaponEffect, (BASE_OBJECT *)psStruct);