From da41a22da95f0a8f22e36cdb68fcc5e1b9a006bd Mon Sep 17 00:00:00 2001 From: Shaman <48730089+Arch-Shaman@users.noreply.github.com> Date: Thu, 10 Jul 2025 05:07:50 -0400 Subject: [PATCH 1/2] End game now tracks attrition --- LuaRules/Gadgets/endgame_graphs.lua | 50 ++++++++++++++++++++++++----- 1 file changed, 42 insertions(+), 8 deletions(-) diff --git a/LuaRules/Gadgets/endgame_graphs.lua b/LuaRules/Gadgets/endgame_graphs.lua index 9173078f18..639799c91c 100644 --- a/LuaRules/Gadgets/endgame_graphs.lua +++ b/LuaRules/Gadgets/endgame_graphs.lua @@ -1,4 +1,3 @@ - if not gadgetHandler:IsSyncedCode() then return end @@ -18,6 +17,7 @@ end local unitCategoryDefs = VFS.Include("LuaRules/Configs/unit_category.lua") local teamList = Spring.GetTeamList() +local gaiaTeamID = Spring.GetGaiaTeamID() local allyTeamByTeam local spAreTeamsAllied = Spring.AreTeamsAllied @@ -25,6 +25,7 @@ local spGetUnitHealth = Spring.GetUnitHealth local spGetTeamResources = Spring.GetTeamResources local spGetTeamRulesParam = Spring.GetTeamRulesParam local spSetTeamRulesParam = Spring.SetTeamRulesParam +local spGetUnitRulesParam = Spring.GetUnitRulesParam local GetUnitCost = Spring.Utilities.GetUnitCost @@ -51,6 +52,8 @@ local damageDealtByTeamNonhax = {} local unitValueKilledByTeamHax = {} local unitValueKilledByTeamNonhax = {} +local unitAttritionByTeamHax = {} +local unitAttritionByTeamNonhax = {} local ALLIED_VISIBLE = {allied = true} @@ -217,6 +220,7 @@ function gadget:UnitDestroyed(unitID, unitDefID, teamID, attackerID, attackerDef cost = nanoframeCosts[index] local lastUnitID = nanoframes[nanoframeCount] + nanoframesByID[unitID] = nil nanoframesByID[lastUnitID] = index nanoframesByID[unitID] = nil nanoframeTeams[index] = nanoframeTeams[nanoframeCount] @@ -248,10 +252,28 @@ function gadget:UnitDestroyed(unitID, unitDefID, teamID, attackerID, attackerDef end if attackerTeam and not spAreTeamsAllied(attackerTeam, teamID) then unitValueKilledByTeamHax[attackerTeam] = unitValueKilledByTeamHax[attackerTeam] + cost + if canTeamSeeUnit(attackerTeam, unitID) then unitValueKilledByTeamNonhax[attackerTeam] = unitValueKilledByTeamNonhax[attackerTeam] + cost end end + if attackerTeam then + local lostValue = unitValueLostByTeam[attackerTeam] or 1 + if lostValue == 0 then + lostValue = 1 -- prevent NAN. + end + unitAttritionByTeamHax[attackerTeam] = unitValueKilledByTeamHax[attackerTeam] / lostValue + if canTeamSeeUnit(attackerTeam, unitID) then + unitAttritionByTeamNonhax[attackerTeam] = unitValueKilledByTeamNonhax[attackerTeam] / lostValue + end + else -- unit died through other means EG suicide + local lostValue = unitValueLostByTeam[teamID] or 1 + if lostValue == 0 then + lostValue = 1 -- prevent NAN. + end + unitAttritionByTeamHax[teamID] = unitValueKilledByTeamHax[teamID] / lostValue + unitAttritionByTeamNonhax[teamID] = unitValueKilledByTeamNonhax[teamID] / lostValue + end end function gadget:UnitTaken(unitID, unitDefID, oldTeam, newTeam) @@ -331,13 +353,18 @@ function gadget:GameFrame(n) local teamID = teamList[i] mIncome[teamID] = mIncome[teamID] + GetMetalIncome (teamID) eIncome[teamID] = eIncome[teamID] + GetEnergyIncome (teamID) - mIncomeBase [teamID] = mIncomeBase [teamID] + (spGetTeamRulesParam(teamID, "OD_metalBase" ) or 0) - mIncomeOverdrive[teamID] = mIncomeOverdrive[teamID] + (spGetTeamRulesParam(teamID, "OD_metalOverdrive") or 0) - mTotalBaseMex[teamID] = mTotalBaseMex[teamID] + (spGetTeamRulesParam(teamID, "OD_metalBase") or 0) - mTotalOverdrive[teamID] = mTotalOverdrive[teamID] + (spGetTeamRulesParam(teamID, "OD_metalOverdrive") or 0) + mIncomeBase[teamID] = mIncomeBase[teamID] + (spGetTeamRulesParam(teamID, "OD_metalBase") or 0) + local overdrive = (spGetTeamRulesParam(teamID, "OD_metalOverdrive") or 0) + if overdrive > 0 then + GG.Awards.AddAwardPoints('economist', teamID, overdrive) + end + mIncomeOverdrive[teamID] = mIncomeOverdrive[teamID] + overdrive + mTotalBaseMex[teamID] = mTotalBaseMex[teamID] + (spGetTeamRulesParam(teamID, "OD_metalBase") or 0) + mTotalOverdrive[teamID] = mTotalOverdrive[teamID] + overdrive SetHiddenTeamRulesParam(teamID, "stats_history_damage_dealt_current", damageDealtByTeamHax[teamID]) SetHiddenTeamRulesParam(teamID, "stats_history_unit_value_killed_current", unitValueKilledByTeamHax[teamID]) + SetHiddenTeamRulesParam(teamID, "stats_history_attrition_current", unitAttritionByTeamHax[teamID] or 0) spSetTeamRulesParam(teamID, "stats_history_damage_dealt_current", damageDealtByTeamNonhax[teamID], ALLIED_VISIBLE) spSetTeamRulesParam(teamID, "stats_history_damage_received_current", damageReceivedByTeam[teamID], ALLIED_VISIBLE) spSetTeamRulesParam(teamID, "stats_history_metal_base_mex_current", mTotalBaseMex[teamID], ALLIED_VISIBLE) @@ -357,10 +384,12 @@ function gadget:GameFrame(n) spSetTeamRulesParam(teamID, "stats_history_unit_lost_tally_current", unitLostTallyByTeam[teamID], ALLIED_VISIBLE) spSetTeamRulesParam(teamID, "stats_history_nano_partial_current", partialNanoValueByTeam[teamID], ALLIED_VISIBLE) spSetTeamRulesParam(teamID, "stats_history_nano_total_current", totalNanoValueByTeam[teamID], ALLIED_VISIBLE) + spSetTeamRulesParam(teamID, "stats_history_attrition_current", unitAttritionByTeamNonhax[teamID] or 0, ALLIED_VISIBLE) if isSpringStatsHistoryFrame then SetHiddenTeamRulesParam(teamID, "stats_history_damage_dealt_" .. stats_index, damageDealtByTeamHax[teamID]) SetHiddenTeamRulesParam(teamID, "stats_history_unit_value_killed_" .. stats_index, unitValueKilledByTeamHax[teamID]) + SetHiddenTeamRulesParam(teamID, "stats_history_attrition_" .. stats_index, unitAttritionByTeamHax[teamID] or 0) spSetTeamRulesParam(teamID, "stats_history_damage_dealt_" .. stats_index, damageDealtByTeamNonhax[teamID]) spSetTeamRulesParam(teamID, "stats_history_damage_received_" .. stats_index, damageReceivedByTeam[teamID], ALLIED_VISIBLE) spSetTeamRulesParam(teamID, "stats_history_metal_base_mex_" .. stats_index, mTotalBaseMex[teamID], ALLIED_VISIBLE) @@ -384,6 +413,7 @@ function gadget:GameFrame(n) spSetTeamRulesParam(teamID, "stats_history_unit_value_other_" .. stats_index, unitCategoryValueByTeam[teamID].other, ALLIED_VISIBLE) spSetTeamRulesParam(teamID, "stats_history_nano_partial_" .. stats_index, partialNanoValueByTeam[teamID], ALLIED_VISIBLE) spSetTeamRulesParam(teamID, "stats_history_nano_total_" .. stats_index, totalNanoValueByTeam[teamID], ALLIED_VISIBLE) + spSetTeamRulesParam(teamID, "stats_history_attrition_" .. stats_index, unitAttritionByTeamNonhax[teamID] or 0, ALLIED_VISIBLE) mIncome [teamID] = 0 mIncomeBase [teamID] = 0 @@ -400,7 +430,9 @@ end function gadget:GameOver() gadget:GameFrame(450) -- fake history frame to snapshot end state - + for teamID, attritionRate in pairs(unitAttritionByTeamHax) do + GG.Awards.AddAwardPoints('attrition', teamID, attritionRate) + end Spring.SetGameRulesParam("gameover_frame", Spring.GetGameFrame()) Spring.SetGameRulesParam("gameover_second", math.floor(Spring.GetGameSeconds())) Spring.SetGameRulesParam("gameover_historyframe", stats_index - 1) @@ -510,8 +542,8 @@ function gadget:Initialize() spSetTeamRulesParam(teamID, "stats_history_nano_total_0" , 0, ALLIED_VISIBLE) mTotalOverdrive [teamID] = spGetTeamRulesParam(teamID, "stats_history_metal_overdrive_current") or 0 - mTotalBaseMex [teamID] = spGetTeamRulesParam(teamID, "stats_history_metal_base_mex_current") or 0 - reclaimListByTeam [teamID] = -1*(spGetTeamRulesParam(teamID, "stats_history_metal_reclaim_current") or 0) + mTotalBaseMex [teamID] = spGetTeamRulesParam(teamID, "stats_history_metal_base_mex_current") or 0 + reclaimListByTeam [teamID] = -spGetTeamRulesParam(teamID, "stats_history_metal_reclaim_current") or 0 metalExcessByTeam [teamID] = spGetTeamRulesParam(teamID, "stats_history_metal_excess_current") or 0 metalSharedByTeam [teamID] = spGetTeamRulesParam(teamID, "stats_history_metal_shared_current") or 0 energyExcessByTeam [teamID] = spGetTeamRulesParam(teamID, "stats_history_energy_excess_current") or 0 @@ -523,5 +555,7 @@ function gadget:Initialize() unitValueLostByTeam[teamID] = spGetTeamRulesParam(teamID, "stats_history_unit_value_lost_current") or 0 unitLostTallyByTeam[teamID] = spGetTeamRulesParam(teamID, "stats_history_unit_lost_tally_current") or 0 damageReceivedByTeam[teamID] = Spring.GetTeamRulesParam(teamID, "stats_history_damage_received_current") or 0 + unitAttritionByTeamHax[teamID] = GetHiddenTeamRulesParam(teamID, "stats_history_attrition_current") or 0 + unitAttritionByTeamNonhax[teamID] = Spring.GetTeamRulesParam(teamID, "stats_history_attrition_current") or 0 end end From be5fe42bbd765df3ea4210b5c431f28ffb71a98f Mon Sep 17 00:00:00 2001 From: Shaman <48730089+Arch-Shaman@users.noreply.github.com> Date: Thu, 10 Jul 2025 05:08:42 -0400 Subject: [PATCH 2/2] New awards, localized end game menu --- LuaRules/Configs/award_names.lua | 59 +++-- LuaRules/Gadgets/awards.lua | 257 ++++++++++++++++---- LuaRules/Gadgets/endgame_graphs.lua | 2 +- LuaRules/Images/awards/trophy_assistant.png | Bin 0 -> 2302 bytes LuaRules/Images/awards/trophy_attrition.png | Bin 0 -> 12309 bytes LuaRules/Images/awards/trophy_drone.png | Bin 0 -> 14665 bytes LuaRules/Images/awards/trophy_economist.png | Bin 0 -> 2273 bytes LuaRules/Images/awards/trophy_missile.png | Bin 0 -> 8787 bytes LuaRules/Images/awards/trophy_repair.png | Bin 0 -> 2384 bytes LuaRules/Images/awards/trophy_shield.png | Bin 0 -> 9271 bytes LuaUI/Configs/lang/awards.de.json | 150 ++++++++++++ LuaUI/Configs/lang/awards.en.json | 150 ++++++++++++ LuaUI/Configs/lang/awards.fr.json | 149 ++++++++++++ LuaUI/Configs/lang/awards.it.json | 150 ++++++++++++ LuaUI/Configs/lang/awards.ja.json | 149 ++++++++++++ LuaUI/Configs/lang/awards.pl.json | 150 ++++++++++++ LuaUI/Configs/lang/awards.pt.json | 150 ++++++++++++ LuaUI/Configs/lang/awards.ru.json | 150 ++++++++++++ LuaUI/Configs/lang/awards.th.json | 148 +++++++++++ LuaUI/Configs/lang/awards.tr.json | 150 ++++++++++++ LuaUI/Configs/lang/awards.zh.json | 150 ++++++++++++ LuaUI/Widgets/gui_chili_endgamewindow.lua | 257 ++++++++++++++++---- 22 files changed, 2103 insertions(+), 118 deletions(-) create mode 100644 LuaRules/Images/awards/trophy_assistant.png create mode 100644 LuaRules/Images/awards/trophy_attrition.png create mode 100644 LuaRules/Images/awards/trophy_drone.png create mode 100644 LuaRules/Images/awards/trophy_economist.png create mode 100644 LuaRules/Images/awards/trophy_missile.png create mode 100644 LuaRules/Images/awards/trophy_repair.png create mode 100644 LuaRules/Images/awards/trophy_shield.png create mode 100644 LuaUI/Configs/lang/awards.de.json create mode 100644 LuaUI/Configs/lang/awards.en.json create mode 100644 LuaUI/Configs/lang/awards.fr.json create mode 100644 LuaUI/Configs/lang/awards.it.json create mode 100644 LuaUI/Configs/lang/awards.ja.json create mode 100644 LuaUI/Configs/lang/awards.pl.json create mode 100644 LuaUI/Configs/lang/awards.pt.json create mode 100644 LuaUI/Configs/lang/awards.ru.json create mode 100644 LuaUI/Configs/lang/awards.th.json create mode 100644 LuaUI/Configs/lang/awards.tr.json create mode 100644 LuaUI/Configs/lang/awards.zh.json diff --git a/LuaRules/Configs/award_names.lua b/LuaRules/Configs/award_names.lua index 0b6cd8eecf..ce89fbe0d6 100644 --- a/LuaRules/Configs/award_names.lua +++ b/LuaRules/Configs/award_names.lua @@ -1,28 +1,35 @@ return { - pwn = 'Complete Annihilation', - navy = 'Fleet Admiral', - air = 'Airforce General', - nux = 'Apocalyptic Achievement Award', - shell = 'Turtle Shell', - fire = 'Master Grill-Chef', - emp = 'EMP Wizard', - slow = 'Traffic Cop', - disarm = 'Peacemaker', - t3 = 'Experimental Engineer', - cap = 'Master of Puppets', - share = 'Share Bear', - terra = 'Legendary Landscaper', - reclaim = 'Spoils of War', - rezz = 'Vile Necromancer', - vet = 'Decorated Veteran', - ouch = 'Big Purple Heart', - kam = 'Blaze of Glory', - comm = 'Master and Commander', - mex = 'Mineral Prospector', - mexkill = 'Loot & Pillage', - rage = 'Rage Inducer', - head = 'Head Hunter', - dragon = 'Dragon Slayer', - heart = 'Queen Heart Breaker', - sweeper = 'Land Sweeper', + pwn = 'Complete Annihilation', + navy = 'Fleet Admiral', + air = 'Airforce General', + nux = 'Apocalyptic Achievement Award', + shell = 'Turtle Shell', + fire = 'Master Grill-Chef', + emp = 'EMP Wizard', + slow = 'Traffic Cop', + disarm = 'Peacemaker', + t3 = 'Experimental Engineer', + cap = 'Master of Puppets', + share = 'Share Bear', + terra = 'Legendary Landscaper', + reclaim = 'Spoils of War', + rezz = 'Vile Necromancer', + vet = 'Decorated Veteran', + ouch = 'Big Purple Heart', + kam = 'Blaze of Glory', + comm = 'Master and Commander', + mex = 'Mineral Prospector', + mexkill = 'Loot & Pillage', + rage = 'Rage Inducer', + head = 'Head Hunter', + dragon = 'Dragon Slayer', + heart = 'Queen Heart Breaker', + sweeper = 'Land Sweeper', + repair = 'Friendly Mechanic', + assistant = 'Subsidization Strategy', + economist = 'Economic Powerhouse', + shield = 'Shieldbearer', + drone = 'Drone Director', + missile = 'Missile Marauder', + attrition = 'Attrition Ace', } diff --git a/LuaRules/Gadgets/awards.lua b/LuaRules/Gadgets/awards.lua index e9673b00fd..205d21be95 100644 --- a/LuaRules/Gadgets/awards.lua +++ b/LuaRules/Gadgets/awards.lua @@ -27,12 +27,14 @@ if (gadgetHandler:IsSyncedCode()) then ------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------- local spAreTeamsAllied = Spring.AreTeamsAllied +local spGetTeamRulesParam = Spring.GetTeamRulesParam local spGetUnitHealth = Spring.GetUnitHealth local spGetAllUnits = Spring.GetAllUnits local spGetUnitTeam = Spring.GetUnitTeam local spGetUnitDefID = Spring.GetUnitDefID local spGetUnitExperience = Spring.GetUnitExperience local spGetTeamResources = Spring.GetTeamResources +local spGetGameRulesParam = Spring.GetGameRulesParam local GetUnitCost = Spring.Utilities.GetUnitCost local GetUnitValue = Spring.Utilities.GetUnitValue @@ -50,6 +52,8 @@ local cappedComs = {} local awardData = {} +local empFactor = veryEasyFactor*4 +local reclaimFactor = veryEasyFactor*0.2 -- wrecks aren't guaranteed to leave more than 0.2 of value local minReclaimRatio = 0.15 @@ -65,6 +69,9 @@ local awardAbsolutes = { sweeper = 20, heart = 1*10^9, -- avoid higher values, math.floor starts returning INT_MIN at some point vet = 3, + shield = 10000, + missile = 1000, + attrition = 1, } local basicEasyFactor = 0.5 @@ -121,7 +128,42 @@ local kamikaze = { chicken_dodo=1, } +local missiles = { + [UnitDefNames["napalmmissile"].id] = 1, + [UnitDefNames["tacnuke"].id] = 1, + [UnitDefNames["empmissile"].id] = 1, + [UnitDefNames["subtacmissile"].id] = 1, + [UnitDefNames["seismic"].id] = 1, +} + + local flamerWeaponDefs = {} +local PUBLIC = {public = true} +local bestCostByTeam = {} +------------------- +-- Resource tracking + + +local allyTeamInfo = {} +--local resourceInfo = {count = 0, data = {}} + +do + local allyTeamList = Spring.GetAllyTeamList() + for i=1,#allyTeamList do + local allyTeamID = allyTeamList[i] + allyTeamInfo[allyTeamID] = { + team = {}, + teams = 0, + } + + local teamList = Spring.GetTeamList(allyTeamID) + for j=1,#teamList do + local teamID = teamList[j] + allyTeamInfo[allyTeamID].teams = allyTeamInfo[allyTeamID].teams + 1 + allyTeamInfo[allyTeamID].team[allyTeamInfo[allyTeamID].teams] = teamID + end + end +end ------------------------------------------------ -- functions @@ -153,9 +195,10 @@ local function getMeanDamageExcept(excludeTeam) return (count>0) and (mean/count) or 0 end -local function getMaxVal(valList) +local function getMaxVal(valList, award) local winTeam, maxVal = false,0 for team,val in pairs(valList) do + Spring.SetGameRulesParam(team .. "_" .. award .. "_score", val, PUBLIC) if val and val > maxVal then winTeam = team maxVal = val @@ -195,6 +238,94 @@ local function CopyTable(original) -- Warning: circular table references lead to return copy end +local function UpdateResourceStats(t) -- this never gets called apparently. + + resourceInfo.count = resourceInfo.count + 1 + resourceInfo.data[resourceInfo.count] = {allyRes = {}, teamRes = {}, t = t} + + for allyTeamID, allyTeamData in pairs(allyTeamInfo) do + local teams = allyTeamData.teams + local team = allyTeamData.team + + local allyOverdriveResources = GG.Overdrive_allyTeamResources[allyTeamID] or {} + resourceInfo.data[resourceInfo.count].allyRes[allyTeamID] = { + metal_income_total = 0, + metal_income_base = allyOverdriveResources.baseMetal or 0, + metal_income_overdrive = allyOverdriveResources.overdriveMetal or 0, + metal_income_other = 0, + + metal_spend_total = 0, + metal_spend_construction = 0, + metal_spend_waste = 0, + + metal_storage_current = 0, + metal_storage_free = 0, + + energy_income_total = allyOverdriveResources.baseEnergy or 0, + + energy_spend_total = 0, + energy_spend_overdrive = allyOverdriveResources.overdriveEnergy or 0, + energy_spend_construction = 0, + energy_spend_other = 0, + energy_spend_waste = allyOverdriveResources.wasteEnergy or 0, + + energy_storage_current = 0, + } + + local aRes = resourceInfo.data[resourceInfo.count].allyRes[allyTeamID] + + for i = 1, teams do + local teamID = team[i] + local mCurr, mStor, mPull, mInco, mExpe, mShar, mSent, mReci = spGetTeamResources(teamID, "metal") + aRes.metal_spend_construction = aRes.metal_spend_construction + mExpe + aRes.metal_income_total = aRes.metal_income_total + mInco + aRes.metal_spend_total = aRes.metal_spend_total + mExpe + aRes.metal_storage_free = aRes.metal_storage_free + mStor - mCurr + aRes.metal_storage_current = aRes.metal_storage_current + mCurr + + local eCurr, eStor, ePull, eInco, eExpe, eShar, eSent, eReci = spGetTeamResources(teamID, "energy") + aRes.energy_spend_total = aRes.energy_spend_total + eExpe + aRes.energy_storage_current = aRes.energy_storage_current + eCurr + + local teamOverdriveResources = GG.Overdrive_teamResources[teamID] or {} + + resourceInfo.data[resourceInfo.count].teamRes[teamID] = { + metal_income_total = mInco + mReci, + metal_income_base = teamOverdriveResources.baseMetal or 0, + metal_income_overdrive = teamOverdriveResources.overdriveMetal or 0, + metal_income_other = 0, + + metal_spend_total = mExpe + mSent, + metal_spend_construction = mExpe, + + metal_share_net = mReci - mSent, + + metal_storage_current = mCurr, + + energy_income_total = eInco, + + energy_spend_total = eExpe, + energy_spend_construction = mExpe, + energy_spend_other = 0, + + energy_share_net = teamOverdriveResources.overdriveEnergyChange or 0, + + energy_storage_current = eCurr, + } + local tRes = resourceInfo.data[resourceInfo.count].teamRes[teamID] + + tRes.metal_income_other = tRes.metal_income_total - tRes.metal_income_base - tRes.metal_income_overdrive - mReci + tRes.energy_spend_other = tRes.energy_spend_total - tRes.energy_spend_construction + math.min(0, tRes.energy_share_net) + end + + aRes.metal_income_other = aRes.metal_income_total - aRes.metal_income_base - aRes.metal_income_overdrive + aRes.metal_spend_waste = math.min(aRes.metal_storage_free - aRes.metal_income_total - aRes.metal_spend_total,0) + + aRes.energy_spend_construction = aRes.metal_spend_construction + aRes.energy_spend_other = aRes.energy_spend_total - (aRes.energy_spend_overdrive + aRes.energy_spend_construction + aRes.energy_spend_waste) + end +end + local function AddAwardPoints( awardType, teamID, amount ) if (teamID and (teamID ~= gaiaTeamID)) then awardData[awardType][teamID] = awardData[awardType][teamID] + (amount or 0) @@ -202,35 +333,30 @@ local function AddAwardPoints( awardType, teamID, amount ) end local function ProcessAwardData() - for awardType, data in pairs(awardData) do local winningTeam local maxVal local easyFactor = awardEasyFactors[awardType] or 1 local absolute = awardAbsolutes[awardType] local message - if awardType == 'vet' then maxVal = expUnitExp winningTeam = expUnitTeam else - winningTeam, maxVal = getMaxVal(data) - + winningTeam, maxVal = getMaxVal(data, awardType) end - if winningTeam then - local compare if absolute then compare = absolute - else compare = getMeanDamageExcept(winningTeam) * easyFactor end - --if reclaimTeam and maxReclaim > getMeanMetalIncome() * minReclaimRatio then if maxVal > compare then - maxVal = floor(maxVal) + if awardType ~= 'attrition' and awardType ~= 'vet' then -- do not floor the attrition award, it has its own formatting. This just makes every award 100%, which is not what we want. + maxVal = floor(maxVal) + end local maxValWrite = comma_value(maxVal) if awardType == 'cap' then @@ -262,15 +388,29 @@ local function ProcessAwardData() elseif awardType == 'dragon' then message = maxVal .. ' White Dragons annihilated' elseif awardType == 'heart' then - local maxQueenKillDamage = maxVal - absolute --remove the queen kill signature: +1000000000 from the total damage - message = 'Damage: '.. comma_value(maxQueenKillDamage) + message = 'Damage: '.. comma_value(maxVal) elseif awardType == 'sweeper' then message = maxVal .. ' Nests wiped out' - elseif awardType == 'vet' then local vetName = UnitDefs[expUnitDefID] and UnitDefs[expUnitDefID].humanName + Spring.SetGameRulesParam("vet_unitdef", UnitDefs[expUnitDefID].name, public) local expUnitExpRounded = floor(expUnitExp * 100) message = vetName ..', '.. expUnitExpRounded .. "% cost made" + elseif awardType == 'repair' then + message = maxValWrite .. ' allied value repaired' + elseif awardType == 'assistant' then + message = maxValWrite .. ' metal used for assisting allies' + elseif awardType == 'economist' then + message = maxValWrite .. ' metal overdriven' + elseif awardType == 'drone' then + message = 'Damaged Value : ' .. maxValWrite + elseif awardType == 'shield' then + message = 'Damage shielded: ' .. maxValWrite + elseif awardType == 'missile' then + message = 'Damaged Value : ' .. maxValWrite + elseif awardType == 'attrition' then + --Spring.Echo("Attrition rate: " .. maxVal .. "\"" .. comma_value(string.format("%.2f%%", maxVal * 100)) .. "\"") + message = 'Attrition rate: ' .. comma_value(string.format("%.2f%%", maxVal * 100)) else message = 'Damaged value: '.. maxValWrite end @@ -278,6 +418,7 @@ local function ProcessAwardData() end --if winningTeam if message then awardAward(winningTeam, awardType, message) + Spring.SetGameRulesParam(awardType .. "_rawscore", maxVal, PUBLIC) end end @@ -286,11 +427,28 @@ end ------------------- -- Callins -function gadget:Initialize() +function gadget:AllowUnitBuildStep(builderID, builderTeam, unitID, unitDefID, part) + if part < 0 or unitID == nil then + return true + end + local hp, maxhp, _, _, bp = spGetUnitHealth(unitID) + local otherTeam = spGetUnitTeam(unitID) + if otherTeam == builderTeam then + return true + end + if bp < 1.0 then + AddAwardPoints('assistant', builderTeam, part * UnitDefs[unitDefID].metalCost) + else + local _, maxHealth = Spring.GetUnitHealth(unitID) + local healthMetalRatio = maxHealth / UnitDefs[unitDefID].metalCost + AddAwardPoints('repair', builderTeam, part * healthMetalRatio) + end + return true +end - GG.Awards = GG.Awards or {} - GG.Awards.AddAwardPoints = AddAwardPoints - +function gadget:Initialize() + --_G.resourceInfo = resourceInfo + GG.Awards = {AddAwardPoints = AddAwardPoints} local tempTeamList = Spring.GetTeamList() for i=1, #tempTeamList do local team = tempTeamList[i] @@ -310,24 +468,22 @@ function gadget:Initialize() for awardType, _ in pairs(awardDescs) do awardData[awardType][team] = 0 end - end - - local shipSMClass = Game.speedModClasses.Ship - for i = 1, #UnitDefs do - local ud = UnitDefs[i] - --[[ NB: ships that extend legs and walk onto land, like - the SupCom Cybran Siren or RA3 Soviet Stingray, are - technically hovercraft in Spring so would need some - extra handling AFAIK. No such ship in vanilla ZK. ]] - if (ud.moveDef.smClass == shipSMClass) then - boats[i] = true - end + end - if ud.customParams.dynamic_comm then - comms[i] = true + local boatFacs = {'factoryship', 'striderhub'} + for _, boatFac in pairs(boatFacs) do -- Fixes the ships with legs problem, future proofing. + local udBoatFac = UnitDefNames[boatFac] + if udBoatFac then + for _, boatDefID in pairs(udBoatFac.buildOptions) do + if (UnitDefs[boatDefID].minWaterDepth > 0) then -- because striderhub + boats[boatDefID] = true + end + end end end + -- Gull is only available to carriers, therefore it counts towards naval awards. + boats[UnitDefNames["dronecarry"].id] = true for i=1,#WeaponDefs do local wcp = WeaponDefs[i].customParams or {} @@ -335,6 +491,12 @@ function gadget:Initialize() flamerWeaponDefs[i] = true end end + + for i=1,#UnitDefs do + if(UnitDefs[i].customParams.dynamic_comm) then comms[i] = true + end + end + end --Initialize function gadget:UnitTaken(unitID, unitDefID, oldTeam, newTeam) @@ -372,7 +534,13 @@ local roostDefID = UnitDefNames.roost .id function gadget:UnitDestroyed(unitID, unitDefID, unitTeam, _, _, killerTeam) local experience = spGetUnitExperience(unitID) - if experience > expUnitExp and (experience*UnitDefs[unitDefID].metalCost > 1000) then + local bestTeamCost = bestCostByTeam[unitTeam] or 0 + if experience > bestTeamCost then -- track each teams veterancy award. This way we can translate via luaui. + Spring.SetGameRulesParam(unitTeam .. "_vet_score", experience, PUBLIC) + Spring.SetGameRulesParam(unitTeam .. "_vet_unit", UnitDefs[unitDefID].name, PUBLIC) + bestCostByTeam[unitTeam] = experience + end + if experience > expUnitExp and (experience*UnitDefs[unitDefID].metalCost > 1000) and not (UnitDefs[unitDefID].customParams.dontcount or UnitDefs[unitDefID].metalCost == 0) then expUnitExp = experience expUnitTeam = unitTeam expUnitDefID = unitDefID @@ -424,10 +592,9 @@ function gadget:UnitDamaged(unitID, unitDefID, unitTeam, damage, paralyzer, weap or (attackerTeam == unitTeam) or (attackerTeam == gaiaTeamID) then return end - local costdamage = (damage / maxHP) * GetUnitCost(unitID, unitDefID) - if not spAreTeamsAllied(attackerTeam, unitTeam) then + local isMissile = missiles[attackerDefID] ~= nil if paralyzer then AddAwardPoints( 'emp', attackerTeam, costdamage ) elseif attackerDefID then @@ -439,31 +606,27 @@ function gadget:UnitDamaged(unitID, unitDefID, unitTeam, damage, paralyzer, weap if (flamerWeaponDefs[weaponID]) then AddAwardPoints( 'fire', attackerTeam, costdamage ) end - + if isMissile then + AddAwardPoints('missile', attackerTeam, costdamage) + end -- Static Weapons if (not ad.canMove) then - -- bignukes, zenith, starlight - if staticO_big[ad.name] then + if staticO_big[ad.name] then -- not lrpc, tacnuke, emp missile AddAwardPoints( 'nux', attackerTeam, costdamage ) - - -- not lrpc, tacnuke, emp missile - elseif not staticO_small[ad.name] then + elseif not staticO_small[ad.name] and not isMissile then -- defenses that aren't missiles. AddAwardPoints( 'shell', attackerTeam, costdamage ) end - elseif kamikaze[ad.name] then AddAwardPoints( 'kam', attackerTeam, costdamage ) - elseif ad.canFly and not (ad.customParams.dontcount or ad.customParams.is_drone) then AddAwardPoints( 'air', attackerTeam, costdamage ) - elseif boats[attackerDefID] then AddAwardPoints( 'navy', attackerTeam, costdamage ) - elseif comms[attackerDefID] then AddAwardPoints( 'comm', attackerTeam, costdamage ) - + elseif ad.customParams.is_drone then + AddAwardPoints('drone', attackerTeam, costdamage ) end end end @@ -475,7 +638,7 @@ function gadget:UnitFinished(unitID, unitDefID, teamID) end end -function gadget:GameOver() +function gadget:GameOver(winningAllys) gameOver = true local units = spGetAllUnits() @@ -485,7 +648,6 @@ function gadget:GameOver() local unitDefID = spGetUnitDefID(unitID) gadget:UnitDestroyed(unitID, unitDefID, teamID) end - -- read externally tracked values local teams = Spring.GetTeamList() for i = 1, #teams do @@ -495,7 +657,6 @@ function gadget:GameOver() AddAwardPoints('pwn', team, Spring.Utilities.GetHiddenTeamRulesParam(team, "stats_history_damage_dealt_current") or 0) end end - ProcessAwardData() _G.awardList = awardList diff --git a/LuaRules/Gadgets/endgame_graphs.lua b/LuaRules/Gadgets/endgame_graphs.lua index 639799c91c..2bf0ba1ba1 100644 --- a/LuaRules/Gadgets/endgame_graphs.lua +++ b/LuaRules/Gadgets/endgame_graphs.lua @@ -184,7 +184,7 @@ function gadget:UnitFinished(unitID, unitDefID, teamID) end function gadget:UnitReverseBuilt(unitID, unitDefID, teamID) - if dontCountUnits[unitDefID] then + if dontCountUnits[unitDefID] or spGetUnitRulesParam(unitID, "dangerous") then return end diff --git a/LuaRules/Images/awards/trophy_assistant.png b/LuaRules/Images/awards/trophy_assistant.png new file mode 100644 index 0000000000000000000000000000000000000000..f7e90ba621774cf84f3cc9d8af6c8331e16a91ac GIT binary patch literal 2302 zcmVEX>4Tx04R}tkv&MmP!xqvQ>7vm2MdZgWT;M7L`57+6^me@v=v%)FnQ@8G-*gu zTpR`0f`dPcRR4rtTK|H%@ z>74h8L#!kz#OK801~o|h$aUG}H_ke3JS*_Gqt55#IU|w5EbDe4gaV#N$Bt*!lp^OSFL}=GYF_EJ4n1_GZ@h8b8ldB9y zjs;YqLUR1zfAD*@W?_2DO$x?LIHR`qi@Oq1Ghl$nmf1FIZhvd49#l!1~@nb z#)_1^?(y!P&bj@2r!~JHm6>w24Y63Z00006VoOIv0RI600RN!9r;`8x010qNS#tmY zE+YT{E+YYWr9XB6000McNlirueSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00!1cL_t(o!{wN3Y!ufShM#k0=FHf;ECvkN!Pr>AG!T?H z3Q|xSgd7_qM@o|*5{b%5qxMIr8feU0&3tp7^M2>MY2g3u5>quSI8cB< zpoJd2Ydv8Vp#>UEcy0LZfC~>7;wSxSsgZ`Hyr}$^Hs;MYSXM zUu9=!->;PVty1dMjTbh06~z?-FaQOp5C8o8xz*LDLz_1LxG7s_4*$6H+opo zSVG~!LMql)utjeP*45R0vTN6_6@7huDYk8Iwk+#A6~z?*8t{OT_V%WJFKJ~h%DwLo zU0q!*?d|PlEiEmNWtBVd5k@S-Q^tUv#!*}A}dg!6= zwY9bFwk&H_b3?AAV24-QgQR>sJYBlg2vw=Oa)i}wBd8Q!<= z1u=7GmT_-hVZm>5Ca9hO_O*`)1{rE?{eCDv{}E%w3fz7EX~NEv$d6r zpMTDx)vHNfy2MCF2f2?u#{AM!Y{%h?%1WZ|zfa`cIdm}Si;R2lwSS8<*5F-iW2C=N zjMUU1v_=Mlc#l4c<$0Ki1j7dokUV;nM14Ie$B!ce0ovYtlNrmF(U_4zqM!h;w--4u zfb-ykDAOGD&ensTHAx;{?nY;1M6^<9&x2Tuplu_iq_?RFQC3D^`Et@qO6c9U53MzU zygYi29b;tWO6H`dk_-k(S+ay!TN@+w_4Oo^w~lI!rrLStEIeJvSPc#}O;kww9w4(_nQwn*ltx1Vg3d3UxvC`*4&t;@(B5ivVK3;K3 z3Q{SAX(BBPIS#CoNutpx$tz$DLrFMkrO&;tWM0=K(iUVPq#Rw;vXDw)Dm4neqIgWT z83-U8=Nj1aMisj*3HWRXR{X80`_r@qS(A6C*zhnB_?hebKlik55Qd=*%R)+t5CUo2 zqwp)Po}k$Ch(@Esk!13R^|0m#_vW2ztNe`E@bKi_Y3O_-FG35^=@Ve;Qq}4gFQSNoVirZY23nV0H=-=`ollz=8Dn(-$-;c>N|ZO^*;hPD=O0ssylM=h08+w{@c3q-$MWC6K>1p=Iy|%K2%ikQ$XSTul@D; Y4|78M5WR93DgXcg07*qoM6N<$g1JOjI{*Lx literal 0 HcmV?d00001 diff --git a/LuaRules/Images/awards/trophy_attrition.png b/LuaRules/Images/awards/trophy_attrition.png new file mode 100644 index 0000000000000000000000000000000000000000..5be71b352736e88af0c000e2977dccef3783632f GIT binary patch literal 12309 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≪)pl`ZDml}IWy+P~#j}|Hm3f~!{2752b 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 literal 0 HcmV?d00001 diff --git a/LuaRules/Images/awards/trophy_drone.png b/LuaRules/Images/awards/trophy_drone.png new file mode 100644 index 0000000000000000000000000000000000000000..116ac02d25224482c3b234c45f82bea21686edbd GIT binary patch literal 14665 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 LNkvXXu0mjfE%4DB literal 0 HcmV?d00001 diff --git a/LuaRules/Images/awards/trophy_economist.png b/LuaRules/Images/awards/trophy_economist.png new file mode 100644 index 0000000000000000000000000000000000000000..0f538aaa9aba6b71d2f2b2e0d7aa7d6c6431cccb GIT binary patch literal 2273 zcmV<72p;!|P)EX>4Tx04R}tkv&MmP!xqvQ>7vm2MdZgWT;M7L`57+6^me@v=v%)FnQ@8G-*gu zTpR`0f`dPcRR4rtTK|H%@ z>74h8L#!kz#OK801~o|h$aUG}H_ke3JS*_Gqt55#IU|w5EbDe4gaV#N$Bt*!lp^OSFL}=GYF_EJ4n1_GZ@h8b8ldB9y zjs;YqLUR1zfAD*@W?_2DO$x?LIHR`qi@Oq1Ghl$nmf1FIZhvd49#l!1~@nb z#)_1^?(y!P&bj@2r!~JHm6>w24Y63Z00006VoOIv0RI600RN!9r;`8x010qNS#tmY zE+YT{E+YYWr9XB6000McNlirueSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00y~9L_t(o!{wNLP*mp?#((d_|LswC8aTORG75z# zx%Mm4YZoO7L8zEkaesib%Cay6X1~~Iy2k$O{dWf}B4q8$LX?2qJf?hVxdL>+0F3SL z{3ia$kq?~f)^9ou_yAKWC3k${+}d2GluYR}Mnsf|SVUxihzx9KIRD_pCrAByXQ_PYDD9L}iR&#KOhQ+PH~F7c2^;$O=RP zaRoD!nR@t%=iWg+lsmL!TX#k z-cFahou3R)Au~CE*!H%j;U}s$eE;z$W+vA+4mtbCBNLkWj};X_!nR`c)U+E|_X0M> zL^+*UCp^vIS6;(ivWJ9u3wUVha^6UAg+OgUOn0|u*xtXqKJS^Y6+GV35-^j8=hYZC zr!9CWM=%w7{rm!@oK8$J`!JV)zoDMa%a@2AF_NU0RuZErY$++>d5tnn-_WwZuFHEk z-99VYHCC@Y`semX$1m^pbT%dVd|uPz@mO7PsZF|WbpxiqpJ{jm5~BjxE*&j))L&L}SCbp(m<0ESfcYNxY^H zMAM>}JO2*`$RNbeh1zx99-py$?6@gi;q6wg>q1)ZHg?T~lXr}!z34eUTU1Eh>Qy0` zwZ?|ph;?h1Kl|9YK^dlbm9CECcsfsmvZ3@uuC~|9frBjv7Jui}J$6T=2MC1Brmky} zmcDvvA}~Bmkdr4*SZix9vU#h!JTh`?WK@(by1nh=lw~WnIQ)TD%JywImp5z8?;@iT zF9IEapIbCs%MEA(hYM?%`Kvcc&6$op))llJ{+y{_Z_LV`@gt?wV1-I)Y^WOh&r_S8 z(=ARu`tYrmVZ)!_Jb1{%XMrn#2ME|)vGU}O(Kk$mUQ%mHqheYGnM+^ff!TA>5)$ch zMDzeFrMh(8(xPelC8eoLM-KlnHa$Jn{>hnLUeu7c$BcXCFmMrY2Zw}YE`5=TX%%Qn zyESlGP8rs?c#?AS@eYWj>B4!M>MroDE)l>CO4ki^cXqUy1ggJc7@bsBoqg}I%q6=t z&1eAH054z~@dG6(Hy>+UJY_j$edjnPArayR(scS1C)TgQXZlHB@iJtLAS_?n!HPd6 z#=B0Yy??0n?@wiI-eR#jJ_lMt5-+T4me5`?35i_3uB2`N_PE{D|Lp+hig%DYr;v&T zbLg^I;kTQ6+#Lw`v_l8CkB@P7H9wW}>gt4~uYLl20dxX^Z{~=*y zPGs2b($M_1ib!1!#zX{r-VBoV zA0eg1A3pe{eCgxSdY+fbJ{!hiMM$BVK`6}f4xZB>n`+JbU$AHU0hvug} zMu8pT2KArNZGj7lyegc5o*03GYt0-s&rg}AlUwl zaB^>EX>4U6ba`-PAZ2)IW&i+q+O3;umLoTIh5us}UIM0vVL2Gj@eaIve-~tyC3Q>P zvR$bnSxhn_@P<1)gxvYB|Ge%$_)}^sE?aG-m*V-8d+u@YqWRCC@g9TE@A31G^Zi}; z{rfKdd@1r);yHc(*~<6*!~2oX$M5^=dz``h_L~Fs?-|1U{V&G%K%D4vg75o3CraUS z0>8fp8s7t@_&sy}{Cj@STzad&UBdT!{(gV|!oXjrhn#9GRzl4@=ICoJo!2e;T#4J( zh0dQN*!M(#__zD{XylsWNg?^qb>*1T1U#b1YY-VY`;PM zvp;`!_3pQq|4sYv()tsMKc@TFt8cd5PZmo2{v!P$OXb(|KYc&g&w>7s)|b2AoVm1L zXa3#$CxrIfCA**W>F>R}-FrT(8@aIL@?F%=Qr;^*Hx;e-t-??B#gV?o3;lF{8f~$t zrA=@qKP&VQN#YGT>@dO&=RL2mxWpV!tUSlKTukrHMlyO_q&cLlpKxPMJ?+#;@uDOW z@5W!(65eV1JKbWD+xZ>%Xbc=I@Rk4dkNbB&cwbM1;J?9NFTYV$$5r@1`t`)e$Vj-~ zpxO)Y&(9zKD6feO+6!}Ifx}PtImEQ^KgE?^q7xr9oi!;p5OHebVnQMVzJz3< za78u78UlfABxrEyYN$yDf?3>LWXvfQl0y%3ZoX5)`)IWIc^fcH+0lF@RdUnQAXzyZ z^;2`BhK41}W>&0Pvu>lLq7Eyi7NP2>spe|6)LNUXy^fYzZq`bxt+n1pk3E69*6GLI zdhcU!(!r4j-yVEmj2UN|dD<+q&NjQ7V^KaUFI#2R)mC3)$DKBPyvwe;?Y_qehf+HE z*eR!;cKR8YQoHHqYq#9$ZoB=CUs(&^w*BMJ-^g0{W-Y!<>4WuG)_AwppF;$}i797f zEapJMD_J9B6t;5aTgW*obIO_T0z!*iq$xQ&C}U(WpAhYaU%C5c&c*TnlQ&n}%Uk@v zX3i;f|7Pa?F>n7YYkRy-OfN%fLj~0*y6@IIVjH65KYc#t60~vo_!8D#4mpgYdK;6U zW1nAtf5|uAuSJu5pj`m(R^vj#aO9=!usjRxlUnbg!%uD2;aPv*%hz;Uzje$RZnJB> zn@_{~v3zqnM2sUOcXQizHcOqkwqc4dVJjD&13jBh#E6UYv)nLB-+mL)!qW~E$fgc< zz5BSqSs+Zp%eAh}>mB-@k&Knq4$0ne+!ESaohq8F6A+XX%-g=1u51 z3-xAed_M5`wXWs;T1xEm0n*Rm?q$_!!+B#~bka-egdNt)?vP0Om(T9^Z)owYrF&^# zp3XcvkI=QSvNNb^BCg_|z!chM76{;3O)?N-RasA2C8chQM1iM2e(V)ZX`@K0wa+EE@1i{b?#Enu(CQ`$frW+CDM2+aC(Z865o~50pz*N zcFVA^DT#VdbJxS8k^a8(@-^BP$bey0_aH<+d8%Ver(7vH^&!f3Q(DI#I)3a762<1$ z-a97V-D~c18hJN=PEgh6cjyef1nT*k6|0FH6mgqlkzI-)w=OCQkImR8`R77tP@V1kdgsRV6Hvy-rb`6s-O)Hyfn<-D2fp$*%&u2iD zWg4IuT-dDxoh8^x?JQb*0kUOJTO43y9{YwH>dBUFNDl;!Q1=XaePC|nj2H1>eV>Oz zwNO%92`uDd0g{y4JbY$s@DXtddfx@kBc~^nlQ|h&Qa-HWA~+JjdsOG^|IA9-%!gJ1 zNhGm6k%CTB2mCU{K?jx;CtNV8&KUc(ovu4!k#~r3sC9ZjtSYn`@o{9`pPkQ69NiA! zdP||VNGkY2DcS^zX-7EYU?E1!bCkS#fJs3%UuV~~`7sbklL{U|L>EX^uub1Ct22Ra zC}?`m77&r#m>D*$GpY)ea{&aDhO77j1Zce7!Ck~^ImpG_4cN(9djWwS@F z&<;gDhy~GS1%a>u0$wj<4}bsc{Ga^d^IRdc)+;SdllKc-^1}F;H-ZqmPpgaIwB-iU zM+yd>$8@7Y%`bF+rsXy?wEb*3fHlN=j(&jz^P7y)4-ysfDE_){K%G7%-}%0jCqBr6#ene1zqpBvt@8&g@*{P5SH#;gt=OBq3xl8sIf=8i-W6&dKT&Cw|Z^y83hjYv!a zdhT)y5mwK!8-Xu$d`1(&5yrP#l0GBJ03x=Q@W)yvaHbb>!KH*x=j86)=cR@#fBjq` ztcBA>+FU&m=Yx0=&|=uiaH?0eQYM0jb*PcXYo&q&LiDW3rL0LCJ>lgy>V16<^*!c0 zqPsdEMaNyYt-ns+SV0({S71yR62(dkZWl4KXq>uafhQ3nFA zYbi?{qzX+z9XWJ}R^-1y#!RfQ=32C^dN(8Zsk|^9Iyb@xjYJFrNCTIW04WMC6v|jR z74Tn+l*~O>xtwT%1Vaz97Sy<7OZgv9Tl0CeCE~c9lXwCo5n8KXEbCD_qihW;0&cR} zJS4R0I*kiL8P($GX?zJ^fu~`%)kHa>TE3h|N?njF#L4pk`s@oc5|Fxhp|c>xA~SSw z*}WxfDOF66fp~NTdKiYr!eL!xIMwc4cm_=(bx0?-2ALrTp*#&f(8{fs~+n<%ePfPEDg6fN=%2JapjHpeI2P5_Un*RD{f+A0$T-RzaPU zz=-gg=x_DL@`6%Boll)#U@J8OVJ>;jAC#xzf=crTM1fgi6?ptjX2G|lu10Hjvv|w4TY6k%e%egEEWdt6^TfCMt zh+jE))Yt>X0Bk;;837E3=fD@79akQd`T%A-i)JY>Bh-TC!wc3n0h@|8lrLq;D4qNK zD=wd|sgYhoeNoJjHdz!F@CvU;utl^c0#heWT|J1Uq4sVRU03Q%W6C|tBrtKfif4si zw7dlVB#&&~hg5XP1_gX7>gIA)kQ48#J4itZ^W}9OdvJ^K<1CP4hSLb%Mkk^T_FB@X ztdTkfp|Ceo3Jn_F;J;DvSR{C{6HzJ^W*-htRXjYd2Vqw1l+QQ;mgiEj6$GitzW|Ew z+N1?&7Q8+OL|>pffGX-}wXS&~s`FsQFWTn7Y)Dru6pSpBPLQ#{C}=EA#XlWfJI-7v zD<428@NWJCA;&W621AirkifM2dZ9&{7PLuO z*mkK`)jrsV9tpURW}%fxoX~3Yq>tFeMfMg+MLlaEq}_`rA}lLo6vqa^Vgg^U24R5I zf+f&_KD@k8%?sg$IfEVMp!2~`LZRUjNEBSvyyHp|q0_)pB=#Ois=bN!@n~a>T2NTO zsvCkqi6e@CSKiLbUtkVZn1NXfTqU}}W2mtMEMm{- zFv<#`nz(%MOBNJSTgfBP-GSc*?&U7AHw)_Z`jws4b||AWv2vQ7W2WzgjM2hy5!%>R ztk?>9NGf_U1q||dF=hXyQ9O9XcQP($BLpMX~2$IrSQ^` zxW5reQag&GtG5qDr?CaR2-{|u>}smP(Q;6R_+Hn(fjdI}aIR*~S78FHkk^P0Bf&@v z`t`!%LSZfoonT1*3~^(|-*9X``f$x20$+d#IjmElTbJj>^Hl!UclNm&jb3s!lh?#- z@e62li^+$b?L>te{Dwa%INv4u2ydfxnvko3ZUyHtKD+ktr}V3YAdG-kO#Z4|?U4g>|k z3rLon|ShfFivB-un5L7|HHz7k-?N#ap%=QMO5)wJGnW?5)aC<8wZ z%qEQ`ZPqAfmAEAQ1TmnLq_bwg-8-qnCUr>T>_t~nZhhk=Q!jW0xrM@7o*y_GZc@N7 zXI-+%C%l77m1d_-Q$LCN;aDg9v--Jd!7wE{6u7+GqdNkZK<+aoO+Wvp~T= zG?g4H?V3ap5U6HU!)s@T>R_o3r0OP#j**qF1y(XSd(43xgL(0KsRQGvj;!gZ;;msm z)-B?9P|UeE#3<^;Btt37w|43}aJKs~>Xk~EIcn0v#}LJMB(i}5fiRIk2ZgK=*>)1v z*dYLL)7jyybSKCGEa8O!4$Y5)WaZ-*nh0KlUSa}vI5_dalxd_vMoE9 zcf3~!AY}_dQ4y^Y#jljXQgqb%eh+)&BE6u^g&`{?gDq979hpIUAx|O)nI8i2_7^F2 z|1#I)k%g1HfCfSFLskgs&uOt{bQG?#Ui1-Qc{N<{Z=%2l9+)EqB7(5U?0MuxHaBe(uG=(;L(7?JuZ6j7O~q(3M7_BgaF+ejc*=iJ~l zx-;YeF0xnXfdndK=sapg6f-e9npw(w`s_dZArIWofm4voIOSr9i1Mg>YxEEL2aNBt zd%8lXf_UtV{sZyOpuZ?f{1t0Ws0cx16!-YzG`$E?JH%#x>iN^u70tH59J)g%=xXIm z$X^gvmr!`MB~GBP0XC#`T@;|^oalTdTHCsRlMq}mOb)J#@FCVFEcic@2+X8rCSaiU z#lM4yj2N!0amn=4fW#J#3=Vykg7!M8z|bP?ra89Nq{HJQr>379=Oz`6i`9Jk0O{*! z>cE!^76gjm{UohZTrAre^>m*x-w%!BvA(-)~K7C|<2 zB6?_PpcQovMxt<#T3b6|1;jt3b|Na|gD`IN?8FXghp8#SEnbHf07ybY3X{!bpg!i8 zvV}k;)8&&i zU?wP4_Gv`P7f<;Gbi(iN0)`*~3-&r$U!a8M zkWF()B0ObvER3Z)f<&4CG{uEN#yNIHsvl_%@<

J+vRsg85Ez1^o4gg-}~_!syWE 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 JPDHLkV1js7p{xJ^ literal 0 HcmV?d00001 diff --git a/LuaRules/Images/awards/trophy_repair.png b/LuaRules/Images/awards/trophy_repair.png new file mode 100644 index 0000000000000000000000000000000000000000..d38f602d947536a66e42f9ec63506058d8ecd0c1 GIT binary patch literal 2384 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 Ze*>N;@HD01v7rC}002ovPDHLkV1f>8-Aw=h literal 0 HcmV?d00001 diff --git a/LuaUI/Configs/lang/awards.de.json b/LuaUI/Configs/lang/awards.de.json new file mode 100644 index 0000000000..5f12ee7aed --- /dev/null +++ b/LuaUI/Configs/lang/awards.de.json @@ -0,0 +1,150 @@ +{ + "air": "Luftwaffengeneral", + "air_desc": "Verdient durch Schaden an feindlichen Einheiten mit Flugzeugen.", + "air_yourscore": "Du hast %{score} Schaden mit Flugzeugen verursacht.", + "air_score": "Schaden durch Lufteinheiten: %{score}", + "apm": "APM", + "apm_mousespeed": "Mausgeschwindigkeit\n(Pixel/Sek.)", + "apm_clickrate": "Klickrate\n(Mausklicks/Min.)", + "apm_keyspressed": "Tastendruckrate\n(gedrückte Tasten/Min.)", + "apm_cmd": "APM\n(Befehle/Min.)", + "assistant": "Subventionsstrategie", + "assistant_desc": "Verdient durch Unterstützung von Verbündeten bei Bauprojekten oder durch Metallspenden an Verbündete.", + "assistant_yourscore" : "Du hast %{score} Metall für die Unterstützung deiner Verbündeten eingesetzt.", + "assistant_score" : "%{score} Metall für die Unterstützung deiner Verbündeten eingesetzt.", + "attrition" : "Abnutzungs-Ass", + "attrition_desc" : "Verdient durch das Töten von mehr Metall als du verloren hast. Die Punktzahl wird anhand des Verhältnisses von getötetem zu verlorenem Metall berechnet.", + "attrition_yourscore" : "Deine Abnutzungsrate betrug %{score}.", + "attrition_score" : "Abnutzungsrate: %{score}", + "awards" : "Auszeichnungen", + "cap" : "Meister der Puppen", + "cap_desc" : "Verdient durch die Eroberung feindlicher Einheiten entweder durch den Eroberungsstrahl des Unterstützungskommandanten oder durch Dominas.", + "cap_yourscore" : "Du hast Einheiten im Wert von %{score} Metall erobert.", + "cap_score" : "Gefangene Feinde im Wert von %{score} Metall.", + "comm" : "Meister und Kommandant", + "comm_desc": "Verdient durch Schadensverursachung mit Kommandanten.", + "comm_yourscore": "Du hast mit deinen Kommandanten %{score} Schaden verursacht.", + "comm_score": "%{score} Schadensverursacht durch Kommandanten.", + "commwars": "Kommandant Eroberer", + "commwars_desc": "Verdient als letzter überlebender Kommandant im Commander Wars-Spielmodus.", + "commwars_yourscore": "Du hast %{score} Kommandanten getötet.", + "commwars_score": "%{score} Kommandanten eliminiert.", + "chicken": "Hühner-Anwärter", + "chicken_desc": "Verdient durch das Erreichen von über 100 Punkten mit anwesenden Hühnern. Verdient Punkte, indem ihr länger gegen die Hühnerplage überlebt! Jeder erhält diese Auszeichnung.", + "chicken_score": "Punktzahl: %{score}", + "chickenWin": "Hühnervernichter", + "chickenWin_desc": "Verdient durch das Erreichen von über 100 Punkten mit anwesenden Hühnern auf höheren Schwierigkeitsgraden. Verdient mehr Punkte, indem ihr länger überlebt! Jeder erhält diese Auszeichnung.", + "chickenWin_score": "Punktzahl: %{score}", + "defeat": "Niederlage!", + "draw_result": "Unentschieden!", + "drone": "Drohnenleiter", + "drone_desc": "Verdient durch Schaden mit Drohnen.", + "drone_yourscore": "Du hast %{score} Schaden mit Drohnen verursacht.", + "drone_score": "%{score} Schaden mit Drohnen verursacht.", + "economist": "Wirtschaftsmacht", + "economist_desc": "Verdient durch Metallproduktion mit Overdrive.", + "economist_yourscore": "Dein Overdrive hat dem Team %{score} Metall beigesteuert.", + "economist_score": "%{score} Metall mit Overdrive produziert", + "emp": "EMP-Zauberer", + "emp_desc": "Verdient durch EMP-Schaden an gegnerischen Einheiten.", + "emp_yourscore": "Du hast gegnerischen Einheiten %{score} EMP-Schaden zugefügt.", + "emp_score": "%{score} EMP Schaden verursacht", + "exitlobby": "Verlassen zur Lobby", + "fire": "Grillmeister", + "fire_desc": "Verdient durch Feuerschaden an gegnerischen Einheiten.", + "fire_yourscore": "Du hast gegnerischen Einheiten %{score} Feuerschaden zugefügt.", + "fire_score": "%{score} Feuerschaden verursacht", + "gameover": "Spiel vorbei!", + "gameabort": "Spiel abgebrochen", + "head": "Kopfjäger", + "head_desc": "Verdient durch das Töten gegnerischer Kommandanten. Du musst mindestens 4 töten, um diese Auszeichnung zu erhalten.", + "head_yourscore": "Dein Kommandant tötet: %{score}", + "head_score": "%{score} Kommandanten getötet", + "heart": "Herzensbrecherin der Königin", + "heart_desc": "Verdient durch Schaden an der Hühnerkönigin.", + "heart_yourscore": "Du hast der Königin %{score} Schaden zugefügt.", + "heart_score": "%{score} Schaden an der Hühnerkönigin verursacht", + "kam": "Glorreicher Brand", + "kam_desc": "Verdient durch Schaden mit Selbstmordeinheiten.", + "kam_yourscore": "Du hast feindlichen Einheiten mit Selbstmordeinheiten %{score} Schaden zugefügt.", + "kam_score": "%{score} Schaden durch Selbstmordeinheiten verursacht", + "mex": "Mineralschürfer", + "mex_desc": "Verdient durch den Bau von Metallextraktoren für deine Team.", + "mex_yourscore": "Du hast %{score} gebaut.", + "mex_score": "%{score} Metallextraktoren gebaut.", + "mexkill": "Plündern & Brandschatzen", + "mexkill_desc": "Verdient durch das Töten feindlicher Metallextraktoren.", + "mexkill_yourscore": "Du hast %{score} feindliche Metallextraktoren getötet.", + "mexkill_score": "%{score} Metallextraktoren getötet", + "menace": "Bedrohungstöter", + "menace_desc": "Verdient durch das Verursachen von Schaden an Hühnerbedrohungen.", + "menace_yourscore": "Du hast Bedrohungen %{score} Schaden zugefügt.", + "menace_score": "%{score} Schaden an Bedrohungen verursacht.", + "missile": "Raketen-Marodeur", + "missile_desc": "Verdient durch Schaden mit Raketensilo-Raketen.", + "missile_yourscore": "Du hast %{score} Schaden mit taktischen Raketen verursacht.", + "missile_score": "%{score} Schaden mit taktischen Raketen verursacht.", + "nux": "Apokalyptischer Erfolg", + "nux_desc": "Verdient durch Schaden mit Superwaffen.", + "nux_yourscore": "Du hast %{score} Schaden mit Superwaffen verursacht.", + "nux_score": "%{score} Schaden mit Superwaffen verursacht", + "ouch": "Großes Lila Herz", + "ouch_desc": "Erworben durch erlittenen Gesundheitsschaden.", + "ouch_yourscore": "Du hast %{score} Schaden erlitten.", + "ouch_score": "%{score} Schaden erlitten", + "pwn": "Komplette Vernichtung", + "pwn_desc": "Erworben durch Schaden an gegnerischen Einheiten.", + "pwn_yourscore": "Du hast gegnerischen Einheiten %{score} Schaden zugefügt.", + "pwn_score": "%{score} Schaden verursacht", + "rage": "Wutauslöser", + "rage_desc": "Dieser Erfolg ist nicht implementiert.", + "rage_yourscore": "Nicht implementiert. %{score}", + "rage_score": "%{score} erzielt?", + "reclaim": "Kriegsbeute", + "reclaim_desc": "Verdient durch die Rückgewinnung von Metall aus der Umgebung, z. B. von Wracks oder Zauberpilzen.", + "reclaim_yourscore": "Du hast %{score} Metall zurückgewonnen.", + "reclaim_score": "%{score} Metall zurückgewonnen.", + "rezz": "Abscheulicher Totenbeschwörer", + "rezz_desc": "Verdient durch die Wiederbelebung von Wracks.", + "rezz_yourscore": "Du hast Wracks im Wert von %{score} Metall wiederbelebt.", + "rezz_score": "Einheiten im Wert von %{score} Metall wiederbelebt.", + "repair": "Freundlicher Mechaniker", + "repair_desc": "Verdient durch die Reparatur verbündeter Einheiten.", + "repair_yourscore": "Du hast die Gesundheit deiner Verbündeten im Wert von %{score} repariert.", + "repair_score" : "%{score} Gesundheit wiederhergestellt.", + "share" : "Bär teilen", + "share_desc": "Verdient durch das Teilen von Einheiten mit Verbündeten.", + "share_yourscore": "Du hast Einheiten im Wert von %{score} Metall mit deinen Teammitgliedern geteilt.", + "share_score": "Geteilte Einheiten im Wert von %{score} Metall.", + "shell": "Schildkrötenpanzer", + "shell_desc": "Verdient durch Schaden an gegnerischen Einheiten durch Verteidigung.", + "shell_yourscore": "Deine Verteidigung hat gegnerischen Einheiten %{score} Schaden zugefügt.", + "shell_score": "%{score} Schaden durch Verteidigung.", + "shield": "Schildträger", + "shield_desc": "Verdient durch das Tanken von Schaden durch Schilde.", + "shield_yourscore": "Deine Schilde haben %{score} Schaden absorbiert.", + "shield_score": "%{score} Schaden durch Schilde erlitten.", + "langsam" : "Verkehrspolizist", + "slow_desc": "Verdient durch Verlangsamungsschaden an gegnerischen Einheiten.", + "slow_yourscore": "Du hast gegnerischen Einheiten %{score} Verlangsamungsschaden zugefügt.", + "slow_score": "%{score} Verlangsamungsschaden verursacht", + "statistics": "Statistiken", + "sweeper": "Landkehrer", + "sweeper_desc": "Verdient durch das Töten von Hühnerställen.", + "sweeper_yourscore": "Du hast %{score} vernichtet.", + "sweeper_score": "%{score} Hühnerställe vernichtet", + "t3": "Experimenteller Ingenieur", + "t3_desc": "Diese Auszeichnung ist noch nicht implementiert.", + "t3_yourscore": "Nicht implementiert %{score}", + "t3_score": "Punktzahl: %{score}", + "terra": "Legendärer Landschaftsgärtner", + "terra_desc": "Durch Terraforming verdient.", + "terra_yourscore": "Du hast %{score} Metall für Terraforming ausgegeben.", + "terra_score": "%{score} Metall für Terraforming ausgegeben.", + "vet": "Ausgezeichneter Veteran", + "vet_desc": "Verdient durch den effektiven Einsatz einer Einheit, um Schaden zu verursachen oder mehr Wert zu töten, als sie wert war.", + "vet_yourscore": "Deine kosteneffektivste Einheit war %{unitname}, die %{score} kostete.", + "vet_score": "%{unitname}, verursachte Kosten: %{score}", + "victory": "Sieg!", + "teamwins": "%{name} gewinnt!" +} diff --git a/LuaUI/Configs/lang/awards.en.json b/LuaUI/Configs/lang/awards.en.json new file mode 100644 index 0000000000..21e6e6ff72 --- /dev/null +++ b/LuaUI/Configs/lang/awards.en.json @@ -0,0 +1,150 @@ +{ + "air" : "Airforce General", + "air_desc" : "Earned by damaging enemy units with aircraft.", + "air_yourscore" : "You did %{score} damage with aircraft.", + "air_score" : "Damage done by air units: %{score}", + "apm" : "APM", + "apm_mousespeed" : "Mouse Speed\n(Pixels/sec)", + "apm_clickrate" : "Click Rate\n(Mouse Clicks/min)", + "apm_keyspressed" : "Key Press Rate\n(Keys Pressed/min)", + "apm_cmd" : "APM\n(Commands/min)", + "assistant" : "Subsidization Strategy", + "assistant_desc" : "Earned by assisting allies with construction projects or donating metal to allies.", + "assistant_yourscore" : "You used %{score} metal for assisting your allies.", + "assistant_score" : "%{score} metal used for assisting allies", + "attrition" : "Attrition Ace", + "attrition_desc" : "Earned by killing more metal value than you have lost. Score is calculated using a ratio of value killed vs value lost.", + "attrition_yourscore" : "Your attrition rate was %{score}.", + "attrition_score" : "Attrition rate: %{score}", + "awards" : "Awards", + "cap" : "Master of Puppets", + "cap_desc" : "Earned by capturing enemy units either via Support Commander's Capture Ray or Dominatrixes.", + "cap_yourscore" : "You captured %{score} metal worth of units.", + "cap_score" : "%{score} metal worth of enemies captured.", + "comm" : "Master and Commander", + "comm_desc" : "Earned by dealing damage using commanders.", + "comm_yourscore" : "You did %{score} damage using your commanders.", + "comm_score" : "%{score} damage done by commanders.", + "commwars" : "Commander Conqueror", + "commwars_desc" : "Earned by being the last commander standing in the Commander Wars game mode.", + "commwars_yourscore" : "You killed %{score} commanders.", + "commwars_score" : "%{score} commanders eliminated.", + "chicken" : "Chicken Contender", + "chicken_desc" : "Earned by scoring over 100 points with chickens present. Earn points by surviving longer against the chicken menace! Everyone earns this award.", + "chicken_score" : "Score: %{score}", + "chickenWin" : "Chicken Eradicator", + "chickenWin_desc" : "Earned by scoring over 100 points with chickens present on harder difficulties. Earn more points by surviving longer! Everyone earns this award.", + "chickenWin_score" : "Score: %{score}", + "defeat" : "Defeat!", + "draw_result" : "Draw!", + "drone" : "Drone Director", + "drone_desc" : "Earned by dealing damage with drones.", + "drone_yourscore" : "You did %{score} damage with drones.", + "drone_score" : "%{score} damage dealt with drones", + "economist" : "Economic Powerhouse", + "economist_desc" : "Earned by producing metal through overdrive.", + "economist_yourscore" : "Your overdrive contributed %{score} metal to the team.", + "economist_score" : "%{score} metal produced via overdrive", + "emp" : "EMP Wizard", + "emp_desc" : "Earned by dealing EMP damage to enemy units.", + "emp_yourscore" : "You did %{score} emp damage to enemy units.", + "emp_score" : "%{score} emp damage dealt", + "exitlobby" : "Exit to lobby", + "fire" : "Master Grill-Chef", + "fire_desc" : "Earned by dealing fire damage to enemy units.", + "fire_yourscore" : "You did %{score} fire damage to enemy units.", + "fire_score" : "%{score} fire damage dealt", + "gameover" : "Game over!", + "gameabort" : "Game aborted", + "head" : "Head Hunter", + "head_desc" : "Earned by killing enemy commanders. You must kill at least 4 to qualify for this award.", + "head_yourscore" : "Your commander kills: %{score}", + "head_score" : "%{score} commanders killed", + "heart" : "Queen Heart Breaker", + "heart_desc" : "Earned by dealing damage to the chicken queen.", + "heart_yourscore" : "You did %{score} damage to the queen.", + "heart_score" : "%{score} damage dealt to the Chicken Queen", + "kam" : "Blaze of Glory", + "kam_desc" : "Earned by dealing damage using suicide units.", + "kam_yourscore" : "You did %{score} damage to enemy units using suicide units", + "kam_score" : "%{score} damage dealt by suicide units", + "mex" : "Mineral Prospector", + "mex_desc" : "Earned by building metal extractors for your team.", + "mex_yourscore" : "You built %{score}.", + "mex_score" : "%{score} metal extractors built", + "mexkill" : "Loot & Pillage", + "mexkill_desc" : "Earned by killing enemy metal extractors.", + "mexkill_yourscore" : "You killed %{score} enemy metal extractors.", + "mexkill_score" : "%{score} metal extractors killed", + "menace" : "Menace Slayer", + "menace_desc" : "Earned by dealing damage to chicken menaces.", + "menace_yourscore" : "You did %{score} damage to menaces.", + "menace_score" : "%{score} damage dealt to menaces.", + "missile" : "Missile Marauder", + "missile_desc" : "Earned by dealing damage using missile silo missiles.", + "missile_yourscore" : "You did %{score} damage using tactical missiles.", + "missile_score" : "%{score} damage dealt using tactical missiles.", + "nux" : "Apocalyptic Achievement", + "nux_desc" : "Earned by dealing damage using superweapons.", + "nux_yourscore" : "You did %{score} damage using superweapons.", + "nux_score" : "%{score} damage dealt using superweapons", + "ouch" : "Big Purple Heart", + "ouch_desc" : "Earned by taking health damage.", + "ouch_yourscore" : "You took %{score} damage.", + "ouch_score" : "%{score} damage taken", + "pwn" : "Complete Annihalation", + "pwn_desc" : "Earned by dealing damage to enemy units.", + "pwn_yourscore" : "You dealt %{score} damage to enemy units.", + "pwn_score" : "%{score} damage dealt", + "rage" : "Rage inducer", + "rage_desc" : "This achievement is not implemented.", + "rage_yourscore" : "Not implemented. %{score}", + "rage_score" : "%{score} scored?", + "reclaim" : "Spoils of War", + "reclaim_desc" : "Earned by reclaiming metal from the environment from things such as wrecks or magic mushrooms.", + "reclaim_yourscore" : "You reclaimed %{score} metal.", + "reclaim_score" : "%{score} metal reclaimed.", + "rezz" : "Vile Necromancer", + "rezz_desc" : "Earned by resurrecting wrecks.", + "rezz_yourscore" : "You resurrected %{score} metal worth of wrecks.", + "rezz_score" : "%{score} metal worth of units resurrected.", + "repair" : "Friendly Mechanic", + "repair_desc" : "Earned by repairing allied units.", + "repair_yourscore" : "You repaired %{score} health to your allies.", + "repair_score" : "%{score} health repaired.", + "share" : "Share Bear", + "share_desc" : "Earned by sharing units to your allies.", + "share_yourscore" : "You shared %{score} metal worth of units to your teammates.", + "share_score" : "%{score} metal worth of units shared", + "shell" : "Turtle Shell", + "shell_desc" : "Earned by dealing damage to enemy units using defenses.", + "shell_yourscore" : "Your defenses inflicted %{score} damage to enemy units.", + "shell_score" : "%{score} damage dealt by defenses", + "shield" : "Shieldbearer", + "shield_desc" : "Earned by tanking damage using shields.", + "shield_yourscore" : "Your shields absorbed %{score} damage.", + "shield_score" : "%{score} damage taken using shields", + "slow" : "Traffic Cop", + "slow_desc" : "Earned by dealing slow damage to enemy units.", + "slow_yourscore" : "You dealt %{score} slow damage to enemy units.", + "slow_score" : "%{score} slow damage dealt", + "statistics" : "Statistics", + "sweeper" : "Land Sweeper", + "sweeper_desc" : "Earned by killing chicken roosts.", + "sweeper_yourscore" : "You wiped out %{score}.", + "sweeper_score" : "%{score} chicken roosts wiped out", + "t3" : "Experimental Engineer", + "t3_desc" : "This award is not yet implemented.", + "t3_yourscore" : "Not implemented %{score}", + "t3_score" : "Score: %{score}", + "terra" : "Legendary Landscaper", + "terra_desc" : "Earned by terraforming.", + "terra_yourscore" : "You spent %{score} metal on terraform.", + "terra_score" : "%{score} metal spent on terraform.", + "vet" : "Decorated Veteran", + "vet_desc" : "Earned by using a unit very effectively to deal damage or kill more value than it was worth.", + "vet_yourscore" : "Your most cost effective unit was %{unitname} which made %{score} cost.", + "vet_score" : "%{unitname}, cost made: %{score}", + "victory" : "Victory!", + "teamwins" : "%{name} wins!" +} diff --git a/LuaUI/Configs/lang/awards.fr.json b/LuaUI/Configs/lang/awards.fr.json new file mode 100644 index 0000000000..ce7a142471 --- /dev/null +++ b/LuaUI/Configs/lang/awards.fr.json @@ -0,0 +1,149 @@ +{ + "air" : "Général de l'armée de l'air", + "air_desc" : "Gagné en endommageant des unités ennemies avec des avions", + "air_yourscore" : "Vous avez fait %{score} de dégâts avec des avions. ", + "air_score" : "Dommages causés par les unités aériennes : %{score}", + "apm" : "APM", + "apm_mousespeed" : "Vitesse de la souris\n(Pixels/sec)", + "apm_clickrate" : "Taux de clics\n(Clics de souris/min)", + "apm_keyspressed" : "Taux de pression des touches\n(Touches enfoncées/min)", + "apm_cmd" : "APM\n(Commandes/min)", + "assistant" : "Stratégie de subvention", + "assistant_desc" : "Gagné en aidant les alliés avec des projets de construction ou en donnant du métal aux alliés", + "assistant_yourscore" : "Vous avez utilisé %{score} de métal pour aider vos alliés", + "assistant_score" : "%{score} de métal utilisé pour aider les alliés", + "attrition" : "As d'attrition", + "attrition_desc" : "Gagné en tuant plus de valeur en métal que vous n'en avez perdu. Le score est calculé à l'aide d'un rapport entre la valeur tuée et la valeur perdue.", + "attrition_yourscore" : "Votre taux d'attrition était de %{score}.", + "attrition_score" : "Taux d'attrition : %{score}", + "awards" : "Prix", + "cap" : "Le maître des marionnettes", + "cap_desc" : "Obtenu en capturant des unités ennemies via le rayon de capture du commandant de soutien ou les dominatrices.", + "cap_yourscore" : "Vous avez capturé %{score} d'unités en métal.", + "cap_score" : "%{score} de métal d'ennemis capturés.", + "comm" : "Master and Commander", + "comm_desc" : "Gagner en infligeant des dégâts avec les commandants", + "comm_yourscore" : "Vous avez infligé %{score} de dégâts avec vos commandants", + "comm_score" : "%{score} de dégâts infligés par les commandants", + "commwars" : "Commander Conqueror", + "commwars_desc" : "Gagner en étant le dernier commandant debout dans le mode de jeu Commander Wars", + "commwars_yourscore" : "Vous avez tué %{score} de commandants", + "commwars_score" : "%{score} commandants éliminés.", + "chicken" : "Chicken Contender", + "chicken_desc" : "Obtenu en marquant plus de 100 points en présence de poulets. Gagnez des points en survivant plus longtemps à la menace des poulets ! Tout le monde gagne cette récompense.", + "chicken_score" : "Score: %{score}", + "chickenWin" : "Chicken Eradicator", + "chickenWin_desc" : "Gagné en marquant plus de 100 points avec les poulets présents dans les difficultés les plus difficiles. Gagnez plus de points en survivant plus longtemps ! Tout le monde gagne cette récompense.", + "chickenWin_score" : "Score: %{score}", + "defeat" : "Défaite !", + "draw_result" : "Match nul!", + "drone_desc" : "Gagné en infligeant des dégâts aux drones", + "drone_yourscore" : "Vous avez infligé %{score} de dégâts aux drones", + "drone_score" : "%{score} de dégâts infligés aux drones", + "economist" : "Economic Powerhouse", + "economist_desc" : "Gagné en produisant du métal par overdrive", + "economist_yourscore" : "Votre overdrive a apporté %{score} de métal à l'équipe", + "economist_score" : "%{score} de métal produit par l'overdrive", + "emp" : "EMP Wizard", + "emp_desc" : "Gagné en infligeant des dégâts EMP aux unités ennemies", + "emp_yourscore" : "Vous avez infligé %{score} de dégâts EMP aux unités ennemies", + "emp_score" : "%{score} de dégâts emp infligés", + "exitlobby" : "Quitter le lobby", + "fire" : "Maître Grill-Chef", + "fire_desc" : "Gagné en infligeant des dégâts de feu aux unités ennemies.", + "fire_yourscore" : "Vous avez infligé %{score} dégâts de feu aux unités ennemies.", + "fire_score" : "%{score} dégâts de feu infligés", + "gameover" : "Fin de partie !", + "gameabort" : "Partie interrompue", + "head" : "Chasseur de têtes", + "head_desc" : "Gagné en tuant des commandants ennemis. Vous devez en tuer au moins 4 pour obtenir cette récompense.", + "head_yourscore" : "Votre commandant a tué : %{score}", + "head_score" : "%{score} commandants tués", + "heart" : "Reine Briseur de Cœurs", + "heart_desc" : "Gagné en infligeant des dégâts à la reine poulet.", + "heard_yourscore" : "Vous avez infligé %{score} dégâts à la reine.", + "heart_score" : "%{score} dégâts infligés à la Reine Poule", + "kam" : "Flamme de gloire", + "kam_desc" : "Gagnez en infligeant des dégâts avec des unités suicides.", + "kam_yourscore" : "Vous avez infligé %{score} points de dégâts aux unités ennemies avec des unités suicides.", + "kam_score" : "%{score} points de dégâts infligés par les unités suicides.", + "mex" : "Prospecteur de minéraux", + "mex_desc" : "Gagnez en construisant des extracteurs de métal pour votre équipe.", + "mex_yourscore" : "Vous avez construit %{score}.", + "mex_score" : "%{score} extracteurs de métal construits", + "mexkill" : "Butin et pillage", + "mexkill_desc" : "Gagnez en tuant des extracteurs de métal ennemis.", + "mexkill_yourscore" : "Vous avez tué %{score} extracteurs de métal ennemis.", + "mexkill_score" : "%{score} extracteurs de métal tués", + "menace" : "Tueur de Menaces", + "menace_desc" : "Gagné en infligeant des dégâts aux menaces poulets.", + "menace_yourscore" : "Vous avez infligé %{score} points de dégâts aux menaces.", + "menace_score" : "%{score} points de dégâts infligés aux menaces.", + "missile" : "Maraudeur de Missiles", + "missile_desc" : "Gagné en infligeant des dégâts avec des missiles de silo à missiles.", + "missile_yourscore" : "Vous avez infligé %{score} points de dégâts avec des missiles tactiques.", + "missile_score" : "%{score} points de dégâts infligés avec des missiles tactiques.", + "nux" : "Succès Apocalyptique", + "nux_desc" : "Gagné en infligeant des dégâts avec des super-armes.", + "nux_yourscore" : "Vous avez infligé %{score} points de dégâts avec des super-armes.", + "nux_score" : "%{score} dégâts infligés à l'aide de super-armes", + "ouch" : "Grand cœur violet", + "ouch_desc" : "Gagné en subissant des dégâts de santé.", + "ouch_yourscore" : "Vous avez subi %{score} dégâts.", + "ouch_score" : "%{score} dégâts subis", + "pwn" : "Annihalation complète", + "pwn_desc" : "Gagné en infligeant des dégâts aux unités ennemies.", + "pwn_yourscore" : "Vous avez infligé %{score} points de dégâts aux unités ennemies.", + "pwn_score" : "%{score} points de dégâts infligés", + "rage" : "Inducteur de rage", + "rage_desc" : "Ce succès n'est pas implémenté.", + "rage_yourscore" : "Non implémenté. %{score}", + "rage_score" : "%{score} points de dégâts ?", + "reclaim" : "Butin de guerre", + "reclaim_desc" : "Gagné en récupérant du métal de l'environnement, comme des épaves ou des champignons magiques.", + "reclaim_yourscore" : "Vous avez récupéré %{score} points de métal.", + "reclaim_score" : "%{score} points de métal récupéré.", + "rezz" : "Vile Nécromancien", + "rezz_desc" : "Gagné en ressuscitant des épaves.", + "rezz_yourscore" : "Vous avez ressuscité %{score} de métal d'épaves.", + "rezz_score" : "%{score} de métal d'unités ressuscitées.", + "repair" : "Mécanicien amical", + "repair_desc" : "Gagné en réparant des unités alliées.", + "repair_yourscore" : "Vous avez réparé %{score} de points de vie à vos alliés.", + "repair_score" : "%{score} de points de vie réparés.", + "share" : "Ours partagé", + "share_desc" : "Gagnez en partageant des unités avec vos alliés.", + "share_yourscore" : "Vous avez partagé %{score} de métal d'unités avec vos coéquipiers.", + "share_score" : "%{score} de métal d'unités partagées", + "shell" : "Carapace de tortue", + "shell_desc" : "Gagnez en infligeant des dégâts aux unités ennemies avec vos défenses.", + "shell_yourscore" : "Vos défenses ont infligé %{score} de dégâts aux unités ennemies.", + "shell_score" : "%{score} de dégâts infligés par les défenses", + "shield" : "Porteur de bouclier", + "shield_desc" : "Gagnez en encaissant les dégâts avec vos boucliers.", + "shield_yourscore" : "Vos boucliers ont absorbé %{score} de dégâts.", + "shield_score" : "%{score} de dégâts subis avec vos boucliers", + "slow" : "Trafic Flic", + "slow_desc" : "Gagné en infligeant des dégâts lents aux unités ennemies.", + "slow_yourscore" : "Vous avez infligé %{score} dégâts lents aux unités ennemies.", + "slow_score" : "%{score} dégâts lents infligés", + "statistics" : "Statistiques", + "sweeper" : "Balayeur de terrain", + "sweeper_desc" : "Gagné en tuant des poulaillers.", + "sweeper_yourscore" : "Vous avez éliminé %{score}.", + "sweeper_score" : "%{score} poulaillers éliminés", + "t3" : "Ingénieur expérimental", + "t3_desc" : "Cette récompense n'est pas encore implémentée.", + "t3_yourscore" : "Non implémenté %{score}", + "t3_score" : "Score : %{score}", + "terra" : "Paysagiste légendaire", + "terra_desc" : "Gagné en terraformant.", + "terra_yourscore" : "Vous avez dépensé %{score} métal pour terraformer.", + "terra_score" : "%{score} métal dépensé pour terraformer.", + "vet" : "Vétéran décoré", + "vet_desc" : "Obtenu en utilisant une unité très efficacement pour infliger des dégâts ou tuer plus de valeur que ce qu'elle valait.", + "vet_yourscore" : "Votre unité la plus rentable était %{unitname}, ce qui a rapporté %{score} de coût.", + "vet_score" : "%{unitname}, coût réalisé : %{score}", + "victory" : "Victoire!", + "teamwins" : "%{name} gagne!" +} diff --git a/LuaUI/Configs/lang/awards.it.json b/LuaUI/Configs/lang/awards.it.json new file mode 100644 index 0000000000..b0f5a8dfa0 --- /dev/null +++ b/LuaUI/Configs/lang/awards.it.json @@ -0,0 +1,150 @@ +{ + "air" : "Generale dell'Aeronautica", + "air_desc" : "Ottenuto danneggiando le unità nemiche con gli aerei.", + "air_yourscore" : "Hai inflitto %{score} danni con gli aerei.", + "air_score" : "Danni inflitti dalle unità aeree: %{score}", + "apm" : "APM", + "apm_mousespeed" : "Velocità del mouse\n(pixel/sec)", + "apm_clickrate" : "Percentuale di clic\n(clic del mouse/min)", + "apm_keyspressed" : "Percentuale di pressione tasti\n(tasti premuti/min)", + "apm_cmd" : "APM\n(comandi/min)", + "assistant" : "Strategia di sovvenzionamento", + "assistant_desc" : "Ottenuto aiutando gli alleati nei progetti di costruzione o donando metallo agli alleati.", + "assistant_yourscore" : "Hai usato %{score} metallo per assistere i tuoi alleati.", + "assistant_score" : "%{score} metallo usato per assistere gli alleati", + "attrition" : "Asso di logoramento", + "attrition_desc" : "Ottenuto uccidendo più metallo di quanto ne hai perso. Il punteggio è calcolato usando il rapporto tra il valore ucciso e quello perso.", + "attrition_yourscore" : "Il tuo tasso di logoramento è stato %{score}.", + "attrition_score" : "Tasso di logoramento: %{score}", + "awards" : "Premi", + "cap" : "Maestro di Burattini", + "cap_desc" : "Ottenuto catturando unità nemiche tramite il Raggio di Cattura del Comandante di Supporto o le Dominatrici.", + "cap_yourscore" : "Hai catturato unità per un valore di %{score} metallo.", + "cap_score" : "%{score} metallo di nemici catturati.", + "comm" : "Maestro e Comandante", + "comm_desc": "Ottenuto infliggendo danni usando i comandanti.", + "comm_yourscore": "Hai inflitto %{score} danni usando i tuoi comandanti.", + "comm_score": "%{score} danni inflitti dai comandanti.", + "commwars": "Comandante Conquistatore", + "commwars_desc": "Ottenuto essendo l'ultimo comandante rimasto in piedi nella modalità di gioco Commander Wars.", + "commwars_yourscore": "Hai ucciso %{score} comandanti.", + "commwars_score": "%{score} comandanti eliminati.", + "chicken": "Pollo Contendente", + "chicken_desc": "Ottenuto totalizzando più di 100 punti con i polli presenti. Guadagna punti sopravvivendo più a lungo contro la minaccia dei polli! Tutti si aggiudicano questo premio.", + "chicken_score": "Punteggio: %{score}", + "chickenWin": "Eradicatore di polli", + "chickenWin_desc": "Ottenuto totalizzando più di 100 punti con i polli presenti alle difficoltà più elevate. Guadagna più punti sopravvivendo più a lungo! Tutti si aggiudicano questo premio.", + "chickenWin_score": "Punteggio: %{score}", + "defeat": "Sconfitta!", + "draw_result": "Pareggio!", + "drone": "Direttore di droni", + "drone_desc": "Ottenuto infliggendo danni con i droni.", + "drone_yourscore": "Hai inflitto %{score} danni con droni.", + "drone_score" : "%{score} danni inflitti con i droni", + "economist" : "Potenza economica", + "economist_desc" : "Ottenuto producendo metallo tramite overdrive.", + "economist_yourscore" : "Il tuo overdrive ha contribuito con %{score} metallo alla squadra.", + "economist_score" : "%{score} metallo prodotto tramite overdrive", + "emp" : "Mago EMP", + "emp_desc" : "Ottenuto infliggendo danni EMP alle unità nemiche.", + "emp_yourscore" : "Hai inflitto %{score} danni EMP alle unità nemiche.", + "emp_score" : "%{score} danni EMP inflitti", + "exitlobby" : "Esci alla lobby", + "fire" : "Maestro della griglia", + "fire_desc" : "Ottenuto infliggendo danni da fuoco alle unità nemiche.", + "fire_yourscore": "Hai inflitto %{score} danni da fuoco alle unità nemiche.", + "fire_score": "%{score} danni da fuoco inflitti", + "gameover": "Fine partita!", + "gameabort": "Partita interrotta", + "head": "Cacciatore di teste", + "head_desc": "Ottenuto uccidendo comandanti nemici. Devi ucciderne almeno 4 per qualificarti per questo premio.", + "head_yourscore": "Il tuo comandante ha ucciso: %{score}", + "head_score": "%{score} comandanti uccisi", + "heart": "Regina Spezzacuori", + "heart_desc": "Ottenuto infliggendo danni alla Regina Gallina.", + "heard_yourscore": "Hai inflitto %{score} danni alla Regina.", + "heart_score": "%{score} danni inflitti alla Regina Gallina", + "kam": "Fulmine di Gloria", + "kam_desc": "Ottenuto infliggendo danni usando unità suicide.", + "kam_yourscore": "Hai inflitto %{score} danni alle unità nemiche usando unità suicide", + "kam_score": "%{score} danni inflitti da suicidio unità", + "mex": "Cercatore di minerali", + "mex_desc": "Ottenuto costruendo estrattori di metallo per la tua squadra.", + "mex_yourscore": "Hai costruito %{score}.", + "mex_score": "Costruiti %{score} estrattori di metallo", + "mexkill": "Bottino e saccheggio", + "mexkill_desc": "Ottenuto uccidendo estrattori di metallo nemici.", + "mexkill_yourscore": "Hai ucciso %{score} estrattori di metallo nemici.", + "mexkill_score": "Ucciditi %{score} estrattori di metallo", + "menace": "Uccisore di minacce", + "menace_desc": "Ottenuto infliggendo danni alle minacce di polli.", + "menace_yourscore": "Hai inflitto %{score} danni alle minacce.", + "menace_score": "%{score} danni inflitti alle minacce.", + "missile": "Predone missilistico", + "missile_desc": "Ottenuto infliggendo danni usando missili silos.", + "missile_yourscore": "Hai inflitto %{score} danni usando missili tattici.", + "missile_score": "%{score} danni inflitti usando missili tattici.", + "nux": "Obiettivo Apocalittico", + "nux_desc": "Ottenuto infliggendo danni usando superarmi.", + "nux_yourscore": "Hai inflitto %{score} danni usando superarmi.", + "nux_score": "%{score} danni inflitti usando superarmi", + "ouch": "Grande Cuore Viola", + "ouch_desc": "Ottenuto subendo danni alla salute.", + "ouch_yourscore": "Hai subito %{score} danni.", + "ouch_score": "%{score} danni subiti", + "pwn": "Annientamento Completo", + "pwn_desc": "Ottenuto infliggendo danni alle unità nemiche.", + "pwn_yourscore": "Hai inflitto %{score} danni alle unità nemiche.", + "pwn_score": "%{score} danni inflitti", + "rage": "Induttore di rabbia", + "rage_desc": "Questo risultato non è implementato.", + "rage_yourscore": "Non implementato. %{score}", + "rage_score": "%{score} ottenuti?", + "reclaim": "Bottino di guerra", + "reclaim_desc": "Ottenuto recuperando metallo dall'ambiente, da oggetti come relitti o funghi allucinogeni.", + "reclaim_yourscore": "Hai recuperato %{score} metallo.", + "reclaim_score": "Recuperato %{score} metallo.", + "rezz": "Negromante Vile", + "rezz_desc": "Ottenuto resuscitando relitti.", + "rezz_yourscore": "Hai resuscitato relitti per un valore di %{score} metallo.", + "rezz_score": "Unità resuscitate per un valore di %{score} metallo.", + "repair": "Meccanico Amico", + "repair_desc": "Ottenuto riparando unità alleate.", + "repair_yourscore": "Hai riparato %{score} salute ai tuoi alleati.", + "repair_score" : "%{score} salute riparata.", + "share" : "Condividi Orso", + "share_desc" : "Ottenuto condividendo unità con i tuoi alleati.", + "share_yourscore" : "Hai condiviso unità per un valore di %{score} metallo con i tuoi compagni.", + "share_score" : "Unità condivise per un valore di %{score} metallo", + "shell" : "Guscio di tartaruga", + "shell_desc" : "Ottenuto infliggendo danni alle unità nemiche usando le difese.", + "shell_yourscore" : "Le tue difese hanno inflitto %{score} danni alle unità nemiche.", + "shell_score" : "%{score} danni inflitti dalle difese", + "shield" : "Portatore di scudo", + "shield_desc": "Ottenuto incassando danni con gli scudi.", + "shield_yourscore": "I tuoi scudi hanno assorbito %{score} danni.", + "shield_score": "%{score} danni subiti con gli scudi", + "slow": "Agente di Polizia", + "slow_desc": "Ottenuto infliggendo danni lenti alle unità nemiche.", + "slow_yourscore": "Hai inflitto %{score} danni lenti alle unità nemiche.", + "slow_score": "%{score} danni lenti inflitti", + "statistics": "Statistiche", + "sweeper": "Spazzatrice stradale", + "sweeper_desc": "Ottenuto uccidendo i polli nei pollai.", + "sweeper_yourscore": "Hai eliminato %{score}.", + "sweeper_score": "%{score} pollai distrutti", + "t3": "Ingegnere Sperimentale", + "t3_desc": "Questo premio non è ancora implementato.", + "t3_yourscore": "Non implementato %{score}", + "t3_score": "Punteggio: %{score}", + "terra": "Paesaggista Leggendario", + "terra_desc": "Ottenuto con la terraformazione.", + "terra_yourscore": "Hai speso %{score} metallo per la terraformazione.", + "terra_score": "%{score} metallo speso per la terraformazione.", + "vet": "Veterano Decorato", + "vet_desc": "Ottenuto usando un'unità in modo molto efficace per infliggere danni o uccidere più valore di quanto valesse.", + "vet_yourscore": "La tua unità più conveniente è stata %{unitname}, che ha fatto sì che il costo fosse di %{score}.", + "vet_score" : "%{unitname}, costo sostenuto: %{score}", + "victory" : "Vittoria!", + "teamwins" : "%{name} vince!" +} diff --git a/LuaUI/Configs/lang/awards.ja.json b/LuaUI/Configs/lang/awards.ja.json new file mode 100644 index 0000000000..be5902708a --- /dev/null +++ b/LuaUI/Configs/lang/awards.ja.json @@ -0,0 +1,149 @@ +{ + "air" : "空軍将軍", + "air_desc" : "航空機で敵ユニットにダメージを与えることで獲得できます。", + "air_yourscore" : "航空機で%{score}のダメージを与えました。", + "air_score" : "航空ユニットによるダメージ: %{score}", + "apm" : "APM", + "apm_mousespeed" : "マウス速度\n(ピクセル/秒)", + "apm_clickrate" : "クリック速度\n(マウスクリック/分)", + "apm_keyspressed" : "キー入力速度\n(キー入力/分)", + "apm_cmd" : "APM\n(コマンド/分)", + "assistant" : "補助金戦略", + "assistant_desc" : "建設プロジェクトで味方を支援したり、味方に金属を寄付したりすることで獲得できます。", + "assistant_yourscore" : "味方の支援に%{score}メタルを使用しました。", + "assistant_score" : "味方の支援に%{score}メタルを使用しました。", + "attrition" : "消耗エース", + "attrition_desc" : "失ったメタルよりも多くのメタルをキルすることで獲得しました。スコアはキルしたメタルと失ったメタルの比率で計算されます。", + "attrition_yourscore" : "消耗率は%{score}でした。", + "attrition_score" : "消耗率: %{score}", + "awards" : "賞", + "cap" : "操り人形の達人", + "cap_desc" : "支援司令官の捕獲光線またはドミナトリックスで敵ユニットを捕獲することで獲得しました。", + "cap_yourscore" : "捕獲したユニットのメタルは%{score}メタルです。", + "cap_score" : "%{score}メタル相当の敵を捕獲しました。", + "comm" : "マスター・アンド・コマンダー", + "comm_desc" : "コマンダーを使ってダメージを与えることで獲得。", + "comm_yourscore" : "コマンダーを使って%{score}のダメージを与えました。", + "comm_score" : "コマンダーによって%{score}のダメージを与えました。", + "commwars" : "コマンダー・コンテンダー", + "commwars_desc" : "コマンダーウォーズゲームモードで最後のコマンダーになることで獲得。", + "commwars_yourscore" : "%{score}人のコマンダーを倒しました。", + "commwars_score" : "%{score}人のコマンダーを倒しました。", + "chicken" : "チキン・コンテンダー", + "chicken_desc" : "ニワトリがいる状態で100ポイント以上を獲得することで獲得。ニワトリの脅威からより長く生き残ることでポイントを獲得!全員が獲得できますこの賞を獲得しました。", + "chicken_score" : "スコア: %{score}", + "chickenWin" : "チキンエラディケーター", + "chickenWin_desc" : "より難しい難易度で、ニワトリがいる状態で100ポイント以上獲得すると獲得できます。より長く生き残るほど、より多くのポイントを獲得できます!この賞は誰でも獲得できます。", + "chickenWin_score" : "スコア: %{score}", + "defeat" : "敗北!", + "draw_result" : "引き分け!", + "drone" : "ドローンディレクター", + "drone_desc" : "ドローンでダメージを与えて獲得しました。", + "drone_yourscore" : "ドローンで%{score}のダメージを与えました。", + "drone_score" : "ドローンで%{score}のダメージを与えました。", + "economist" : "経済大国", + "economist_desc" : "オーバードライブでメタルを生産して獲得しました。", + "economist_yourscore" : "オーバードライブはチームに%{score}のメタルをもたらしました。", + "economist_score" : "オーバードライブで%{score}のメタルを生産しました。", + "emp" : "EMPウィザード", + "emp_desc" : "敵ユニットにEMPダメージを与えることで獲得しました。", + "emp_yourscore" : "敵ユニットに%{score}のEMPダメージを与えました。", + "emp_score" : "%{score}のEMPダメージを与えました。", + "exitlobby" : "ロビーへ退出", + "fire" : "マスターグリルシェフ", + "fire_desc" : "敵ユニットに火炎ダメージを与えることで獲得しました。", + "fire_yourscore" : "敵ユニットに%{score}の火炎ダメージを与えました。", + "fire_score" : "%{score}の火炎ダメージを与えました。", + "gameover" : "ゲームオーバーです!", + "gameabort" : "ゲームが中止されました。", + "head" : "ヘッドハンター", + "head_desc" : "敵指揮官を倒すことで獲得。この賞を獲得するには、少なくとも4人倒す必要があります。", + "head_yourscore" : "指揮官の撃破数: %{score}", + "head_score" : "%{score}人の指揮官を倒しました", + "heart" : "クイーンハートブレーカー", + "heart_desc" : "チキンクイーンにダメージを与えることで獲得。", + "heart_yourscore" : "クイーンに%{score}のダメージを与えました。", + "heart_score" : "チキンクイーンに%{score}のダメージを与えました。", + "kam" : "栄光の炎", + "kam_desc" : "自爆ユニットを使用してダメージを与えることで獲得。", + "kam_yourscore" : "自爆ユニットを使用して敵ユニットに%{score}のダメージを与えました。", + "kam_score" : "自爆ユニットによるダメージ:%{score}", + "mex" : "鉱物探鉱者", + "mex_desc" : "チームのために金属抽出装置を建設することで獲得しました。", + "mex_yourscore" : "%{score}台を建設しました。", + "mex_score" : "%{score}台の金属抽出装置を建設しました。", + "mexkill" : "略奪と略奪", + "mexkill_desc" : "敵の金属抽出装置を倒すことで獲得しました。", + "mexkill_yourscore" : "敵の金属抽出装置を%{score}台倒しました。", + "mexkill_score" : "%{score}台の金属抽出装置を倒しました。", + "menace" : "メナスレイヤー", + "menace_desc" : "チキンメナスにダメージを与えることで獲得しました。", + "menace_yourscore" : "メナスに%{score}のダメージを与えました。", + "menace_score" : "メナスに%{score}のダメージを与えました。", + "missile" : "ミサイルマローダー", + "missile_desc" : "ミサイルサイロのミサイルでダメージを与えることで獲得しました。", + "missile_yourscore" : "タクティカルミサイルで%{score}のダメージを与えました。", + "missile_score" : "タクティカルミサイルで%{score}のダメージを与えました。", + "nux" : "終末の功績", + "nux_desc" : "超兵器でダメージを与えて獲得しました。", + "nux_yourscore" : "超兵器で%{score}のダメージを与えました。", + "nux_score" : "超兵器で%{score}のダメージを与えました。", + "ouch" : "ビッグパープルハート", + "ouch_desc" : "体力ダメージを受けることで獲得しました。", + "ouch_yourscore" : "%{score}のダメージを受けました。", + "ouch_score" : "%{score}のダメージを受けました。", + "pwn" : "完全なる殲滅", + "pwn_desc" : "敵ユニットにダメージを与えることで獲得しました。", + "pwn_yourscore" : "敵ユニットに%{score}のダメージを与えました。", + "pwn_score" : "%{score}のダメージを与えました。", + "rage" : "怒り誘発剤", + "rage_desc" : "この実績は実装されていません。", + "rage_yourscore" : "実装されていません。%{score}", + "rage_score" : "%{score}のダメージを受けましたか?", + "reclaim" : "戦利品", + "reclaim_desc" : "残骸やマジックマッシュルームなどの環境からメタルを回収することで獲得しました。", + "reclaim_yourscore" : "メタルを%{score}回収しました。", + "reclaim_score" : "メタルを%{score}回収しました。", + "rezz" : "邪悪なネクロマンサー", + "rezz_desc" : "残骸を復活させることで獲得しました。", + "rezz_yourscore" : "メタル相当の残骸を復活させました。", + "rezz_score" : "メタル相当のユニットを復活させました。", + "repair" : "味方のメカニック", + "repair_desc" : "味方ユニットを修理することで獲得しました。", + "repair_yourscore" : "味方の体力を%{score}回復しました。", + "repair_score": "体力%{score}を修復しました。", + "share": "シェアベア", + "share_desc" : "味方にユニットを共有することで獲得しました。", + "share_yourscore" : "チームメイトに%{score}メタル相当のユニットを共有しました。", + "share_score" : "%{score}メタル相当のユニットを共有しました。", + "shell" : "タートルシェル", + "shell_desc" : "防御を使用して敵ユニットにダメージを与えることで獲得しました。", + "shell_yourscore" : "防御が敵ユニットに%{score}ダメージを与えました。", + "shell_score" : "防御が%{score}ダメージを与えました。", + "shield" : "シールドベアラー", + "shield_desc" : "シールドを使用してダメージを吸収することで獲得しました。", + "shield_yourscore" : "シールドが%{score}ダメージを吸収しました。", + "shield_score" : "シールドを使用して%{score}ダメージを受けました。", + "slow" : "交通警官", + "slow_desc" : "敵ユニットにスロウダメージを与えることで獲得しました。", + "slow_yourscore" : "敵ユニットに%{score}のスロウダメージを与えました。", + "slow_score" : "%{score}のスロウダメージを与えました。", + "statistics" : "統計情報", + "sweeper" : "土地清掃員", + "sweeper_desc" : "鶏小屋を倒すことで獲得しました。", + "sweeper_yourscore" : "%{score}の鶏小屋を倒しました。", + "sweeper_score" : "%{score}の鶏小屋を倒しました。", + "t3" : "実験技師", + "t3_desc" : "この賞はまだ実装されていません。", + "t3_yourscore" : "未実装 %{score}", + "t3_score" : "スコア: %{score}", + "terra" : "伝説の造園家", + "terra_desc" : "テラフォームによって獲得しました。", + "terra_yourscore" : "テラフォームに %{score} メタルを費やしました。", + "terra_score" : "テラフォームに %{score} メタルを費やしました。", + "vet" : "勲章を授与されたベテラン", + "vet_desc" : "ユニットを非常に効果的に使用し、その価値以上のダメージやキルを与えることで獲得しました。", + "vet_yourscore" : "最もコスト効率の良いユニットは %{unitname} で、コストは %{score} でした。", + "victory" : "勝利!", + "teamwins" : "%{name}が勝利!" +} diff --git a/LuaUI/Configs/lang/awards.pl.json b/LuaUI/Configs/lang/awards.pl.json new file mode 100644 index 0000000000..749b664337 --- /dev/null +++ b/LuaUI/Configs/lang/awards.pl.json @@ -0,0 +1,150 @@ +{ + "air" : "Generał Sił Powietrznych", + "air_desc" : "Zdobywa się, uszkadzając jednostki wroga samolotami.", + "air_yourscore" : "Zadałeś %{score} obrażeń samolotami.", + "air_score" : "Obrażenia zadane przez jednostki powietrzne: %{score}", + "apm" : "APM", + "apm_mousespeed" : "Prędkość myszy\n(piksele/sek)", + "apm_clickrate" : "Częstotliwość kliknięć\n(kliknięcia myszą/min)", + "apm_keyspressed" : "Częstotliwość naciśnięć klawiszy\n(naciśnięte klawisze/min)", + "apm_cmd" : "APM\n(polecenia/min)", + "assistant" : "Strategia subsydiowania", + "assistant_desc" : "Zdobywa się, pomagając sojusznikom w projektach budowlanych lub przekazując metal sojusznicy.", + "assistant_yourscore" : "Użyłeś %{score} metalu na pomoc sojusznikom.", + "assistant_score" : "%{score} metalu wykorzystano na pomoc sojusznikom", + "attrition" : "As wyniszczenia", + "attrition_desc" : "Zdobywa się go, zabijając więcej wartości metalu, niż straciłeś. Wynik oblicza się, używając stosunku wartości zabitego do wartości utraconej.", + "attrition_yourscore" : "Twój współczynnik wyniszczenia wyniósł %{score}.", + "attrition_score" : "Współczynnik wyniszczenia: %{score}", + "awards" : "Nagrody", + "cap" : "Mistrz marionetek", + "cap_desc" : "Zdobywa się je, przechwytując jednostki wroga za pomocą promienia przechwytującego dowódcy wsparcia lub dominatrix.", + "cap_yourscore" : "Zdobyto jednostki o wartości %{score} metalu.", + "cap_score" : "Wartość metalu schwytanych wrogów wynosi %{score}.", + "comm" : "Mistrz i dowódca", + "comm_desc" : "Zdobywa się je, zadając obrażenia za pomocą dowódców.", + "comm_yourscore" : "Zadano %{score} obrażeń za pomocą dowódców.", + "comm_score" : "%{score} obrażeń zadanych przez dowódców.", + "commwars" : "Dowódca Zdobywca", + "commwars_desc" : "Zdobywa się za bycie ostatnim dowódcą stojącym w trybie gry Commander Wars.", + "commwars_yourscore" : "Zabiłeś %{score} dowódców.", + "commwars_score" : "Wyeliminowano %{score} dowódców.", + "chicken" : "Pretendent do kurczaka", + "chicken_desc" : "Zdobyte za zdobycie ponad 100 punktów z obecnymi kurczakami. Zdobywaj punkty za dłuższe przetrwanie w walce z zagrożeniem ze strony kurczaków! Każdy zdobywa tę nagrodę.", + "chicken_score" : "Wynik: %{score}", + "chickenWin" : "Chicken Eradicator", + "chickenWin_desc" : "Zdobyte za zdobycie ponad 100 punktów z obecnymi kurczakami na trudniejszych poziomach trudności. Zdobądź więcej punktów, przeżywając dłużej! Każdy zdobywa tę nagrodę.", + "chickenWin_score" : "Wynik: %{score}", + "defeat" : "Defeat!", + "draw_result" : "Draw!", + "drone" : "Drone Director", + "drone_desc" : "Zdobyte za zadawanie obrażeń za pomocą dronów. ", + "drone_yourscore" : "Zadałeś %{score} obrażeń dronami.", + "drone_score" : "%{score} obrażeń zadanych dronami", + "economist" : "Potęga ekonomiczna", + "economist_desc" : "Zdobywa się, produkując metal za pomocą overdrive.", + "economist_yourscore" : "Twój overdrive przyniósł drużynie %{score} metalu.", + "economist_score" : "%{score} metalu wyprodukowanego za pomocą overdrive", + "emp" : "Emp Wizard", + "emp_desc" : "Zdobywa się, zadając obrażenia EMP jednostkom wroga.", + "emp_yourscore" : "Zadałeś %{score} obrażeń emp jednostkom wroga.", + "emp_score" : "Zadano %{score} obrażeń emp", + "exitlobby" : "Wyjście do lobby", + "fire" : "Mistrz grilla", + "fire_desc" : "Zdobywa się, zadając obrażenia od ognia jednostkom wroga.", + "fire_yourscore" : "Zadałeś %{score} obrażeń od ognia jednostkom wroga units.", + "fire_score" : "%{score} obrażeń od ognia zadanych", + "gameover" : "Koniec gry!", + "gameabort" : "Gra przerwana", + "head" : "Łowca głów", + "head_desc" : "Zdobywa się ją, zabijając dowódców wroga. Musisz zabić co najmniej 4, aby otrzymać tę nagrodę.", + "head_yourscore" : "Twój dowódca zabija: %{score}", + "head_score" : "%{score} zabitych dowódców", + "heart" : "Łamiący serca królowej", + "heart_desc" : "Zdobywa się ją, zadając obrażenia królowej kurczaków.", + "heart_yourscore" : "Zadałeś %{score} obrażeń królowej.", + "heart_score" : "%{score} obrażeń zadanych Królowej Kurczaków", + "kam" : "Blaze of Glory", + "kam_desc" : "Zdobywa się zadając obrażenia za pomocą jednostek samobójców.", + "kam_yourscore" : "Zadałeś %{score} obrażeń jednostkom wroga za pomocą jednostek samobójców", + "kam_score" : "%{score} obrażeń zadanych przez jednostki samobójców", + "mex" : "Mineral Prospector", + "mex_desc" : "Zdobywa się, budując ekstraktory metalu dla swojej drużyny.", + "mex_yourscore" : "Zbudowałeś %{score} ekstraktorów metalu.", + "mex_score" : "Zbudowano %{score} ekstraktorów metalu", + "mexkill" : "Łup i grabież", + "mexkill_desc" : "Zdobywa się, zabijając ekstraktory metalu przeciwnika.", + "mexkill_yourscore" : "Zabiłeś %{score} ekstraktorów metalu przeciwnika.", + "mexkill_score" : "Zabito %{score} ekstraktorów metalu", + "menace" : "Zabójca menace", + "menace_desc" : "Zdobywa się, zadając obrażenia kurczakom menace.", + "menace_yourscore" : "Zadałeś %{score} obrażeń menace.", + "menace_score" : "Zadano %{score} obrażeń menaces.", + "missile" : "Missile Marauder", + "missile_desc" : "Zdobywa się zadając obrażenia za pomocą pocisków silosowych.", + "missile_yourscore" : "Zadałeś %{score} obrażeń za pomocą pocisków taktycznych.", + "missile_score" : "%{score} obrażeń zadanych przy użyciu pocisków taktycznych.", + "nux" : "Osiągnięcie Apokaliptyczne", + "nux_desc" : "Zdobywane przez zadawanie obrażeń przy użyciu superbroni.", + "nux_yourscore" : "Zadałeś %{score} obrażeń przy użyciu superbroni.", + "nux_score" : "%{score} obrażeń zadanych przy użyciu superbroni", + "ouch" : "Wielkie Purpurowe Serce", + "ouch_desc" : "Zdobywane przez otrzymywanie obrażeń od zdrowia.", + "ouch_yourscore" : "Otrzymałeś %{score} obrażeń.", + "ouch_score" : "%{score} obrażeń zadanych", + "pwn" : "Ukończona Annihalacja", + "pwn_desc" : "Zdobywa się, zadając obrażenia jednostkom wroga.", + "pwn_yourscore" : "Zadałeś %{score} obrażeń jednostkom wroga.", + "pwn_score" : "Zadano %{score} obrażeń", + "rage" : "Wywołujący wściekłość", + "rage_desc" : "To osiągnięcie nie zostało zaimplementowane.", + "rage_yourscore" : "Nie zaimplementowano. %{score}", + "rage_score" : "Zdobył %{score}?", + "reclaim" : "Łupy wojenne", + "reclaim_desc" : "Zdobywa się, odzyskując metal z otoczenia z takich rzeczy, jak wraki lub grzyby halucynogenne.", + "reclaim_yourscore" : "Odzyskałeś %{score} metalu.", + "reclaim_score" : "Odzyskano %{score} metalu.", + "rezz" : "Podły Nekromanta", + "rezz_desc" : "Zdobywa się przez wskrzeszanie wraków.", + "rezz_yourscore" : "Wskrzesiłeś wraki o wartości %{score} metalu.", + "rezz_score" : "Wskrzeszono jednostki o wartości %{score} metalu.", + "repair" : "Przyjazny mechanik", + "repair_desc" : "Zdobywa się przez naprawę sojuszniczych jednostek.", + "repair_yourscore" : "Naprawiłeś zdrowie swoich sojuszników o wartości %{score}.", + "repair_score" : "Naprawiono zdrowie %{score}.", + "share" : "Udostępnij niedźwiedzia", + "share_desc" : "Zdobywa się przez dzielenie się jednostkami ze swoimi sojusznikami.", + "share_yourscore" : "Udostępniłeś swoim sojusznikom jednostki o wartości %{score} metalu.", + "share_score" : "Metal %{score} wartość współdzielonych jednostek", + "shell" : "Turtle Shell", + "shell_desc" : "Zdobywane przez zadawanie obrażeń jednostkom wroga za pomocą obrony.", + "shell_yourscore" : "Twoje obrony zadały %{score} obrażeń jednostkom wroga.", + "shell_score" : "%{score} obrażeń zadanych przez obronę", + "shield" : "Shieldbearer", + "shield_desc" : "Zdobywane przez przyjmowanie obrażeń za pomocą tarcz.", + "shield_yourscore" : "Twoje tarcze pochłonęły %{score} obrażeń.", + "shield_score" : "%{score} obrażeń otrzymanych za pomocą tarcz", + "slow" : "Policjant ruchu drogowego", + "slow_desc" : "Zdobywa się, zadając powolne obrażenia wrogim jednostkom.", + "slow_yourscore" : "Zadano %{score} powolnych obrażeń wrogim jednostkom.", + "slow_score" : "Zadano %{score} powolnych obrażeń", + "statistics" : "Statystyki", + "sweeper" : "Zamiatacz ziemi", + "sweeper_desc" : "Zdobywa się, zabijając kurniki.", + "sweeper_yourscore" : "Zniszczyłeś %{score} kurników.", + "sweeper_score" : "Zniszczono %{score} kurników", + "t3" : "Inżynier eksperymentalny", + "t3_desc" : "Ta nagroda nie została jeszcze zaimplementowana.", + "t3_yourscore" : "Nie zaimplementowano %{score}", + "t3_score" : "Wynik: %{score}", + "terra" : "Legendarny architekt krajobrazu", + "terra_desc" : "Zdobyto przez terraformowanie.", + "terra_yourscore" : "Wydano %{score} metalu na terraform.", + "terra_score" : "Wydano %{score} metalu na terraform.", + "vet" : "Odznaczony weteran", + "vet_desc" : "Zdobyto przez bardzo efektywne wykorzystanie jednostki do zadania obrażeń lub zabicia większej wartości, niż była warta.", + "vet_yourscore" : "Twoja najbardziej efektywna kosztowo jednostka to %{unitname}, która wyniosła %{score} koszt.", + "vet_score" : "%{unitname}, wyniósł koszt: %{score}", + "victory" : "Zwycięstwo!", + "teamwins" : "Wygrywa %{name}!" + } diff --git a/LuaUI/Configs/lang/awards.pt.json b/LuaUI/Configs/lang/awards.pt.json new file mode 100644 index 0000000000..37975ea8db --- /dev/null +++ b/LuaUI/Configs/lang/awards.pt.json @@ -0,0 +1,150 @@ +{ + "air": "General da Força Aérea", + "air_desc": "Ganho ao causar dano a unidades inimigas com aeronaves.", + "air_yourscore": "Você causou %{score} de dano com aeronaves.", + "air_score": "Dano causado por unidades aéreas: %{score}", + "apm": "APM", + "apm_mousespeed": "Velocidade do Mouse\n(Pixels/seg)", + "apm_clickrate": "Taxa de Cliques\n(Cliques do Mouse/min)", + "apm_keyspressed": "Taxa de Pressionamento de Teclas\n(Teclas Pressionadas/min)", + "apm_cmd": "APM\n(Comandos/min)", + "assistant": "Estratégia de Subsídios", + "assistant_desc": "Ganho ao auxiliar aliados em projetos de construção ou doar metal a aliados.", + "assistant_yourscore": "Você usou %{score} de metal para ajudar seus aliados.", + "assistant_score": "%{score} de metal usado para ajudar aliados", + "attrition": "Ás do Atrito", + "attrition_desc": "Ganho ao matar mais metal do que você perdeu. A pontuação é calculada usando a proporção entre o valor morto e o valor perdido.", + "attrition_yourscore": "Sua taxa de atrito foi de %{score}.", + "attrition_score": "Taxa de atrito: %{score}", + "awards": "Recompensas", + "cap": "Mestre das Marionetes", + "cap_desc": "Ganho ao capturar unidades inimigas com o Raio de Captura do Comandante de Suporte ou com as Dominatrixes.", + "cap_yourscore": "Você capturou %{score} de metal em unidades.", + "cap_score" : "%{score} de metal em inimigos capturados.", + "comm": "Mestre e Comandante", + "comm_desc": "Ganho ao causar dano usando comandantes.", + "comm_yourscore": "Você causou %{score} de dano usando seus comandantes.", + "comm_score": "%{score} de dano causado por comandantes.", + "commwars": "Comandante Conquistador", + "commwars_desc": "Ganho por ser o último comandante sobrevivente no modo de jogo Guerra dos Comandantes.", + "commwars_yourscore": "Você matou %{score} comandantes.", + "commwars_score": "%{score} comandantes eliminados.", + "chicken": "Concorrente das Galinhas", + "chicken_desc": "Ganhado ao marcar mais de 100 pontos com galinhas presentes. Ganhe pontos sobrevivendo por mais tempo contra a ameaça das galinhas! Todos ganham esta recompensa.", + "chicken_score": "Pontuação: %{score}", + "chickenWin": "Erradicador de Galinhas", + "chickenWin_desc": "Ganhado ao marcar mais de 100 pontos com galinhas presentes em dificuldades mais difíceis. Ganhe mais pontos sobrevivendo por mais tempo! Todos ganham esta recompensa.", + "chickenWin_score": "Pontuação: %{score}", + "defeat": "Derrota!", + "draw_result": "Empate!", + "drone": "Diretor de Drones", + "drone_desc": "Ganhado ao causar dano com drones.", + "drone_yourscore" : "Você causou %{score} de dano com drones.", + "drone_score": "%{score} de dano causado com drones", + "economist": "Potência Econômica", + "economist_desc": "Ganho ao produzir metal através de overdrive.", + "economist_yourscore": "Seu overdrive contribuiu com %{score} de metal para a equipe.", + "economist_score": "%{score} de metal produzido através de overdrive", + "emp": "Mago de EMP", + "emp_desc": "Ganho ao causar dano de EMP a unidades inimigas.", + "emp_yourscore": "Você causou %{score} de dano emp a unidades inimigas.", + "emp_score": "%{score} de dano emp causado", + "exitlobby": "Saída para o lobby", + "fire": "Chef Mestre da Churrascaria", + "fire_desc": "Ganho ao causar dano de fogo a unidades inimigas.", + "fire_yourscore": "Você causou %{score} de dano de fogo a unidades inimigas.", + "fire_score": "%{score} de dano de fogo causado", + "gameover": "Fim de jogo!", + "gameabort": "Jogo abortado", + "head": "Caçador de Cabeças", + "head_desc": "Ganho ao matar comandantes inimigos. Você precisa matar pelo menos 4 para se qualificar para esta recompensa.", + "head_yourscore": "Seu comandante matou: %{score}", + "head_score": "%{score} comandantes mortos", + "heart": "Quebra-Corações da Rainha", + "heart_desc": "Ganho ao causar dano à rainha galinha.", + "heart_yourscore": "Você causou %{score} de dano à rainha.", + "heart_score": "%{score} de dano à Rainha Galinha", + "kam": "Explosão de Glória", + "kam_desc": "Ganho ao causar dano usando unidades suicidas.", + "kam_yourscore": "Você causou %{score} de dano a unidades inimigas usando unidades suicidas", + "kam_score": "%{score} de dano causado por unidades suicidas", + "mex": "Gerador de Minerais", + "mex_desc": "Ganho ao construir extratores de metal para sua equipe.", + "mex_yourscore": "Você construiu %{score}.", + "mex_score": "%{score} Extratores de metal construídos", + "mexkill": "Saque e Pilhagem", + "mexkill_desc": "Ganhado ao matar extratores de metal inimigos.", + "mexkill_yourscore": "Você matou %{score} extratores de metal inimigos.", + "mexkill_score": "%{score} extratores de metal mortos", + "menace": "Matador de Ameaças", + "menace_desc": "Ganhado ao causar dano a galinhas ameaçadoras.", + "menace_yourscore": "Você causou %{score} de dano a ameaças.", + "menace_score": "%{score} de dano causado a ameaças.", + "missile": "Saqueador de Mísseis", + "missile_desc": "Ganhado ao causar dano usando mísseis de silo de mísseis.", + "missile_yourscore": "Você causou %{score} de dano usando mísseis táticos.", + "missile_score": "%{score} de dano causado com mísseis táticos.", + "nux": "Conquista Apocalíptica", + "nux_desc": "Ganho ao causar dano com superarmas.", + "nux_yourscore": "Você causou %{score} de dano usando superarmas.", + "nux_score": "%{score} de dano causado com superarmas.", + "ouch": "Grande Coração Púrpura", + "ouch_desc": "Ganho ao receber dano de vida.", + "ouch_yourscore": "Você sofreu %{score} de dano.", + "ouch_score": "%{score} de dano recebido", + "pwn": "Aniquilação Completa", + "pwn_desc": "Ganho ao causar dano a unidades inimigas.", + "pwn_yourscore": "Você causou %{score} de dano a unidades inimigas.", + "pwn_score": "%{score} de dano causado", + "rage": "Indutor de Fúria", + "rage_desc": "Esta conquista não foi implementada.", + "rage_yourscore": "Não implementada. %{score}", + "rage_score": "%{score} conquistados?", + "reclaim": "Espólios de Guerra", + "reclaim_desc": "Ganha recuperando metal do ambiente, como destroços ou cogumelos mágicos.", + "reclaim_yourscore": "Você recuperou %{score} metal.", + "reclaim_score": "%{score} metal recuperado.", + "rezz": "Necromante Vil", + "rezz_desc": "Ganha ressuscitando destroços.", + "rezz_yourscore": "Você ressuscitou %{score} metal de destroços.", + "rezz_score": "%{score} metal de unidades ressuscitado.", + "reparar": "Mecânico Amigável", + "repair_desc": "Ganho ao reparar unidades aliadas.", + "repair_yourscore": "Você reparou %{score} de vida dos seus aliados.", + "repair_score": "%{score} de vida reparada.", + "share": "Compartilhe o Urso", + "share_desc": "Ganho ao compartilhar unidades com seus aliados.", + "share_yourscore": "Você compartilhou %{score} de metal em unidades com seus companheiros de equipe.", + "share_score": "%{score} de metal em unidades compartilhadas", + "shell": "Casco de Tartaruga", + "shell_desc": "Ganho ao causar dano a unidades inimigas usando defesas.", + "shell_yourscore": "Suas defesas infligiram %{score} de dano às unidades inimigas.", + "shell_score": "%{score} de dano causado pelas defesas", + "shield": "Shieldbearer", + "shield_desc": "Ganho ao suportar dano usando escudos.", + "shield_yourscore": "Seus escudos absorveram %{score} de dano.", + "shield_score": "%{score} de dano recebido usando escudos.", + "slow": "Polícia de Trânsito", + "slow_desc": "Ganho ao causar dano de lentidão a unidades inimigas.", + "slow_yourscore": "Você causou %{score} de dano de lentidão a unidades inimigas.", + "slow_score": "%{score} de dano de lentidão causado", + "statistics": "Estatísticas", + "sweeper": "Varredor de Terras", + "sweeper_desc": "Ganho ao matar poleiros de galinhas.", + "sweeper_yourscore": "Você eliminou %{score}.", + "sweeper_score" : "%{score} poleiros de galinhas destruídos", + "t3": "Engenheiro Experimental", + "t3_desc": "Esta condecoração ainda não foi implementada.", + "t3_yourscore": "Não implementado %{score}", + "t3_score": "Pontuação: %{score}", + "terra": "Paisagista Lendário", + "terra_desc": "Ganho por terraformação.", + "terra_yourscore": "Você gastou %{score} de metal em terraformação.", + "terra_score": "%{score} de metal gasto em terraformação.", + "vet": "Veterano Condecorado", + "vet_desc": "Ganho por usar uma unidade de forma muito eficaz para causar dano ou matar mais valor do que ela realmente valia.", + "vet_yourscore": "Sua unidade com melhor custo-benefício foi %{unitname}, o que custou %{score}.", + "vet_score": "%{unitname}, custo obtido: %{score}", + "victory": "Vitória!", + "teamwins": "%{name} vence!" +} diff --git a/LuaUI/Configs/lang/awards.ru.json b/LuaUI/Configs/lang/awards.ru.json new file mode 100644 index 0000000000..73838cf4c3 --- /dev/null +++ b/LuaUI/Configs/lang/awards.ru.json @@ -0,0 +1,150 @@ +{ + "air" : "Генерал ВВС", + "air_desc" : "Зарабатывается за нанесение урона вражеским юнитам с помощью авиации", + "air_yourscore" : "Вы нанесли %{score} урона с помощью авиации", + "air_score" : "Урон, нанесенный воздушными юнитами: %{score}", + "apm" : "APM", + "apm_mousespeed" : "Скорость мыши\n(Пиксели/сек)", + "apm_clickrate" : "Частота щелчков\n(Щелчки мыши/мин)", + "apm_keyspressed" : "Частота нажатия клавиш\n(Нажатия клавиш/мин)", + "apm_cmd" : "APM\n(Команды/мин)", + "assistant" : "Стратегия субсидирования", + "assistant_desc" : "Зарабатывается за помощь союзникам в строительных проектах или пожертвование металла союзникам", + "assistant_yourscore" : "Вы потратили %{score} металла на помощь союзникам.", + "assistant_score" : "%{score} металла использовано на помощь союзникам.", + "attrition" : "Туз истощения", + "attrition_desc" : "Зарабатывается за убийство большего количества металла, чем вы потеряли. Очки рассчитываются с использованием соотношения убитых и потерянных единиц.", + "attrition_yourscore" : "Ваша скорость истощения составила %{score}.", + "attrition_score" : "Скорость истощения: %{score}", + "awards" : "Награды", + "cap" : "Мастер марионеток", + "cap_desc" : "Зарабатывается за захват вражеских юнитов с помощью луча захвата командира поддержки или доминант.", + "cap_yourscore" : "Вы захватили юнитов на сумму %{score} металла.", + "cap_score" : "%{score} металла стоит захваченных врагов", + "comm" : "Мастер и Командир", + "comm_desc" : "Присуждается за нанесение урона с помощью командиров.", + "comm_yourscore" : "Вы нанесли %{score} урона с помощью своих командиров.", + "comm_score" : "%{score} урона, нанесенного командирами.", + "commwars" : "Командир-завоеватель", + "commwars_desc" : "Присуждается за то, что вы последний выживший командир в режиме игры Commander Wars.", + "commwars_yourscore" : "Вы убили %{score} командиров.", + "commwars_score" : "%{score} командиров устранено.", + "chicken" : "Куриный претендент", + "chicken_desc" : "Присуждается за набранные более 100 очков с курицами. Зарабатывайте очки, дольше выживая против куриной угрозы! Все получает эту награду.", + "chicken_score" : "Очки: %{score}", + "chickenWin" : "Уничтожитель кур", + "chickenWin_desc" : "Присуждается за набранные более 100 очков с курами на более высоких уровнях сложности. Зарабатывайте больше очков, выживая дольше! Каждый получает эту награду.", + "chickenWin_score" : "Очки: %{score}", + "defeat" : "Поражение!", + "draw_result" : "Ничья!", + "drone" : "Директор дронов", + "drone_desc" : "Зарабатывается за нанесение урона дронами", + "drone_yourscore" : "Вы нанесли %{score} урона дронами", + "drone_score" : "%{score} урона нанесено дронами", + "economist" : "Экономическая электростанция", + "economist_desc" : "Зарабатывается за производство металла с помощью ускорения", + "economist_yourscore" : "Ваш ускорение принес команде %{score} металла", + "economist_score" : "%{score} металла произведено с помощью ускорения", + "emp" : "Мастер ЭМИ", + "emp_desc" : "Зарабатывается за нанесение ЭМИ урона вражеским юнитам", + "emp_yourscore" : "Вы нанесли %{score} урона ЭМИ вражеским юнитам", + "emp_score" : "%{score} нанесенный урон от emp", + "exitlobby" : "Выход в лобби", + "fire" : "Мастер-повар-гриль", + "fire_desc" : "Присуждается за нанесение урона огнем вражеским юнитам.", + "fire_yourscore" : "Вы нанесли %{score} урона огнем вражеским юнитам.", + "fire_score" : "%{score} урона огнем нанесли", + "gameover" : "Игра окончена!", + "gameabort" : "Игра прервана", + "head" : "Охотник за головами", + "head_desc" : "Присуждается за убийство вражеских командиров. Вы должны убить не менее 4, чтобы претендовать на эту награду.", + "head_yourscore" : "Убийства вашего командира: %{score}", + "head_score" : "Убито командиров: %{score}", + "heart" : "Королева-сердцеедка", + "heart_desc" : "Зарабатывается за нанесение урона куриной королеве.", + "heart_yourscore" : "Вы нанесли %{score} урона куриной королеве.", + "heart_score" : "%{score} урона нанесено куриной королеве.", + "kam" : "Пламя славы.", + "kam_desc" : "Зарабатывается за нанесение урона с помощью самоубийц.", + "kam_yourscore" : "Вы нанесли %{score} урона вражеским юнитам с помощью самоубийц.", + "kam_score" : "%{score} урона нанесено самоубийцами.", + "mex" : "Старатель минералов.", + "mex_desc" : "Зарабатывается за строительство экстракторов металла для вашей команды.", + "mex_yourscore" : "Вы построили %{score}.", + "mex_score" : "%{score} экстракторов металла построено.", + "mexkill" : "Добыча и разграбление", + "mexkill_desc" : "Присваивается за убийство вражеских металлоизвлекателей.", + "mexkill_yourscore" : "Вы убили %{score} вражеских металлоизвлекателей.", + "mexkill_score" : "%{score} металлоизвлекателей убито", + "menace" : "Убийца угроз", + "menace_desc" : "Присваивается за нанесение урона куриным угрозам.", + "menace_yourscore" : "Вы нанесли %{score} урона угрозам.", + "menace_score" : "%{score} урона нанесено угрозам.", + "missile" : "Ракетный мародер", + "missile_desc" : "Присваивается за нанесение урона с помощью ракетных шахт.", + "missile_yourscore" : "Вы нанесли %{score} урона с помощью тактических ракет.", + "missile_score" : "%{score} урона нанесено с помощью тактических ракет.", + "nux" : "Апокалиптическое достижение", + "nux_desc" : "Заработано за нанесение урона с помощью супероружия.", + "nux_yourscore" : "Вы нанесли %{score} урона с помощью супероружия.", + "nux_score" : "%{score} урона нанесено с помощью супероружия", + "ouch" : "Большое пурпурное сердце", + "ouch_desc" : "Получено за получение урона здоровью.", + "ouch_yourscore" : "Вы получили %{score} урона.", + "ouch_score" : "%{score} полученного урона", + "pwn" : "Полное уничтожение", + "pwn_desc" : "Получено за нанесение урона вражеским юнитам.", + "pwn_yourscore" : "Вы нанесли %{score} урона вражеским юнитам.", + "pwn_score" : "%{score} нанесенного урона", + "rage" : "Вызыватель ярости", + "rage_desc" : "Это достижение не реализовано.", + "rage_yourscore" : "Не реализовано. %{score}", + "rage_score" : "%{score} набрано?", + "reclaim" : "Трофеи Война", + "reclaim_desc" : "Зарабатывается за сбор металла из окружающей среды, например, из обломков или волшебных грибов.", + "reclaim_yourscore" : "Вы собрали %{score} металла.", + "reclaim_score" : "%{score} металла собрано.", + "rezz" : "Подлый некромант", + "rezz_desc" : "Зарабатывается за воскрешение обломков.", + "rezz_yourscore" : "Вы воскресили обломков на сумму %{score} металла.", + "rezz_score" : "%{score} металла воскрешенных юнитов.", + "repair" : "Дружелюбный механик", + "repair_desc" : "Зарабатывается за ремонт союзных юнитов.", + "repair_yourscore" : "Вы восстановили здоровье союзников на сумму %{score}.", + "repair_score" : "%{score} здоровья восстановлено.", + "share" : "Поделиться Медведем", + "share_desc" : "Заработано за то, что вы поделились юнитами со своими союзниками.", + "share_yourscore" : "Вы поделились %{score} металлическими юнитами со своими товарищами по команде.", + "share_score" : "%{score} металлическими юнитами, которыми вы поделились", + "shell" : "Панцирь Черепахи", + "shell_desc" : "Заработано за то, что вы нанесли урон вражеским юнитам с помощью защиты.", + "shell_yourscore" : "Ваша защита нанесла %{score} урона вражеским юнитам.", + "shell_score" : "%{score} урона нанесенного защитой", + "shield" : "Щитоносец", + "shield_desc" : "Заработано за то, что выдержали урон с помощью щитов.", + "shield_yourscore" : "Ваши щиты поглотили %{score} урона.", + "shield_score" : "%{score} урона, полученного с помощью щитов", + "slow" : "Гаишник", + "slow_desc" : "Зарабатывается за нанесение медленного урона вражеским юнитам.", + "slow_yourscore" : "Вы нанесли %{score} медленного урона вражеским юнитам.", + "slow_score" : "%{score} медленного урона нанесено", + "statistics" : "Статистика", + "sweeper" : "Чистильщик земли", + "sweeper_desc" : "Зарабатывается за уничтожение куриных насестов.", + "sweeper_yourscore" : "Вы уничтожили %{score}.", + "sweeper_score" : "%{score} куриных насестов уничтожено", + "t3" : "Экспериментальный инженер", + "t3_desc" : "Эта награда пока не реализована.", + "t3_yourscore" : "Не реализована %{score}", + "t3_score" : "Оценка: %{score}", + "terra" : "Легендарный ландшафтный дизайнер", + "terra_desc" : "Заработано за терраформирование.", + "terra_yourscore" : "Вы потратили %{score} металла на терраформирование.", + "terra_score" : "%{score} металла потрачено на терраформирование.", + "vet" : "Награжденный ветеран", + "vet_desc" : "Заработано за очень эффективное использование отряда для нанесения урона или уничтожения большего количества ценностей, чем он стоил.", + "vet_yourscore" : "Ваш самый экономически эффективный отряд был %{unitname}, что составило стоимость %{score}.", + "vet_score" : "%{unitname}, стоимость: %{score}", + "victory" : "Победа!", + "teamwins" : "%{name} побеждает!" +} diff --git a/LuaUI/Configs/lang/awards.th.json b/LuaUI/Configs/lang/awards.th.json new file mode 100644 index 0000000000..b0ffa4c4cb --- /dev/null +++ b/LuaUI/Configs/lang/awards.th.json @@ -0,0 +1,148 @@ +{ + "air" : "นายพลกองทัพอากาศ", + "air_desc" : "ได้รับจากการทำความเสียหายให้หน่วยศัตรูด้วยเครื่องบิน", + "air_yourscore" : "คุณสร้างความเสียหาย %{score} ด้วยเครื่องบิน", + "air_score" : "ความเสียหายที่ทำโดยหน่วยทางอากาศ: %{score}", + "apm" : "APM", + "apm_mousespeed" : "ความเร็วของเมาส์\n(พิกเซล/วินาที)", + "apm_clickrate" : "อัตราการคลิก\n(จำนวนครั้งที่เมาส์คลิก/นาที)", + "apm_keyspressed" : "อัตราการกดปุ่ม\n(จำนวนครั้งที่กด/นาที)", + "apm_cmd" : "APM\n(คำสั่ง/นาที)", + "assistant" : "กลยุทธ์การอุดหนุน", + "assistant_desc" : "ได้รับจากการช่วยเหลือพันธมิตรด้วยโครงการก่อสร้างหรือบริจาคโลหะให้กับพันธมิตร", "assistant_yourscore" : "คุณใช้โลหะ %{score} ชิ้นในการช่วยเหลือพันธมิตรของคุณ", + "assistant_score" : "ใช้โลหะ %{score} ชิ้นในการช่วยเหลือพันธมิตร", + "attrition" : "เอซการสึกกร่อน", + "attrition_desc" : "ได้รับจากการฆ่าโลหะที่มีค่ามากกว่าที่คุณเสียไป คะแนนจะคำนวณโดยใช้อัตราส่วนของค่าที่ฆ่าได้เทียบกับค่าที่เสียไป", + "attrition_yourscore" : "อัตราการสูญเสียของคุณคือ %{score}", + "attrition_score" : "อัตราการสูญเสีย: %{score}", + "awards" : "รางวัล", + "cap" : "ปรมาจารย์แห่งหุ่นเชิด", + "cap_desc" : "ได้รับจากการยึดหน่วยของศัตรูโดยใช้รังสียึดของผู้บัญชาการสนับสนุนหรือโดมินาทริกซ์", + "cap_yourscore" : "คุณยึดหน่วยที่มีค่าโลหะ %{score} ชิ้น", + "cap_score" : "ศัตรูที่จับได้มีค่าโลหะ %{score}", + "comm" : "ปรมาจารย์และผู้บัญชาการ", + "comm_desc" : "ได้รับจากการสร้างความเสียหายโดยใช้ผู้บัญชาการ", + "comm_yourscore" : "คุณสร้างความเสียหาย %{score} โดยใช้ผู้บัญชาการของคุณ", + "comm_score" : "%{score} ความเสียหายที่ทำโดยผู้บัญชาการ", + "commwars" : "ผู้บัญชาการผู้พิชิต", + "commwars_desc" : "ได้รับจากการเป็นผู้บัญชาการคนสุดท้ายที่ยืนหยัดในโหมดเกม Commander Wars", + "commwars_yourscore" : "คุณฆ่าผู้บัญชาการ %{score} คน", + "commwars_score" : "ผู้บัญชาการ %{score} คนถูกกำจัด", + "chicken" : "คู่แข่งไก่", + "chicken_desc" : "ได้รับจากการทำคะแนนได้มากกว่า 100 แต้มโดยมีไก่อยู่ รับคะแนนจากการเอาชีวิตรอดจากการคุกคามของไก่ได้นานขึ้น! ทุกคนได้รับรางวัลนี้", + "chicken_score" : "คะแนน: %{score}", + "chickenWin" : "เครื่องกำจัดไก่", + "chickenWin_desc" : "ได้รับจากการทำคะแนนได้มากกว่า 100 คะแนนโดยมีไก่อยู่ในความยากที่ยากขึ้น รับคะแนนมากขึ้นโดยการเอาชีวิตรอดได้นานขึ้น! ทุกคนได้รับรางวัลนี้", + "chickenWin_score" : "คะแนน: %{score}", + "defeat" : "พ่ายแพ้!", + "draw_result" : "เสมอ!", + "drone" : "ผู้อำนวยการโดรน", + "drone_desc" : "ได้รับจากการสร้างความเสียหายด้วยโดรน", + "drone_yourscore" : "คุณสร้างความเสียหาย %{score} ด้วยโดรน", + "drone_score" : "%{score} ความเสียหายที่จัดการได้ด้วยโดรน", + "economist" : "Economity Powerhouse", + "economist_desc" : "ได้รับจากการผลิตโลหะด้วยความเร็วเกิน", + "economist_yourscore" : "ความเร็วเกินของคุณมีส่วนสนับสนุน %{score} โลหะให้กับทีม", + "economist_score" : "%{score} โลหะที่ผลิตด้วยความเร็วเกิน", + "emp" : "ตัวช่วยสร้าง EMP", + "emp_desc" : "ได้รับจากการสร้างความเสียหายด้วย EMP ให้กับยูนิตศัตรู", + "emp_yourscore" : "คุณสร้างความเสียหายด้วย %{score} emp ให้กับยูนิตศัตรู", + "emp_score" : "%{score} ความเสียหายของ emp ที่เกิดขึ้น", + "exitlobby" : "ออกไปที่ล็อบบี้", + "fire" : "มาสเตอร์ กริลล์ เชฟ", + "fire_desc" : "ได้รับจากการทำความเสียหายจากไฟให้กับหน่วยศัตรู", + "fire_yourscore" : "คุณทำความเสียหายจากไฟได้ %{score} หน่วยศัตรู", + "fire_score" : "ความเสียหายจากไฟ %{score} หน่วย", + "gameover" : "จบเกม!", + "gameabort" : "เกมถูกยกเลิก", + "head" : "นักล่าหัว", + "head_desc" : "ได้รับจากการฆ่าผู้บัญชาการของศัตรู คุณต้องฆ่าอย่างน้อย 4 คนจึงจะมีสิทธิ์ได้รับรางวัลนี้", + "head_yourscore" : "ผู้บัญชาการของคุณฆ่า: %{score}", + "head_score" : "ผู้บัญชาการถูกฆ่า %{score} คน", + "heart" : "Queen Heart Breaker", + "heart_desc" : "ได้รับจากการทำความเสียหายให้กับราชินีไก่", + "heart_yourscore" : "คุณสร้างความเสียหาย %{score} ให้กับราชินี", + "heart_score" : "สร้างความเสียหาย %{score} ให้กับราชินีไก่", + "kam" : "Blaze of Glory", + "kam_desc" : "ได้รับจากการสร้างความเสียหายโดยใช้หน่วยฆ่าตัวตาย", + "kam_yourscore" : "คุณสร้างความเสียหาย %{score} ให้กับหน่วยศัตรูโดยใช้หน่วยฆ่าตัวตาย", + "kam_score" : "สร้างความเสียหาย %{score} ให้กับหน่วยฆ่าตัวตาย", + "mex" : "นักสำรวจแร่", + "mex_desc" : "ได้รับจากการสร้างเครื่องสกัดโลหะสำหรับทีมของคุณ", + "mex_yourscore" : "คุณสร้างเครื่องสกัดโลหะ %{score} เครื่อง", + "mexkill" : "ปล้นสะดมและปล้นสะดม", + "mexkill_desc" : "ได้รับจากการฆ่าโลหะของศัตรู เครื่องสกัดโลหะ", + "mexkill_yourscore" : "คุณฆ่าเครื่องสกัดโลหะของศัตรูไปแล้ว %{score} เครื่อง", + "mexkill_score" : "เครื่องสกัดโลหะถูกฆ่าไปแล้ว %{score} เครื่อง", + "menace" : "นักล่าอันตราย", + "menace_desc" : "ได้รับจากการสร้างความเสียหายให้กับไก่ที่เป็นตัวอันตราย", + "menace_yourscore" : "คุณสร้างความเสียหายให้กับตัวอันตรายได้ %{score} เครื่อง", + "menace_score" : "สร้างความเสียหายให้กับตัวอันตรายได้ %{score} เครื่อง", + "missile" : "Missile Marauder", + "missile_desc" : "ได้รับจากการสร้างความเสียหายโดยใช้ขีปนาวุธไซโล", + "missile_yourscore" : "คุณสร้างความเสียหาย %{score} โดยใช้ขีปนาวุธยุทธวิธี", + "missile_score" : "%{score} ความเสียหายที่เกิดขึ้นจากการใช้ขีปนาวุธยุทธวิธี", + "nux" : "ความสำเร็จในการทำลายล้าง", + "nux_desc" : "ได้รับจากการสร้างความเสียหายโดยใช้อาวุธเหนือมนุษย์", + "nux_yourscore" : "คุณสร้างความเสียหายได้ %{score} โดยใช้อาวุธเหนือมนุษย์", + "nux_score" : "%{score} ความเสียหายที่เกิดขึ้นจากการใช้อาวุธเหนือมนุษย์", + "ouch" : "หัวใจสีม่วงขนาดใหญ่", + "ouch_desc" : "ได้รับจากการรับความเสียหายจากพลังชีวิต", + "ouch_yourscore" : "คุณได้รับความเสียหาย %{score}", + "ouch_score" : "ได้รับความเสียหาย %{score}", + "pwn" : "ทำลายล้างสำเร็จ", + "pwn_desc" : "ได้รับจากการสร้างความเสียหายให้กับหน่วยศัตรู", + "pwn_yourscore" : "คุณสร้างความเสียหายได้ %{score} ความเสียหายต่อหน่วยศัตรู", + "pwn_score" : "%{score} ความเสียหายที่เกิดขึ้น", + "rage" : "ตัวกระตุ้นความโกรธ", + "rage_desc" : "ความสำเร็จนี้ไม่ได้นำไปใช้", + "rage_yourscore" : "ไม่ได้นำไปใช้ %{score}", + "rage_score" : "ได้ %{score} คะแนนแล้วเหรอ?", + "reclaim" : "ของปล้นสงคราม", + "reclaim_desc" : "ได้รับจากการเรียกคืนโลหะจากสิ่งแวดล้อมจากสิ่งของต่างๆ เช่น ซากเรือหรือเห็ดวิเศษ", + "reclaim_yourscore" : "คุณได้เรียกคืนโลหะ %{score} แล้ว", + "reclaim_score" : "ได้เรียกคืนโลหะ %{score} แล้ว", + "rezz" : "นักเล่นไสยศาสตร์ที่ชั่วร้าย", + "rezz_desc" : "ได้รับจากการฟื้นคืนซากเรือ", + "rezz_yourscore" : "คุณได้ฟื้นคืน %{score} ซากรถมีค่าเทียบเท่าโลหะ", + "rezz_score" : "%{score} โลหะที่มีมูลค่าของหน่วยที่ฟื้นคืนชีพ", + "repair" : "ช่างเครื่องฝ่ายเดียวกัน", + "repair_desc" : "ได้รับจากการซ่อมแซมยูนิตฝ่ายพันธมิตร", + "repair_yourscore" : "คุณได้ซ่อมแซมพลังชีวิต %{score} ให้กับพันธมิตรของคุณ", + "repair_score" : "%{score} สุขภาพได้รับการซ่อมแซมแล้ว", + "share" : "แชร์แบร์", + "share_desc" : "ได้รับจากการแบ่งปันยูนิตให้กับพันธมิตรของคุณ", + "share_yourscore" : "คุณได้แชร์หน่วยที่มีมูลค่าโลหะ %{score}", + "share_score" : "%{score} มูลค่าโลหะของหน่วยที่แบ่งปัน", + "shell" : "กระดองเต่า", + "shell_desc" : "ได้รับจากการสร้างความเสียหายให้กับยูนิตของศัตรูโดยใช้การป้องกัน", + "shell_yourscore" : "ของคุณ การป้องกันสร้างความเสียหาย %{score} ให้กับหน่วยศัตรู", + "shell_score" : "%{score} ความเสียหายที่เกิดจากการป้องกัน", + "shield" : "ผู้ถือโล่", + "shield_desc" : "ได้รับจากการแทงค์ความเสียหายโดยใช้โล่", + "shield_yourscore" : "โล่ของคุณดูดซับความเสียหาย %{score}", + "shield_score" : "%{score} ความเสียหายที่ได้รับโดยใช้โล่", + "slow" : "ตำรวจจราจร", + "slow_desc" : "ได้รับจากการสร้างความเสียหายช้าๆ ให้กับหน่วยศัตรู", + "slow_yourscore" : "คุณสร้างความเสียหายช้าๆ %{score} ให้กับหน่วยศัตรู", + "slow_score" : "%{score} ความเสียหายที่ทำได้ช้า", + "statistics" : "Statistics", + "sweeper" : "Land Sweeper", + "sweeper_desc" : "ได้รับจากการฆ่ารังไก่", + "sweeper_yourscore" : "คุณกำจัด %{score} ไปหมด", + "sweeper_score" : "กำจัด %{score} รังไก่", + "t3" : "วิศวกรทดลอง", + "t3_desc" : "รางวัลนี้ยังไม่ได้นำมาใช้", + "t3_yourscore" : "ยังไม่ได้นำมาใช้ %{score}", + "t3_score" : "คะแนน: %{score}", + "terra" : "นักจัดสวนในตำนาน", + "terra_desc" : "ได้รับจากการปรับสภาพภูมิประเทศ", + "terra_yourscore" : "คุณใช้โลหะ %{score} ไปกับการปรับสภาพภูมิประเทศ", + "terra_score" : "ใช้โลหะ %{score} ไปกับการปรับสภาพภูมิประเทศ", + "vet" : "ทหารผ่านศึกที่ได้รับการยกย่อง", + "vet_desc" : "ได้รับจากการใช้หน่วยอย่างมีประสิทธิภาพมาก เพื่อสร้างความเสียหายหรือฆ่าสิ่งที่มีมูลค่ามากกว่าที่ควรจะเป็น", + "vet_yourscore" : "หน่วยที่คุ้มต้นทุนที่สุดของคุณคือ %{unitname} ซึ่งสร้างต้นทุนได้ %{score}", + "vet_score" : "%{unitname}, สร้างต้นทุนได้: %{score}", + "victory" : "ชัยชนะ!", + "teamwins" : "%{name} ชนะ!" +} diff --git a/LuaUI/Configs/lang/awards.tr.json b/LuaUI/Configs/lang/awards.tr.json new file mode 100644 index 0000000000..1daba48de1 --- /dev/null +++ b/LuaUI/Configs/lang/awards.tr.json @@ -0,0 +1,150 @@ +{ + "air" : "Hava Kuvvetleri Generali", + "air_desc" : "Uçakla düşman birimlerine hasar vererek kazanılır.", + "air_yourscore" : "Uçakla %{score} hasar verdiniz.", + "air_score" : "Hava birimlerinin verdiği hasar: %{score}", + "apm" : "APM", + "apm_mousespeed" : "Fare Hızı\n(Piksel/sn)", + "apm_clickrate" : "Tıklama Oranı\n(Fare Tıklamaları/dk)", + "apm_keyspressed" : "Tuş Basma Oranı\n(Basılan Tuşlar/dk)", + "apm_cmd" : "APM\n(Komutlar/dk)", + "assistant" : "Subvansiyon Stratejisi", + "assistant_desc" : "Müttefiklere inşaat projelerinde yardımcı olarak veya müttefiklere metal bağışlayarak kazanılır.", + "assistant_yourscore" : "Müttefiklerinize yardım etmek için %{score} metal kullandınız.", + "assistant_score" : "Müttefiklerinize yardım etmek için %{score} metal kullandınız", + "attrition" : "Attrition Ası", + "attrition_desc" : "Kaybettiğinizden daha fazla metal değeri öldürerek kazanılır. Puan, öldürülen değerin kaybedilen değere oranı kullanılarak hesaplanır.", + "attrition_yourscore" : "Attrition oranınız %{score}.", + "attrition_score" : "Attrition oranı: %{score}", + "awards" : "Ödüller", + "cap" : "Kuklaların Efendisi", + "cap_desc" : "Düşman birimlerini Destek Komutanının Yakalama Işını veya Kadın Egemenler aracılığıyla ele geçirerek kazanılır.", + "cap_yourscore" : "%{score} değerinde birim ele geçirdiniz.", + "cap_score" : "Ele geçirilen düşmanın metal değeri %{score} oldu.", + "comm" : "Usta ve Komutan", + "comm_desc" : "Komutanları kullanarak hasar vererek kazanılır.", + "comm_yourscore" : "Komutanlarınızı kullanarak %{score} hasar verdiniz.", + "comm_score" : "Komutanlar tarafından %{score} hasar verildi.", + "commwars" : "Komutan Fatih", + "commwars_desc" : "Komutan savaşları oyun modunda ayakta kalan son komutan olarak kazanılır.", + "commwars_yourscore" : "%{score} komutanı öldürdünüz.", + "commwars_score" : "%{score} komutan elendi.", + "chicken" : "Tavuk Yarışmacısı", + "chicken_desc" : "Tavuklar varken 100'den fazla puan alarak kazanılır. Tavuk tehdidine karşı daha uzun süre hayatta kalarak puan kazanın! Herkes bu ödülü kazanır.", + "chicken_score" : "Puan: %{score}", + "chickenWin" : "Tavuk Yok Edici", + "chickenWin_desc" : "Daha zor zorluklarda tavuklar varken 100'den fazla puan alarak kazanılır. Daha uzun süre hayatta kalarak daha fazla puan kazanın! Herkes bu ödülü kazanır.", + "chickenWin_score" : "Puan: %{score}", + "defeat" : "Yenilgi!", + "draw_result" : "Beraberlik!", + "drone" : "İHA Yöneticisi", + "drone_desc" : "İHA'larla hasar vererek kazanılır.", + "drone_yourscore" : "İHA'larla %{score} hasar verdiniz.", + "drone_score" : "İHA'larla %{score} hasar verildi", + "economist" : "Ekonomik Güç Merkezi", + "economist_desc" : "Aşırı hız ile metal üreterek kazanılır.", + "economist_yourscore" : "Aşırı hızınız takıma %{score} metal kazandırdı.", + "economist_score" : "Aşırı hız ile üretilen %{score} metal", + "emp" : "EMP Sihirbazı", + "emp_desc" : "Düşman birimlerine EMP hasarı vererek kazanıldı.", + "emp_yourscore" : "Düşman birimlerine %{score} emp hasarı verdiniz.", + "emp_score" : "%{score} emp hasarı verildi", + "exitlobby" : "Lobiye çık", + "fire" : "Usta Izgara Şefi", + "fire_desc" : "Düşman birimlerine ateş hasarı vererek kazanılır.", + "fire_yourscore" : "Düşman birimlerine %{score} ateş hasarı verdiniz.", + "fire_score" : "%{score} ateş hasarı verildi", + "gameover" : "Oyun bitti!", + "gameabort" : "Oyun iptal edildi", + "head" : "Kafa Avcısı", + "head_desc" : "Düşman komutanlarını öldürerek kazanılır. Bu ödüle hak kazanmak için en az 4 kişiyi öldürmelisiniz.", + "head_yourscore" : "Komutanınız öldürdü: %{score}", + "head_score" : "%{score} komutan öldürdü", + "heart" : "Kraliçenin Kalbini Kıran", + "heart_desc" : "Tavuk kraliçesine hasar vererek kazanılır.", + "heard_yourscore" : "Kraliçeye %{score} hasar verdiniz.", + "heart_score" : "Tavuk Kraliçesine %{score} hasar verildi", + "kam" : "Glory'nin Parıltısı", + "kam_desc" : "İntihar birimleri kullanarak hasar vererek kazanıldı.", + "kam_yourscore" : "İntihar birimleri kullanarak düşman birimlerine %{score} hasar verdiniz", + "kam_score" : "İntihar birimleri tarafından %{score} hasar verildi", + "mex" : "Maden Arayıcısı", + "mex_desc" : "Takımınız için metal çıkarıcılar inşa ederek kazanıldı.", + "mex_yourscore" : "%{score} inşa ettiniz.", + "mex_score" : "%{score} metal çıkarıcı inşa ettiniz", + "mexkill" : "Ganimet ve Yağma", + "mexkill_desc" : "Düşman metal çıkarıcılarını öldürerek kazanıldı.", + "mexkill_yourscore" : "%{score} düşman metal çıkarıcısını öldürdünüz.", + "mexkill_score" : "%{score} metal çıkarıcı öldürüldü", + "menace" : "Tehdit Katili", + "menace_desc" : "Tavuk tehditlerine hasar vererek kazanıldı.", + "menace_yourscore" : "Tehditlere %{score} hasar verdiniz.", + "menace_score" : "Tehditlere %{score} hasar verildi.", + "missile" : "Füze Yağmacısı", + "missile_desc" : "Füze silosu füzeleri kullanarak hasar vererek kazanıldı.", + "missile_yourscore" : "Taktik füzeleri kullanarak %{score} hasar verdiniz.", + "missile_score" : "Taktik füzeleri kullanarak %{score} hasar verildi.", + "nux" : "Kıyamet Başarısı", + "nux_desc" : "Süper silahlar kullanarak hasar vererek kazanıldı.", + "nux_yourscore" : "Süper silahlar kullanarak %{score} hasar verdiniz.", + "nux_score" : "Süper silahlar kullanarak %{score} hasar verdiniz", + "ouch" : "Büyük Mor Kalp", + "ouch_desc" : "Sağlık hasarı alarak kazanıldı.", + "ouch_yourscore" : "%{score} hasar aldınız.", + "ouch_score" : "%{score} hasar aldınız", + "pwn" : "İmhayı Tamamla", + "pwn_desc" : "Düşman birimlerine hasar vererek kazanıldı.", + "pwn_yourscore" : "Düşman birimlerine %{score} hasar verdiniz.", + "pwn_score" : "%{score} hasar verdiniz", + "rage" : "Öfke tetikleyici", + "rage_desc" : "Bu başarı uygulanmadı.", + "rage_yourscore" : "Uygulanmadı. %{score}", + "rage_score" : "%{score} puan aldı mı?", + "reclaim" : "Savaş Ganimetleri", + "reclaim_desc" : "Enkaz veya sihirli mantar gibi şeylerden çevreden metal geri kazanarak kazanılır.", + "reclaim_yourscore" : "%{score} metal geri kazandınız.", + "reclaim_score" : "%{score} metal geri kazanıldı.", + "rezz" : "Alçak Nekromanser", + "rezz_desc" : "Enkazları dirilterek kazanılır.", + "rezz_yourscore" : "%{score} değerinde metal değerinde enkazı dirilttiniz.", + "rezz_score" : "%{score} değerinde metal değerinde birim diriltildi.", + "repair" : "Dost Mekanik", + "repair_desc" : "Müttefik birimleri onararak kazanılır.", + "repair_yourscore" : "Müttefiklerinize %{score} can onardınız.", + "repair_score" : "%{score} can onarıldı.", + "share" : "Paylaşım Ayısı", + "share_desc" : "Birlikleri müttefiklerinizle paylaşarak kazanılır.", + "share_yourscore" : "%{score} değerinde metal birimi takım arkadaşlarınızla paylaştınız.", + "share_score" : "%{score} değerinde metal birimi paylaşıldı", + "shell" : "Kaplumbağa Kabuğu", + "shell_desc" : "Savunma kullanarak düşman birimlerine hasar vererek kazanılır.", + "shell_yourscore" : "Savunmalarınız düşman birimlerine %{score} hasar verdi.", + "shell_score" : "Savunmaların verdiği %{score} hasar", + "shield" : "Kalkan Taşıyıcısı", + "shield_desc" : "Kalkanlar kullanarak hasarı tanklayarak kazanılır.", + "shield_yourscore" : "Kalkanlarınız %{score} hasar emdi.", + "shield_score" : "%{score} hasar kullanarak alınan shields", + "slow" : "Trafik Polisi", + "slow_desc" : "Düşman birimlerine yavaş hasar vererek kazanılır.", + "slow_yourscore" : "Düşman birimlerine %{score} yavaş hasar verdiniz.", + "slow_score" : "%{score} yavaş hasar verildi", + "statistics" : "İstatistikler", + "sweeper" : "Kara Süpürgesi", + "sweeper_desc" : "Tavuk tüneklerini öldürerek kazanılır.", + "sweeper_yourscore" : "%{score}'u yok ettiniz.", + "sweeper_score" : "%{score} tavuk tünekleri yok edildi", + "t3" : "Deneysel Mühendis", + "t3_desc" : "Bu ödül henüz uygulanmadı.", + "t3_yourscore" : "Uygulanmadı %{score}", + "t3_score" : "Puan: %{score}", + "terra" : "Efsanevi Peyzajcı", + "terra_desc" : "Terraform yaparak kazanıldı.", + "terra_yourscore" : "Terraform için %{score} metal harcadınız.", + "terra_score" : "Terraform için %{score} metal harcadınız.", + "vet" : "Dekorasyonlu Gazi", + "vet_desc" : "Bir birimi hasar vermek veya değerinden daha fazla değer öldürmek için çok etkili bir şekilde kullanarak kazanıldı.", + "vet_yourscore" : "En uygun maliyetli biriminiz %{score} maliyetine sahip olan %{unitname} oldu.", + "vet_score" : "%{unitname}, maliyet: %{score}", + "victory" : "Zafer!", + "teamwins" : "%{name} kazandı!" +} diff --git a/LuaUI/Configs/lang/awards.zh.json b/LuaUI/Configs/lang/awards.zh.json new file mode 100644 index 0000000000..82370cf0d6 --- /dev/null +++ b/LuaUI/Configs/lang/awards.zh.json @@ -0,0 +1,150 @@ +{ + "air": "空军将领", + "air_desc": "使用飞机对敌方单位造成伤害获得。", + "air_yourscore": "你使用飞机造成了 %{score} 点伤害。", + "air_score": "空中单位造成的伤害:%{score}", + "apm": "每分钟", + "apm_mousespeed": "鼠标速度\n(像素/秒)", + "apm_clickrate": "点击率\n(鼠标点击次数/分钟)", + "apm_keyspressed": "按键率\n(按键次数/分钟)", + "apm_cmd": "每分钟\n(命令次数/分钟)", + "assistant": "补贴策略", + "assistant_desc": "通过协助盟友进行建设项目或向盟友捐赠金属获得。", + "assistant_yourscore": "您使用了 %{score} 金属来协助您的盟友。", + "assistant_score": "用于协助盟友的 %{score} 金属", + "attrition": "消耗王牌", + "attrition_desc": "通过击杀的金属价值超过损失的金属价值获得。分数是根据击杀价值与损失价值的比率计算的。", + "attrition_yourscore": "您的消耗率为 %{score}。", + "attrition_score": "消耗率:%{score}", + "awards": "奖励", + "cap": "傀儡大师", + "cap_desc": "通过支援指挥官的捕获射线或施虐狂捕获敌方单位获得。", + "cap_yourscore": "您捕获了价值 %{score} 金属的单位。", + "cap_score" : "捕获敌人价值 %{score} 金属。", + "comm": "大师和指挥官", + "comm_desc": "使用指挥官造成伤害即可获得。", + "comm_yourscore": "您使用指挥官造成了 %{score} 点伤害。", + "comm_score": "指挥官造成了 %{score} 点伤害。", + "commwars": "征服指挥官", + "commwars_desc": "在指挥官战争游戏模式中,成为最后一位存活下来的指挥官即可获得。", + "commwars_yourscore": "您击杀了 %{score} 名指挥官。", + "commwars_score": "淘汰了 %{score} 名指挥官。", + "chicken": "鸡肉争夺者", + "chicken_desc": "在有鸡的情况下获得超过 100 分即可获得。在鸡的威胁下存活更长时间即可获得积分!每个人都可以获得此奖励。", + "chicken_score": "得分:%{score}", + "chickenWin": "小鸡消灭者", + "chickenWin_desc": "在更高难度下,当有小鸡出现时,得分超过 100 分即可获得。存活时间越长,得分越高!每个人都可以获得此奖励。", + "chickenWin_score": "得分:%{score}", + "defeat": "失败!", + "draw_result": "平局!", + "drone": "无人机指挥官", + "drone_desc": "使用无人机造成伤害即可获得。", + "drone_yourscore": "你使用无人机造成了 %{score} 点伤害。", + "drone_score": "使用无人机造成了 %{score} 点伤害", + "economist": "经济强国", + "economist_desc": "通过超速生产金属获得。", + "economist_yourscore": "你的超速为团队贡献了 %{score} 金属。", + "economist_score": "通过超速生产了 %{score} 金属。", + "emp": "电磁脉冲巫师。", + "emp_desc": "通过对敌方单位造成电磁脉冲伤害获得。", + "emp_yourscore": "你对敌方单位造成了 %{score} 点电磁脉冲伤害。", + "emp_score": "造成了 %{score} 点电磁脉冲伤害。", + "exitlobby": "退出大厅。", + "fire": "烧烤大师。", + "fire_desc": "通过对敌方单位造成火焰伤害获得。", + "fire_yourscore": "你对敌方单位造成了 %{score} 点火焰伤害。", + "fire_score": "造成 %{score} 点火焰伤害", + "gameover": "游戏结束!", + "gameabort": "游戏中止", + "head": "猎头人", + "head_desc": "通过击杀敌方指挥官获得。您必须击杀至少 4 名才能获得此奖励。", + "head_yourscore": "您的指挥官击杀数:%{score}", + "head_score": "已击杀 %{score} 名指挥官", + "heart": "女王心碎者", + "heart_desc": "通过对鸡女王造成伤害获得。", + "heard_yourscore": "您对女王造成了 %{score} 点伤害。", + "heart_score": "对鸡女王造成了 %{score} 点伤害", + "kam": "荣耀之光", + "kam_desc": "通过自杀造成伤害获得单位。", + "kam_yourscore": "你使用自杀单位对敌方单位造成了 %{score} 点伤害", + "kam_score": "自杀单位造成的伤害为 %{score} 点", + "mex": "矿产勘探员", + "mex_desc": "通过为你的队伍建造金属提取器获得。", + "mex_yourscore": "你建造了 %{score} 台。", + "mex_score": "建造了 %{score} 台金属提取器", + "mexkill": "掠夺与劫掠", + "mexkill_desc": "通过击杀敌方金属采集器获得。", + "mexkill_yourscore": "你击杀了 %{score} 个敌方金属采集器。", + "mexkill_score": "击杀了 %{score} 个金属采集器。", + "menace": "威胁杀手", + "menace_desc": "通过对小鸡威胁造成伤害获得。", + "menace_yourscore": "你对威胁造成了 %{score} 点伤害。", + "menace_score": "对威胁造成了 %{score} 点伤害。", + "missile": "导弹掠夺者", + "missile_desc": "通过使用导弹发射井导弹造成伤害获得。", + "missile_yourscore": "你使用战术导弹。", + "missile_score": "使用战术导弹造成 %{score} 点伤害。", + "nux": "末日成就", + "nux_desc": "使用超级武器造成伤害获得。", + "nux_yourscore": "你使用超级武器造成了 %{score} 点伤害。", + "nux_score": "使用超级武器造成了 %{score} 点伤害。", + "ouch": "大紫心勋章", + "ouch_desc": "受到生命值伤害获得。", + "ouch_yourscore": "你受到了 %{score} 点伤害。", + "ouch_score": "受到 %{score} 点伤害。", + "pwn": "彻底歼​​灭", + "pwn_desc": "对敌方单位造成伤害获得。", + "pwn_yourscore": "你对敌方单位造成了 %{score} 点伤害。", + "pwn_score": "造成了 %{score} 点伤害", + "rage": "愤怒诱导者", + "rage_desc": "此成就尚未实现。", + "rage_yourscore": "未实现。%{score}", + "rage_score": "得分为 %{score}?", + "reclaim": "战利品", + "reclaim_desc": "通过从环境中回收金属(例如残骸或迷幻蘑菇)获得。", + "reclaim_yourscore": "您回收了 %{score} 金属。", + "reclaim_score": "回收了 %{score} 金属。", + "rezz": "邪恶的死灵法师", + "rezz_desc": "通过复活残骸获得。", + "rezz_yourscore": "您复活了价值 %{score} 金属的残骸。", + "rezz_score": "复活价值 %{score} 金属的单位。", + "repair": "友方机械师", + "repair_desc": "通过修复友方单位获得。", + "repair_yourscore": "你为你的友方修复了 %{score} 点生命值。", + "repair_score": "修复了 %{score} 点生命值。", + "share": "分享熊", + "share_desc": "通过与你的友方分享单位获得。", + "share_yourscore": "你与你的队友分享了价值 %{score} 金属的单位。", + "share_score": "分享了价值 %{score} 金属的单位。", + "shell": "龟壳", + "shell_desc": "通过使用防御对敌方单位造成伤害获得。", + "shell_yourscore": "你的防御造成了 %{score}对敌方单位造成伤害。", + "shell_score": "防御单位造成的 %{score} 点伤害", + "shield": "持盾者", + "shield_desc": "使用盾牌承受伤害获得。", + "shield_yourscore": "你的盾牌吸收了 %{score} 点伤害。", + "shield_score": "使用盾牌受到 %{score} 点伤害", + "slow": "交通警察", + "slow_desc": "对敌方单位造成减速伤害获得。", + "slow_yourscore": "你对敌方单位造成了 %{score} 点减速伤害。", + "slow_score": "造成了 %{score} 点减速伤害", + "statistics": "统计", + "sweeper": "陆地清扫者", + "sweeper_desc": "杀死鸡窝获得。", + "sweeper_yourscore": "您消灭了 %{score} 个鸡舍。", + "sweeper_score": "消灭了 %{score} 个鸡舍。", + "t3": "实验工程师。", + "t3_desc": "此奖项尚未实施。", + "t3_yourscore": "未实施 %{score}。", + "t3_score": "得分:%{score}。", + "terra": "传奇景观设计师。", + "terra_desc": "通过地形改造获得。", + "terra_yourscore": "您花费了 %{score} 金属进行地形改造。", + "terra_score": "花费了 %{score} 金属进行地形改造。", + "vet": "荣誉老兵。", + "vet_desc": "通过使用单位非常有效地造成伤害或击杀,其价值超过了其应有的价值。", + "vet_yourscore": "您最具成本效益的单位是 %{unitname},其成本为 %{score}。", + "vet_score": "%{unitname},成本为:%{score}", + "victory": "胜利!", + "teamwins": "%{name} 获胜!" +} diff --git a/LuaUI/Widgets/gui_chili_endgamewindow.lua b/LuaUI/Widgets/gui_chili_endgamewindow.lua index 2eb22a38b8..fe9861774d 100644 --- a/LuaUI/Widgets/gui_chili_endgamewindow.lua +++ b/LuaUI/Widgets/gui_chili_endgamewindow.lua @@ -2,15 +2,15 @@ -------------------------------------------------------------------------------- function widget:GetInfo() - return { - name = "Chili EndGame Window", - desc = "v0.005 Chili EndGame Window. Creates award control and receives stats control from another widget.", - author = "CarRepairer", - date = "2013-09-05", - license = "GNU GPL, v2 or later", - layer = 0, - enabled = true, - } + return { + name = "Chili EndGame Window", + desc = "v0.005 Chili EndGame Window. Creates award control and receives stats control from another widget.", + author = "CarRepairer, localization by Shaman", + date = "2013-09-05", + license = "GNU GPL, v2 or later", + layer = 0, + enabled = true, + } end -------------------------------------------------------------------------------- @@ -39,6 +39,7 @@ local Line local screen0 local color2incolor local incolor2color +local winners -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- @@ -77,12 +78,22 @@ local SELECT_BUTTON_COLOR = {0.98, 0.48, 0.26, 0.85} local SELECT_BUTTON_FOCUS_COLOR = {0.98, 0.48, 0.26, 0.85} local BUTTON_COLOR local BUTTON_FOCUS_COLOR +local controlsSetup = false +local checkFont + local awardDescs = VFS.Include("LuaRules/Configs/award_names.lua") +local text = {} local teamNames = {} local teamColors = {} local teamApmStatsLabels = {} +local localizationNames = { + ["apm_mousespeed"] = true, + ["apm_clickrate"] = true, + ["apm_keyspressed"] = true, + ["apm_cmd"] = true, +} -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- @@ -98,6 +109,7 @@ options = { dontRegisterAction = true, }, } + -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- --utilities @@ -112,7 +124,8 @@ local function SetTeamNamesAndColors() local name = Spring.GetPlayerInfo(leader, false) teamNames[teamID] = name end - teamColors[teamID] = Chili.color2incolor(Spring.GetTeamColor(teamID)) + name = name or "Unknown" + teamColors[teamID] = Chili.color2incolor(Spring.GetTeamColor(teamID)) or Chili.color2incolor(1,1,1,1) end end @@ -127,22 +140,129 @@ local function SetButtonSelected(button, isSelected) button:Invalidate() end +local function comma_value(amount) + local formatted = amount .. '' + local k + while true do + formatted, k = formatted:gsub("^(-?%d+)(%d%d%d)", '%1,%2') + if (k==0) then + break + end + end + return formatted +end + +local function GetBestFitFontSizeJapanese(text, width, wantedSize) -- Japanese is beyond stupid with GetTextWidth it seems. Need individual iconograph sizes. + local array = {} + for word in text:gmatch("[%z\1-\127\194-\244][\128-\191]*") do + array[#array + 1] = word + end + local fits = false + local currentSize = wantedSize + local length = 0 + while not fits do + for i = 1, #array do + length = length + (checkFont:GetTextWidth(text, 1) * currentSize) + end + if length > width then + currentSize = currentSize - 1 + length = 0 + else + fits = true + end + end + return currentSize +end + + +local function GetBestFitFontSize(text, width, wantedSize) + local fits = false + local currentSize = wantedSize + while not fits do + Spring.Echo("CheckSize: " .. checkFont:GetTextWidth(text, 1) * currentSize) + fits = checkFont:GetTextWidth(text, 1) * currentSize < width - 2 + if not fits then + currentSize = currentSize - 1 + end + end + return currentSize +end + -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- --awards local function MakeAwardPanel(awardType, record) - local desc = awardDescs[awardType] - local fontsize = desc:len() > 25 and 12 or 16 - return Panel:New{ - width=230; - height=awardPanelHeight; + local desc = awardDescs[awardType] -- localized via OnLocaleChanged + if desc == awardType then + desc = WG.Translate("interface", awardType) -- might not have initialized yet. + end + local fontsize, recordFontSize + if WG.lang == 'ja' then + fontsize = GetBestFitFontSizeCJK(desc, 180, 16) + else + fontsize = GetBestFitFontSize(desc, 180, 16) + end + local descLen = desc:len() + Spring.Echo(awardType .. " Desc Length: " .. descLen .. ", " .. fontsize) + local score = Spring.GetGameRulesParam(awardType .. "_rawscore") + if score then -- precaution. + if awardType == 'attrition' or awardType == 'vet' then + score = string.format("%.2f%%%%", score * 100) + else + if score > 1000 then + score = comma_value(math.floor(score)) + else + score = string.format("%.1f", score) + end + end + if awardType ~= 'vet' then + record = WG.Translate("interface", awardType .. "_score", {score = score}) -- translate. + else + local bestUnit = WG.Translate("units", Spring.GetGameRulesParam("vet_unitdef") .. ".name") or UnitDefNames[bestUnitDef].humanName + record = WG.Translate("interface", awardType .. "_score", {score = score, unitname = bestUnit}) -- translate. + end + end + local recordLength = record:len() + if WG.lang == 'ja' then + recordFontSize = GetBestFitFontSizeCJK(record, 180, 16) + else + recordFontSize = GetBestFitFontSize(record, 180, 16) + end + Spring.Echo("Record Length: " .. recordLength .. ", " .. recordFontSize) + local myTeamID = Spring.GetMyTeamID() + local myScore = Spring.GetGameRulesParam(myTeamID .. "_" .. awardType .. "_score") + local tooltipString = WG.Translate("interface", awardType .. "_desc") + if myScore and myScore > 0 and awardType ~= "chickenWin" and awardType ~= "chicken" then -- chicken and chickenwin are cooperative awards that everyone gets. Just explain how they're earned. + if awardType == 'attrition' or awardType == 'vet' then + myScore = string.format("%.2f%%%%", myScore * 100) -- format in a more human readable way. These are ratios, let's present them in percentages. + else + if myScore > 999 then + myScore = comma_value(math.floor(myScore)) + else + myScore = math.floor(myScore) + end + end + if awardType == "vet" then + local bestUnitDef = Spring.GetGameRulesParam(Spring.GetMyTeamID() .. "_vet_unit") + local myBestUnit = WG.Translate("units", bestUnitDef .. ".name") or UnitDefNames[bestUnitDef].humanName + tooltipString = tooltipString .. "\n\n" .. WG.Translate("interface", awardType .. "_yourscore", {score = myScore, unitname = myBestUnit}) + else -- vet needs special support. + tooltipString = tooltipString .. "\n\n" .. WG.Translate("interface", awardType .. "_yourscore", {score = myScore}) + end + end + local newPanel = Panel:New{ + width=230, + height=awardPanelHeight, + HitTest = function (self, x, y) return self end, + tooltip = tooltipString, children = { - Image:New{ file='LuaRules/Images/awards/trophy_'.. awardType ..'.png'; parent=awardPanel; x=0;y=0; width=30; height=40; objectOverrideFont = WG.GetFont(), }; - Label:New{ caption = desc; autosize=true, height=L_HEIGHT, parent=awardPanel; x=35; y=0; textColor={1,1,0,1}; objectOverrideFont = WG.GetFont(fontsize), }; - Label:New{ caption = record, autosize=true, height=L_HEIGHT, parent=awardPanel; x=35; y=20, objectOverrideFont = WG.GetFont(), }; - } + Image:New{name = awardType .. "_icon", file='LuaRules/Images/awards/trophy_'.. awardType ..'.png'; parent=awardPanel; x=0;y=0; width=30; height=40; objectOverrideFont = WG.GetFont(), }; + Label:New{name = awardType .. "_name", caption = desc; autosize=true, height=L_HEIGHT, parent=awardPanel; x=35; y=0; textColor={1,1,0,1}; objectOverrideFont = WG.GetFont(fontsize), }; + Label:New{name = awardType .. "_record", caption = record, autosize=true, height=L_HEIGHT, parent=awardPanel; x=35; y=20, objectOverrideFont = WG.GetFont(recordFontSize), }; + }, } + return newPanel end local function SetupAwardsPanel() @@ -183,6 +303,7 @@ end local function SetupAPMPanel() Label:New{ + name = "empty", parent=apmSubPanel, width=200, y=200, @@ -194,38 +315,42 @@ local function SetupAPMPanel() } Label:New{ parent=apmSubPanel, + name = "apm_mousespeed", width=200, y=200, height=awardPanelHeight, - caption = "Mouse Speed\n(Pixels/s)", + caption = WG.Translate("interface", "apm_mousespeed"), valign='center', autosize=false, objectOverrideFont = WG.GetFont(), } Label:New{ parent=apmSubPanel, + name = "apm_clickrate", width=200, --y = 120, height=awardPanelHeight, - caption = "Click Rate\n(Mouse Clicks/m)", + caption = WG.Translate("interface", "apm_clickrate"), valign='center', autosize=false, objectOverrideFont = WG.GetFont(), } Label:New{ parent=apmSubPanel, + name = "apm_keyspressed", width=200, height=awardPanelHeight, - caption = "Key Press Rate\n(Keys Pressed/m)", + caption = WG.Translate("interface", "apm_keyspressed"), valign='center', autosize=false, objectOverrideFont = WG.GetFont(), } Label:New{ parent=apmSubPanel, + name = "apm_cmd", width=200, height=awardPanelHeight, - caption = "APM\n(Cmds/m)", + caption = WG.Translate("interface", "apm_cmd"), valign='center', autosize=false, objectOverrideFont = WG.GetFont(), @@ -456,9 +581,10 @@ local function SetupControls() awardButton = Button:New{ parent = window_endgame; - caption="Awards", + caption = WG.Translate("interface", "awards"), objectOverrideFont = WG.GetFont(), x=9, y=7, + width = 10 .. "%", height=B_HEIGHT; OnClick = { ShowAwards @@ -470,8 +596,9 @@ local function SetupControls() statsButton = Button:New{ parent = window_endgame; - caption="Statistics", - x=86, y=7, + caption= WG.Translate("interface", "statistics"), + x= 10.9 .. "%", y=7, + width = 10 .. "%", objectOverrideFont = WG.GetFont(), height=B_HEIGHT; OnClick = { @@ -484,7 +611,8 @@ local function SetupControls() apmButton = Button:New{ parent = window_endgame; caption="APM", - x=86+77, y=7, + x= 21 .. "%", y=7, + width = 10 .. "%", objectOverrideFont = WG.GetFont(), height=B_HEIGHT; OnClick = { @@ -492,11 +620,11 @@ local function SetupControls() }; } exitButton = Button:New{ - x = -169, -- This is is a high class nonsense here + x = 79 .. "%", y = 7, - width = 160, + width = 20 .. "%", height = B_HEIGHT, - caption = "Exit to Lobby", + caption = WG.Translate("interface", "exitlobby"), objectOverrideFont = WG.GetFont(18), OnClick = { function() @@ -509,13 +637,15 @@ local function SetupControls() }, parent = window_endgame, } + controlsSetup = true end -local function SetEndgameCaption(winners) +local function SetEndgameCaption() + if winners == nil then return end local gaiaAllyTeamID = select(6, Spring.GetTeamInfo(Spring.GetGaiaTeamID(), false)) if #winners > 1 then if spec then - endgame_caption = "Game over!" + endgame_caption = WG.Translate("interface", "gameover") endgame_fontcolor = {1,1,1,1} else local i_win = false @@ -526,10 +656,10 @@ local function SetEndgameCaption(winners) end if i_win then - endgame_caption = "Victory!" + endgame_caption = WG.Translate("interface", "victory") endgame_fontcolor = {0,1,0,1} else - endgame_caption = "Defeat!" + endgame_caption = WG.Translate("interface", "defeat") endgame_fontcolor = {1,0,0,1} end end @@ -540,20 +670,20 @@ local function SetEndgameCaption(winners) end if spec then if (winners[1] == gaiaAllyTeamID) then - endgame_caption = "Draw!" + endgame_caption = WG.Translate("interface", "draw_result") endgame_fontcolor = {1,1,1,1} else - endgame_caption = (winnerTeamName .. " wins!") + endgame_caption = WG.Translate("interface", "teamwins", {name = winnerTeamName}) endgame_fontcolor = {1,1,1,1} end elseif (winners[1] == Spring.GetMyAllyTeamID()) then - endgame_caption = "Victory!" + endgame_caption = WG.Translate("interface", "victory") endgame_fontcolor = {0,1,0,1} elseif (winners[1] == gaiaAllyTeamID) then - endgame_caption = "Draw!" + endgame_caption = WG.Translate("interface", "draw_result") endgame_fontcolor = {1,1,0,1} else - endgame_caption = "Defeat!" -- could somehow add info on who won (eg. for FFA) but as-is it won't fit + endgame_caption = WG.Translate("interface", "defeat") -- could somehow add info on who won (eg. for FFA) but as-is it won't fit endgame_fontcolor = {1,0,0,1} end end @@ -574,6 +704,45 @@ local function StartEndgameTimer (delay) widgetHandler:UpdateCallIn("Update") end +local function OnLocaleChange() + for k, _ in pairs(awardDescs) do + awardDescs[k] = WG.Translate("interface", k) + end + if awardButton then + awardButton:SetCaption(WG.Translate("interface", "awards")) + awardButton:Invalidate() + end + if statsButton then + statsButton:SetCaption(WG.Translate("interface", "statistics")) + statsButton:Invalidate() + end + if apmButton then + apmButton:SetCaption(WG.Translate("interface", "apm")) + apmButton:Invalidate() + end + if exitButton then + exitButton:SetCaption(WG.Translate("interface", "exitlobby")) + exitButton:Invalidate() + end + if apmSubPanel and not apmSubPanel:IsEmpty() then + for name, _ in pairs(localizationNames) do + Spring.Echo("Updating " .. name) + local button = apmSubPanel:GetChildByName(name) + if button then + Spring.Echo("Applying update to " .. name) + button:SetCaption(WG.Translate("interface", name)) + Spring.Echo("Caption set") + end + end + end + if gameEnded and controlsSetup then + SetEndgameCaption() + window_endgame.caption = endgame_caption + window_endgame:Invalidate() + SetupAwardsPanel() + end +end + function widget:Initialize() if (not WG.Chili) then widgetHandler:RemoveWidget() @@ -613,11 +782,11 @@ function widget:Initialize() statsButton:Hide() exitButton:Hide() ShowStats() - + checkFont = WG.GetFont() widgetHandler:RemoveCallIn("Update") widgetHandler:RemoveCallIn("GameFrame") if Spring.IsGameOver() then - window_endgame.caption = "Game aborted" + window_endgame.caption = WG.Translate("interface", "gameabort") StartEndgameTimer(1) end @@ -631,10 +800,12 @@ function widget:Initialize() end global_command_button = WG.GlobalCommandBar.AddCommand("LuaUI/Images/graphs_icon.png", "Toggle graphs" .. toggleKey, ToggleStatsGraph) end + WG.InitializeTranslation(OnLocaleChange, "gui_chili_endgamewindow") end -function widget:GameOver(winners) - SetEndgameCaption(winners) +function widget:GameOver(thisWinners) + winners = thisWinners + SetEndgameCaption() StartEndgameTimer(endgameWindowDelay) end