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.
332 lines
13 KiB
Lua
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
|