Index: binaries/data/mods/public/gui/credits/texts/programming.json =================================================================== --- binaries/data/mods/public/gui/credits/texts/programming.json +++ binaries/data/mods/public/gui/credits/texts/programming.json @@ -25,6 +25,7 @@ {"nick": "aBothe", "name": "Alexander Bothe"}, {"nick": "alpha123", "name": "Peter P. Cannici"}, {"nick": "andy5995", "name": "Andy Alt"}, + {"nick": "Angen"}, {"nick": "ArnH", "name": "Arno Hemelhof"}, {"nick": "Aurium", "name": "Aurélio Heckert"}, {"nick": "badmadblacksad", "name": "Martin F"}, Index: binaries/data/mods/public/gui/session/messages.js =================================================================== --- binaries/data/mods/public/gui/session/messages.js +++ binaries/data/mods/public/gui/session/messages.js @@ -319,7 +319,7 @@ "type": "defeat", "guid": findGuidForPlayerID(player), "player": player, - "resign": !!notification.resign + "reason": notification.reason }); playerFinished(player, false); sendLobbyPlayerlistUpdate(); @@ -329,7 +329,8 @@ addChatMessage({ "type": "won", "guid": findGuidForPlayerID(player), - "player": player + "player": player, + "reason": notification.reason }); playerFinished(player, true); sendLobbyPlayerlistUpdate(); @@ -968,9 +969,17 @@ function formatDefeatMessage(msg) { + if (msg.reason) + { + return sprintf( + translate("%(player)s has been defeated (%(reason)s)."), + { + "player": colorizePlayernameByID(msg.player), + "reason": translateWithContext("defeat reason", msg.reason) + } + ); + } return sprintf( - msg.resign ? - translate("%(player)s has resigned.") : translate("%(player)s has been defeated."), { "player": colorizePlayernameByID(msg.player) } ); @@ -978,9 +987,19 @@ function formatWinMessage(msg) { - return sprintf(translate("%(player)s has won."), { - "player": colorizePlayernameByID(msg.player) - }); + if (msg.reason) + { + return sprintf( + translate("%(player)s has won (%(reason)s)."), + { + "player": colorizePlayernameByID(msg.player), + "reason": translateWithContext("victory reason", msg.reason) + } + ); + } + return sprintf(translate("%(player)s has won."), + { "player": colorizePlayernameByID(msg.player) } + ); } function formatDiplomacyMessage(msg) Index: binaries/data/mods/public/gui/session/session.js =================================================================== --- binaries/data/mods/public/gui/session/session.js +++ binaries/data/mods/public/gui/session/session.js @@ -655,11 +655,10 @@ { if (g_IsObserver || g_Disconnected) return; - Engine.PostNetworkCommand({ "type": "defeat-player", "playerId": Engine.GetPlayerID(), - "resign": true + "resign": markForTranslationWithContext("defeat reason", "resigned") }); if (!leaveGameAfterResign) Index: binaries/data/mods/public/maps/random/survivalofthefittest_triggers.js =================================================================== --- binaries/data/mods/public/maps/random/survivalofthefittest_triggers.js +++ binaries/data/mods/public/maps/random/survivalofthefittest_triggers.js @@ -345,7 +345,7 @@ if (data.entity == this.playerCivicCenter[data.from]) { this.playerCivicCenter[data.from] = undefined; - TriggerHelper.DefeatPlayer(data.from); + TriggerHelper.DefeatPlayer(data.from, markForTranslationWithContext("defeat reason", "lost civic center")); } else if (data.entity == this.treasureFemale[data.from]) { Index: binaries/data/mods/public/maps/scenarios/treasure_islands.js =================================================================== --- binaries/data/mods/public/maps/scenarios/treasure_islands.js +++ binaries/data/mods/public/maps/scenarios/treasure_islands.js @@ -96,7 +96,7 @@ Trigger.prototype.Victory = function(playerID) { - TriggerHelper.SetPlayerWon(playerID); + TriggerHelper.SetPlayerWon(playerID,"treasure collected"); }; var cmpTrigger = Engine.QueryInterface(SYSTEM_ENTITY, IID_Trigger); Index: binaries/data/mods/public/maps/scripts/CaptureTheRelic.js =================================================================== --- binaries/data/mods/public/maps/scripts/CaptureTheRelic.js +++ binaries/data/mods/public/maps/scripts/CaptureTheRelic.js @@ -145,11 +145,17 @@ "translateMessage": true }, captureTheRelicDuration); - this.relicsVictoryTimer = cmpTimer.SetTimeout(SYSTEM_ENTITY, IID_EndGameManager, - "MarkPlayerAsWon", captureTheRelicDuration, playerAndAllies[0]); + this.relicsVictoryTimer = cmpTimer.SetTimeout(SYSTEM_ENTITY, IID_Trigger, + "CaptureTheRelicVictorySetWinner", captureTheRelicDuration, playerAndAllies[0]); }; +Trigger.prototype.CaptureTheRelicVictorySetWinner = function(playerID) { + let cmpEndGameManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_EndGameManager); + cmpEndGameManager.MarkPlayerAsWon(playerID, "relic captured"); +} + +{ let cmpTrigger = Engine.QueryInterface(SYSTEM_ENTITY, IID_Trigger); cmpTrigger.relics = []; cmpTrigger.playerRelicsCount = []; Index: binaries/data/mods/public/maps/scripts/ConquestCommon.js =================================================================== --- binaries/data/mods/public/maps/scripts/ConquestCommon.js +++ binaries/data/mods/public/maps/scripts/ConquestCommon.js @@ -24,12 +24,21 @@ if (index >= 0) { + let defeatReason; + + if (this.conquestClassFilter == "Unit") + defeatReason = markForTranslationWithContext("defeat reason", "lost all workers"); + else if (this.conquestClassFilter == "Structure") + defeatReason = markForTranslationWithContext("defeat reason", "lost all structures"); + else if (this.conquestClassFilter == "ConquestCritical") + defeatReason = markForTranslationWithContext("defeat reason", "lost all workers and structures"); + entities.splice(index, 1); if (!entities.length) { let cmpPlayer = QueryPlayerIDInterface(msg.from); if (cmpPlayer) - cmpPlayer.SetState("defeated"); + cmpPlayer.SetState("defeated", defeatReason); } } }; Index: binaries/data/mods/public/maps/scripts/Regicide.js =================================================================== --- binaries/data/mods/public/maps/scripts/Regicide.js +++ binaries/data/mods/public/maps/scripts/Regicide.js @@ -1,7 +1,7 @@ Trigger.prototype.CheckRegicideDefeat = function(data) { if (data.entity == this.regicideHeroes[data.from]) - TriggerHelper.DefeatPlayer(data.from); + TriggerHelper.DefeatPlayer(data.from, markForTranslationWithContext("defeat reason", "lost hero")); }; Trigger.prototype.InitRegicideGame = function(msg) Index: binaries/data/mods/public/maps/scripts/TriggerHelper.js =================================================================== --- binaries/data/mods/public/maps/scripts/TriggerHelper.js +++ binaries/data/mods/public/maps/scripts/TriggerHelper.js @@ -118,20 +118,20 @@ * The given player will win the game. * If it's not a last man standing game, then allies will win too. */ -TriggerHelper.SetPlayerWon = function(playerID) +TriggerHelper.SetPlayerWon = function(playerID, victoryReason) { let cmpEndGameManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_EndGameManager); - cmpEndGameManager.MarkPlayerAsWon(playerID); + cmpEndGameManager.MarkPlayerAsWon(playerID, victoryReason); }; /** * Defeats a player */ -TriggerHelper.DefeatPlayer = function(playerID) +TriggerHelper.DefeatPlayer = function(playerID, defeatReason) { let cmpPlayer = QueryPlayerIDInterface(playerID); if (cmpPlayer) - cmpPlayer.SetState("defeated"); + cmpPlayer.SetState("defeated", defeatReason); }; /** Index: binaries/data/mods/public/maps/scripts/WonderVictory.js =================================================================== --- binaries/data/mods/public/maps/scripts/WonderVictory.js +++ binaries/data/mods/public/maps/scripts/WonderVictory.js @@ -56,8 +56,8 @@ "translateMessage": true, }, wonderDuration); - timer = cmpTimer.SetTimeout(SYSTEM_ENTITY, IID_EndGameManager, - "MarkPlayerAsWon", wonderDuration, data.to); + timer = cmpTimer.SetTimeout(SYSTEM_ENTITY, IID_Trigger, + "WonderVictorySetWinner", wonderDuration, data.to); this.wonderVictoryTimers[ent] = timer; this.wonderVictoryMessages[ent] = messages; @@ -76,7 +76,13 @@ } }; +Trigger.prototype.WonderVictorySetWinner = function(playerID) { + let cmpEndGameManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_EndGameManager); + cmpEndGameManager.MarkPlayerAsWon(playerID, "wonder victory"); +} + +{ let cmpTrigger = Engine.QueryInterface(SYSTEM_ENTITY, IID_Trigger); cmpTrigger.RegisterTrigger("OnOwnershipChanged", "CheckWonderVictory", { "enabled": true }); cmpTrigger.RegisterTrigger("OnPlayerWon", "DeleteWonderVictoryMessages", { "enabled": true }); Index: binaries/data/mods/public/simulation/components/EndGameManager.js =================================================================== --- binaries/data/mods/public/simulation/components/EndGameManager.js +++ binaries/data/mods/public/simulation/components/EndGameManager.js @@ -48,7 +48,10 @@ Engine.BroadcastMessage(MT_GameTypeChanged, {}); }; -EndGameManager.prototype.MarkPlayerAsWon = function(playerID) +/** + * @param reason - string : reason of victory/defeat + */ +EndGameManager.prototype.MarkPlayerAsWon = function(playerID, reason) { let cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager); let numPlayers = cmpPlayerManager.GetNumPlayers(); @@ -63,7 +66,17 @@ let hasWon = playerID == i || this.alliedVictory && cmpPlayer.IsMutualAlly(playerID); if (hasWon == won) - cmpPlayer.SetState(won ? "won" : "defeated"); + { + if (won) + { + if (playerID == i) + cmpPlayer.SetState("won", reason); + else + cmpPlayer.SetState("won", markForTranslationWithContext("victory reason", "allied victory")); + } + else + cmpPlayer.SetState("defeated", reason); + } } this.skipAlliedVictoryCheck = false; @@ -110,7 +123,12 @@ { let cmpPlayer = QueryPlayerIDInterface(playerID); if (cmpPlayer) - cmpPlayer.SetState("won"); + { + if (allies.length == 1) + cmpPlayer.SetState("won", markForTranslationWithContext("victory reason", "last player alive")); + else + cmpPlayer.SetState("won", markForTranslationWithContext("victory reason", "allied victory")); + } } else this.lastManStandingMessage = cmpGuiInterface.AddTimeNotification({ Index: binaries/data/mods/public/simulation/components/Player.js =================================================================== --- binaries/data/mods/public/simulation/components/Player.js +++ binaries/data/mods/public/simulation/components/Player.js @@ -395,7 +395,7 @@ return this.state; }; -Player.prototype.SetState = function(newState, resign) +Player.prototype.SetState = function(newState, reason) { if (this.state != "active") return; @@ -436,19 +436,26 @@ } Engine.BroadcastMessage(won ? MT_PlayerWon : MT_PlayerDefeated, { "playerId": this.playerID }); - + let cmpGUIInterface = Engine.QueryInterface(SYSTEM_ENTITY, IID_GuiInterface); + if (won) + { cmpGUIInterface.PushNotification({ "type": "won", - "players": [this.playerID] + "players": [this.playerID], + "reason": reason }); + } else + { cmpGUIInterface.PushNotification({ "type": "defeat", "players": [this.playerID], - "resign": resign + "reason": reason }); + } + }; Player.prototype.GetTeam = function() Index: binaries/data/mods/public/simulation/helpers/Commands.js =================================================================== --- binaries/data/mods/public/simulation/helpers/Commands.js +++ binaries/data/mods/public/simulation/helpers/Commands.js @@ -441,7 +441,7 @@ { let cmpPlayer = QueryPlayerIDInterface(player); if (cmpPlayer) - cmpPlayer.SetState("defeated", !!cmd.resign); + cmpPlayer.SetState("defeated", cmd.resign); }, "garrison": function(player, cmd, data) Index: build/svn_revision/svn_revision.txt =================================================================== --- build/svn_revision/svn_revision.txt +++ build/svn_revision/svn_revision.txt @@ -1 +1 @@ -L"custom build" +L"exported"