landsandboat/scripts/missions/windurst/2_2_A_Testing_Time.lua
Corey Sotiropoulos 4995c0efce
Adjust time use in scripts
Switch day checks to VanadielUniqueDay (a count of days since epoch).
VanadielDayOfTheYear is almost never the right function to use.
Use Vana'diel timestamp and time enums in some places instead of trying
to calculate how much time has passed by storing a bunch of variables.
2025-05-01 15:01:49 -04:00

332 lines
13 KiB
Lua

-----------------------------------
-- A Testing Time
-- Windurst M2-2
-----------------------------------
-- !addmission 2 4
-- Gate Guards
-- Rakoh Buuma - !pos 106 -5 -23 241
-- Mokyokyo - !pos -55 -8 227 238
-- Janshura-Rashura - !pos -227 -8 184 240
-- Zokima-Rokima - !pos 0 -16 124 239
--
-- Moreno-Toeno - !pos 169 -1.25 159 238
-----------------------------------
local mission = Mission:new(xi.mission.log_id.WINDURST, xi.mission.id.windurst.A_TESTING_TIME)
mission.reward =
{
rankPoints = 300,
}
local handleAcceptMission = function(player, csid, option, npc)
if option == 4 then
mission:begin(player)
player:setMissionStatus(mission.areaId, 1)
player:messageSpecial(zones[player:getZoneID()].text.YOU_ACCEPT_THE_MISSION)
end
end
local killCounter = function(mob, player, optParams)
local testVar = mission:getVar(player, 'KillCount')
mission:setVar(player, 'KillCount', testVar + 1)
end
local assessment = function(player, npc)
local currentTime = VanadielTime()
local endTime = mission:getVar(player, 'EndTime')
local killCount = mission:getVar(player, 'KillCount')
local completed = player:hasCompletedMission(mission.areaId, mission.missionId)
-- player took too long to speak under requirements in time, so they fail mission
if currentTime > endTime then
return mission:progressEvent(202)
end
-- player hasn't waited long enough to be assessed
if currentTime < endTime - xi.vanaTime.HOUR then
local hoursRemaining = math.ceil((endTime - currentTime) / xi.vanaTime.HOUR)
if completed then
return mission:progressEvent(204, 0, 0, 0, 0, 0, VanadielHour(), hoursRemaining, 0)
else
return mission:progressEvent(183, 0, VanadielHour(), hoursRemaining)
end
end
-- handle the events for first-time doing the mission
if not completed then
local event = completed and 208 or 198
if killCount >= 35 then
event = completed and 206 or 201
elseif killCount >= 30 then
event = completed and 209 or 200
elseif not completed and killCount >= 19 then
event = 199
end
return mission:progressEvent(event, 0, VanadielHour(), 1, killCount)
end
end
local failMission = function(player, csid, option, npc)
mission:setVar(player, 'EndTime', 0)
mission:setVar(player, 'KillCount', 0)
player:delKeyItem(xi.ki.CREATURE_COUNTER_MAGIC_DOLL)
player:delMission(mission.areaId, mission.missionId)
end
local clearMission = function(player, csid, option, npc)
if mission:complete(player) then
player:delKeyItem(xi.ki.CREATURE_COUNTER_MAGIC_DOLL)
end
end
mission.sections =
{
-- Player is offered mission from a gate guard. Note that retail will have the
-- player be presented with the mission selection menu, choose, accept, and then
-- start the events below, where you accept it again.
-- Choosing to keep the existing flow we had already.
{
check = function(player, currentMission)
return currentMission == xi.mission.id.nation.NONE and
player:getNation() == mission.areaId and
not player:hasCompletedMission(mission.areaId, mission.missionId)
end,
[xi.zone.PORT_WINDURST] =
{
onEventFinish =
{
[78] = handleAcceptMission,
},
},
[xi.zone.WINDURST_WALLS] =
{
onEventFinish =
{
[93] = handleAcceptMission,
},
},
[xi.zone.WINDURST_WATERS] =
{
onEventFinish =
{
[111] = handleAcceptMission,
},
},
[xi.zone.WINDURST_WOODS] =
{
onEventFinish =
{
[114] = handleAcceptMission,
},
},
},
-- Mission has been accepted, these NPCs dialogue does not change during mission
{
check = function(player, currentMission)
return currentMission == mission.missionId
end,
[xi.zone.PORT_WINDURST] =
{
['Janshura-Rashura'] = mission:event(133),
['Nine_of_Clubs'] = mission:event(134),
['Puo_Rhen'] = mission:event(136),
['Ten_of_Clubs'] = mission:event(135),
},
[xi.zone.WINDURST_WALLS] =
{
['Chawo_Shipeynyo'] = mission:event(130),
['Keo-Koruo'] = mission:event(128),
['Pakke-Pokke'] = mission:event(129),
['Zokima-Rokima'] = mission:event(127),
},
[xi.zone.WINDURST_WATERS] =
{
['Akkeke'] = mission:event(190),
['Chomoro-Kyotoro'] = mission:event(195),
['Dagoza-Beruza'] = mission:event(178),
['Foi-Mui'] = mission:event(193),
['Fuepepe'] = mission:event(186),
['Kirarara'] = mission:event(188),
['Koko_Lihzeh'] = mission:event(191),
['Mashuu-Ajuu'] = mission:event(192),
['Mimomo'] = mission:event(196),
['Mokyokyo'] = mission:event(177),
['Paku-Nakku'] = mission:event(194),
['Panna-Donna'] = mission:event(179),
['Pechiru-Mashiru'] = mission:event(185),
['Rukuku'] = mission:event(189),
['Tauwawa'] = mission:event(187),
['Ten_of_Hearts'] = mission:event(180),
},
[xi.zone.WINDURST_WOODS] =
{
['Miiri-Wohri'] = mission:event(474),
['Rakoh_Buuma'] = mission:event(473),
['Sola_Jaab'] = mission:event(475),
['Tih_Pikeh'] = mission:event(476),
},
},
-- Talk to Moreno-Toeno (inside the Aurastery) at Windurst Waters, North (L-6)
{
check = function(player, currentMission, missionStatus)
return currentMission == mission.missionId and missionStatus == 1
end,
[xi.zone.WINDURST_WATERS] =
{
['Moreno-Toeno'] =
{
onTrigger = function(player, npc)
local completed = player:hasCompletedMission(mission.areaId, mission.missionId)
if not completed then
return mission:progressEvent(182) -- first time
elseif completed then
return mission:progressEvent(687) -- repeating
end
end,
},
onEventFinish =
{
[182] = function(player, csid, option, npc)
if option == 2 then
player:setMissionStatus(mission.areaId, 2)
npcUtil.giveKeyItem(player, xi.ki.CREATURE_COUNTER_MAGIC_DOLL)
mission:setVar(player, 'EndTime', VanadielTime() + xi.vanaTime.DAY)
end
end,
[687] = function(player, csid, option, npc)
if option == 2 then
player:setMissionStatus(mission.areaId, 2)
npcUtil.giveKeyItem(player, xi.ki.CREATURE_COUNTER_MAGIC_DOLL)
mission:setVar(player, 'EndTime', VanadielTime() + (2 * xi.vanaTime.DAY))
end
end,
},
},
},
-- Kill Tahrongi Canyon mobs if first time doing mission
{
check = function(player, currentMission, missionStatus)
return currentMission == mission.missionId and missionStatus == 2 and
not player:hasCompletedMission(mission.areaId, mission.missionId)
end,
[xi.zone.TAHRONGI_CANYON] =
{
['Air_Elemental'] = { onMobDeath = killCounter, },
['Akbaba'] = { onMobDeath = killCounter, },
['Barghest'] = { onMobDeath = killCounter, },
['Canyon_Crawler'] = { onMobDeath = killCounter, },
['Canyon_Rarab'] = { onMobDeath = killCounter, },
['Earth_Elemental'] = { onMobDeath = killCounter, },
['Goblin_Ambusher'] = { onMobDeath = killCounter, },
['Goblin_Archaeologist'] = { onMobDeath = killCounter, },
['Goblin_Digger'] = { onMobDeath = killCounter, },
['Goblin_Thug'] = { onMobDeath = killCounter, },
['Goblin_Tinkerer'] = { onMobDeath = killCounter, },
['Goblin_Weaver'] = { onMobDeath = killCounter, },
['Grenade'] = { onMobDeath = killCounter, },
['Habrok'] = { onMobDeath = killCounter, },
['Herbage_Hunter'] = { onMobDeath = killCounter, },
['Killer_Bee'] = { onMobDeath = killCounter, },
['Poltergeist'] = { onMobDeath = killCounter, },
['Pygmaioi'] = { onMobDeath = killCounter, },
['Serpopard_Ishtar'] = { onMobDeath = killCounter, },
['Skeleton_Sorcerer'] = { onMobDeath = killCounter, },
['Skeleton_Warrior'] = { onMobDeath = killCounter, },
['Strolling_Sapling'] = { onMobDeath = killCounter, },
['Wild_Dhalmel'] = { onMobDeath = killCounter, },
['Yagudo_Acolyte'] = { onMobDeath = killCounter, },
['Yagudo_Initiate'] = { onMobDeath = killCounter, },
['Yagudo_Mendicant'] = { onMobDeath = killCounter, },
['Yagudo_Persecutor'] = { onMobDeath = killCounter, },
['Yagudo_Piper'] = { onMobDeath = killCounter, },
['Yagudo_Scribe'] = { onMobDeath = killCounter, },
['Yara_Ma_Yha_Who'] = { onMobDeath = killCounter, },
},
},
-- Kill Buburimu Peninsula mobs if repeating mission
{
check = function(player, currentMission, missionStatus)
return currentMission == mission.missionId and missionStatus == 2 and
player:hasCompletedMission(mission.areaId, mission.missionId)
end,
[xi.zone.BUBURIMU_PENINSULA] =
{
['Air_Elemental'] = { onMobDeath = killCounter, },
['Backoo'] = { onMobDeath = killCounter, },
['Buburimboo'] = { onMobDeath = killCounter, },
['Bull_Dhalmel'] = { onMobDeath = killCounter, },
['Carnivorous_Crawler'] = { onMobDeath = killCounter, },
['Ghoul'] = { onMobDeath = killCounter, },
['Goblin_Ambusher'] = { onMobDeath = killCounter, },
['Goblin_Bounty_Hunter'] = { onMobDeath = killCounter, },
['Goblin_Butcher'] = { onMobDeath = killCounter, },
['Goblin_Gambler'] = { onMobDeath = killCounter, },
['Goblin_Leecher'] = { onMobDeath = killCounter, },
['Goblin_Mugger'] = { onMobDeath = killCounter, },
['Goblin_Tinkerer'] = { onMobDeath = killCounter, },
['Helldiver'] = { onMobDeath = killCounter, },
['Might_Rarab'] = { onMobDeath = killCounter, },
['Poison_Leech'] = { onMobDeath = killCounter, },
['Shoal_Pugil'] = { onMobDeath = killCounter, },
['Snipper'] = { onMobDeath = killCounter, },
['Sylvestre'] = { onMobDeath = killCounter, },
['Wake_Warder_Wanda'] = { onMobDeath = killCounter, },
['Water_Elemental'] = { onMobDeath = killCounter, },
['Will-o-the-Wisp'] = { onMobDeath = killCounter, },
['Zombie'] = { onMobDeath = killCounter, },
['Zu'] = { onMobDeath = killCounter, },
},
},
-- Speaking to Moreno-Toeno afterwards to be assessed.
{
check = function(player, currentMission, missionStatus)
return currentMission == mission.missionId and missionStatus == 2
end,
[xi.zone.WINDURST_WATERS] =
{
['Moreno-Toeno'] =
{
onTrigger = function(player, npc)
return assessment(player, npc)
end,
},
onEventFinish =
{
[198] = failMission,
[199] = failMission,
[202] = failMission,
[208] = failMission,
[200] = clearMission,
[201] = clearMission,
[206] = clearMission,
[209] = clearMission,
},
},
},
}
return mission