-- ========== GENERATED BY Achievement Editor DO NOT EDIT MANUALLY! ========== PlaceObj('Achievement', { description = T(577854314600, --[[Achievement PlatinumTrophy description (limited to 100 characters on XBOX)]] "Unlocked all trophies."), display_name = T(220715659890, --[[Achievement PlatinumTrophy display_name]] "Medal Of Honor"), group = "PlayStation", how_to = T(498691177443, --[[Achievement PlatinumTrophy how_to (limited to 100 characters on XBOX)]] "Unlock all trophies."), id = "PlatinumTrophy", ps4_grade = "platinum", ps4_id = 0, ps5_grade = "platinum", ps5_id = 0, }) PlaceObj('Achievement', { SortKey = 1000, description = T(810430241463, --[[Achievement BloodRain description (limited to 100 characters on XBOX)]] "Dealt 1000 damage to enemies in one turn."), display_name = T(907749527147, --[[Achievement BloodRain display_name]] "Blood Rain"), group = "Combat", how_to = T(431654490364, --[[Achievement BloodRain how_to (limited to 100 characters on XBOX)]] "Deal 1000 damage to enemies in one turn."), id = "BloodRain", msg_reactions = { PlaceObj('MsgReaction', { Event = "DamageDone", Handler = function (self, attacker, target, dmg, hit_descr) if GetAchievementFlags(self.id) then return end if IsMerc(attacker) and attacker:IsOnEnemySide(target) and dmg > 0 then gv_Achievements[self.id] = (gv_Achievements[self.id] or 0) + dmg if gv_Achievements[self.id] >= self.target then AchievementUnlock(self.id) end end end, }), PlaceObj('MsgReaction', { Event = "TurnEnded", Handler = function (self, teamEnded) if GetAchievementFlags(self.id) then return end gv_Achievements[self.id] = 0 end, }), PlaceObj('MsgReaction', { Event = "Attack", Handler = function (self, action, results, attack_args, combat_starting) if GetAchievementFlags(self.id) then return end if not combat_starting and not g_Combat then gv_Achievements[self.id] = 0 end end, }), }, ps4_id = 1, ps5_id = 1, target = 1000, xbox_id = 46, }) PlaceObj('Achievement', { Comment = "current player", SortKey = 1000, description = T(911958725547, --[[Achievement BornKiller description (limited to 100 characters on XBOX)]] "Killed 5 enemies in one turn with a single merc."), display_name = T(365161191013, --[[Achievement BornKiller display_name]] "Born Killer"), group = "Combat", how_to = T(152740288772, --[[Achievement BornKiller how_to (limited to 100 characters on XBOX)]] "Kill 5 enemies in one turn with a single merc."), id = "BornKiller", msg_reactions = { PlaceObj('MsgReaction', { Event = "OnAttack", Handler = function (self, attacker, action, target, results, attack_args) if GetAchievementFlags(self.id) then return end if g_CageFighting then return end if IsMerc(attacker) and attacker.ControlledBy == netUniqueId then local kills = EnemiesKilled(attacker, results) if kills > 0 then local state = GetAccountCurrentGameAchievementState(self.id) or {} local mercId = attacker.session_id state[mercId] = (state[mercId] or 0) + kills if state[mercId] >= self.target then AchievementUnlock(self.id) end SetAccountCurrentGameAchievementState(self.id, state) end end end, }), PlaceObj('MsgReaction', { Event = "TurnStart", Handler = function (self, teamEnded) if GetAchievementFlags(self.id) then return end SetAccountCurrentGameAchievementState(self.id, {}) end, }), PlaceObj('MsgReaction', { Event = "Attack", Handler = function (self, action, results, attack_args, combat_starting) if GetAchievementFlags(self.id) then return end if not combat_starting and not g_Combat then SetAccountCurrentGameAchievementState(self.id, {}) end end, }), }, ps4_id = 2, ps5_id = 2, target = 5, xbox_id = 42, }) PlaceObj('Achievement', { SortKey = 1000, description = T(872847195726, --[[Achievement BulletProof description (limited to 100 characters on XBOX)]] "Finished the campaign without a single merc dying or getting downed."), display_name = T(725359206535, --[[Achievement BulletProof display_name]] "Bullet Proof"), group = "Combat", how_to = T(115567857703, --[[Achievement BulletProof how_to (limited to 100 characters on XBOX)]] "Finish the campaign without a single merc dying or getting downed."), id = "BulletProof", msg_reactions = { PlaceObj('MsgReaction', { Event = "CampaignEnd", Handler = function (self, campaignId) if GetAchievementFlags(self.id) then return end if gv_Achievements[self.id] ~= "failed" then AchievementUnlock(self.id) end end, }), PlaceObj('MsgReaction', { Event = "UnitDowned", Handler = function (self, unit) if GetAchievementFlags(self.id) then return end if IsMerc(unit) then gv_Achievements[self.id] = "failed" end end, }), PlaceObj('MsgReaction', { Event = "UnitDied", Handler = function (self, unit, killer, results) if GetAchievementFlags(self.id) then return end if IsMerc(unit) then gv_Achievements[self.id] = "failed" end end, }), }, ps4_grade = "silver", ps4_id = 3, ps5_grade = "silver", ps5_id = 3, xbox_id = 15, }) PlaceObj('Achievement', { SortKey = 1000, description = T(119695960362, --[[Achievement FlawlessVictory description (limited to 100 characters on XBOX)]] "Conquered an Outpost without losing HP."), display_name = T(434089830814, --[[Achievement FlawlessVictory display_name]] "Flawless Victory"), group = "Combat", how_to = T(926544369717, --[[Achievement FlawlessVictory how_to (limited to 100 characters on XBOX)]] "Conquer an Outpost without losing HP."), id = "FlawlessVictory", msg_reactions = { PlaceObj('MsgReaction', { Event = "DamageDone", Handler = function (self, attacker, target, dmg, hit_descr) if GetAchievementFlags(self.id) then return end if IsMerc(target) and hit_descr.prev_hit_points and target.HitPoints < hit_descr.prev_hit_points then gv_Achievements[self.id] = false end end, }), PlaceObj('MsgReaction', { Event = "SectorSideChanged", Handler = function (self, sectorId, oldSide, newSide) if GetAchievementFlags(self.id) then return end if gv_Achievements[self.id] == sectorId and IsPlayerSide(newSide) then AchievementUnlock(self.id) end end, }), PlaceObj('MsgReaction', { Event = "EnterSector", Handler = function (self, game_start, load_game) if GetAchievementFlags(self.id) then return end if not game_start and not load_game then local sector = gv_Sectors[gv_CurrentSectorId] if sector.Guardpost and not IsPlayerSide(sector.Side) then gv_Achievements[self.id] = gv_CurrentSectorId end end end, }), }, ps4_id = 4, ps5_id = 4, xbox_id = 49, }) PlaceObj('Achievement', { SortKey = 1000, description = T(855827054392, --[[Achievement MartialArtiste description (limited to 100 characters on XBOX)]] "Conquered an Outpost without using firearms."), display_name = T(330886195762, --[[Achievement MartialArtiste display_name]] "Martial Artiste"), group = "Combat", how_to = T(509509051660, --[[Achievement MartialArtiste how_to (limited to 100 characters on XBOX)]] "Conquer an Outpost without using firearms."), id = "MartialArtiste", msg_reactions = { PlaceObj('MsgReaction', { Event = "OnAttack", Handler = function (self, attacker, action, target, results, attack_args) if GetAchievementFlags(self.id) then return end if IsMerc(attacker) and not IsKindOf(results.weapon, "MeleeWeapon") then gv_Achievements[self.id] = false end end, }), PlaceObj('MsgReaction', { Event = "SectorSideChanged", Handler = function (self, sectorId, oldSide, newSide) if GetAchievementFlags(self.id) then return end if gv_Achievements[self.id] == sectorId and IsPlayerSide(newSide) then AchievementUnlock(self.id) end end, }), PlaceObj('MsgReaction', { Event = "EnterSector", Handler = function (self, game_start, load_game) if GetAchievementFlags(self.id) then return end if not game_start and not load_game then local sector = gv_Sectors[gv_CurrentSectorId] if sector.Guardpost and not IsPlayerSide(sector.Side) then gv_Achievements[self.id] = gv_CurrentSectorId end end end, }), }, ps4_grade = "silver", ps4_id = 5, ps5_grade = "silver", ps5_id = 5, xbox_id = 48, }) PlaceObj('Achievement', { Comment = "current player", SortKey = 1000, description = T(851738195780, --[[Achievement NaturalSprinter description (limited to 100 characters on XBOX)]] "Moved a merc 35 tiles away in a single turn."), display_name = T(729701469966, --[[Achievement NaturalSprinter display_name]] "Natural Sprinter"), group = "Combat", how_to = T(698490476872, --[[Achievement NaturalSprinter how_to (limited to 100 characters on XBOX)]] "Move a merc 35 tiles away in a single turn."), id = "NaturalSprinter", msg_reactions = { PlaceObj('MsgReaction', { Event = "TurnStart", Handler = function (self, team) if GetAchievementFlags(self.id) then return end SetAccountCurrentGameAchievementState(self.id, {}) end, }), PlaceObj('MsgReaction', { Event = "UnitMovementDone", Handler = function (self, unit, action_id, prev_pos) if not g_Combat or not prev_pos or not IsMerc(unit) or unit.ControlledBy ~= netUniqueId then return end local state = GetAccountCurrentGameAchievementState(self.id) or {} state[unit.session_id] = (state[unit.session_id] or 0) + (unit:GetDist(prev_pos) / const.SlabSizeX) if state[unit.session_id] >= self.target then AchievementUnlock(self.id) end SetAccountCurrentGameAchievementState(self.id, state) end, }), }, ps4_id = 6, ps5_id = 6, target = 35, xbox_id = 43, }) PlaceObj('Achievement', { SortKey = 1000, description = T(164832430302, --[[Achievement Overwatchmen description (limited to 100 characters on XBOX)]] "Made 10 overwatch attacks in one turn."), display_name = T(996243104692, --[[Achievement Overwatchmen display_name]] "Overwatchmen"), group = "Combat", how_to = T(141359912587, --[[Achievement Overwatchmen how_to (limited to 100 characters on XBOX)]] "Make 10 overwatch attacks in one turn."), id = "Overwatchmen", msg_reactions = { PlaceObj('MsgReaction', { Event = "OnAttack", Handler = function (self, attacker, action, target, results, attack_args) if GetAchievementFlags(self.id) then return end if IsMerc(attacker) and attack_args.opportunity_attack and attack_args.opportunity_attack_type == "Overwatch" then gv_Achievements[self.id] = (gv_Achievements[self.id] or 0) + 1 if gv_Achievements[self.id] >= self.target then AchievementUnlock(self.id) end end end, }), PlaceObj('MsgReaction', { Event = "TurnEnded", Handler = function (self, teamEnded) if GetAchievementFlags(self.id) then return end gv_Achievements[self.id] = 0 end, }), PlaceObj('MsgReaction', { Event = "CombatEnd", Handler = function (self, teamEnded) if GetAchievementFlags(self.id) then return end gv_Achievements[self.id] = 0 end, }), PlaceObj('MsgReaction', { Event = "Attack", Handler = function (self, action, results, attack_args, combat_starting, attacker, target) if GetAchievementFlags(self.id) then return end if not combat_starting and not g_Combat then gv_Achievements[self.id] = 0 end end, }), }, ps4_id = 7, ps5_id = 7, target = 10, xbox_id = 45, }) PlaceObj('Achievement', { SortKey = 1000, description = T(338728430601, --[[Achievement SilentAndDeadly description (limited to 100 characters on XBOX)]] "Killed 7 enemies in one sector without triggering combat."), display_name = T(490534628132, --[[Achievement SilentAndDeadly display_name]] "Silent And Deadly"), group = "Combat", how_to = T(669838096944, --[[Achievement SilentAndDeadly how_to (limited to 100 characters on XBOX)]] "Kill 7 enemies in one sector without triggering combat."), id = "SilentAndDeadly", msg_reactions = { PlaceObj('MsgReaction', { Event = "OnAttack", Handler = function (self, attacker, action, target, results, attack_args) if GetAchievementFlags(self.id) then return end if IsMerc(attacker) and not g_Combat then local kills = EnemiesKilled(attacker, results) gv_Achievements[self.id] = (gv_Achievements[self.id] or 0) + kills if gv_Achievements[self.id] >= self.target then AchievementUnlock(self.id) end end end, }), PlaceObj('MsgReaction', { Event = "EnterSector", Handler = function (self, game_start, load_game) if GetAchievementFlags(self.id) then return end if not game_start and not load_game then gv_Achievements[self.id] = 0 end end, }), PlaceObj('MsgReaction', { Event = "CombatStart", Handler = function (self, dynamic_data) if GetAchievementFlags(self.id) then return end gv_Achievements[self.id] = 0 end, }), }, ps4_id = 8, ps5_id = 8, target = 7, xbox_id = 47, }) PlaceObj('Achievement', { SortKey = 1000, description = T(704839762293, --[[Achievement TrueCrit description (limited to 100 characters on XBOX)]] "Made 10 critical hits in one turn."), display_name = T(868987388803, --[[Achievement TrueCrit display_name]] "True Crit"), group = "Combat", how_to = T(699334368445, --[[Achievement TrueCrit how_to (limited to 100 characters on XBOX)]] "Make 10 critical hits in one turn."), id = "TrueCrit", msg_reactions = { PlaceObj('MsgReaction', { Event = "OnAttack", Handler = function (self, attacker, action, target, results, attack_args) if GetAchievementFlags(self.id) then return end if not g_Combat or not IsKindOf(target, "Unit") then return end if IsMerc(attacker) then local crits = 0 if results.shots and #results.shots > 0 then for _, shot in ipairs(results.shots) do for _, hit in ipairs(shot.hits) do if hit.critical and IsKindOf(hit.obj, "Unit") then crits = crits + 1 end end end else if results.crit then crits = crits + 1 end end gv_Achievements[self.id] = (gv_Achievements[self.id] or 0) + crits if gv_Achievements[self.id] >= self.target then AchievementUnlock(self.id) end end end, }), PlaceObj('MsgReaction', { Event = "TurnEnded", Handler = function (self, teamEnded) if GetAchievementFlags(self.id) then return end gv_Achievements[self.id] = 0 end, }), PlaceObj('MsgReaction', { Event = "CombatEnd", Handler = function (self, test_combat, combat, anyEnemies) if GetAchievementFlags(self.id) then return end gv_Achievements[self.id] = 0 end, }), }, ps4_id = 9, ps5_id = 9, target = 10, xbox_id = 44, }) PlaceObj('Achievement', { SortKey = 1000, description = T(322312460334, --[[Achievement AFistfulOfDiamonds description (limited to 100 characters on XBOX)]] "Controlled all sectors with mines."), display_name = T(312797445218, --[[Achievement AFistfulOfDiamonds display_name]] "A Fistful Of Diamonds"), group = "Direction", how_to = T(762369019591, --[[Achievement AFistfulOfDiamonds how_to (limited to 100 characters on XBOX)]] "Control all sectors with mines."), id = "AFistfulOfDiamonds", msg_reactions = { PlaceObj('MsgReaction', { Event = "SectorSideChanged", Handler = function (self, sectorId, oldSide, newSide) if GetAchievementFlags(self.id) then return end local sector = gv_Sectors[sectorId] if IsPlayerSide(newSide) and sector.Mine then local totalMines = 0 local minesControlled = 0 for _, s in pairs(gv_Sectors) do if s.Mine then totalMines = totalMines + 1 if IsPlayerSide(s.Side) then minesControlled = minesControlled + 1 end end end if minesControlled >= totalMines then AchievementUnlock(self.id) end end end, }), }, ps4_id = 10, ps5_id = 10, xbox_id = 1, }) PlaceObj('Achievement', { SortKey = 1000, description = T(290395589625, --[[Achievement AllYourBaseAreBelongToUs description (limited to 100 characters on XBOX)]] "Controlled 5 sectors with an Outpost."), display_name = T(144123582589, --[[Achievement AllYourBaseAreBelongToUs display_name]] "All Your Base Are Belong To Us"), group = "Direction", how_to = T(877212686494, --[[Achievement AllYourBaseAreBelongToUs how_to (limited to 100 characters on XBOX)]] "Control 5 sectors with an Outpost."), id = "AllYourBaseAreBelongToUs", msg_reactions = { PlaceObj('MsgReaction', { Event = "SectorSideChanged", Handler = function (self, sectorId, oldSide, newSide) if GetAchievementFlags(self.id) then return end local sector = gv_Sectors[sectorId] if IsPlayerSide(newSide) and sector.Guardpost then local guardpostsControlled = 0 for _, s in pairs(gv_Sectors) do if s.Guardpost and IsPlayerSide(s.Side) then guardpostsControlled = guardpostsControlled + 1 end end if guardpostsControlled >= self.target then AchievementUnlock(self.id) end end end, }), }, ps4_id = 11, ps5_id = 11, target = 5, xbox_id = 4, }) PlaceObj('Achievement', { Comment = "current player", SortKey = 1000, description = T(545503004820, --[[Achievement BreakingTheWall description (limited to 100 characters on XBOX)]] "Killed an enemy with a shot through an obstacle."), display_name = T(193951673209, --[[Achievement BreakingTheWall display_name]] "Breaking The Wall"), group = "Direction", how_to = T(810505979553, --[[Achievement BreakingTheWall how_to (limited to 100 characters on XBOX)]] "Kill an enemy with a shot through an obstacle."), id = "BreakingTheWall", msg_reactions = { PlaceObj('MsgReaction', { Event = "OnAttack", Handler = function (self, attacker, action, target, results, attack_args) if GetAchievementFlags(self.id) then return end if IsMerc(attacker) and attacker.ControlledBy == netUniqueId and results.shots and #results.shots > 0 and results.clear_attacks < #results.shots and EnemiesKilled(attacker, results) > 0 then local wallHit for _, shot in ipairs(results.shots) do for _, hit in ipairs(shot.hits) do if hit.obj and IsKindOf(hit.obj, "WallSlab") then wallHit = true break end end if wallHit then break end end if wallHit then AchievementUnlock(self.id) end end end, }), }, ps4_id = 12, ps5_id = 12, xbox_id = 6, }) PlaceObj('Achievement', { Comment = "current player", SortKey = 1000, description = T(186518333537, --[[Achievement Bullseye description (limited to 100 characters on XBOX)]] "Killed 25 enemies with a headshot."), display_name = T(904913789519, --[[Achievement Bullseye display_name]] "Bullseye"), group = "Direction", how_to = T(865763504878, --[[Achievement Bullseye how_to (limited to 100 characters on XBOX)]] "Kill 25 enemies with a headshot."), id = "Bullseye", msg_reactions = { PlaceObj('MsgReaction', { Event = "OnAttack", Handler = function (self, attacker, action, target, results, attack_args) if GetAchievementFlags(self.id) then return end if IsMerc(attacker) and attacker.ControlledBy == netUniqueId then local kills = {} for _, shot in ipairs(results.shots) do for _, hit in ipairs(shot.hits) do if hit.obj and attacker:IsOnEnemySide(hit.obj) and hit.spot_group == "Head" and table.find(results.killed_units, hit.obj) then table.insert_unique(kills, hit.obj.session_id) end end end if #kills > 0 then local state = GetAccountCurrentGameAchievementState(self.id) or 0 state = state + #kills if state >= self.target then AchievementUnlock(self.id) end SetAccountCurrentGameAchievementState(self.id, state) end end end, }), }, ps4_id = 13, ps5_id = 13, target = 25, xbox_id = 3, }) PlaceObj('Achievement', { Comment = "current player", SortKey = 1000, description = T(523513735051, --[[Achievement DifferentWaysToDie description (limited to 100 characters on XBOX)]] "Killed an enemy with 5 different weapon types."), display_name = T(361303909436, --[[Achievement DifferentWaysToDie display_name]] "Different Ways To Die"), group = "Direction", how_to = T(203891626791, --[[Achievement DifferentWaysToDie how_to (limited to 100 characters on XBOX)]] "Kill an enemy with 5 different weapon types."), id = "DifferentWaysToDie", msg_reactions = { PlaceObj('MsgReaction', { Event = "OnAttack", Handler = function (self, attacker, action, target, results, attack_args) if GetAchievementFlags(self.id) then return end if IsMerc(attacker) and attacker.ControlledBy == netUniqueId and results.weapon and results.weapon.WeaponType then local kills = EnemiesKilled(attacker, results) if kills > 0 then local state = GetAccountCurrentGameAchievementState(self.id) or {} table.insert_unique(state, results.weapon.WeaponType) if #state >= self.target then AchievementUnlock(self.id) end SetAccountCurrentGameAchievementState(self.id, state) end end end, }), }, ps4_id = 14, ps5_id = 14, target = 5, xbox_id = 2, }) PlaceObj('Achievement', { SortKey = 1000, description = T(993435384871, --[[Achievement FieldTraining description (limited to 100 characters on XBOX)]] "Defended a sector with the help of militia without autoresolve."), display_name = T(231296917797, --[[Achievement FieldTraining display_name]] "Field Training"), group = "Direction", how_to = T(774529404226, --[[Achievement FieldTraining how_to (limited to 100 characters on XBOX)]] "Defend a sector with the help of militia without autoresolve."), id = "FieldTraining", msg_reactions = { PlaceObj('MsgReaction', { Event = "ConflictEnd", Handler = function (self, sector, bNoVoice, playerAttacking, playerWon, isAutoResolve) if GetAchievementFlags(self.id) then return end if not playerAttacking and playerWon and #GetMilitiaSquads(sector) > 0 and not isAutoResolve then AchievementUnlock(self.id) end end, }), }, ps4_id = 15, ps5_id = 15, xbox_id = 13, }) PlaceObj('Achievement', { SortKey = 1000, description = T(506831456489, --[[Achievement HotDiamonds description (limited to 100 characters on XBOX)]] "Ambushed a diamond shipment and got the case."), display_name = T(921919975685, --[[Achievement HotDiamonds display_name]] "Hot Diamonds"), group = "Direction", how_to = T(529510145610, --[[Achievement HotDiamonds how_to (limited to 100 characters on XBOX)]] "Ambush a diamond shipment and get the case."), id = "HotDiamonds", msg_reactions = { PlaceObj('MsgReaction', { Event = "ItemAdded", Handler = function (self, unit, item, slotName, pos) if GetAchievementFlags(self.id) then return end if IsMerc(unit) and item.class == "DiamondBriefcase" and item.extra_tag == "dynamic-db" then AchievementUnlock(self.id) end end, }), PlaceObj('MsgReaction', { Event = "CashInItem", Handler = function (self, item) if GetAchievementFlags(self.id) then return end if item.class == "DiamondBriefcase" and item.extra_tag == "dynamic-db" then AchievementUnlock(self.id) end end, }), }, ps4_id = 16, ps5_id = 16, xbox_id = 11, }) PlaceObj('Achievement', { SortKey = 1000, description = T(491484399853, --[[Achievement LethalWeapons description (limited to 100 characters on XBOX)]] "Killed 10 enemies in a single turn."), display_name = T(478171225920, --[[Achievement LethalWeapons display_name]] "Lethal Weapons"), group = "Direction", how_to = T(377131575653, --[[Achievement LethalWeapons how_to (limited to 100 characters on XBOX)]] "Kill 10 enemies in a single turn."), id = "LethalWeapons", msg_reactions = { PlaceObj('MsgReaction', { Event = "OnAttack", Handler = function (self, attacker, action, target, results, attack_args) if GetAchievementFlags(self.id) then return end if IsMerc(attacker) then local kills = EnemiesKilled(attacker, results) if kills > 0 then gv_Achievements[self.id] = (gv_Achievements[self.id] or 0) + kills if gv_Achievements[self.id] >= self.target then AchievementUnlock(self.id) end end end end, }), PlaceObj('MsgReaction', { Event = "TurnEnded", Handler = function (self, teamEnded) if GetAchievementFlags(self.id) then return end gv_Achievements[self.id] = 0 end, }), PlaceObj('MsgReaction', { Event = "Attack", Handler = function (self, action, results, attack_args, combat_starting) if GetAchievementFlags(self.id) then return end if not combat_starting and not g_Combat then gv_Achievements[self.id] = 0 end end, }), }, ps4_id = 17, ps5_id = 17, target = 10, xbox_id = 9, }) PlaceObj('Achievement', { SortKey = 1000, description = T(792959937717, --[[Achievement LivingLegend description (limited to 100 characters on XBOX)]] "Hired a Legendary merc."), display_name = T(872535188900, --[[Achievement LivingLegend display_name]] "Living Legend"), group = "Direction", how_to = T(147916492607, --[[Achievement LivingLegend how_to (limited to 100 characters on XBOX)]] "Hire a Legendary merc."), id = "LivingLegend", msg_reactions = { PlaceObj('MsgReaction', { Event = "MercHired", Handler = function (self, mercId, price, days, alreadyHired) if GetAchievementFlags(self.id) then return end local merc = gv_UnitData[mercId] if merc and merc.Tier == "Legendary" then AchievementUnlock(self.id) end end, }), }, ps4_id = 18, ps5_id = 18, xbox_id = 8, }) PlaceObj('Achievement', { Comment = "current player", SortKey = 1000, description = T(842369104667, --[[Achievement ModdingExpert description (limited to 100 characters on XBOX)]] "Installed 7 mods on a single weapon."), display_name = T(424158225526, --[[Achievement ModdingExpert display_name]] "Modding Expert"), group = "Direction", how_to = T(175006091972, --[[Achievement ModdingExpert how_to (limited to 100 characters on XBOX)]] "Install 7 mods on a single weapon."), id = "ModdingExpert", msg_reactions = { PlaceObj('MsgReaction', { Event = "WeaponModifiedSuccessSync", Handler = function (self, weapon, owner, modAdded, mechanic) if GetAchievementFlags(self.id) then return end if mechanic.ControlledBy == netUniqueId and IsKindOf(weapon, "FirearmBase") and weapon:GetNumAttachedComponents() >= self.target then AchievementUnlock(self.id) end end, }), }, ps4_id = 19, ps5_id = 19, target = 7, xbox_id = 10, }) PlaceObj('Achievement', { SortKey = 1000, description = T(268671993376, --[[Achievement NewKidOnTheBlock description (limited to 100 characters on XBOX)]] "Created an I.M.P. merc."), display_name = T(252968329296, --[[Achievement NewKidOnTheBlock display_name]] "New Kid On The Block"), group = "Direction", how_to = T(315702958489, --[[Achievement NewKidOnTheBlock how_to (limited to 100 characters on XBOX)]] "Create an I.M.P. merc."), id = "NewKidOnTheBlock", msg_reactions = { PlaceObj('MsgReaction', { Event = "MercHired", Handler = function (self, mercId, price, days, alreadyHired) if GetAchievementFlags(self.id) then return end if IsImpUnit(gv_UnitData[mercId]) then AchievementUnlock(self.id) end end, }), }, ps4_id = 20, ps5_id = 20, xbox_id = 7, }) PlaceObj('Achievement', { SortKey = 1000, description = T(921666624864, --[[Achievement Sabotage description (limited to 100 characters on XBOX)]] "Reduced all defense shields of an Outpost."), display_name = T(686488730003, --[[Achievement Sabotage display_name]] "Sabotage"), group = "Direction", how_to = T(257729471729, --[[Achievement Sabotage how_to (limited to 100 characters on XBOX)]] "Reduce all defense shields of an Outpost."), id = "Sabotage", msg_reactions = { PlaceObj('MsgReaction', { Event = "GuardpostAllShieldsDone", Handler = function (self, sectorId) if GetAchievementFlags(self.id) then return end AchievementUnlock(self.id) end, }), }, ps4_id = 21, ps5_id = 21, xbox_id = 12, }) PlaceObj('Achievement', { SortKey = 1000, description = T(960641119476, --[[Achievement TenOutOfTen description (limited to 100 characters on XBOX)]] "Have a Level 10 merc."), display_name = T(150219298467, --[[Achievement TenOutOfTen display_name]] "10 Out Of 10"), group = "Direction", how_to = T(148856160387, --[[Achievement TenOutOfTen how_to (limited to 100 characters on XBOX)]] "Have a Level 10 merc."), id = "TenOutOfTen", msg_reactions = { PlaceObj('MsgReaction', { Event = "UnitLeveledUp", Handler = function (self, unit) if GetAchievementFlags(self.id) then return end if unit:GetLevel() >= 10 then AchievementUnlock(self.id) end end, }), }, ps4_id = 22, ps5_id = 22, xbox_id = 5, }) PlaceObj('Achievement', { Comment = "current player", SortKey = 1000, description = T(119822047028, --[[Achievement ALongShot description (limited to 100 characters on XBOX)]] "Killed an enemy at extreme range."), display_name = T(750301231519, --[[Achievement ALongShot display_name]] "A Long Shot"), group = "Hidden", how_to = T(208023546436, --[[Achievement ALongShot how_to (limited to 100 characters on XBOX)]] "Kill an enemy at extreme range."), id = "ALongShot", msg_reactions = { PlaceObj('MsgReaction', { Event = "OnKill", Handler = function (self, attacker, killedUnits) if GetAchievementFlags(self.id) then return end if IsMerc(attacker) and attacker.ControlledBy == netUniqueId then for _, unit in ipairs(killedUnits) do if IsValid(unit) and attacker:IsOnEnemySide(unit) and (attacker:GetDist(unit) / const.Scale.voxelSizeX) >= self.target then AchievementUnlock(self.id) break end end end end, }), }, ps4_grade = "silver", ps4_id = 23, ps5_grade = "silver", ps5_id = 23, secret = true, target = 40, xbox_id = 23, }) PlaceObj('Achievement', { SortKey = 1000, description = T(895686751734, --[[Achievement ApocalypseLater description (limited to 100 characters on XBOX)]] "Hired the Major."), display_name = T(480100937125, --[[Achievement ApocalypseLater display_name]] "Apocalypse Later"), group = "Hidden", how_to = T(137793487053, --[[Achievement ApocalypseLater how_to (limited to 100 characters on XBOX)]] "Hire the Major."), id = "ApocalypseLater", msg_reactions = { PlaceObj('MsgReaction', { Event = "MercHireStatusChanged", Handler = function (self, unitData, oldStatus, newStatus) if GetAchievementFlags(self.id) then return end if unitData.session_id == "Spike" and newStatus == "Hired" then AchievementUnlock(self.id) end end, }), }, ps4_id = 24, ps5_id = 24, secret = true, xbox_id = 32, }) PlaceObj('Achievement', { Comment = "current player", SortKey = 1000, description = T(610287284347, --[[Achievement FriendlyFire description (limited to 100 characters on XBOX)]] "Hurt your own merc with the bullet that killed an enemy."), display_name = T(278452667109, --[[Achievement FriendlyFire display_name]] "Friendly Fire"), group = "Hidden", how_to = T(508061852041, --[[Achievement FriendlyFire how_to (limited to 100 characters on XBOX)]] "Hurt your own merc with the bullet that killed an enemy."), id = "FriendlyFire", msg_reactions = { PlaceObj('MsgReaction', { Event = "OnAttack", Handler = function (self, attacker, action, target, results, attack_args) if GetAchievementFlags(self.id) then return end if IsMerc(attacker) and attacker.ControlledBy == netUniqueId and results.shots and #results.shots > 0 then for _, shot in ipairs(results.shots) do local killedEnemy local hitMerc for _, hit in ipairs(shot.hits) do if hit.obj and IsMerc(hit.obj) then hitMerc = true end if hit.obj and hit.enemy_hit and hit.damage and hit.prev_hit_points and hit.damage >= hit.prev_hit_points then killedEnemy = true end end if killedEnemy and hitMerc then AchievementUnlock(self.id) return end end end end, }), }, ps4_id = 25, ps5_id = 25, secret = true, xbox_id = 26, }) PlaceObj('Achievement', { SortKey = 1000, description = T(963062406870, --[[Achievement Prizefighter description (limited to 100 characters on XBOX)]] "Defeated all fighters in the Night Club."), display_name = T(728458082058, --[[Achievement Prizefighter display_name]] "Prizefighter"), group = "Hidden", how_to = T(661685811383, --[[Achievement Prizefighter how_to (limited to 100 characters on XBOX)]] "Defeat all fighters in the Night Club."), id = "Prizefighter", msg_reactions = { PlaceObj('MsgReaction', { Event = "QuestParamChanged", Handler = function (self, questId, varId, prevVal, newVal) if GetAchievementFlags(self.id) then return end if questId == "Landsbach" and varId == "AllFightersBeaten" and newVal == true then AchievementUnlock(self.id) end end, }), }, ps4_id = 26, ps5_id = 26, secret = true, xbox_id = 24, }) PlaceObj('Achievement', { SortKey = 1000, description = T(892466364170, --[[Achievement Psycho description (limited to 100 characters on XBOX)]] "Chose a Psycho dialogue option 5 times."), display_name = T(984238767804, --[[Achievement Psycho display_name]] "Psycho"), group = "Hidden", how_to = T(902602620687, --[[Achievement Psycho how_to (limited to 100 characters on XBOX)]] "Choose a Psycho dialogue option 5 times."), id = "Psycho", msg_reactions = { PlaceObj('MsgReaction', { Event = "PhraseExecuted", Handler = function (self, phraseId) if GetAchievementFlags(self.id) then return end local phrase = GetPhrase(phraseId) if phrase then local psycho = CheckExecutedPhraseForPsycho(phrase) and 1 or 0 gv_Achievements[self.id] = (gv_Achievements[self.id] or 0) + psycho if (gv_Achievements[self.id] or 0) >= self.target then AchievementUnlock(self.id) end end end, }), }, ps4_id = 27, ps5_id = 27, secret = true, target = 5, xbox_id = 28, }) PlaceObj('Achievement', { SortKey = 1000, description = T(239863007169, --[[Achievement ReadyWoody description (limited to 100 characters on XBOX)]] "Hired Gus."), display_name = T(580346307029, --[[Achievement ReadyWoody display_name]] "Ready, Woody!"), group = "Hidden", how_to = T(857345891615, --[[Achievement ReadyWoody how_to (limited to 100 characters on XBOX)]] "Hire Gus."), id = "ReadyWoody", msg_reactions = { PlaceObj('MsgReaction', { Event = "MercHireStatusChanged", Handler = function (self, unitData, oldStatus, newStatus) if GetAchievementFlags(self.id) then return end if unitData.session_id == "Gus" and newStatus == "Hired" then AchievementUnlock(self.id) end end, }), }, ps4_grade = "silver", ps4_id = 28, ps5_grade = "silver", ps5_id = 28, secret = true, xbox_id = 31, }) PlaceObj('Achievement', { SortKey = 1000, description = T(318709322191, --[[Achievement Rehab description (limited to 100 characters on XBOX)]] "Helped Larry overcome his addiction."), display_name = T(953123524232, --[[Achievement Rehab display_name]] "Rehab"), group = "Hidden", how_to = T(898219595089, --[[Achievement Rehab how_to (limited to 100 characters on XBOX)]] "Help Larry overcome his addiction."), id = "Rehab", msg_reactions = { PlaceObj('MsgReaction', { Event = "OperationChanged", Handler = function (self, unit, oldOperation, newOperation, prevProfession, interrupted) if GetAchievementFlags(self.id) then return end if oldOperation.id == "AddictionTreatment" and not interrupted then AchievementUnlock(self.id) end end, }), }, ps4_id = 29, ps5_id = 29, secret = true, xbox_id = 30, }) PlaceObj('Achievement', { SortKey = 1000, description = T(593813560963, --[[Achievement SayMyName description (limited to 100 characters on XBOX)]] "Did three morally bad things."), display_name = T(365562174003, --[[Achievement SayMyName display_name]] "Say My Name"), group = "Hidden", how_to = T(965690657000, --[[Achievement SayMyName how_to (limited to 100 characters on XBOX)]] "Do three morally bad things."), id = "SayMyName", msg_reactions = { PlaceObj('MsgReaction', { Event = "QuestParamChanged", Handler = function (self, questId, varId, prevVal, newVal) if GetAchievementFlags(self.id) then return end -- "Hire Graaf as a mine foreman" if questId == "DiamondRed" and varId == "GraafForeman" and newVal == true then gv_Achievements[self.id] = (gv_Achievements[self.id] or 0) + 1 end -- "kill Lurch and take his shotgun" if questId == "AyeMom" and varId == "GunTaken" and newVal == true then local lurch = gv_UnitData.NPC_Lurch if lurch and lurch:IsDead() then gv_Achievements[self.id] = (gv_Achievements[self.id] or 0) + 1 end end -- "Meet Bastien in Refugee Camp and make him give you money" if questId == "RefugeeBlues" and varId == "BastienShare" and newVal == true then gv_Achievements[self.id] = (gv_Achievements[self.id] or 0) + 1 end -- "Be Boss Blaubert's partner" if questId == "Luigi" and varId == "BossPartnership" and newVal == true then gv_Achievements[self.id] = (gv_Achievements[self.id] or 0) + 1 end if (gv_Achievements[self.id] or 0) >= self.target then AchievementUnlock(self.id) end end, }), PlaceObj('MsgReaction', { Event = "SectorSideChanged", Handler = function (self, sectorId, oldSide, newSide) if GetAchievementFlags(self.id) or not gv_Quests["PantagruelRebels"] then return end -- "Take over Maquis mine by force" if sectorId == "C7_Underground" and IsPlayerSide(newSide) then if GetQuestVar("PantagruelRebels", "MaquieEnemies") then gv_Achievements[self.id] = (gv_Achievements[self.id] or 0) + 1 end end if (gv_Achievements[self.id] or 0) >= self.target then AchievementUnlock(self.id) end end, }), }, ps4_id = 30, ps5_id = 30, secret = true, target = 3, xbox_id = 29, }) PlaceObj('Achievement', { Comment = "current player", SortKey = 1000, description = T(785039187961, --[[Achievement TwoBirdsOneStone description (limited to 100 characters on XBOX)]] "Killed two enemies with a single shot."), display_name = T(899260696739, --[[Achievement TwoBirdsOneStone display_name]] "Two Birds One Stone"), group = "Hidden", how_to = T(345293348180, --[[Achievement TwoBirdsOneStone how_to (limited to 100 characters on XBOX)]] "Kill two enemies with a single shot."), id = "TwoBirdsOneStone", msg_reactions = { PlaceObj('MsgReaction', { Event = "OnAttack", Handler = function (self, attacker, action, target, results, attack_args) if GetAchievementFlags(self.id) then return end if IsMerc(attacker) and attacker.ControlledBy == netUniqueId and results.shots and #results.shots == 1 and EnemiesKilled(attacker, results) >= 2 then AchievementUnlock(self.id) end end, }), }, ps4_id = 31, ps5_id = 31, secret = true, xbox_id = 25, }) PlaceObj('Achievement', { Comment = "current player", SortKey = 1000, description = T(718694453555, --[[Achievement WinnerWinnerChickenDinner description (limited to 100 characters on XBOX)]] "Chicken murderer."), display_name = T(252119341614, --[[Achievement WinnerWinnerChickenDinner display_name]] "Winner, Winner, Chicken Dinner"), group = "Hidden", how_to = T(669885107481, --[[Achievement WinnerWinnerChickenDinner how_to (limited to 100 characters on XBOX)]] "Kill a chicken."), id = "WinnerWinnerChickenDinner", msg_reactions = { PlaceObj('MsgReaction', { Event = "OnAttack", Handler = function (self, attacker, action, target, results, attack_args) if GetAchievementFlags(self.id) then return end if IsMerc(attacker) and attacker.ControlledBy == netUniqueId then for _, hitData in ipairs(results) do local obj = hitData.obj if IsKindOf(obj, "Animal_Hen") and obj:IsDead() then AchievementUnlock(self.id) end end end end, }), }, ps4_id = 32, ps5_id = 32, secret = true, xbox_id = 27, }) PlaceObj('Achievement', { SortKey = 1000, description = T(673543460181, --[[Achievement DieselPower description (limited to 100 characters on XBOX)]] "Solved the Diesel problem."), display_name = T(580828763361, --[[Achievement DieselPower display_name]] "Diesel Power"), group = "Quests", how_to = T(689846303069, --[[Achievement DieselPower how_to (limited to 100 characters on XBOX)]] "Solve the Diesel problem."), id = "DieselPower", msg_reactions = { PlaceObj('MsgReaction', { Event = "QuestParamChanged", Handler = function (self, questId, varId, prevVal, newVal) if GetAchievementFlags(self.id) then return end if questId == "Landsbach" and varId == "GetRidOfDiesel" and newVal == true then AchievementUnlock(self.id) end end, }), }, ps4_grade = "silver", ps4_id = 33, ps5_grade = "silver", ps5_id = 33, xbox_id = 35, }) PlaceObj('Achievement', { SortKey = 1000, description = T(868668282301, --[[Achievement GreenDiamond description (limited to 100 characters on XBOX)]] "Obtained the Green Diamond."), display_name = T(168847895084, --[[Achievement GreenDiamond display_name]] "Green Diamond"), group = "Quests", how_to = T(149168865866, --[[Achievement GreenDiamond how_to (limited to 100 characters on XBOX)]] "Obtain the Green Diamond."), id = "GreenDiamond", msg_reactions = { PlaceObj('MsgReaction', { Event = "ItemAdded", Handler = function (self, unit, item, slotName, pos) if GetAchievementFlags(self.id) then return end if IsMerc(unit) and item.class == "TheGreenDiamond" then AchievementUnlock(self.id) end end, }), }, ps4_id = 34, ps5_id = 34, xbox_id = 36, }) PlaceObj('Achievement', { SortKey = 1000, description = T(338667995652, --[[Achievement LoveCats description (limited to 100 characters on XBOX)]] "Made Maman and Chimurenga get together."), display_name = T(846246131029, --[[Achievement LoveCats display_name]] "Love Cats"), group = "Quests", how_to = T(100160794579, --[[Achievement LoveCats how_to (limited to 100 characters on XBOX)]] "Make Maman and Chimurenga get together."), id = "LoveCats", msg_reactions = { PlaceObj('MsgReaction', { Event = "QuestParamChanged", Handler = function (self, questId, varId, prevVal, newVal) if GetAchievementFlags(self.id) then return end if questId == "PantagruelDramas" and varId == "YoungHearts" and newVal == true then AchievementUnlock(self.id) end end, }), }, ps4_id = 35, ps5_id = 35, secret = true, xbox_id = 38, }) PlaceObj('Achievement', { SortKey = 1000, description = T(889771902479, --[[Achievement ProvenInnocent description (limited to 100 characters on XBOX)]] "Gathered enough evidence to clear your name."), display_name = T(259283301037, --[[Achievement ProvenInnocent display_name]] "Proven Innocent"), group = "Quests", how_to = T(291562539660, --[[Achievement ProvenInnocent how_to (limited to 100 characters on XBOX)]] "Gather enough evidence to clear your name."), id = "ProvenInnocent", msg_reactions = { PlaceObj('MsgReaction', { Event = "QuestParamChanged", Handler = function (self, questId, varId, prevVal, newVal) if GetAchievementFlags(self.id) then return end if questId == "05_TakeDownCorazon" and varId == "Evidence" and newVal >= GetQuestVar(questId, "EvidenceRequired") then AchievementUnlock(self.id) end end, }), }, ps4_id = 36, ps5_id = 36, secret = true, xbox_id = 39, }) PlaceObj('Achievement', { SortKey = 1000, description = T(657790232514, --[[Achievement SawItComing description (limited to 100 characters on XBOX)]] "Corazon betrayed you."), display_name = T(188253254182, --[[Achievement SawItComing display_name]] "Saw It Coming..."), group = "Quests", how_to = T(122883982105, --[[Achievement SawItComing how_to (limited to 100 characters on XBOX)]] "Corazon betrayed you."), id = "SawItComing", msg_reactions = { PlaceObj('MsgReaction', { Event = "QuestParamChanged", Handler = function (self, questId, varId, prevVal, newVal) if GetAchievementFlags(self.id) then return end if questId == "04_Betrayal" and varId == "Completed" and newVal == true then AchievementUnlock(self.id) end end, }), }, ps4_id = 37, ps5_id = 37, secret = true, xbox_id = 40, }) PlaceObj('Achievement', { SortKey = 1000, description = T(504681351963, --[[Achievement TruestDetective description (limited to 100 characters on XBOX)]] "Caught the Teddy Bear killer."), display_name = T(484366144845, --[[Achievement TruestDetective display_name]] "Truest Detective"), group = "Quests", how_to = T(610523312013, --[[Achievement TruestDetective how_to (limited to 100 characters on XBOX)]] "Catch the Teddy Bear killer."), id = "TruestDetective", msg_reactions = { PlaceObj('MsgReaction', { Event = "QuestParamChanged", Handler = function (self, questId, varId, prevVal, newVal) if GetAchievementFlags(self.id) then return end if questId == "Ted" and varId == "Completed" and newVal == true then AchievementUnlock(self.id) end end, }), }, ps4_id = 38, ps5_id = 38, secret = true, xbox_id = 41, }) PlaceObj('Achievement', { SortKey = 1000, description = T(547528613214, --[[Achievement TwelveChairs description (limited to 100 characters on XBOX)]] "Found Madam Lecoq's diamond necklace."), display_name = T(979859433082, --[[Achievement TwelveChairs display_name]] "Twelve Chairs"), group = "Quests", how_to = T(734069117003, --[[Achievement TwelveChairs how_to (limited to 100 characters on XBOX)]] "Find Madam Lecoq's diamond necklace."), id = "TwelveChairs", msg_reactions = { PlaceObj('MsgReaction', { Event = "QuestParamChanged", Handler = function (self, questId, varId, prevVal, newVal) if GetAchievementFlags(self.id) then return end if questId == "TheTwelveChairs" and varId == "FoundNecklace" and newVal == true then AchievementUnlock(self.id) end end, }), }, ps4_id = 39, ps5_id = 39, secret = true, xbox_id = 37, }) PlaceObj('Achievement', { SortKey = 1000, description = T(957788705095, --[[Achievement Unlockdown description (limited to 100 characters on XBOX)]] "Found a cure for the Red Rabies."), display_name = T(753539187750, --[[Achievement Unlockdown display_name]] "Unlockdown"), group = "Quests", how_to = T(833150760628, --[[Achievement Unlockdown how_to (limited to 100 characters on XBOX)]] "Find a cure for the Red Rabies."), id = "Unlockdown", msg_reactions = { PlaceObj('MsgReaction', { Event = "QuestParamChanged", Handler = function (self, questId, varId, prevVal, newVal) if GetAchievementFlags(self.id) then return end if questId == "Sanatorium" and varId == "SamplesGiven" and newVal == true then AchievementUnlock(self.id) end end, }), }, ps4_grade = "silver", ps4_id = 40, ps5_grade = "silver", ps5_id = 40, xbox_id = 34, }) PlaceObj('Achievement', { SortKey = 1000, description = T(377566481789, --[[Achievement XMarksTheSpot description (limited to 100 characters on XBOX)]] "Found Lucky Veinard's secret treasures."), display_name = T(667944553137, --[[Achievement XMarksTheSpot display_name]] "X Marks The Spot"), group = "Quests", how_to = T(421408703447, --[[Achievement XMarksTheSpot how_to (limited to 100 characters on XBOX)]] "Find Lucky Veinard's secret treasures."), id = "XMarksTheSpot", msg_reactions = { PlaceObj('MsgReaction', { Event = "QuestParamChanged", Handler = function (self, questId, varId, prevVal, newVal) if GetAchievementFlags(self.id) then return end if questId == "TreasureHunting" and varId == "foundcirclestreasure" and newVal == true then AchievementUnlock(self.id) end end, }), }, ps4_grade = "silver", ps4_id = 41, ps5_grade = "silver", ps5_id = 41, xbox_id = 33, }) PlaceObj('Achievement', { SortKey = 1000, description = T(545460392452, --[[Achievement DynamicDuo description (limited to 100 characters on XBOX)]] "Finished the campaign while having no more than two mercs at the same time."), display_name = T(277542343056, --[[Achievement DynamicDuo display_name]] "Dynamic Duo"), group = "Retention", how_to = T(471839901231, --[[Achievement DynamicDuo how_to (limited to 100 characters on XBOX)]] "Finish the campaign while having no more than two mercs at the same time."), id = "DynamicDuo", msg_reactions = { PlaceObj('MsgReaction', { Event = "CampaignEnd", Handler = function (self, campaignId) if GetAchievementFlags(self.id) then return end if gv_Achievements[self.id] ~= "failed" then AchievementUnlock(self.id) end end, }), PlaceObj('MsgReaction', { Event = "MercHired", Handler = function (self, mercId, price, days, alreadyHired) if GetAchievementFlags(self.id) then return end if #GetHiredMercIds() > 2 then gv_Achievements[self.id] = "failed" end end, }), PlaceObj('MsgReaction', { Event = "UnitJoinedAsMerc", Handler = function (self, mercId, price, days, alreadyHired) if GetAchievementFlags(self.id) then return end if #GetHiredMercIds() > 2 then gv_Achievements[self.id] = "failed" end end, }), }, ps4_grade = "silver", ps4_id = 42, ps5_grade = "silver", ps5_id = 42, xbox_id = 18, }) PlaceObj('Achievement', { SortKey = 1000, description = T(313785946781, --[[Achievement GrittyDozen description (limited to 100 characters on XBOX)]] "Have at least 12 mercs."), display_name = T(639786242732, --[[Achievement GrittyDozen display_name]] "Gritty Dozen"), group = "Retention", how_to = T(857992386571, --[[Achievement GrittyDozen how_to (limited to 100 characters on XBOX)]] "Have at least 12 mercs."), id = "GrittyDozen", msg_reactions = { PlaceObj('MsgReaction', { Event = "MercHired", Handler = function (self, mercId, price, days, alreadyHired) if GetAchievementFlags(self.id) then return end if #GetHiredMercIds() >= self.target then AchievementUnlock(self.id) end end, }), PlaceObj('MsgReaction', { Event = "UnitJoinedAsMerc", Handler = function (self, mercId, price, days, alreadyHired) if GetAchievementFlags(self.id) then return end if #GetHiredMercIds() >= self.target then AchievementUnlock(self.id) end end, }), }, ps4_id = 43, ps5_id = 43, target = 12, xbox_id = 21, }) PlaceObj('Achievement', { SortKey = 1000, description = T(103278828302, --[[Achievement Ironman description (limited to 100 characters on XBOX)]] 'Finished the game on "Mission Impossible", "Dead is Dead", "To The Bitter End" and "Lethal Weapons".'), display_name = T(452896945074, --[[Achievement Ironman display_name]] "Ironman"), group = "Retention", how_to = T(218540356017, --[[Achievement Ironman how_to (limited to 100 characters on XBOX)]] 'Finish the game on "Mission Impossible", "Dead is Dead", "To The Bitter End" and "Lethal Weapons".'), id = "Ironman", msg_reactions = { PlaceObj('MsgReaction', { Event = "CampaignEnd", Handler = function (self, campaignId) if GetAchievementFlags(self.id) then return end if Game.game_difficulty == "VeryHard" and IsGameRuleActive("DeadIsDead") and IsGameRuleActive("Ironman") and IsGameRuleActive("LethalWeapons") and not IsGameRuleActive("ForgivingMode") and gv_Achievements[self.id] ~= "failed" then AchievementUnlock(self.id) end end, }), PlaceObj('MsgReaction', { Event = "ChangeGameRule", Handler = function (self, rule, value) if GetAchievementFlags(self.id) then return end if rule == "ForgivingMode" and value then gv_Achievements[self.id] = "failed" end end, }), PlaceObj('MsgReaction', { Event = "DifficultyChange", Handler = function (self) if GetAchievementFlags(self.id) then return end if Game.game_difficulty ~= "VeryHard" then gv_Achievements[self.id] = "failed" end end, }), PlaceObj('MsgReaction', { Event = "NewGame", Handler = function (self, game) if GetAchievementFlags(self.id) then return end if IsGameRuleActive("ForgivingMode") and Game.game_difficulty ~= "VeryHard" then gv_Achievements[self.id] = "failed" end end, }), }, ps4_grade = "gold", ps4_id = 44, ps5_grade = "gold", ps5_id = 44, xbox_id = 16, }) PlaceObj('Achievement', { SortKey = 1000, description = T(719266083045, --[[Achievement JustAFleshWound description (limited to 100 characters on XBOX)]] "Taken 300 damage in a single turn without any merc dying or getting downed."), display_name = T(434853556936, --[[Achievement JustAFleshWound display_name]] "Just A Flesh Wound"), group = "Retention", how_to = T(657003907968, --[[Achievement JustAFleshWound how_to (limited to 100 characters on XBOX)]] "Take 300 damage in a single turn without any merc dying or getting downed."), id = "JustAFleshWound", msg_reactions = { PlaceObj('MsgReaction', { Event = "DamageDone", Handler = function (self, attacker, target, dmg, hit_descr) if GetAchievementFlags(self.id) then return end if IsMerc(target) and dmg > 0 then gv_Achievements[self.id] = (gv_Achievements[self.id] or 0) + dmg if target.HitPoints == 0 then gv_Achievements[self.id] = 0 end if gv_Achievements[self.id] >= self.target then AchievementUnlock(self.id) end end end, }), PlaceObj('MsgReaction', { Event = "UnitDied", Handler = function (self, unit, killer, results) if GetAchievementFlags(self.id) then return end if IsMerc(unit) then gv_Achievements[self.id] = 0 end end, }), PlaceObj('MsgReaction', { Event = "UnitDowned", Handler = function (self, unit, killer, results) if GetAchievementFlags(self.id) then return end if IsMerc(unit) then gv_Achievements[self.id] = 0 end end, }), PlaceObj('MsgReaction', { Event = "TurnEnded", Handler = function (self, teamEnded) if GetAchievementFlags(self.id) then return end gv_Achievements[self.id] = 0 end, }), PlaceObj('MsgReaction', { Event = "Attack", Handler = function (self, action, results, attack_args, combat_starting) if GetAchievementFlags(self.id) then return end if not combat_starting and not g_Combat then gv_Achievements[self.id] = 0 end end, }), }, ps4_id = 45, ps5_id = 45, target = 300, xbox_id = 50, }) PlaceObj('Achievement', { SortKey = 1000, description = T(157013389224, --[[Achievement Liberator description (limited to 100 characters on XBOX)]] "Earned at least 75 Loyalty in 5 towns."), display_name = T(360574911271, --[[Achievement Liberator display_name]] "Liberator"), group = "Retention", how_to = T(677038024683, --[[Achievement Liberator how_to (limited to 100 characters on XBOX)]] "Earn at least 75 Loyalty in 5 towns."), id = "Liberator", msg_reactions = { PlaceObj('MsgReaction', { Event = "LoyaltyChanged", Handler = function (self, cityId, change) if GetAchievementFlags(self.id) then return end local highLoyaltyCities = 0 for _, city in pairs(gv_Cities) do if city.Loyalty >= 75 then highLoyaltyCities= highLoyaltyCities + 1 end end if highLoyaltyCities >= 5 then AchievementUnlock(self.id) end end, }), }, ps4_id = 46, ps5_id = 46, xbox_id = 20, }) PlaceObj('Achievement', { SortKey = 1000, description = T(950963933037, --[[Achievement LoneWolf description (limited to 100 characters on XBOX)]] "Finished the campaign while having no more than one merc at the same time."), display_name = T(422926797000, --[[Achievement LoneWolf display_name]] "Lone Wolf"), group = "Retention", how_to = T(987003129842, --[[Achievement LoneWolf how_to (limited to 100 characters on XBOX)]] "Finish the campaign while having no more than one merc at the same time."), id = "LoneWolf", msg_reactions = { PlaceObj('MsgReaction', { Event = "CampaignEnd", Handler = function (self, campaignId) if GetAchievementFlags(self.id) then return end if gv_Achievements[self.id] ~= "failed" then AchievementUnlock(self.id) end end, }), PlaceObj('MsgReaction', { Event = "MercHired", Handler = function (self, mercId, price, days, alreadyHired) if GetAchievementFlags(self.id) then return end if #GetHiredMercIds() > 1 then gv_Achievements[self.id] = "failed" end end, }), PlaceObj('MsgReaction', { Event = "UnitJoinedAsMerc", Handler = function (self, mercId, price, days, alreadyHired) if GetAchievementFlags(self.id) then return end if #GetHiredMercIds() > 1 then gv_Achievements[self.id] = "failed" end end, }), }, ps4_grade = "silver", ps4_id = 47, ps5_grade = "silver", ps5_id = 47, xbox_id = 17, }) PlaceObj('Achievement', { SortKey = 1000, description = T(151643533374, --[[Achievement Pacifist description (limited to 100 characters on XBOX)]] "Finished the campaign without killing any civilian."), display_name = T(194042060571, --[[Achievement Pacifist display_name]] "Pacifist"), group = "Retention", how_to = T(338716292182, --[[Achievement Pacifist how_to (limited to 100 characters on XBOX)]] "Finish the campaign without killing any civilian."), id = "Pacifist", msg_reactions = { PlaceObj('MsgReaction', { Event = "CampaignEnd", Handler = function (self, campaignId) if GetAchievementFlags(self.id) then return end if gv_CiviliansKilled <= 0 then AchievementUnlock(self.id) end end, }), }, ps4_grade = "silver", ps4_id = 48, ps5_grade = "silver", ps5_id = 48, xbox_id = 19, }) PlaceObj('Achievement', { SortKey = 1000, description = T(838187958581, --[[Achievement Tactician description (limited to 100 characters on XBOX)]] "Controlled at least 50 sectors."), display_name = T(219959948272, --[[Achievement Tactician display_name]] "Tactician"), group = "Retention", how_to = T(996157707667, --[[Achievement Tactician how_to (limited to 100 characters on XBOX)]] "Control at least 50 sectors."), id = "Tactician", msg_reactions = { PlaceObj('MsgReaction', { Event = "SectorSideChanged", Handler = function (self, sectorId, oldSide, newSide) if GetAchievementFlags(self.id) then return end if IsPlayerSide(newSide) then local controlled = 0 for _, s in pairs(gv_Sectors) do if IsPlayerSide(s.Side) then controlled = controlled + 1 end end if controlled >= self.target then AchievementUnlock(self.id) end end end, }), }, ps4_id = 49, ps5_id = 49, target = 50, xbox_id = 22, }) PlaceObj('Achievement', { SortKey = 1000, description = T(763203074646, --[[Achievement TimeIsMoney description (limited to 100 characters on XBOX)]] "Finished the campaign before 1 MAY, 2001."), display_name = T(622226557896, --[[Achievement TimeIsMoney display_name]] "Time Is Money"), group = "Retention", how_to = T(227445552899, --[[Achievement TimeIsMoney how_to (limited to 100 characters on XBOX)]] "Finish the campaign before 1 MAY, 2001."), id = "TimeIsMoney", msg_reactions = { PlaceObj('MsgReaction', { Event = "CampaignEnd", Handler = function (self, campaignId) if GetAchievementFlags(self.id) then return end -- target is in days if DivRound(Game.CampaignTime - Game.CampaignTimeStart, const.Scale.day) <= self.target then AchievementUnlock(self.id) end end, }), }, ps4_grade = "gold", ps4_id = 50, ps5_grade = "gold", ps5_id = 50, target = 27, xbox_id = 14, })