|
|
|
|
|
PlaceObj('Achievement', { |
|
description = T(577854314600, "Unlocked all trophies."), |
|
display_name = T(220715659890, "Medal Of Honor"), |
|
group = "PlayStation", |
|
how_to = T(498691177443, "Unlock all trophies."), |
|
id = "PlatinumTrophy", |
|
ps4_grade = "platinum", |
|
ps4_id = 0, |
|
ps5_grade = "platinum", |
|
ps5_id = 0, |
|
}) |
|
|
|
PlaceObj('Achievement', { |
|
SortKey = 1000, |
|
description = T(810430241463, "Dealt 1000 damage to enemies in one turn."), |
|
display_name = T(907749527147, "Blood Rain"), |
|
group = "Combat", |
|
how_to = T(431654490364, "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, "Killed 5 enemies in one turn with a single merc."), |
|
display_name = T(365161191013, "Born Killer"), |
|
group = "Combat", |
|
how_to = T(152740288772, "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, "Finished the campaign without a single merc dying or getting downed."), |
|
display_name = T(725359206535, "Bullet Proof"), |
|
group = "Combat", |
|
how_to = T(115567857703, "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, "Conquered an Outpost without losing HP."), |
|
display_name = T(434089830814, "Flawless Victory"), |
|
group = "Combat", |
|
how_to = T(926544369717, "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, "Conquered an Outpost without using firearms."), |
|
display_name = T(330886195762, "Martial Artiste"), |
|
group = "Combat", |
|
how_to = T(509509051660, "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, "Moved a merc 35 tiles away in a single turn."), |
|
display_name = T(729701469966, "Natural Sprinter"), |
|
group = "Combat", |
|
how_to = T(698490476872, "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, "Made 10 overwatch attacks in one turn."), |
|
display_name = T(996243104692, "Overwatchmen"), |
|
group = "Combat", |
|
how_to = T(141359912587, "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, "Killed 7 enemies in one sector without triggering combat."), |
|
display_name = T(490534628132, "Silent And Deadly"), |
|
group = "Combat", |
|
how_to = T(669838096944, "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, "Made 10 critical hits in one turn."), |
|
display_name = T(868987388803, "True Crit"), |
|
group = "Combat", |
|
how_to = T(699334368445, "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, "Controlled all sectors with mines."), |
|
display_name = T(312797445218, "A Fistful Of Diamonds"), |
|
group = "Direction", |
|
how_to = T(762369019591, "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, "Controlled 5 sectors with an Outpost."), |
|
display_name = T(144123582589, "All Your Base Are Belong To Us"), |
|
group = "Direction", |
|
how_to = T(877212686494, "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, "Killed an enemy with a shot through an obstacle."), |
|
display_name = T(193951673209, "Breaking The Wall"), |
|
group = "Direction", |
|
how_to = T(810505979553, "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, "Killed 25 enemies with a headshot."), |
|
display_name = T(904913789519, "Bullseye"), |
|
group = "Direction", |
|
how_to = T(865763504878, "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, "Killed an enemy with 5 different weapon types."), |
|
display_name = T(361303909436, "Different Ways To Die"), |
|
group = "Direction", |
|
how_to = T(203891626791, "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, "Defended a sector with the help of militia without autoresolve."), |
|
display_name = T(231296917797, "Field Training"), |
|
group = "Direction", |
|
how_to = T(774529404226, "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, "Ambushed a diamond shipment and got the case."), |
|
display_name = T(921919975685, "Hot Diamonds"), |
|
group = "Direction", |
|
how_to = T(529510145610, "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, "Killed 10 enemies in a single turn."), |
|
display_name = T(478171225920, "Lethal Weapons"), |
|
group = "Direction", |
|
how_to = T(377131575653, "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, "Hired a Legendary merc."), |
|
display_name = T(872535188900, "Living Legend"), |
|
group = "Direction", |
|
how_to = T(147916492607, "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, "Installed 7 mods on a single weapon."), |
|
display_name = T(424158225526, "Modding Expert"), |
|
group = "Direction", |
|
how_to = T(175006091972, "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, "Created an I.M.P. merc."), |
|
display_name = T(252968329296, "New Kid On The Block"), |
|
group = "Direction", |
|
how_to = T(315702958489, "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, "Reduced all defense shields of an Outpost."), |
|
display_name = T(686488730003, "Sabotage"), |
|
group = "Direction", |
|
how_to = T(257729471729, "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, "Have a Level 10 merc."), |
|
display_name = T(150219298467, "10 Out Of 10"), |
|
group = "Direction", |
|
how_to = T(148856160387, "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, "Killed an enemy at extreme range."), |
|
display_name = T(750301231519, "A Long Shot"), |
|
group = "Hidden", |
|
how_to = T(208023546436, "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, "Hired the Major."), |
|
display_name = T(480100937125, "Apocalypse Later"), |
|
group = "Hidden", |
|
how_to = T(137793487053, "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, "Hurt your own merc with the bullet that killed an enemy."), |
|
display_name = T(278452667109, "Friendly Fire"), |
|
group = "Hidden", |
|
how_to = T(508061852041, "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, "Defeated all fighters in the Night Club."), |
|
display_name = T(728458082058, "Prizefighter"), |
|
group = "Hidden", |
|
how_to = T(661685811383, "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, "Chose a Psycho dialogue option 5 times."), |
|
display_name = T(984238767804, "Psycho"), |
|
group = "Hidden", |
|
how_to = T(902602620687, "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, "Hired Gus."), |
|
display_name = T(580346307029, "Ready, Woody!"), |
|
group = "Hidden", |
|
how_to = T(857345891615, "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, "Helped Larry overcome his addiction."), |
|
display_name = T(953123524232, "Rehab"), |
|
group = "Hidden", |
|
how_to = T(898219595089, "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, "Did three morally bad things."), |
|
display_name = T(365562174003, "Say My Name"), |
|
group = "Hidden", |
|
how_to = T(965690657000, "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 |
|
|
|
|
|
if questId == "DiamondRed" and varId == "GraafForeman" and newVal == true then |
|
gv_Achievements[self.id] = (gv_Achievements[self.id] or 0) + 1 |
|
end |
|
|
|
|
|
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 |
|
|
|
|
|
if questId == "RefugeeBlues" and varId == "BastienShare" and newVal == true then |
|
gv_Achievements[self.id] = (gv_Achievements[self.id] or 0) + 1 |
|
end |
|
|
|
|
|
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 |
|
|
|
|
|
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, "Killed two enemies with a single shot."), |
|
display_name = T(899260696739, "Two Birds One Stone"), |
|
group = "Hidden", |
|
how_to = T(345293348180, "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, "Chicken murderer."), |
|
display_name = T(252119341614, "Winner, Winner, Chicken Dinner"), |
|
group = "Hidden", |
|
how_to = T(669885107481, "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, "Solved the Diesel problem."), |
|
display_name = T(580828763361, "Diesel Power"), |
|
group = "Quests", |
|
how_to = T(689846303069, "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, "Obtained the Green Diamond."), |
|
display_name = T(168847895084, "Green Diamond"), |
|
group = "Quests", |
|
how_to = T(149168865866, "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, "Made Maman and Chimurenga get together."), |
|
display_name = T(846246131029, "Love Cats"), |
|
group = "Quests", |
|
how_to = T(100160794579, "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, "Gathered enough evidence to clear your name."), |
|
display_name = T(259283301037, "Proven Innocent"), |
|
group = "Quests", |
|
how_to = T(291562539660, "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, "Corazon betrayed you."), |
|
display_name = T(188253254182, "Saw It Coming..."), |
|
group = "Quests", |
|
how_to = T(122883982105, "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, "Caught the Teddy Bear killer."), |
|
display_name = T(484366144845, "Truest Detective"), |
|
group = "Quests", |
|
how_to = T(610523312013, "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, "Found Madam Lecoq's diamond necklace."), |
|
display_name = T(979859433082, "Twelve Chairs"), |
|
group = "Quests", |
|
how_to = T(734069117003, "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, "Found a cure for the Red Rabies."), |
|
display_name = T(753539187750, "Unlockdown"), |
|
group = "Quests", |
|
how_to = T(833150760628, "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, "Found Lucky Veinard's secret treasures."), |
|
display_name = T(667944553137, "X Marks The Spot"), |
|
group = "Quests", |
|
how_to = T(421408703447, "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, "Finished the campaign while having no more than two mercs at the same time."), |
|
display_name = T(277542343056, "Dynamic Duo"), |
|
group = "Retention", |
|
how_to = T(471839901231, "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, "Have at least 12 mercs."), |
|
display_name = T(639786242732, "Gritty Dozen"), |
|
group = "Retention", |
|
how_to = T(857992386571, "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, 'Finished the game on "Mission Impossible", "Dead is Dead", "To The Bitter End" and "Lethal Weapons".'), |
|
display_name = T(452896945074, "Ironman"), |
|
group = "Retention", |
|
how_to = T(218540356017, '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, "Taken 300 damage in a single turn without any merc dying or getting downed."), |
|
display_name = T(434853556936, "Just A Flesh Wound"), |
|
group = "Retention", |
|
how_to = T(657003907968, "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, "Earned at least 75 Loyalty in 5 towns."), |
|
display_name = T(360574911271, "Liberator"), |
|
group = "Retention", |
|
how_to = T(677038024683, "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, "Finished the campaign while having no more than one merc at the same time."), |
|
display_name = T(422926797000, "Lone Wolf"), |
|
group = "Retention", |
|
how_to = T(987003129842, "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, "Finished the campaign without killing any civilian."), |
|
display_name = T(194042060571, "Pacifist"), |
|
group = "Retention", |
|
how_to = T(338716292182, "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, "Controlled at least 50 sectors."), |
|
display_name = T(219959948272, "Tactician"), |
|
group = "Retention", |
|
how_to = T(996157707667, "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, "Finished the campaign before 1 MAY, 2001."), |
|
display_name = T(622226557896, "Time Is Money"), |
|
group = "Retention", |
|
how_to = T(227445552899, "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 |
|
|
|
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, |
|
}) |
|
|
|
|