Skip to content

Commit

Permalink
[AMK, Lua] Mission 13 puzzle 1 - Beaucedine Glacier runaround (#5045)
Browse files Browse the repository at this point in the history
* Add beauc glac puzzle npc logic

Structure for cutscenes handled by lonely evergreen and goblin grenadier, as well as the
structure of the pips.

* puzzle pips complete, map bug fixed

The cutscene event for the goblin grenadier requires two sets of args, first is for the hint and win/lose mechanic, the second
from the eventUpdate section is to relabel an pips on the map if you wanted to.  Setting the pip args to 0 makes it so the
map isn't changed accidentally
  • Loading branch information
Flibe-XI authored Jan 31, 2024
1 parent 45ad07b commit 2f71f2e
Show file tree
Hide file tree
Showing 5 changed files with 425 additions and 12 deletions.
345 changes: 338 additions & 7 deletions scripts/missions/amk/13_A_Challenge_You_Could_Be_a_Winner.lua
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,13 @@
-- A Challenge! You Could Be a Winner
-- A Moogle Kupo d'Etat M13
-- !addmission 10 12
-- Inconspicuous Door : !pos -15 1.300 68 244
-- Shadowy Pillar : !pos 374 -12 -15
-- Lonely Evergreen : !pos -162 -80 178
-- Goblin Grenadier : !pos -26 -59 -76
-----------------------------------
-- This mission can be repeated by losing the bncm battle in the subsequent mission
-- Therefore to remove possible conflicts, the mission progress will be handled
-- using a variable stored as a CharVar
-----------------------------------
require('scripts/globals/missions')
require('scripts/globals/interaction/mission')
Expand All @@ -17,28 +23,353 @@ mission.reward =

mission.sections =
{
-- Part 1: Castle Zvahl Baileys
{
check = function(player, currentMission, missionStatus, vars)
return currentMission == mission.missionId
return currentMission >= mission.missionId and
not player:hasKeyItem(xi.ki.GAUNTLET_CHALLENGE_KUPON)
end,

[xi.zone.UPPER_JEUNO] =
[xi.zone.CASTLE_ZVAHL_BAILEYS] =
{
['Inconspicuous_Door'] =
['Shadowy_Pillar'] =
{
onTrigger = function(player, npc)
return mission:progressEvent(10185)
return mission:progressEvent(100, 3)
end,
},

onEventFinish =
{
[10185] = function(player, csid, option, npc)
mission:complete(player)
[100] = function(player, csid, option, npc)
player:setCharVar('Mission[10][12]progress', 1)
end,
},
},
},

-- Part 2-a: Beaucedine Glacier
{
check = function(player, currentMission, missionStatus, vars)
return currentMission >= mission.missionId and
player:getCharVar('Mission[10][12]progress') == 1 and
not player:hasKeyItem(xi.ki.POCKET_MOGBOMB) and
not player:hasKeyItem(xi.ki.TRIVIA_CHALLENGE_KUPON) and
player:needToZone() == false
end,

[xi.zone.BEAUCEDINE_GLACIER] =
{
['Lonely_Evergreen'] =
{
onTrigger = function(player, npc)
return mission:progressEvent(504)
end,
},

onEventFinish =
{
[504] = function(player, csid, option, npc)
if option == 1 then
player:needToZone(true)
end
end,
}
},
},

-- Part 2-b: Beaucedine Glacier
{
check = function(player, currentMission, missionStatus, vars)
return currentMission >= mission.missionId and
player:getCharVar('Mission[10][12]progress') == 1 and
not player:hasKeyItem(xi.ki.POCKET_MOGBOMB) and
not player:hasKeyItem(xi.ki.TRIVIA_CHALLENGE_KUPON) and
player:needToZone() == true
end,

[xi.zone.BEAUCEDINE_GLACIER] =
{
['Lonely_Evergreen'] =
{
onTrigger = function(player, npc)
return mission:progressEvent(503)
end,
},

['Goblin_Grenadier'] =
{
onTrigger = function(player, npc)
local answer = player:getLocalVar('Mission[10][12]pipSet') - 1

if answer < 0 then
return mission:progressEvent(508, xi.ki.MAP_OF_THE_NORTHLANDS_AREA)
else
local today = VanadielDayOfTheWeek()
local tomorrow = (today + 1) % 8
local hintsUsed = player:getLocalVar('Mission[10][12]hintsUsed')

player:messageSpecial(zones[player:getZoneID()].text.GRENADIER_DAY_HINT, today, tomorrow)

return mission:progressEvent(
507,
hintsUsed + 2,
answer,
xi.ki.MAP_OF_THE_NORTHLANDS_AREA,
xi.ki.POCKET_MOGBOMB,
xi.ki.MAP_OF_THE_NORTHLANDS_AREA
)
end
end,
},

['Northwestern_Pip'] =
{
onTrigger = function(player, npc)
local pipSet = player:getLocalVar('Mission[10][12]pipSet') - 1
local pos = npc:getPos()
local element = xi.amk.helpers.pipSets[pipSet][1]

return mission:progressEvent(
510,
pos.x * 1000,
pos.z * 1000,
pos.y * 1000,
element,
xi.ki.MAP_OF_THE_NORTHLANDS_AREA
)
end,
},

['Western_Pip'] =
{
onTrigger = function(player, npc)
local pipSet = player:getLocalVar('Mission[10][12]pipSet') - 1
local pos = npc:getPos()
local element = xi.amk.helpers.pipSets[pipSet][2]

return mission:progressEvent(
511,
pos.x * 1000,
pos.z * 1000,
pos.y * 1000,
element,
xi.ki.MAP_OF_THE_NORTHLANDS_AREA
)
end,
},

['Southwestern_Pip'] =
{
onTrigger = function(player, npc)
local pipSet = player:getLocalVar('Mission[10][12]pipSet') - 1
local pos = npc:getPos()
local element = xi.amk.helpers.pipSets[pipSet][3]

return mission:progressEvent(
512,
pos.x * 1000,
pos.z * 1000,
pos.y * 1000,
element,
xi.ki.MAP_OF_THE_NORTHLANDS_AREA
)
end,
},

['Northeastern_Pip'] =
{
onTrigger = function(player, npc)
local pipSet = player:getLocalVar('Mission[10][12]pipSet') - 1
local pos = npc:getPos()
local element = xi.amk.helpers.pipSets[pipSet][4]

return mission:progressEvent(
513,
pos.x * 1000,
pos.z * 1000,
pos.y * 1000,
element,
xi.ki.MAP_OF_THE_NORTHLANDS_AREA
)
end,
},

['Eastern_Pip'] =
{
onTrigger = function(player, npc)
local pipSet = player:getLocalVar('Mission[10][12]pipSet') - 1
local pos = npc:getPos()
local element = xi.amk.helpers.pipSets[pipSet][5]

return mission:progressEvent(
514,
pos.x * 1000,
pos.z * 1000,
pos.y * 1000,
element,
xi.ki.MAP_OF_THE_NORTHLANDS_AREA
)
end,
},

['Southeastern_Pip'] =
{
onTrigger = function(player, npc)
local pipSet = player:getLocalVar('Mission[10][12]pipSet') - 1
local pos = npc:getPos()
local element = xi.amk.helpers.pipSets[pipSet][6]

return mission:progressEvent(
515,
pos.x * 1000,
pos.z * 1000,
pos.y * 1000,
element,
xi.ki.MAP_OF_THE_NORTHLANDS_AREA
)
end,
},

onEventUpdate =
{
[507] = function(player, csid, option, npc)
-- This updateEvent updates the markers on the map to track which pips have already been found,
-- and can alter what the map shows when a pip is checked. If not called here, the args
-- for hints used and answer get input as markers and erroneously show incorrect pips
-- All zeros = only show what have been found so far
player:updateEvent(0, 0, 0, 0, 0, 0)
end,
},

onEventFinish =
{
[507] = function(player, csid, option, npc)
if
option == 1 or -- Used first hint
option == 2 -- Used second hint
then
local hintsUsed = player:getLocalVar('Mission[10][12]hintsUsed')
player:setLocalVar('Mission[10][12]hintsUsed', hintsUsed + 1)
elseif option == 3 then
-- wrong answer, reset puzzle
player:needToZone(false)
-- elseif option == 4 then
-- Player chooses to exit the chat, or tries to get a third hint,
-- which doesn't exist. Two hints max
elseif
option == 5 or -- Correct answer, no hints used
option == 6 or -- Correct answer, one hint used
option == 7 -- Correct answer, two hints used
then
player:needToZone(false)
npcUtil.giveKeyItem(player, xi.ki.POCKET_MOGBOMB)

-- Add flee affect, base 5 minutes for no hints used, 3 for 1 hint, no flee for 2 hints
local fleeDuration =
{
[5] = 300,
[6] = 180,
}

if option == 5 or option == 6 then
player:addStatusEffect(xi.effect.FLEE, 100, 0, fleeDuration[option])
end
end
end,

[508] = function(player, csid, option, npc)
-- Pipset offset by 1 to account for saving 0 as a variable. When retrieving, subtract 1
player:setLocalVar('Mission[10][12]pipSet', math.random(1, 10)) -- range: 0 - 9
end,
},
},
},

-- Part 2-c: Beaucedine Glacier
{
check = function(player, currentMission, missionStatus, vars)
return currentMission >= mission.missionId and
player:getCharVar('Mission[10][12]progress') == 1 and
player:hasKeyItem(xi.ki.POCKET_MOGBOMB)
end,

[xi.zone.BEAUCEDINE_GLACIER] =
{
['Lonely_Evergreen'] =
{
onTrigger = function(player, npc)
return mission:progressEvent(502, xi.ki.POCKET_MOGBOMB, xi.ki.TRIVIA_CHALLENGE_KUPON)
end,
},

['Goblin_Grenadier'] =
{
onTrigger = function(player, npc)
-- Reminder to take mogbomb to lonely evergreen moogle
player:messageSpecial(zones[player:getZoneID()].text.GRENADIER_TAKE_PRIZE, xi.ki.POCKET_MOGBOMB)
end,
},

onEventFinish =
{
[502] = function(player, csid, option, npc)
player:delKeyItem(xi.ki.POCKET_MOGBOMB)
npcUtil.giveKeyItem(player, xi.ki.TRIVIA_CHALLENGE_KUPON)
player:setCharVar('Mission[10][12]progress', 2)
end,
},
},
},

-- Part 3: Xarcabard
{
check = function(player, currentMission, missionStatus, vars)
return currentMission == mission.missionId and
player:getCharVar('Mission[10][12]progress') == 2 and
player:hasKeyItem(xi.ki.TRIVIA_CHALLENGE_KUPON)
end,

[xi.zone.BEAUCEDINE_GLACIER] =
{
['Lonely_Evergreen'] =
{
onTrigger = function(player, npc)
-- Reminder text
return mission:progressEvent(501, xi.ki.TRIVIA_CHALLENGE_KUPON)
end,
},
},

[xi.zone.XARCABARD] =
{

},
},

-- Part 4: Castle Zvahl Baileys
{
check = function(player, currentMission, missionStatus, vars)
return currentMission == mission.missionId
end,

[xi.zone.CASTLE_ZVAHL_BAILEYS] =
{

},
},

-- Part 5: Castle Zvahl Keep
{
check = function(player, currentMission, missionStatus, vars)
return currentMission == mission.missionId
end,

[xi.zone.CASTLE_ZVAHL_KEEP] =
{

},
},
}

return mission
Loading

0 comments on commit 2f71f2e

Please sign in to comment.