916 lines
37 KiB
Lua
916 lines
37 KiB
Lua
xi = xi or {}
|
|
xi.mission = xi.mission or {}
|
|
|
|
---@enum xi.mission.log_id
|
|
xi.mission.log_id =
|
|
{
|
|
SANDORIA = 0,
|
|
BASTOK = 1,
|
|
WINDURST = 2,
|
|
ZILART = 3,
|
|
TOAU = 4,
|
|
WOTG = 5,
|
|
COP = 6,
|
|
ASSAULT = 7,
|
|
CAMPAIGN = 8,
|
|
ACP = 9,
|
|
AMK = 10,
|
|
ASA = 11,
|
|
SOA = 12,
|
|
ROV = 13,
|
|
TVR = 14, -- TODO: Find the right ID for this
|
|
}
|
|
|
|
xi.mission.area =
|
|
{
|
|
[xi.mission.log_id.SANDORIA] = 'sandoria',
|
|
[xi.mission.log_id.BASTOK] = 'bastok',
|
|
[xi.mission.log_id.WINDURST] = 'windurst',
|
|
[xi.mission.log_id.ZILART] = 'zilart',
|
|
[xi.mission.log_id.TOAU] = 'toau',
|
|
[xi.mission.log_id.WOTG] = 'wotg',
|
|
[xi.mission.log_id.COP] = 'cop',
|
|
[xi.mission.log_id.ASSAULT] = 'assault',
|
|
[xi.mission.log_id.CAMPAIGN] = 'campaign',
|
|
[xi.mission.log_id.ACP] = 'acp',
|
|
[xi.mission.log_id.AMK] = 'amk',
|
|
[xi.mission.log_id.ASA] = 'asa',
|
|
[xi.mission.log_id.SOA] = 'soa',
|
|
[xi.mission.log_id.ROV] = 'rov',
|
|
[xi.mission.log_id.TVR] = 'tvr',
|
|
}
|
|
|
|
xi.mission.status =
|
|
{
|
|
COP =
|
|
{
|
|
SANDORIA = 0,
|
|
WINDURST = 1,
|
|
LOUVERANCE = 2,
|
|
TENZEN = 3,
|
|
ULMIA = 4,
|
|
PROMY = 5,
|
|
CID = 6,
|
|
RUBIOUS = 7,
|
|
},
|
|
}
|
|
|
|
xi.mission.id =
|
|
{
|
|
-----------------------------------
|
|
-- All Nations
|
|
-----------------------------------
|
|
['nation'] =
|
|
{
|
|
RANK2 = 6,
|
|
MAGICITE = 13,
|
|
ARCHLICH = 14,
|
|
SHADOW_LORD = 15,
|
|
NONE = 65535,
|
|
},
|
|
|
|
-----------------------------------
|
|
-- San d'Oria - Interaction Framework (0)
|
|
-----------------------------------
|
|
[xi.mission.area[xi.mission.log_id.SANDORIA]] =
|
|
{
|
|
SMASH_THE_ORCISH_SCOUTS = 0,
|
|
BAT_HUNT = 1,
|
|
SAVE_THE_CHILDREN = 2,
|
|
THE_RESCUE_DRILL = 3,
|
|
THE_DAVOI_REPORT = 4,
|
|
JOURNEY_ABROAD = 5,
|
|
JOURNEY_TO_BASTOK = 6,
|
|
JOURNEY_TO_WINDURST = 7,
|
|
JOURNEY_TO_BASTOK2 = 8,
|
|
JOURNEY_TO_WINDURST2 = 9,
|
|
INFILTRATE_DAVOI = 10,
|
|
THE_CRYSTAL_SPRING = 11,
|
|
APPOINTMENT_TO_JEUNO = 12,
|
|
MAGICITE = 13,
|
|
THE_RUINS_OF_FEI_YIN = 14,
|
|
THE_SHADOW_LORD = 15,
|
|
LEAUTES_LAST_WISHES = 16,
|
|
RANPERRES_FINAL_REST = 17,
|
|
PRESTIGE_OF_THE_PAPSQUE = 18,
|
|
THE_SECRET_WEAPON = 19,
|
|
COMING_OF_AGE = 20,
|
|
LIGHTBRINGER = 21,
|
|
BREAKING_BARRIERS = 22,
|
|
THE_HEIR_TO_THE_LIGHT = 23,
|
|
NONE = 65535,
|
|
},
|
|
|
|
-----------------------------------
|
|
-- Bastok - Interaction Framework (1)
|
|
-----------------------------------
|
|
[xi.mission.area[xi.mission.log_id.BASTOK]] =
|
|
{
|
|
THE_ZERUHN_REPORT = 0,
|
|
GEOLOGICAL_SURVEY = 1,
|
|
FETICHISM = 2,
|
|
THE_CRYSTAL_LINE = 3,
|
|
WADING_BEASTS = 4,
|
|
THE_EMISSARY = 5,
|
|
THE_EMISSARY_SANDORIA = 6,
|
|
THE_EMISSARY_WINDURST = 7,
|
|
THE_EMISSARY_SANDORIA2 = 8,
|
|
THE_EMISSARY_WINDURST2 = 9,
|
|
THE_FOUR_MUSKETEERS = 10,
|
|
TO_THE_FORSAKEN_MINES = 11,
|
|
JEUNO = 12,
|
|
MAGICITE = 13,
|
|
DARKNESS_RISING = 14,
|
|
XARCABARD_LAND_OF_TRUTHS = 15,
|
|
RETURN_OF_THE_TALEKEEPER = 16,
|
|
THE_PIRATES_COVE = 17,
|
|
THE_FINAL_IMAGE = 18,
|
|
ON_MY_WAY = 19,
|
|
THE_CHAINS_THAT_BIND_US = 20,
|
|
ENTER_THE_TALEKEEPER = 21,
|
|
THE_SALT_OF_THE_EARTH = 22,
|
|
WHERE_TWO_PATHS_CONVERGE = 23,
|
|
NONE = 65535,
|
|
},
|
|
|
|
-----------------------------------
|
|
-- Windurst - Interaction Framework (2)
|
|
-----------------------------------
|
|
[xi.mission.area[xi.mission.log_id.WINDURST]] =
|
|
{
|
|
THE_HORUTOTO_RUINS_EXPERIMENT = 0,
|
|
THE_HEART_OF_THE_MATTER = 1,
|
|
THE_PRICE_OF_PEACE = 2,
|
|
LOST_FOR_WORDS = 3,
|
|
A_TESTING_TIME = 4,
|
|
THE_THREE_KINGDOMS = 5,
|
|
THE_THREE_KINGDOMS_SANDORIA = 6,
|
|
THE_THREE_KINGDOMS_BASTOK = 7,
|
|
THE_THREE_KINGDOMS_SANDORIA2 = 8,
|
|
THE_THREE_KINGDOMS_BASTOK2 = 9,
|
|
TO_EACH_HIS_OWN_RIGHT = 10,
|
|
WRITTEN_IN_THE_STARS = 11,
|
|
A_NEW_JOURNEY = 12,
|
|
MAGICITE = 13,
|
|
THE_FINAL_SEAL = 14,
|
|
THE_SHADOW_AWAITS = 15,
|
|
FULL_MOON_FOUNTAIN = 16,
|
|
SAINTLY_INVITATION = 17,
|
|
THE_SIXTH_MINISTRY = 18,
|
|
AWAKENING_OF_THE_GODS = 19,
|
|
VAIN = 20,
|
|
THE_JESTER_WHOD_BE_KING = 21,
|
|
DOLL_OF_THE_DEAD = 22,
|
|
MOON_READING = 23,
|
|
NONE = 65535,
|
|
},
|
|
|
|
-----------------------------------
|
|
-- Zilart Missions (3)
|
|
-----------------------------------
|
|
[xi.mission.area[xi.mission.log_id.ZILART]] =
|
|
{
|
|
THE_NEW_FRONTIER = 0, -- ±
|
|
WELCOME_TNORG = 4, -- ±
|
|
KAZHAMS_CHIEFTAINESS = 6, -- ±
|
|
THE_TEMPLE_OF_UGGALEPIH = 8, -- ±
|
|
HEADSTONE_PILGRIMAGE = 10, -- ±
|
|
THROUGH_THE_QUICKSAND_CAVES = 12, -- ±
|
|
THE_CHAMBER_OF_ORACLES = 14, -- ±
|
|
RETURN_TO_DELKFUTTS_TOWER = 16, -- ±
|
|
ROMAEVE = 18, -- ±
|
|
THE_TEMPLE_OF_DESOLATION = 20, -- ±
|
|
THE_HALL_OF_THE_GODS = 22, -- ±
|
|
THE_MITHRA_AND_THE_CRYSTAL = 23, -- ±
|
|
THE_GATE_OF_THE_GODS = 24, -- ±
|
|
ARK_ANGELS = 26, -- ±
|
|
THE_SEALED_SHRINE = 27, -- ±
|
|
THE_CELESTIAL_NEXUS = 28, -- ±
|
|
AWAKENING = 30, -- ±
|
|
THE_LAST_VERSE = 31,
|
|
NONE = 65535,
|
|
},
|
|
|
|
-----------------------------------
|
|
-- Promathia Missions (6)
|
|
-----------------------------------
|
|
[xi.mission.area[xi.mission.log_id.COP]] =
|
|
{
|
|
ANCIENT_FLAMES_BECKON = 101, -- Category
|
|
THE_RITES_OF_LIFE = 110, -- ±
|
|
BELOW_THE_ARKS = 118, -- ±
|
|
THE_MOTHERCRYSTALS = 128, -- ±
|
|
-- THE_ISLE_OF_FORGOTTEN_SAINTS = -- Category
|
|
AN_INVITATION_WEST = 138, -- ±
|
|
THE_LOST_CITY = 218, -- ±
|
|
DISTANT_BELIEFS = 228, -- ±
|
|
AN_ETERNAL_MELODY = 238, -- ±
|
|
ANCIENT_VOWS = 248, -- ±
|
|
A_TRANSIENT_DREAM = 257, -- Category
|
|
THE_CALL_OF_THE_WYRMKING = 258, -- ±
|
|
A_VESSEL_WITHOUT_A_CAPTAIN = 318, -- ±
|
|
THE_ROAD_FORKS = 325, -- ±
|
|
-- EMERALD_WATERS = -- Sub-category
|
|
-- VICISSITUDES = -- ±
|
|
DESCENDANTS_OF_A_LINE_LOST = 335, -- ±
|
|
-- LOUVERANCE = -- ±
|
|
-- MEMORIES_OF_A_MAIDEN = -- Sub-category
|
|
COMEDY_OF_ERRORS_ACT_I = 341, -- ±
|
|
-- COMEDY_OF_ERRORS_ACT_II = -- ±
|
|
-- EXIT_STAGE_LEFT = -- ±
|
|
TENDING_AGED_WOUNDS = 350, -- ±
|
|
DARKNESS_NAMED = 358, -- ±
|
|
-- THE_CRADLES_OF_CHILDREN_LOST = -- Category
|
|
SHELTERING_DOUBT = 368, -- ±
|
|
THE_SAVAGE = 418, -- ±
|
|
THE_SECRETS_OF_WORSHIP = 428, -- ±
|
|
SLANDEROUS_UTTERINGS = 438, -- ±
|
|
-- THE_RETURN_HOME = -- Category
|
|
THE_ENDURING_TUMULT_OF_WAR = 448, -- ±
|
|
DESIRES_OF_EMPTINESS = 518, -- ±
|
|
THREE_PATHS = 530, -- ±
|
|
-- PAST_SINS = -- ±
|
|
-- SOUTHERN_LEGEND = -- ±
|
|
PARTNERS_WITHOUT_FAME = 543, -- ±
|
|
-- A_CENTURY_OF_HARDSHIP = -- ±
|
|
-- DEPARTURES = -- ±
|
|
-- THE_PURSUIT_OF_PARADISE = -- ±
|
|
SPIRAL = 552, -- ±
|
|
-- BRANDED = -- ±
|
|
-- PRIDE_AND_HONOR = -- ±
|
|
-- AND_THE_COMPASS_GUIDES = -- ±
|
|
WHERE_MESSENGERS_GATHER = 560, -- ±
|
|
-- ENTANGLEMENT = -- ±
|
|
-- HEAD_WIND = -- ±
|
|
FLAMES_FOR_THE_DEAD = 568, -- ±
|
|
-- ECHOES_OF_TIME = -- ± -- -- Category
|
|
FOR_WHOM_THE_VERSE_IS_SUNG = 578, -- ±
|
|
A_PLACE_TO_RETURN = 618, -- ±
|
|
MORE_QUESTIONS_THAN_ANSWERS = 628, -- ±
|
|
ONE_TO_BE_FEARED = 638, -- ±
|
|
-- IN_THE_LIGHT_OF_THE_CRYSTAL = -- ± -- -- Category
|
|
CHAINS_AND_BONDS = 648, -- ±
|
|
FLAMES_IN_THE_DARKNESS = 718, -- ±
|
|
FIRE_IN_THE_EYES_OF_MEN = 728, -- ±
|
|
CALM_BEFORE_THE_STORM = 738, -- ±
|
|
THE_WARRIORS_PATH = 748, -- ±
|
|
EMPTINESS_BLEEDS = 758, -- ± ---- Category
|
|
GARDEN_OF_ANTIQUITY = 800, -- ±
|
|
A_FATE_DECIDED = 818, -- ±
|
|
WHEN_ANGELS_FALL = 828, -- ±
|
|
DAWN = 840, -- ±
|
|
THE_LAST_VERSE = 850,
|
|
},
|
|
|
|
-----------------------------------
|
|
-- Aht Urhgan Missions (4)
|
|
-----------------------------------
|
|
[xi.mission.area[xi.mission.log_id.TOAU]] =
|
|
{
|
|
LAND_OF_SACRED_SERPENTS = 0,
|
|
IMMORTAL_SENTRIES = 1,
|
|
PRESIDENT_SALAHEEM = 2,
|
|
KNIGHT_OF_GOLD = 3,
|
|
CONFESSIONS_OF_ROYALTY = 4,
|
|
EASTERLY_WINDS = 5,
|
|
WESTERLY_WINDS = 6,
|
|
A_MERCENARY_LIFE = 7,
|
|
UNDERSEA_SCOUTING = 8,
|
|
ASTRAL_WAVES = 9,
|
|
IMPERIAL_SCHEMES = 10,
|
|
ROYAL_PUPPETEER = 11,
|
|
LOST_KINGDOM = 12,
|
|
THE_DOLPHIN_CREST = 13,
|
|
THE_BLACK_COFFIN = 14,
|
|
GHOSTS_OF_THE_PAST = 15,
|
|
GUESTS_OF_THE_EMPIRE = 16,
|
|
PASSING_GLORY = 17,
|
|
SWEETS_FOR_THE_SOUL = 18,
|
|
TEAHOUSE_TUMULT = 19,
|
|
FINDERS_KEEPERS = 20,
|
|
SHIELD_OF_DIPLOMACY = 21,
|
|
SOCIAL_GRACES = 22,
|
|
FOILED_AMBITION = 23,
|
|
PLAYING_THE_PART = 24,
|
|
SEAL_OF_THE_SERPENT = 25,
|
|
MISPLACED_NOBILITY = 26,
|
|
BASTION_OF_KNOWLEDGE = 27,
|
|
PUPPET_IN_PERIL = 28,
|
|
PREVALENCE_OF_PIRATES = 29,
|
|
SHADES_OF_VENGEANCE = 30,
|
|
IN_THE_BLOOD = 31,
|
|
SENTINELS_HONOR = 32,
|
|
TESTING_THE_WATERS = 33,
|
|
LEGACY_OF_THE_LOST = 34,
|
|
GAZE_OF_THE_SABOTEUR = 35,
|
|
PATH_OF_BLOOD = 36,
|
|
STIRRINGS_OF_WAR = 37,
|
|
ALLIED_RUMBLINGS = 38,
|
|
UNRAVELING_REASON = 39,
|
|
LIGHT_OF_JUDGMENT = 40,
|
|
PATH_OF_DARKNESS = 41,
|
|
FANGS_OF_THE_LION = 42,
|
|
NASHMEIRAS_PLEA = 43,
|
|
RAGNAROK = 44,
|
|
IMPERIAL_CORONATION = 45,
|
|
THE_EMPRESS_CROWNED = 46,
|
|
ETERNAL_MERCENARY = 47,
|
|
},
|
|
|
|
-----------------------------------
|
|
-- Wings of the Goddess (5)
|
|
-----------------------------------
|
|
[xi.mission.area[xi.mission.log_id.WOTG]] =
|
|
{
|
|
CAVERNOUS_MAWS = 0, -- ±
|
|
BACK_TO_THE_BEGINNING = 1, -- ±
|
|
CAIT_SITH = 2, -- ±
|
|
THE_QUEEN_OF_THE_DANCE = 3, -- ±
|
|
WHILE_THE_CAT_IS_AWAY = 4, -- ±
|
|
A_TIMESWEPT_BUTTERFLY = 5, -- ±
|
|
PURPLE_THE_NEW_BLACK = 6, -- ±
|
|
IN_THE_NAME_OF_THE_FATHER = 7, -- ±
|
|
DANCERS_IN_DISTRESS = 8, -- ±
|
|
DAUGHTER_OF_A_KNIGHT = 9, -- ±
|
|
A_SPOONFUL_OF_SUGAR = 10, -- ±
|
|
AFFAIRS_OF_STATE = 11, -- ±
|
|
BORNE_BY_THE_WIND = 12, -- ±
|
|
A_NATION_ON_THE_BRINK = 13, -- ±
|
|
CROSSROADS_OF_TIME = 14, -- ±
|
|
SANDSWEPT_MEMORIES = 15, -- ±
|
|
NORTHLAND_EXPOSURE = 16, -- ±
|
|
TRAITOR_IN_THE_MIDST = 17, -- ±
|
|
BETRAYAL_AT_BEAUCEDINE = 18, -- ±
|
|
ON_THIN_ICE = 19, -- ±
|
|
PROOF_OF_VALOR = 20, -- ±
|
|
A_SANGUINARY_PRELUDE = 21, -- ±
|
|
DUNGEONS_AND_DANCERS = 22, -- ±
|
|
DISTORTER_OF_TIME = 23, -- ±
|
|
THE_WILL_OF_THE_WORLD = 24, -- ±
|
|
FATE_IN_HAZE = 25, -- ±
|
|
THE_SCENT_OF_BATTLE = 26, -- ±
|
|
ANOTHER_WORLD = 27, -- ±
|
|
A_HAWK_IN_REPOSE = 28, -- ±
|
|
THE_BATTLE_OF_XARCABARD = 29, -- ±
|
|
PRELUDE_TO_A_STORM = 30, -- ±
|
|
STORMS_CRESCENDO = 31, -- ±
|
|
INTO_THE_BEASTS_MAW = 32, -- ±
|
|
THE_HUNTER_ENSNARED = 33, -- ±
|
|
FLIGHT_OF_THE_LION = 34, -- ±
|
|
FALL_OF_THE_HAWK = 35, -- ±
|
|
DARKNESS_DESCENDS = 36, -- ±
|
|
ADIEU_LILISETTE = 37, -- ±
|
|
BY_THE_FADING_LIGHT = 38, -- ±
|
|
EDGE_OF_EXISTENCE = 39, -- ±
|
|
HER_MEMORIES = 40, -- ±
|
|
FORGET_ME_NOT = 41, -- ±
|
|
PILLAR_OF_HOPE = 42, -- ±
|
|
GLIMMER_OF_LIFE = 43, -- ±
|
|
TIME_SLIPS_AWAY = 44, -- ±
|
|
WHEN_WILLS_COLLIDE = 45, -- ±
|
|
WHISPERS_OF_DAWN = 46, -- ±
|
|
A_DREAMY_INTERLUDE = 47, -- ±
|
|
CAIT_IN_THE_WOODS = 48, -- ±
|
|
FORK_IN_THE_ROAD = 49, -- ±
|
|
MAIDEN_OF_THE_DUSK = 50, -- ±
|
|
WHERE_IT_ALL_BEGAN = 51, -- ±
|
|
A_TOKEN_OF_TROTH = 52, -- ±
|
|
LEST_WE_FORGET = 53, -- ±
|
|
},
|
|
|
|
-----------------------------------
|
|
-- A Crystalline Prophecy (9)
|
|
-----------------------------------
|
|
[xi.mission.area[xi.mission.log_id.ACP]] =
|
|
{
|
|
A_CRYSTALLINE_PROPHECY = 0, -- ±
|
|
THE_ECHO_AWAKENS = 1, -- ±
|
|
GATHERER_OF_LIGHT_I = 2, -- ±
|
|
GATHERER_OF_LIGHT_II = 3,
|
|
THOSE_WHO_LURK_IN_SHADOWS_I = 4, -- ±
|
|
THOSE_WHO_LURK_IN_SHADOWS_II = 5, -- ±
|
|
THOSE_WHO_LURK_IN_SHADOWS_III = 6, -- ±
|
|
REMEMBER_ME_IN_YOUR_DREAMS = 7, -- ±
|
|
BORN_OF_HER_NIGHTMARES = 8, -- ±
|
|
BANISHING_THE_ECHO = 9,
|
|
ODE_OF_LIFE_BESTOWING = 10,
|
|
A_CRYSTALLINE_PROPHECY_FIN = 11,
|
|
},
|
|
|
|
-----------------------------------
|
|
-- A Moogle Kupo d'Etat (10)
|
|
-----------------------------------
|
|
[xi.mission.area[xi.mission.log_id.AMK]] =
|
|
{
|
|
A_MOOGLE_KUPO_DETAT = 0, -- ±
|
|
DRENCHED_IT_BEGAN_WITH_A_RAINDROP = 1, -- ±
|
|
HASTEN_IN_A_JAM_IN_JEUNO = 2, -- ±
|
|
WELCOME_TO_MY_DECREPIT_DOMICILE = 3, -- ±
|
|
CURSES_A_HORRIFICALLY_HARROWING_HEX = 4, -- ±
|
|
AN_ERRAND_THE_PROFESSORS_PRICE = 5, -- ±
|
|
SHOCK_ARRANT_ABUSE_OF_AUTHORITY = 6, -- ±
|
|
LENDER_BEWARE_READ_THE_FINE_PRINT = 7, -- ±
|
|
RESCUE_A_MOOGLES_LABOR_OF_LOVE = 8, -- ±
|
|
ROAR_A_CAT_BURGLAR_BARES_HER_FANGS = 9, -- ±
|
|
RELIEF_A_TRIUMPHANT_RETURN = 10, -- ±
|
|
JOY_SUMMONED_TO_A_FABULOUS_FETE = 11, -- ±
|
|
A_CHALLENGE_YOU_COULD_BE_A_WINNER = 12, -- ±
|
|
SMASH_A_MALEVOLENT_MENACE = 13, -- ±
|
|
A_MOOGLE_KUPO_DETAT_FIN = 14, -- ±
|
|
},
|
|
|
|
-----------------------------------
|
|
-- A Shantotto Ascension (11)
|
|
-----------------------------------
|
|
[xi.mission.area[xi.mission.log_id.ASA]] =
|
|
{
|
|
A_SHANTOTTO_ASCENSION = 0, -- ±
|
|
BURGEONING_DREAD = 1, -- ±
|
|
THAT_WHICH_CURDLES_BLOOD = 2, -- ±
|
|
SUGAR_COATED_DIRECTIVE = 3, -- ±
|
|
ENEMY_OF_THE_EMPIRE_I = 4,
|
|
ENEMY_OF_THE_EMPIRE_II = 5,
|
|
SUGAR_COATED_SUBTERFUGE = 6,
|
|
SHANTOTTO_IN_CHAINS = 7,
|
|
FOUNTAIN_OF_TROUBLE = 8,
|
|
BATTARU_ROYALE = 9,
|
|
ROMANCING_THE_CLONE = 10,
|
|
SISTERS_IN_ARMS = 11,
|
|
PROJECT_SHANTOTTOFICATION = 12,
|
|
AN_UNEASY_PEACE = 13,
|
|
A_SHANTOTTO_ASCENSION_FIN = 14,
|
|
},
|
|
|
|
-----------------------------------
|
|
-- Seekers of Adoulin (12)
|
|
-----------------------------------
|
|
[xi.mission.area[xi.mission.log_id.SOA]] =
|
|
{
|
|
-- THE_SACRED_CITY_OF_ADOULIN = -- Category
|
|
RUMORS_FROM_THE_WEST = 0, -- ±
|
|
THE_GEOMAGNETRON = 1, -- ±
|
|
ONWARD_TO_ADOULIN = 3, -- ±
|
|
HEARTWINGS_AND_THE_KINDHEARTED = 5, -- ±
|
|
PIONEER_REGISTRATION = 6, -- ±
|
|
LIFE_ON_THE_FRONTIER = 7, -- ±
|
|
MEETING_OF_THE_MINDS = 8, -- ±
|
|
ARCIELA_APPEARS_AGAIN = 9, -- ±
|
|
-- THE_ANCIENT_PACT = -- Category
|
|
BUDDING_PROSPECTS = 11, -- ±
|
|
THE_LIGHT_SHINING_IN_YOUR_EYES = 12, -- ±
|
|
THE_HEIRLOOM = 13, -- ±
|
|
AN_AIMLESS_JOURNEY = 14, -- ±
|
|
ORTHARSYNE = 15, -- ±
|
|
IN_THE_PRESENCE_OF_ROYALTY = 16, -- ±
|
|
THE_TWIN_WORLD_TREES = 17, -- ±
|
|
HONOR_AND_AUDACITY = 18, -- ±
|
|
THE_WATERGARDEN_COLISEUM = 19, -- ±
|
|
FRICTION_AND_FISSURES = 20, -- ±
|
|
THE_CELENNIA_MEMORIAL_LIBRARY = 21, -- ±
|
|
FOR_WHOM_DO_WE_TOIL = 23, -- ±
|
|
AIMING_FOR_YGNAS = 26, -- ±
|
|
CALAMITY_IN_THE_KITCHEN = 27, -- ±
|
|
ARCIELAS_PROMISE = 29, -- ±
|
|
PREDATOR_AND_PREY = 30, -- ±
|
|
BEHIND_THE_SLUICES = 31, -- ±
|
|
THE_LEAFKIN_MONARCH = 34, -- ±
|
|
YGGDRASIL = 35, -- ±
|
|
-- SHADOWS_UPON_ADOULIN = -- Category
|
|
RETURN_OF_THE_EXORCIST = 37, -- ±
|
|
THE_MERCILESS_ONE = 38, -- ±
|
|
A_CURSE_FROM_THE_PAST = 39, -- ±
|
|
THE_PURGATION = 40, -- ±
|
|
THE_KEY = 41, -- ±
|
|
THE_PRINCESSS_DILEMMA = 42, -- ±
|
|
DARK_CLOUDS_AHEAD = 43, -- ±
|
|
THE_SMALLEST_OF_FAVORS = 44, -- ±
|
|
SUMMONED_BY_SPIRITS = 45, -- ±
|
|
EVIL_ENTITIES = 46, -- ±
|
|
ADOULIN_CALLING = 47, -- ±
|
|
THE_DISAPPEARANCE_OF_NYLINE = 48, -- ±
|
|
SHARED_CONSCIOUSNESS = 49, -- ±
|
|
CLEAR_SKIES = 50, -- ±
|
|
THE_MAN_IN_BLACK = 51, -- ±
|
|
TO_THE_VICTOR = 52, -- ±
|
|
AN_EXTRAORDINARY_GENTLEMAN = 53, -- ±
|
|
THE_ORDERS_TREASURES = 55, -- ±
|
|
AUGUSTS_HEIRLOOM = 56, -- ±
|
|
BEAUTY_AND_THE_BEAST = 57, -- ±
|
|
WILDCAT_WITH_A_GOLD_PELT = 58, -- ±
|
|
IN_SEARCH_OF_ARCIELA = 59, -- ±
|
|
LOOKING_FOR_LEADS = 61, -- ±
|
|
DRIFTING_NORTHWEST = 62, -- ±
|
|
KUMHAU_THE_FLASHFROST_NAAKUAL = 63, -- ±
|
|
SOUL_SIPHON = 66, -- ±
|
|
STONEWALLED = 67, -- ±
|
|
SALVATION = 69, -- ±
|
|
GLIMMER_OF_PORTENT = 70, -- ±
|
|
-- THE_SERPENTINE_LABYRINTH = -- Category
|
|
INTO_THE_FIRE = 71, -- ±
|
|
MELVIEN_DE_MALECROIX = 72, -- ±
|
|
COURIER_CATASTROPHE = 73, -- ±
|
|
DONE_AND_DELIVERED = 74, -- ±
|
|
MINISTERIAL_WHISPERS = 75, -- ±
|
|
A_DAY_IN_THE_LIFE_OF_A_PIONEER = 76, -- ±
|
|
LIGHTING_THE_WAY = 77, -- ±
|
|
SAJJAKA = 78, -- ±
|
|
STUDYING_UP = 79, -- ±
|
|
A_VOW_OF_TRUTH = 80, -- ±
|
|
DARRCUILN = 81, -- ±
|
|
THE_GATES = 82, -- ±
|
|
MORIMAR = 84, -- ±
|
|
A_NEW_FORCE_ARISES = 85, -- ±
|
|
THE_SACRED_SAPLING = 86, -- ±
|
|
TREE_GRAFTING = 87, -- ±
|
|
A_SHROUDED_CANOPY = 88, -- ±
|
|
LEAFALLIA = 89, -- ±
|
|
ROSULATIAS_PROMISE = 90, -- ±
|
|
THE_LIGHTSLAND = 91, -- ±
|
|
THE_LIGHT_OF_DAWN_COMES = 92, -- ±
|
|
CRIES_FROM_THE_DEEP = 93, -- ±
|
|
SEEDS_OF_DOUBT = 94, -- ±
|
|
THE_TOMATOES_OF_WRATH = 95, -- ±
|
|
A_GRAVE_MISTAKE = 96, -- ±
|
|
AN_EMERGENCY_CONVOCATION = 98, -- ±
|
|
BALAMOR_THE_DEATHBORNE_XOL = 99, -- ±
|
|
ANAGNORISIS = 100, -- ±
|
|
JUST_THE_THING = 101, -- ±
|
|
SUGARCOATED_SALVATION = 102, -- ±
|
|
ARCIELAS_RESOLVE = 103, -- ±
|
|
BALAMORS_RUSE = 104, -- ±
|
|
THE_CHARLATAN = 105, -- ±
|
|
ROYAL_BLESSINGS = 107, -- ±
|
|
-- HADES = -- Category
|
|
ARBOREAL_RUMORS = 108, -- ±
|
|
ARCIELAS_MISSIVE = 109, -- ±
|
|
HEROES_UNITE = 110, -- ±
|
|
A_PORTENT_MOST_OMINOUS = 111, -- ±
|
|
YGGDRASIL_BECKONS = 112, -- ±
|
|
RETURNING_TO_THE_TREES = 113, -- ±
|
|
THE_KEY_TO_THE_TURRIS = 114, -- ±
|
|
TEODORS_SUMMONS = 116, -- ±
|
|
THE_SEVENTH_GUARDIAN = 117, -- ±
|
|
WATERY_GRAVE = 118, -- ±
|
|
BLOOD_FOR_BLOOD = 120, -- ±
|
|
RECKONING = 121, -- ±
|
|
ABOMINATION = 123, -- ±
|
|
UNDYING_LIGHT = 125, -- ±
|
|
THE_LIGHT_WITHIN = 129, -- ±
|
|
-- FIN = 130,
|
|
},
|
|
|
|
-----------------------------------
|
|
-- Rhapsodies of Vana Diel (13)
|
|
-----------------------------------
|
|
[xi.mission.area[xi.mission.log_id.ROV]] =
|
|
{
|
|
RHAPSODIES_OF_VANADIEL = 0, -- ±
|
|
-- CREATION_AND_REBIRTH = -- Category
|
|
RESONANCE = 2, -- ±
|
|
EMISSARY_FROM_THE_SEAS = 3, -- ±
|
|
SET_FREE = 4, -- ±
|
|
THE_BEGINNING = 6, -- ±
|
|
FLAMES_OF_PRAYER = 10, -- ±
|
|
THE_PATH_UNTRAVELED = 12, -- ±
|
|
AT_THE_HEAVENS_DOOR = 18, -- ±
|
|
THE_LIONS_ROAR = 20, -- ±
|
|
EDDIES_OF_DESPAIR_I = 22, -- ±
|
|
A_LAND_AFTER_TIME = 26, -- ±
|
|
FATES_CALL = 28, -- ±
|
|
WHAT_LIES_BEYOND = 30, -- ±
|
|
THE_TIES_THAT_BIND = 32, -- ±
|
|
IMPURITY = 34, -- ±
|
|
THE_LOST_AVATAR = 36, -- ±
|
|
VOLTO_OSCURO = 40, -- ±
|
|
RING_MY_BELL = 42, -- ±
|
|
-- REVITALIZATION = -- Category
|
|
SPIRITS_AWOKEN = 44, -- ±
|
|
CRASHING_WAVES = 46, -- ±
|
|
CALL_TO_SERVE = 48, -- ±
|
|
NUMBERING_DAYS = 50, -- ±
|
|
INESCAPABLE_BINDS = 52, -- ±
|
|
DESERT_WINDS = 54, -- ±
|
|
EVER_FORWARD = 56, -- ±
|
|
THE_ENDLESS_SKY = 60, -- ±
|
|
APHMAUS_LIGHT = 62, -- ±
|
|
REUNITED = 64, -- ±
|
|
TAKE_WING = 66, -- ±
|
|
PRIME_NUMBER = 68, -- ±
|
|
FROM_THE_RUINS = 70, -- ±
|
|
CAUTERIZE = 72, -- ±
|
|
UNCERTAIN_DESTINATIONS = 78, -- ±
|
|
GANGED_UP_ON = 80, -- ±
|
|
SACRIFICE = 83, -- ±
|
|
SOMBER_DREAMS = 86, -- ±
|
|
OF_LIGHT_AND_DARKNESS = 92, -- ±
|
|
TEMPORARY_FAREWELLS = 94, -- ±
|
|
BRUSHING_UP = 96, -- ±
|
|
KEEP_ON_GIVING = 98, -- ±
|
|
PAST_IMPERFECT = 100, -- ±
|
|
THE_CURSED_TEMPLE = 102,
|
|
WISDOM_OF_OUR_FOREFATHERS = 103,
|
|
WHERE_DIVINITIES_COLLIDE = 104,
|
|
VISIONS_OF_DREAD = 106,
|
|
TO_THE_SKIES = 108,
|
|
ESCHA_RUAUN = 110,
|
|
THE_DECISIVE_HEROINE = 114,
|
|
FALL_FROM_GRACE = 116,
|
|
BANISHING_THE_DARKNESS = 118,
|
|
OVER_THE_RAINBOW = 120,
|
|
CACOPHONOUS_DISCORD = 122,
|
|
EDDIES_OF_DESPAIR_II = 124,
|
|
PRETENDER_TO_THE_THRONE = 126,
|
|
BANISHED = 130,
|
|
CALL_OF_THE_VOID = 132,
|
|
BOTH_PATHS_TAKEN = 136,
|
|
THE_MAN_BEHIND_THE_MASK = 142,
|
|
UNCERTAIN_FUTURES = 144,
|
|
-- RECKONING = -- Category
|
|
DARKNESS_BECKONS = 146,
|
|
THE_BREWING_STORM = 150,
|
|
THE_RIVER_RUNS_RED = 152,
|
|
THE_CRUCIBLE = 154,
|
|
FORWARD_THINKING = 155,
|
|
TEARS_OF_THE_GENERALS = 156,
|
|
WHAT_HE_LEFT_BEHIND = 158,
|
|
GONE_BUT_NOT_FORGOTTEN = 160,
|
|
AUGUST_ARTIFACTS = 161,
|
|
SOLEMNITY = 162,
|
|
EYES_ON_YOU = 164,
|
|
EXPLORING_THE_RUINS = 166,
|
|
BECOME_SOMETHING_MORE = 170,
|
|
UNSHAKABLE_NIGHTMARES = 172,
|
|
WHAT_REMAINS_OF_HOPE = 174,
|
|
DEATH_CARES_NOT = 178,
|
|
NO_TIME_LIKE_THE_FUTURE = 180,
|
|
SIN = 184,
|
|
PENANCE = 188,
|
|
VESSEL_OF_LIGHT = 190,
|
|
THE_LIFESTREAM_OF_REISENJIMA = 192,
|
|
FROM_WEST_TO_EAST = 194,
|
|
GOOD_THINGS_COME_IN_THREES = 196,
|
|
TACKLING_THE_PROBLEM = 198,
|
|
WAY_TO_DIVINITY = 200,
|
|
THE_WINDS_OF_TIME = 202,
|
|
CALM_AFTER_THE_STORM = 206,
|
|
NARY_A_CLOUD_IN_SIGHT = 210,
|
|
AN_UNENDING_SONG = 212,
|
|
A_DEEP_SLEEP = 216,
|
|
GUARDIANS = 218,
|
|
IROHA_IN_DISTRESS = 220,
|
|
ABSOLUTE_TRUST = 222,
|
|
THE_ORBS_RADIANCE = 224,
|
|
A_RHAPSODY_FOR_THE_AGES = 226,
|
|
},
|
|
|
|
-----------------------------------
|
|
-- The Voracious Resurgence (14)
|
|
--
|
|
-- TODO: These are completely guessed, they need to be figured out from the client,
|
|
-- : also with their special relationship with the ROV missions.
|
|
-----------------------------------
|
|
[xi.mission.area[xi.mission.log_id.TVR]] =
|
|
{
|
|
-- Part 1
|
|
THE_VORACIOUS_RESURGENCE = 0,
|
|
THE_GLOOM_PHANTOMS_APPROACH = 1,
|
|
THE_BRYGID_CUP = 2,
|
|
THE_DESTINY_DESTROYERS = 3,
|
|
-- Part 2
|
|
KUPIPIS_DILEMMA = 4,
|
|
THE_CARDIANS_DUTY = 5,
|
|
ZHUU_BUXUS_GAMBIT = 6,
|
|
STAR_ONION_FORTUNE = 7,
|
|
THE_DOLL_WHISPERER = 8,
|
|
-- Part 3
|
|
DANCING_PRINCE = 9,
|
|
CLAIDIES_CONCERN = 10,
|
|
CURILLA_UNLEASHED = 11,
|
|
RUN_EXCENMILLE_RUN = 12,
|
|
OF_KNIGHTS_AND_ORCS = 13,
|
|
-- Part 4
|
|
BEST_SERVED_COLD = 14,
|
|
CORNELIAS_CALL_TO_ACTION = 15,
|
|
NAJA_THE_AMBITIOUS = 16,
|
|
RAUBAHN_THE_BLUE = 17,
|
|
-- Part 5
|
|
GHATSADS_QUANDARY = 18,
|
|
THE_REVELATION = 19,
|
|
TATEEYAS_WORRIES = 20,
|
|
THE_SEAGULL_PHRATRIE = 21,
|
|
THE_SEA_SAGE = 22,
|
|
-- Part 6
|
|
SKY_MOON_INCANTRIX = 23,
|
|
NIIS_LAST_STAND = 24,
|
|
DANCE_OF_THE_TENGU = 25,
|
|
-- Part 7
|
|
RAEBRIMMS_REBIRTH = 26,
|
|
URAN_MAFRAN_OF_THE_MAELSTROM = 27,
|
|
KORU_MORUS_HYPOTHESIS = 28,
|
|
ALTENNIA_BURNS_BRIGHT = 29,
|
|
-- Part 8
|
|
MAAT_ON_THE_RAMPAGE = 30,
|
|
NOT_JUST_A_PRETTY_FACE = 31,
|
|
DELKFUTT_THE_GREAT = 32,
|
|
-- Part 9
|
|
OSHASHAS_VIOLATION = 33,
|
|
PHANTASMIC_HEROES = 34,
|
|
SKOKKR_UNDRBORNS_TEMPTATION = 35,
|
|
THE_PRIME_WEAPONS = 36,
|
|
-- Part 10
|
|
TO_MOVALPOLOS = 37,
|
|
MAGH_BIHU_ON_THE_PROWL = 38,
|
|
DAZBOGS_101 = 39,
|
|
KIPDRIX_THE_FAITHFUL = 40,
|
|
DUKE_ALLOCESS_DECISION = 41,
|
|
ODINS_EYE = 42,
|
|
-- Part 11
|
|
MOGLESSE_OBLIGE = 43,
|
|
THE_VORACIOUS_BEAST = 44,
|
|
YOUR_DECISION = 45,
|
|
-- Epilogue
|
|
EPILOGUE = 46,
|
|
},
|
|
|
|
[xi.mission.area[xi.mission.log_id.CAMPAIGN]] = {},
|
|
}
|
|
|
|
-- Campaign IDs deliberately left out of mission table
|
|
-- due to their nature not being the same as other missions,
|
|
-- and to allow the content the freedom to develop systems
|
|
-- that are more specifically catered to it.
|
|
|
|
-----------------------------------
|
|
-- Campaign (8)
|
|
-----------------------------------
|
|
-- None yet!
|
|
|
|
local function rankPointMath(rank)
|
|
return 0.372 * rank^2 - 1.62 * rank + 6.2
|
|
end
|
|
|
|
-- Number of crystal trades required for specific missions in each nation.
|
|
-- TODO: This needs to be audited for modern retail.
|
|
local crystalRequirements =
|
|
{
|
|
[ 3] = 9,
|
|
[ 4] = 17,
|
|
[ 5] = 42,
|
|
[10] = 12, -- 1 stack needed to unlock
|
|
[11] = 30, -- 2.5 stacks needed to unlock (2 stacks of crystals + 3.1 rank points corresponding to half a stack)
|
|
[12] = 48, -- 4 stacks to unlock (3.5 stacks + 3.1 rank points corresponding to half a stack)
|
|
[13] = 36,
|
|
[15] = 44, -- Mission unlocks at 50% rank bar ~= 44 crystals using the present formula.
|
|
[16] = 36,
|
|
[17] = 93, -- 3 additional stacks to unlock + 3 original stacks + 21 from mission 6.1
|
|
[18] = 45, -- 45 needed, from http://wiki.ffxiclopedia.org/wiki/The_Final_Image
|
|
[19] = 119, -- 4 additional stacks needed, plus mission reward of 26
|
|
[20] = 57,
|
|
[21] = 148, -- 5 additional stacks needed, plus mission reward of 31
|
|
[22] = 96, -- 8 stacks needed (higher value chosen so final rank bar requirement is closer to 90%)
|
|
[23] = 228, -- Additional 8 stacks needed, plus mission reward of 36 (87% rank bar)
|
|
}
|
|
|
|
xi.mission.getMissionRankPoints = function(player, missionID)
|
|
local crystals = crystalRequirements[missionID] or 0
|
|
local pointsNeeded = 1024 * (crystals - 0.25) / (3 * rankPointMath(player:getRank(player:getNation())))
|
|
|
|
if player:getRankPoints() >= pointsNeeded then
|
|
return true
|
|
end
|
|
|
|
return false
|
|
end
|
|
|
|
-- Tables identifying the nature of a mission by nation (0 = Not Repeatable, 1 = Repeatable, 2 = Do Not Add, 3 = Required + Repeatable)
|
|
-- Certain missions do not apply to the gate guard, such as Rank 4; Do Not Add is used for this.
|
|
-- For 3 Nations missions (ID#5) sub-missions are not included in this mask.
|
|
local missionType =
|
|
{
|
|
-- Required Rank : 1 1 1 2 2 2 2 2 2 2 3 3 3 4 5 5 6 6 7 7 8 8 9 9
|
|
[xi.mission.log_id.SANDORIA] = { 1, 3, 1, 0, 1, 0, 2, 2, 2, 2, 3, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
|
[xi.mission.log_id.BASTOK] = { 2, 0, 1, 0, 1, 0, 2, 2, 2, 2, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
|
[xi.mission.log_id.WINDURST] = { 2, 0, 0, 0, 1, 0, 2, 2, 2, 2, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
|
}
|
|
|
|
local function getRequiredRank(missionId)
|
|
local requiredRank = 2
|
|
|
|
if
|
|
missionId <= 2
|
|
then
|
|
requiredRank = math.floor(missionId / 3) + 1
|
|
elseif missionId >= 10 and missionId <= 12 then
|
|
requiredRank = 3
|
|
elseif missionId == 13 then
|
|
requiredRank = 4
|
|
elseif missionId >= 14 then
|
|
requiredRank = math.floor((missionId - 14) / 2) + 5
|
|
end
|
|
|
|
return requiredRank
|
|
end
|
|
|
|
xi.mission.getMissionMask = function(player)
|
|
local nation = player:getNation()
|
|
local rank = player:getRank(nation)
|
|
|
|
local lastRequiredMission = -1
|
|
local firstMission = 0
|
|
local repeatMission = 0
|
|
|
|
for k, v in pairs(missionType[nation]) do
|
|
local missionId = k - 1
|
|
|
|
-- All repeatable missions are skippable as well, so track the required
|
|
-- missions, and only add to mask if rank and required are met
|
|
if
|
|
missionId >= lastRequiredMission and
|
|
(
|
|
rank > getRequiredRank(missionId) or
|
|
(
|
|
rank == getRequiredRank(missionId) and
|
|
xi.mission.getMissionRankPoints(player, missionId)
|
|
)
|
|
)
|
|
and
|
|
(
|
|
lastRequiredMission < 0 or
|
|
player:hasCompletedMission(nation, lastRequiredMission)
|
|
)
|
|
then
|
|
if v == 0 then
|
|
if not player:hasCompletedMission(nation, missionId) then
|
|
firstMission = utils.mask.setBit(firstMission, missionId, true)
|
|
lastRequiredMission = missionId
|
|
end
|
|
elseif v == 1 then
|
|
repeatMission = utils.mask.setBit(repeatMission, missionId, true)
|
|
elseif v == 3 then
|
|
if not player:hasCompletedMission(nation, missionId) then
|
|
firstMission = utils.mask.setBit(firstMission, missionId, true)
|
|
else
|
|
repeatMission = utils.mask.setBit(repeatMission, missionId, true)
|
|
end
|
|
|
|
lastRequiredMission = missionId
|
|
end
|
|
else
|
|
break
|
|
end
|
|
end
|
|
|
|
local missionMask = utils.MAX_INT32 - repeatMission - firstMission
|
|
if
|
|
player:getCurrentMission(nation) == xi.mission.id.nation.NONE and
|
|
rank == 5 and
|
|
not player:hasCompletedMission(nation, xi.mission.id.nation.ARCHLICH) and
|
|
player:getMissionStatus(nation) == 8
|
|
then
|
|
-- Only one option is available when selecting M5-1 as required from a gate guard. Since the mission isn't set,
|
|
-- Use previous logic to require missionStatus of 8, but no mission set (instead of ARCHLICH)
|
|
-- NOTE: For some reason, previous implementation starts with status this high. This should change in the future.
|
|
missionMask = utils.MAX_INT32 - 16384
|
|
end
|
|
|
|
return missionMask, repeatMission
|
|
end
|
|
|
|
-- Interaction Framework Helper Functions
|
|
local function getVarPrefix(areaId, missionId)
|
|
return string.format('Mission[%d][%d]', areaId, missionId)
|
|
end
|
|
|
|
xi.mission.getVarPrefix = getVarPrefix
|
|
|
|
xi.mission.incrementVar = function(player, areaId, missionId, name, value)
|
|
return player:incrementCharVar(getVarPrefix(areaId, missionId) .. name, value)
|
|
end
|
|
|
|
xi.mission.getVar = function(player, areaId, missionId, name)
|
|
return player:getVar(getVarPrefix(areaId, missionId) .. name)
|
|
end
|
|
|
|
xi.mission.setVar = function(player, areaId, missionId, name, value, expiry)
|
|
return player:setVar(getVarPrefix(areaId, missionId) .. name, value, expiry)
|
|
end
|
|
|
|
xi.mission.setVarExpiration = function(player, areaId, missionId, name, expiry)
|
|
return player:setCharVarExpiration(getVarPrefix(areaId, missionId) .. name, expiry)
|
|
end
|
|
|
|
xi.mission.getLocalVar = function(player, areaId, missionId, name)
|
|
return player:getLocalVar(getVarPrefix(areaId, missionId) .. name)
|
|
end
|
|
|
|
xi.mission.setLocalVar = function(player, areaId, missionId, name, value)
|
|
return player:setLocalVar(getVarPrefix(areaId, missionId) .. name, value)
|
|
end
|
|
|
|
xi.mission.getMustZone = function(player, areaId, missionId)
|
|
return player:getCharVar(getVarPrefix(areaId, missionId) .. 'mustZone') ~= 0 and true or false
|
|
end
|
|
|
|
xi.mission.setMustZone = function(player, areaId, missionId)
|
|
player:setCharVar(getVarPrefix(areaId, missionId) .. 'mustZone', player:getZoneID())
|
|
end
|