Skip to content

Commit 959617c

Browse files
authored
Merge pull request #10013 from Aeshur/wotg-bastok-truthlies
[lua] Truth Lies Hid quest
2 parents c4bded0 + b9668c1 commit 959617c

3 files changed

Lines changed: 321 additions & 1 deletion

File tree

scripts/enum/item.lua

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7316,6 +7316,7 @@ xi.item =
73167316
CROCODILE_COLLAR = 16294,
73177317
VARIUS_TORQUE = 16295,
73187318
FOCUS_COLLAR = 16301,
7319+
SANCTUS_ROSARY = 16305,
73197320
SCHOLARS_PANTS = 16311,
73207321
IRON_RAM_BREECHES = 16312,
73217322
FOURTH_DIVISION_CUISSES = 16313,

scripts/globals/quests.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -764,7 +764,7 @@ xi.quest.id =
764764
SUCCOR_TO_THE_SIDHE = 55,
765765
THE_YOUNG_AND_THE_THREADLESS = 56,
766766
SON_AND_FATHER = 57,
767-
THE_TRUTH_LIES_HID = 58,
767+
THE_TRUTH_LIES_HID = 58, -- + Converted
768768
BONDS_OF_MYTHRIL = 59,
769769
CHASING_SHADOWS = 60, -- + Converted
770770
FACE_OF_THE_FUTURE = 61, -- + Converted
Lines changed: 319 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,319 @@
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

Comments
 (0)