|
| 1 | +----------------------------------- |
| 2 | +-- The Truth Lies Hid |
| 3 | +----------------------------------- |
| 4 | +-- !addquest 7 58 |
| 5 | +-- Gentle Tiger : !pos -203.932 -9.998 2.237 87 |
| 6 | +-- Rikke : !pos -90.120 0.601 86.312 155 |
| 7 | +-- Rakke : !pos -113.722 0.601 -149.880 155 |
| 8 | +-- Rokke : !pos -30.042 0.601 -153.925 155 |
| 9 | +-- ??? (qm) : !pos -384.257 -51.999 -95.783 155 |
| 10 | +-- Displaced Block : !pos -264.139 -52.999 82.333 155 |
| 11 | +----------------------------------- |
| 12 | + |
| 13 | +local quest = Quest:new(xi.questLog.CRYSTAL_WAR, xi.quest.id.crystalWar.THE_TRUTH_LIES_HID) |
| 14 | + |
| 15 | +quest.reward = |
| 16 | +{ |
| 17 | + item = xi.item.SANCTUS_ROSARY, |
| 18 | +} |
| 19 | + |
| 20 | +local impScenarios = |
| 21 | +{ |
| 22 | + -- Scenario A |
| 23 | + { |
| 24 | + honestImp = 2, |
| 25 | + statements = |
| 26 | + { |
| 27 | + [1] = 1, |
| 28 | + [2] = 1, |
| 29 | + [3] = 1, |
| 30 | + }, |
| 31 | + }, |
| 32 | + |
| 33 | + -- Scenario B |
| 34 | + { |
| 35 | + honestImp = 1, |
| 36 | + statements = |
| 37 | + { |
| 38 | + [1] = 0, |
| 39 | + [2] = 0, |
| 40 | + [3] = 0, |
| 41 | + }, |
| 42 | + }, |
| 43 | + |
| 44 | + -- Scenario C |
| 45 | + { |
| 46 | + honestImp = 3, |
| 47 | + statements = |
| 48 | + { |
| 49 | + [1] = 0, |
| 50 | + [2] = 2, |
| 51 | + [3] = 0, |
| 52 | + }, |
| 53 | + }, |
| 54 | +} |
| 55 | + |
| 56 | +local impData = |
| 57 | +{ |
| 58 | + [1] = |
| 59 | + { |
| 60 | + dayVar = 'Imp1Day', |
| 61 | + initial = 9, |
| 62 | + reminder = 19, |
| 63 | + trade = 12, |
| 64 | + selfTrade = 22, |
| 65 | + otherTrade = 25, |
| 66 | + }, |
| 67 | + |
| 68 | + [2] = |
| 69 | + { |
| 70 | + dayVar = 'Imp2Day', |
| 71 | + initial = 10, |
| 72 | + reminder = 20, |
| 73 | + trade = 13, |
| 74 | + selfTrade = 23, |
| 75 | + otherTrade = 26, |
| 76 | + }, |
| 77 | + |
| 78 | + [3] = |
| 79 | + { |
| 80 | + dayVar = 'Imp3Day', |
| 81 | + initial = 11, |
| 82 | + reminder = 21, |
| 83 | + trade = 14, |
| 84 | + selfTrade = 24, |
| 85 | + otherTrade = 27, |
| 86 | + }, |
| 87 | +} |
| 88 | + |
| 89 | +local function getCurrentImpScenario() |
| 90 | + -- The active scenario rotates by Vana'diel day. |
| 91 | + return impScenarios[(VanadielUniqueDay() % #impScenarios) + 1] |
| 92 | +end |
| 93 | + |
| 94 | +local function setImpTradeState(player, impNumber, isCorrect) |
| 95 | + quest:setVar(player, 'TradeDay', VanadielUniqueDay()) |
| 96 | + quest:setVar(player, 'TradeImp', impNumber) |
| 97 | + quest:setVar(player, 'TradeSuccess', isCorrect and 1 or 0) |
| 98 | +end |
| 99 | + |
| 100 | +local function handleImpPuzzleTrigger(player, impNumber) |
| 101 | + local imp = impData[impNumber] |
| 102 | + |
| 103 | + if quest:getVar(player, 'TradeDay') == VanadielUniqueDay() then |
| 104 | + local tradeSucceeded = quest:getVar(player, 'TradeSuccess') |
| 105 | + |
| 106 | + if quest:getVar(player, 'TradeImp') == impNumber then |
| 107 | + return quest:event(imp.selfTrade, 155, 0, tradeSucceeded) |
| 108 | + end |
| 109 | + |
| 110 | + return quest:event(imp.otherTrade, tradeSucceeded) |
| 111 | + end |
| 112 | + |
| 113 | + local param3 = getCurrentImpScenario().statements[impNumber] |
| 114 | + |
| 115 | + if quest:getVar(player, imp.dayVar) == VanadielUniqueDay() then |
| 116 | + return quest:event(imp.reminder, 155, 0, param3) |
| 117 | + end |
| 118 | + |
| 119 | + quest:setVar(player, imp.dayVar, VanadielUniqueDay()) |
| 120 | + return quest:event(imp.initial, 155, 0, param3) |
| 121 | +end |
| 122 | + |
| 123 | +local function handleImpTrade(player, impNumber, trade) |
| 124 | + local imp = impData[impNumber] |
| 125 | + |
| 126 | + if |
| 127 | + npcUtil.tradeHasExactly(trade, xi.item.ELIXIR) and |
| 128 | + quest:getVar(player, 'TradeDay') ~= VanadielUniqueDay() |
| 129 | + then |
| 130 | + local isCorrect = getCurrentImpScenario().honestImp == impNumber |
| 131 | + setImpTradeState(player, impNumber, isCorrect) |
| 132 | + |
| 133 | + if isCorrect then |
| 134 | + return quest:progressEvent(imp.trade, 155, 0, 1) |
| 135 | + end |
| 136 | + |
| 137 | + return quest:event(imp.trade, 155, 0, 0) |
| 138 | + end |
| 139 | +end |
| 140 | + |
| 141 | +local function handleSolvedImpTrigger(impNumber) |
| 142 | + local imp = impData[impNumber] |
| 143 | + |
| 144 | + if getCurrentImpScenario().honestImp == impNumber then |
| 145 | + return quest:event(imp.selfTrade, 155, 0, 1) |
| 146 | + end |
| 147 | + |
| 148 | + return quest:event(imp.otherTrade, 1) |
| 149 | +end |
| 150 | + |
| 151 | +quest.sections = |
| 152 | +{ |
| 153 | + { |
| 154 | + check = function(player, status, vars) |
| 155 | + return status == xi.questStatus.QUEST_AVAILABLE and |
| 156 | + player:hasCompletedQuest(xi.questLog.CRYSTAL_WAR, xi.quest.id.crystalWar.WHAT_PRICE_LOYALTY) and |
| 157 | + player:getCurrentMission(xi.mission.log_id.WOTG) >= xi.mission.id.wotg.ADIEU_LILISETTE |
| 158 | + end, |
| 159 | + |
| 160 | + [xi.zone.BASTOK_MARKETS_S] = |
| 161 | + { |
| 162 | + ['Gentle_Tiger'] = quest:progressEvent(211), |
| 163 | + |
| 164 | + onEventFinish = |
| 165 | + { |
| 166 | + [211] = function(player, csid, option, npc) |
| 167 | + quest:begin(player) |
| 168 | + end, |
| 169 | + }, |
| 170 | + }, |
| 171 | + }, |
| 172 | + |
| 173 | + { |
| 174 | + check = function(player, status, vars) |
| 175 | + return status == xi.questStatus.QUEST_ACCEPTED and vars.Prog == 0 |
| 176 | + end, |
| 177 | + |
| 178 | + [xi.zone.BASTOK_MARKETS_S] = |
| 179 | + { |
| 180 | + ['Gentle_Tiger'] = quest:event(212), |
| 181 | + }, |
| 182 | + |
| 183 | + [xi.zone.CASTLE_ZVAHL_BAILEYS_S] = |
| 184 | + { |
| 185 | + onZoneIn = function(player, prevZone) |
| 186 | + return 12 |
| 187 | + end, |
| 188 | + |
| 189 | + onEventFinish = |
| 190 | + { |
| 191 | + [12] = function(player, csid, option, npc) |
| 192 | + quest:setVar(player, 'Prog', 1) |
| 193 | + end, |
| 194 | + }, |
| 195 | + }, |
| 196 | + }, |
| 197 | + |
| 198 | + { |
| 199 | + check = function(player, status, vars) |
| 200 | + return status == xi.questStatus.QUEST_ACCEPTED and vars.Prog == 1 |
| 201 | + end, |
| 202 | + |
| 203 | + [xi.zone.CASTLE_ZVAHL_KEEP_S] = |
| 204 | + { |
| 205 | + ['Rikke'] = |
| 206 | + { |
| 207 | + onTrade = function(player, npc, trade) |
| 208 | + return handleImpTrade(player, 1, trade) |
| 209 | + end, |
| 210 | + |
| 211 | + onTrigger = function(player, npc) |
| 212 | + return handleImpPuzzleTrigger(player, 1) |
| 213 | + end, |
| 214 | + }, |
| 215 | + |
| 216 | + ['Rakke'] = |
| 217 | + { |
| 218 | + onTrade = function(player, npc, trade) |
| 219 | + return handleImpTrade(player, 2, trade) |
| 220 | + end, |
| 221 | + |
| 222 | + onTrigger = function(player, npc) |
| 223 | + return handleImpPuzzleTrigger(player, 2) |
| 224 | + end, |
| 225 | + }, |
| 226 | + |
| 227 | + ['Rokke'] = |
| 228 | + { |
| 229 | + onTrade = function(player, npc, trade) |
| 230 | + return handleImpTrade(player, 3, trade) |
| 231 | + end, |
| 232 | + |
| 233 | + onTrigger = function(player, npc) |
| 234 | + return handleImpPuzzleTrigger(player, 3) |
| 235 | + end, |
| 236 | + }, |
| 237 | + |
| 238 | + onEventFinish = |
| 239 | + { |
| 240 | + [12] = function(player, csid, option, npc) |
| 241 | + if quest:getVar(player, 'TradeImp') == 1 and quest:getVar(player, 'TradeSuccess') == 1 then |
| 242 | + quest:setVar(player, 'Prog', 2) |
| 243 | + end |
| 244 | + end, |
| 245 | + |
| 246 | + [13] = function(player, csid, option, npc) |
| 247 | + if quest:getVar(player, 'TradeImp') == 2 and quest:getVar(player, 'TradeSuccess') == 1 then |
| 248 | + quest:setVar(player, 'Prog', 2) |
| 249 | + end |
| 250 | + end, |
| 251 | + |
| 252 | + [14] = function(player, csid, option, npc) |
| 253 | + if quest:getVar(player, 'TradeImp') == 3 and quest:getVar(player, 'TradeSuccess') == 1 then |
| 254 | + quest:setVar(player, 'Prog', 2) |
| 255 | + end |
| 256 | + end, |
| 257 | + }, |
| 258 | + }, |
| 259 | + }, |
| 260 | + |
| 261 | + { |
| 262 | + check = function(player, status, vars) |
| 263 | + return status == xi.questStatus.QUEST_ACCEPTED and vars.Prog == 2 |
| 264 | + end, |
| 265 | + |
| 266 | + [xi.zone.CASTLE_ZVAHL_KEEP_S] = |
| 267 | + { |
| 268 | + ['Rikke'] = |
| 269 | + { |
| 270 | + onTrigger = function(player, npc) |
| 271 | + return handleSolvedImpTrigger(1) |
| 272 | + end, |
| 273 | + }, |
| 274 | + |
| 275 | + ['Rakke'] = |
| 276 | + { |
| 277 | + onTrigger = function(player, npc) |
| 278 | + return handleSolvedImpTrigger(2) |
| 279 | + end, |
| 280 | + }, |
| 281 | + |
| 282 | + ['Rokke'] = |
| 283 | + { |
| 284 | + onTrigger = function(player, npc) |
| 285 | + return handleSolvedImpTrigger(3) |
| 286 | + end, |
| 287 | + }, |
| 288 | + |
| 289 | + ['qm'] = quest:progressEvent(15), |
| 290 | + |
| 291 | + onEventFinish = |
| 292 | + { |
| 293 | + [15] = function(player, csid, option, npc) |
| 294 | + quest:setVar(player, 'Prog', 3) |
| 295 | + end, |
| 296 | + }, |
| 297 | + }, |
| 298 | + }, |
| 299 | + |
| 300 | + { |
| 301 | + check = function(player, status, vars) |
| 302 | + return status == xi.questStatus.QUEST_ACCEPTED and vars.Prog == 3 |
| 303 | + end, |
| 304 | + |
| 305 | + [xi.zone.CASTLE_ZVAHL_KEEP_S] = |
| 306 | + { |
| 307 | + ['Displaced_Block'] = quest:progressEvent(16), |
| 308 | + |
| 309 | + onEventFinish = |
| 310 | + { |
| 311 | + [16] = function(player, csid, option, npc) |
| 312 | + quest:complete(player) |
| 313 | + end, |
| 314 | + }, |
| 315 | + }, |
| 316 | + }, |
| 317 | +} |
| 318 | + |
| 319 | +return quest |
0 commit comments