1972 lines
91 KiB
Lua
1972 lines
91 KiB
Lua
-----------------------------------
|
|
-- Functions for Conquest system
|
|
-----------------------------------
|
|
require('scripts/globals/extravaganza')
|
|
require('scripts/globals/garrison')
|
|
require('scripts/globals/teleports')
|
|
require('scripts/globals/missions')
|
|
require('scripts/globals/npc_util')
|
|
-----------------------------------
|
|
xi = xi or {}
|
|
xi.conquest = xi.conquest or {}
|
|
|
|
-----------------------------------
|
|
-- (LOCAL) constants
|
|
-----------------------------------
|
|
|
|
local conquestConstants =
|
|
{
|
|
TALLY_START = 0,
|
|
TALLY_END = 1,
|
|
UPDATE = 2,
|
|
}
|
|
|
|
-----------------------------------
|
|
-- (GLOBAL) Signet
|
|
-----------------------------------
|
|
|
|
-- Bestow the nation's Signet.
|
|
xi.conquest.bestowSignet = function(player, pNation, pRank, mOffset)
|
|
local duration = (pRank + GetNationRank(pNation) + 3) * 3600
|
|
|
|
player:delStatusEffectsByFlag(xi.effectFlag.INFLUENCE, true)
|
|
player:addStatusEffect(xi.effect.SIGNET, { duration = duration, origin = player })
|
|
player:messageSpecial(mOffset + 1) -- 'You've received your nation's Signet!'
|
|
|
|
if player:getEminenceProgress(3367) then
|
|
xi.roe.onRecordTrigger(player, 3367) -- Complete Weekly Signet, brb objective. This might be able to move to a status effect trigger
|
|
end
|
|
end
|
|
|
|
-----------------------------------
|
|
-- (LOCAL) Expeditionary Forces
|
|
-----------------------------------
|
|
|
|
-- Keep in this order as it is necessary to mimic retail during the removal of the key items.
|
|
local exForceMenuData =
|
|
{
|
|
[xi.region.ZULKHEIM ] = { option = 0x20006, zone = xi.zone.VALKURM_DUNES, menuBit = 0x000040, lvl = 20, ki = xi.ki.ZULKHEIM_EF_INSIGNIA },
|
|
[xi.region.NORVALLEN ] = { option = 0x20007, zone = xi.zone.JUGNER_FOREST, menuBit = 0x000080, lvl = 25, ki = xi.ki.NORVALLEN_EF_INSIGNIA },
|
|
[xi.region.DERFLAND ] = { option = 0x20009, zone = xi.zone.PASHHOW_MARSHLANDS, menuBit = 0x000200, lvl = 25, ki = xi.ki.DERFLAND_EF_INSIGNIA },
|
|
[xi.region.KOLSHUSHU ] = { option = 0x2000B, zone = xi.zone.BUBURIMU_PENINSULA, menuBit = 0x000800, lvl = 20, ki = xi.ki.KOLSHUSHU_EF_INSIGNIA },
|
|
[xi.region.ARAGONEU ] = { option = 0x2000C, zone = xi.zone.MERIPHATAUD_MOUNTAINS, menuBit = 0x001000, lvl = 25, ki = xi.ki.ARAGONEU_EF_INSIGNIA },
|
|
[xi.region.FAUREGANDI ] = { option = 0x2000D, zone = xi.zone.BEAUCEDINE_GLACIER, menuBit = 0x002000, lvl = 35, ki = xi.ki.FAUREGANDI_EF_INSIGNIA },
|
|
[xi.region.VALDEAUNIA ] = { option = 0x2000E, zone = xi.zone.XARCABARD, menuBit = 0x004000, lvl = 40, ki = xi.ki.VALDEAUNIA_EF_INSIGNIA },
|
|
[xi.region.QUFIMISLAND ] = { option = 0x2000F, zone = xi.zone.QUFIM_ISLAND, menuBit = 0x008000, lvl = 25, ki = xi.ki.QUFIM_EF_INSIGNIA },
|
|
[xi.region.LITELOR ] = { option = 0x20010, zone = xi.zone.THE_SANCTUARY_OF_ZITAH, menuBit = 0x010000, lvl = 35, ki = xi.ki.LITELOR_EF_INSIGNIA },
|
|
[xi.region.KUZOTZ ] = { option = 0x20011, zone = xi.zone.EASTERN_ALTEPA_DESERT, menuBit = 0x020000, lvl = 40, ki = xi.ki.KUZOTZ_EF_INSIGNIA },
|
|
[xi.region.VOLLBOW ] = { option = 0x20012, zone = xi.zone.CAPE_TERIGGAN, menuBit = 0x040000, lvl = 65, ki = xi.ki.VOLLBOW_EF_INSIGNIA },
|
|
[xi.region.ELSHIMO_LOWLANDS] = { option = 0x20013, zone = xi.zone.YUHTUNGA_JUNGLE, menuBit = 0x080000, lvl = 35, ki = xi.ki.ELSHIMO_LOWLANDS_EF_INSIGNIA },
|
|
[xi.region.ELSHIMO_UPLANDS ] = { option = 0x20014, zone = xi.zone.YHOATOR_JUNGLE, menuBit = 0x100000, lvl = 45, ki = xi.ki.ELSHIMO_UPLANDS_EF_INSIGNIA },
|
|
}
|
|
|
|
local exForceGateGlyphTable =
|
|
{
|
|
-- [overseerNpcName] = glyphItemId
|
|
['Crying_Wind_IM' ] = xi.item.BASTOK_MINES_GLYPH,
|
|
['Rabid_Wolf_IM' ] = xi.item.BASTOK_MARKETS_GLYPH,
|
|
['Flying_Axe_IM' ] = xi.item.PORT_BASTOK_GLYPH,
|
|
['Achantere_TK' ] = xi.item.NORTH_SANDORIA_GLYPH,
|
|
['Aravoge_TK' ] = xi.item.WEST_SANDORIA_GLYPH,
|
|
['Arpevion_TK' ] = xi.item.EAST_SANDORIA_GLYPH,
|
|
['Harara_WW' ] = xi.item.WINDURST_WOODS_GLYPH,
|
|
['Milma-Hapilma_WW'] = xi.item.PORT_WINDURST_GLYPH,
|
|
['Puroiko-Maiko_WW'] = xi.item.WINDURST_WATERS_GLYPH,
|
|
}
|
|
|
|
local exForceCityGlyphTable =
|
|
{
|
|
-- [nation] = that nation's three glyphs
|
|
[xi.nation.SANDORIA] = { xi.item.NORTH_SANDORIA_GLYPH, xi.item.WEST_SANDORIA_GLYPH, xi.item.EAST_SANDORIA_GLYPH },
|
|
[xi.nation.BASTOK ] = { xi.item.BASTOK_MINES_GLYPH, xi.item.BASTOK_MARKETS_GLYPH, xi.item.PORT_BASTOK_GLYPH },
|
|
[xi.nation.WINDURST] = { xi.item.WINDURST_WOODS_GLYPH, xi.item.PORT_WINDURST_GLYPH, xi.item.WINDURST_WATERS_GLYPH },
|
|
}
|
|
|
|
local exForceNumberRequiredTable =
|
|
{
|
|
-- [Standing] = partySize
|
|
[0] = 4, -- No standing
|
|
[1] = 6,
|
|
[2] = 5,
|
|
[3] = 4,
|
|
}
|
|
|
|
-- CP awarded on collection, by count of participated regions the nation controls.
|
|
-- When looking at the wiki, the data appears to follow a cubic. Extrapolating that would put 13 to be 27,175 CP. This seems unrealistic.
|
|
-- Instead the data from https://ffxiclopedia.fandom.com/wiki/Talk:Expeditionary_Force is used as it is more conservative.
|
|
local exForceCPRewardTable =
|
|
{
|
|
-- [regionsControlled] = cp
|
|
[ 0] = 0,
|
|
[ 1] = 3000, -- Verified in capture
|
|
[ 2] = 4200, -- Verified in capture
|
|
[ 3] = 4680, -- +480 per region
|
|
[ 4] = 5160,
|
|
[ 5] = 5640,
|
|
[ 6] = 6120,
|
|
[ 7] = 6600,
|
|
[ 8] = 7080,
|
|
[ 9] = 7560,
|
|
[10] = 8040,
|
|
[11] = 8520,
|
|
[12] = 9000,
|
|
[13] = 9480,
|
|
}
|
|
|
|
-- Helper to parse region out of the exForceMenu data
|
|
local function getExForceRegion(option)
|
|
for regionId, data in pairs(exForceMenuData) do
|
|
if data.option == option then
|
|
return regionId
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Bitmask of every region this player can sign up for. 0 = the EF menu does not appear.
|
|
local function getExForceAvailable(player, npc, guardNation)
|
|
-- Only one of the nine gate guards can trigger this
|
|
if
|
|
exForceGateGlyphTable[npc:getName()] == nil or
|
|
player:getNation() ~= guardNation
|
|
then
|
|
return 0
|
|
end
|
|
|
|
local mask = 0
|
|
|
|
-- Setup the bit mask for all the available regions
|
|
-- The bit masks are stored in the exForceMenuData.
|
|
for regionId, data in pairs(exForceMenuData) do
|
|
local owner = GetRegionOwner(regionId)
|
|
|
|
-- Region is available if:
|
|
-- The player's nation does not own the region.
|
|
-- The player's ally does not own the region.
|
|
-- The player has visited the region's outpost.
|
|
if
|
|
owner ~= guardNation and
|
|
not xi.conquest.areAllies(guardNation, owner) and
|
|
player:hasVisitedZone(data.zone)
|
|
then
|
|
mask = bit.bor(mask, data.menuBit)
|
|
end
|
|
end
|
|
|
|
return mask
|
|
end
|
|
|
|
-- This is to display the warp information after getting the badge, quitting EF, or giving the CP reward.
|
|
local function getExForceReward(player, guardNation)
|
|
-- This is to catch instances where the player gets the badge and goes to a guard at another nation's embassy.
|
|
if player:getNation() ~= guardNation then
|
|
return 0
|
|
end
|
|
|
|
-- Only show menu if the player has the EF badge
|
|
local badge = player:getStatusEffect(xi.effect.EF_BADGE)
|
|
if badge == nil then
|
|
-- A paid reward is stashed and waiting
|
|
if player:getCharVar('[ExpForce]AwardCP') > 0 then
|
|
return 0x400
|
|
end
|
|
|
|
return 0
|
|
end
|
|
|
|
local region = exForceMenuData[badge:getPower()]
|
|
-- This is a guard. The starter regions exist in the client but were removed from Retail.
|
|
if region == nil then
|
|
return 0
|
|
end
|
|
|
|
-- regionRow 6-20 = eventOption (0x20006-0x20014) minus the 0x20000 base.
|
|
local regionRow = region.option - 0x20000
|
|
return 0x80000000 + bit.lshift(regionRow, 5)
|
|
end
|
|
|
|
-- Validate the sign-up party.
|
|
-- Returns the overseer result code for the first failed check (1-4), or 0 if every check passes.
|
|
local function exForceValidateSignup(player, guardNation, minLevel, numRequired)
|
|
-- Get all party members currently in zone for the check
|
|
local zoneId = player:getZoneID()
|
|
local inZone = {}
|
|
for _, member in pairs(player:getParty()) do
|
|
if member:getZoneID() == zoneId then
|
|
table.insert(inZone, member)
|
|
end
|
|
end
|
|
|
|
-- The checks are in this order and not grouped by party member to match the order of how retail checks
|
|
|
|
-- 1: not enough members present in the overseer's zone
|
|
if #inZone < numRequired then
|
|
return 1
|
|
end
|
|
|
|
-- 2: a party member is not a citizen of the overseer's nation
|
|
for _, member in ipairs(inZone) do
|
|
if member:getNation() ~= guardNation then
|
|
return 2
|
|
end
|
|
end
|
|
|
|
-- 3: a member is below the Conquest rank requirement
|
|
for _, member in ipairs(inZone) do
|
|
if member:getRank(guardNation) < 3 then
|
|
return 3
|
|
end
|
|
end
|
|
|
|
-- 4: a member is below the region's minimum level
|
|
for _, member in ipairs(inZone) do
|
|
if member:getMainLvl() < minLevel then
|
|
return 4
|
|
end
|
|
end
|
|
|
|
return 0
|
|
end
|
|
|
|
-----------------------------------
|
|
-- (LOCAL) outposts
|
|
-----------------------------------
|
|
|
|
local outposts =
|
|
{
|
|
[xi.region.RONFAURE] = { zone = xi.zone.WEST_RONFAURE, ki = xi.ki.RONFAURE_SUPPLIES, cp = 10, lvl = 10, fee = 100 },
|
|
[xi.region.ZULKHEIM] = { zone = xi.zone.VALKURM_DUNES, ki = xi.ki.ZULKHEIM_SUPPLIES, cp = 30, lvl = 10, fee = 100 },
|
|
[xi.region.NORVALLEN] = { zone = xi.zone.JUGNER_FOREST, ki = xi.ki.NORVALLEN_SUPPLIES, cp = 40, lvl = 15, fee = 150 },
|
|
[xi.region.GUSTABERG] = { zone = xi.zone.NORTH_GUSTABERG, ki = xi.ki.GUSTABERG_SUPPLIES, cp = 10, lvl = 10, fee = 100 },
|
|
[xi.region.DERFLAND] = { zone = xi.zone.PASHHOW_MARSHLANDS, ki = xi.ki.DERFLAND_SUPPLIES, cp = 40, lvl = 15, fee = 150 },
|
|
[xi.region.SARUTABARUTA] = { zone = xi.zone.WEST_SARUTABARUTA, ki = xi.ki.SARUTABARUTA_SUPPLIES, cp = 10, lvl = 10, fee = 100 },
|
|
[xi.region.KOLSHUSHU] = { zone = xi.zone.BUBURIMU_PENINSULA, ki = xi.ki.KOLSHUSHU_SUPPLIES, cp = 40, lvl = 10, fee = 100 },
|
|
[xi.region.ARAGONEU] = { zone = xi.zone.MERIPHATAUD_MOUNTAINS, ki = xi.ki.ARAGONEU_SUPPLIES, cp = 40, lvl = 15, fee = 150 },
|
|
[xi.region.FAUREGANDI] = { zone = xi.zone.BEAUCEDINE_GLACIER, ki = xi.ki.FAUREGANDI_SUPPLIES, cp = 70, lvl = 35, fee = 350 },
|
|
[xi.region.VALDEAUNIA] = { zone = xi.zone.XARCABARD, ki = xi.ki.VALDEAUNIA_SUPPLIES, cp = 50, lvl = 40, fee = 400 },
|
|
[xi.region.QUFIMISLAND] = { zone = xi.zone.QUFIM_ISLAND, ki = xi.ki.QUFIM_SUPPLIES, cp = 60, lvl = 15, fee = 150 },
|
|
[xi.region.LITELOR] = { zone = xi.zone.THE_SANCTUARY_OF_ZITAH, ki = xi.ki.LITELOR_SUPPLIES, cp = 40, lvl = 25, fee = 250 },
|
|
[xi.region.KUZOTZ] = { zone = xi.zone.EASTERN_ALTEPA_DESERT, ki = xi.ki.KUZOTZ_SUPPLIES, cp = 70, lvl = 30, fee = 300 },
|
|
[xi.region.VOLLBOW] = { zone = xi.zone.CAPE_TERIGGAN, ki = xi.ki.VOLLBOW_SUPPLIES, cp = 70, lvl = 50, fee = 500 },
|
|
[xi.region.ELSHIMO_LOWLANDS] = { zone = xi.zone.YUHTUNGA_JUNGLE, ki = xi.ki.ELSHIMO_LOWLANDS_SUPPLIES, cp = 70, lvl = 25, fee = 250 },
|
|
[xi.region.ELSHIMO_UPLANDS] = { zone = xi.zone.YHOATOR_JUNGLE, ki = xi.ki.ELSHIMO_UPLANDS_SUPPLIES, cp = 70, lvl = 35, fee = 350 },
|
|
[xi.region.TULIA] = { zone = xi.zone.RUAUN_GARDENS, cp = 0, lvl = 70, fee = 500 },
|
|
[xi.region.MOVALPOLOS] = { zone = xi.zone.OLDTON_MOVALPOLOS, cp = 40, lvl = 25, fee = 250 },
|
|
[xi.region.TAVNAZIANARCH] = { zone = xi.zone.LUFAISE_MEADOWS, ki = xi.ki.TAVNAZIAN_ARCHIPELAGO_SUPPLIES, cp = 70, lvl = 30, fee = 300 },
|
|
}
|
|
|
|
local function hasOutpost(player, region)
|
|
local hasOP = player:hasTeleport(player:getNation(), region + 5)
|
|
|
|
if not hasOP then
|
|
if xi.settings.main.UNLOCK_OUTPOST_WARPS == 2 then
|
|
hasOP = true
|
|
elseif xi.settings.main.UNLOCK_OUTPOST_WARPS == 1 then
|
|
hasOP = region <= xi.region.ELSHIMO_UPLANDS
|
|
end
|
|
end
|
|
|
|
return hasOP
|
|
end
|
|
|
|
local function setHomepointFee(player, guardNation)
|
|
local pNation = player:getNation()
|
|
local fee = 0
|
|
|
|
if
|
|
pNation ~= guardNation and
|
|
not xi.conquest.areAllies(pNation, guardNation)
|
|
then
|
|
local rank = player:getRank(player:getNation())
|
|
|
|
if rank <= 5 then
|
|
fee = 100 * math.pow(2, rank - 1)
|
|
else
|
|
fee = 800 * rank - 2400
|
|
end
|
|
end
|
|
|
|
return fee
|
|
end
|
|
|
|
local function getRegionsMask(nation)
|
|
local mask = 0
|
|
|
|
for region = xi.region.RONFAURE, xi.region.TAVNAZIANARCH do
|
|
if GetRegionOwner(region) == nation then
|
|
mask = bit.bor(mask, bit.lshift(1, region + 5)) -- Region bits start at 5th bit
|
|
end
|
|
end
|
|
|
|
return mask
|
|
end
|
|
|
|
local function getAllowedTeleports(player, nation)
|
|
local allowedTeleports = 0x3F40001F -- All outposts set (0 indicates allowed)
|
|
|
|
if xi.settings.main.UNLOCK_OUTPOST_WARPS == 2 then
|
|
return allowedTeleports -- Allow all outposts
|
|
elseif xi.settings.main.UNLOCK_OUTPOST_WARPS == 1 then
|
|
return 0x3FE0001F -- Allow all outposts except for Tulia and Tavnazia
|
|
end
|
|
|
|
for region = xi.region.RONFAURE, xi.region.TAVNAZIANARCH do
|
|
if not xi.conquest.canTeleportToOutpost(player, region) then
|
|
allowedTeleports = bit.bor(allowedTeleports, bit.lshift(1, region + 5)) -- Region bits start at 5th bit
|
|
end
|
|
end
|
|
|
|
return allowedTeleports
|
|
end
|
|
|
|
-----------------------------------
|
|
-- (LOCAL) supply runs
|
|
-----------------------------------
|
|
|
|
-- produce supply quest mask for the nation based on current conquest standings
|
|
local function suppliesAvailableBitmask(player, nation)
|
|
local mask = 0x7F00001F
|
|
|
|
if player:getCharVar('supplyQuest_started') == VanadielUniqueDay() then
|
|
mask = 0xFFFFFFFF -- Need to wait 1 vanadiel day
|
|
end
|
|
|
|
for k, v in pairs(outposts) do
|
|
if v.ki and player:hasKeyItem(v.ki) then
|
|
mask = -1
|
|
break
|
|
end
|
|
end
|
|
|
|
if mask ~= -1 and mask ~= 0xFFFFFFFF then
|
|
for i = 0, 18 do
|
|
if
|
|
GetRegionOwner(i) ~= nation or
|
|
i == 16 or
|
|
i == 17 or
|
|
(
|
|
i == 18 and
|
|
not player:hasCompletedMission(xi.mission.log_id.COP, xi.mission.id.cop.DARKNESS_NAMED)
|
|
)
|
|
then
|
|
mask = mask + 2^(i + 5)
|
|
end
|
|
end
|
|
end
|
|
|
|
return mask
|
|
end
|
|
|
|
local function areSuppliesRotten(player, npc, guardType)
|
|
local fresh = player:getCharVar('supplyQuest_fresh')
|
|
local region = player:getCharVar('supplyQuest_region')
|
|
local rotten = false
|
|
local text = zones[player:getZoneID()].text
|
|
|
|
if region > 0 and fresh <= GetSystemTime() then
|
|
rotten = true
|
|
end
|
|
|
|
if rotten then
|
|
if guardType <= xi.conquest.guard.FOREIGN then
|
|
player:showText(npc, text.CONQUEST + 40) -- 'We will dispose of those unusable supplies.'
|
|
else
|
|
player:showText(npc, text.CONQUEST - 1) -- 'Hmm... These supplies you have brought us are too old to be of any use.'
|
|
end
|
|
|
|
local ki = outposts[region].ki
|
|
|
|
player:delKeyItem(ki)
|
|
player:messageSpecial(text.KEYITEM_LOST, ki)
|
|
player:setCharVar('supplyQuest_started', 0)
|
|
player:setCharVar('supplyQuest_region', 0)
|
|
player:setCharVar('supplyQuest_fresh', 0)
|
|
end
|
|
|
|
return rotten
|
|
end
|
|
|
|
local function canDeliverSupplies(player, guardNation, guardEvent, guardRegion)
|
|
local delivered = false
|
|
local region = player:getCharVar('supplyQuest_region')
|
|
|
|
if region == guardRegion and player:hasKeyItem(outposts[region].ki) then
|
|
delivered = true
|
|
player:startEvent(guardEvent, 16, 0, 0, 0, 1, 0, 0, 255) -- 'you have brought us supplies!'
|
|
end
|
|
|
|
return delivered
|
|
end
|
|
|
|
-----------------------------------
|
|
-- (LOCAL) overseers
|
|
-----------------------------------
|
|
|
|
local overseerOffsets =
|
|
{
|
|
[xi.region.RONFAURE] =
|
|
{
|
|
{ offset = 0, nation = xi.nation.SANDORIA }, -- Doladepaiton, R.K.
|
|
{ offset = 7, nation = xi.nation.SANDORIA }, -- Ballie, R.K.
|
|
{ offset = 3, nation = xi.nation.SANDORIA }, -- Flag
|
|
{ offset = 11, nation = xi.nation.SANDORIA }, -- Flag
|
|
{ offset = 1, nation = xi.nation.BASTOK }, -- Yoshihiro, I.M.
|
|
{ offset = 8, nation = xi.nation.BASTOK }, -- Molting Moth, I.M.
|
|
{ offset = 4, nation = xi.nation.BASTOK }, -- Flag
|
|
{ offset = 12, nation = xi.nation.BASTOK }, -- Flag
|
|
{ offset = 2, nation = xi.nation.WINDURST }, -- Kyanta-Pakyanta, W.W.
|
|
{ offset = 9, nation = xi.nation.WINDURST }, -- Tottoto, W.W.
|
|
{ offset = 5, nation = xi.nation.WINDURST }, -- Flag
|
|
{ offset = 13, nation = xi.nation.WINDURST }, -- Flag
|
|
{ offset = 6, nation = xi.nation.BEASTMEN }, -- Flag
|
|
{ offset = 14, nation = xi.nation.BEASTMEN }, -- Flag
|
|
{ offset = 10, nation = xi.nation.OTHER }, -- Harvetour
|
|
},
|
|
[xi.region.ZULKHEIM] =
|
|
{
|
|
{ offset = 0, nation = xi.nation.SANDORIA }, -- Quanteilleron, R.K.
|
|
{ offset = 7, nation = xi.nation.SANDORIA }, -- Prunilla, R.K.
|
|
{ offset = 3, nation = xi.nation.SANDORIA }, -- flag
|
|
{ offset = 11, nation = xi.nation.SANDORIA }, -- flag
|
|
{ offset = 1, nation = xi.nation.BASTOK }, -- Tsunashige, I.M.
|
|
{ offset = 8, nation = xi.nation.BASTOK }, -- Fighting Ant, I.M.
|
|
{ offset = 4, nation = xi.nation.BASTOK }, -- flag
|
|
{ offset = 12, nation = xi.nation.BASTOK }, -- flag
|
|
{ offset = 2, nation = xi.nation.WINDURST }, -- Nyata-Mobuta, W.W.
|
|
{ offset = 9, nation = xi.nation.WINDURST }, -- Tebubu, W.W.
|
|
{ offset = 5, nation = xi.nation.WINDURST }, -- flag
|
|
{ offset = 13, nation = xi.nation.WINDURST }, -- flag
|
|
{ offset = 6, nation = xi.nation.BEASTMEN }, -- flag
|
|
{ offset = 14, nation = xi.nation.BEASTMEN }, -- flag
|
|
{ offset = 10, nation = xi.nation.OTHER }, -- Medicine Axe
|
|
},
|
|
[xi.region.NORVALLEN] =
|
|
{
|
|
{ offset = 0, nation = xi.nation.SANDORIA }, -- Chaplion, R.K.
|
|
{ offset = 7, nation = xi.nation.SANDORIA }, -- Taumiale, R.K.
|
|
{ offset = 3, nation = xi.nation.SANDORIA }, -- flag
|
|
{ offset = 11, nation = xi.nation.SANDORIA }, -- flag
|
|
{ offset = 1, nation = xi.nation.BASTOK }, -- Takamoto, I.M.
|
|
{ offset = 8, nation = xi.nation.BASTOK }, -- Pure Heart, I.M.
|
|
{ offset = 4, nation = xi.nation.BASTOK }, -- flag
|
|
{ offset = 12, nation = xi.nation.BASTOK }, -- flag
|
|
{ offset = 2, nation = xi.nation.WINDURST }, -- Bubchu-Bibinchu, W.W.
|
|
{ offset = 9, nation = xi.nation.WINDURST }, -- Geruru, W.W.
|
|
{ offset = 5, nation = xi.nation.WINDURST }, -- flag
|
|
{ offset = 13, nation = xi.nation.WINDURST }, -- flag
|
|
{ offset = 6, nation = xi.nation.BEASTMEN }, -- flag
|
|
{ offset = 14, nation = xi.nation.BEASTMEN }, -- flag
|
|
{ offset = 10, nation = xi.nation.OTHER }, -- Mionie
|
|
},
|
|
[xi.region.GUSTABERG] =
|
|
{
|
|
{ offset = 0, nation = xi.nation.SANDORIA }, -- Ennigreaud, R.K.
|
|
{ offset = 7, nation = xi.nation.SANDORIA }, -- Quellebie, R.K.
|
|
{ offset = 3, nation = xi.nation.SANDORIA }, -- flag
|
|
{ offset = 11, nation = xi.nation.SANDORIA }, -- flag
|
|
{ offset = 1, nation = xi.nation.BASTOK }, -- Shigezane, I.M.
|
|
{ offset = 8, nation = xi.nation.BASTOK }, -- Heavy Fog, I.M.
|
|
{ offset = 4, nation = xi.nation.BASTOK }, -- flag
|
|
{ offset = 12, nation = xi.nation.BASTOK }, -- flag
|
|
{ offset = 2, nation = xi.nation.WINDURST }, -- Kuuwari-Aori, W.W.
|
|
{ offset = 9, nation = xi.nation.WINDURST }, -- Butsutsu, W.W.
|
|
{ offset = 5, nation = xi.nation.WINDURST }, -- flag
|
|
{ offset = 13, nation = xi.nation.WINDURST }, -- flag
|
|
{ offset = 6, nation = xi.nation.BEASTMEN }, -- flag
|
|
{ offset = 14, nation = xi.nation.BEASTMEN }, -- flag
|
|
{ offset = 10, nation = xi.nation.OTHER }, -- Kuleo
|
|
},
|
|
[xi.region.DERFLAND] =
|
|
{
|
|
{ offset = 0, nation = xi.nation.SANDORIA }, -- Mesachedeau, R.K.
|
|
{ offset = 7, nation = xi.nation.SANDORIA }, -- Ioupie, R.K.
|
|
{ offset = 3, nation = xi.nation.SANDORIA }, -- flag
|
|
{ offset = 11, nation = xi.nation.SANDORIA }, -- flag
|
|
{ offset = 1, nation = xi.nation.BASTOK }, -- Souun, I.M.
|
|
{ offset = 8, nation = xi.nation.BASTOK }, -- Sharp Tooth, I.M.
|
|
{ offset = 4, nation = xi.nation.BASTOK }, -- flag
|
|
{ offset = 12, nation = xi.nation.BASTOK }, -- flag
|
|
{ offset = 2, nation = xi.nation.WINDURST }, -- Mokto-Lankto, W.W.
|
|
{ offset = 9, nation = xi.nation.WINDURST }, -- Shikoko, W.W.
|
|
{ offset = 5, nation = xi.nation.WINDURST }, -- flag
|
|
{ offset = 13, nation = xi.nation.WINDURST }, -- flag
|
|
{ offset = 6, nation = xi.nation.BEASTMEN }, -- flag
|
|
{ offset = 14, nation = xi.nation.BEASTMEN }, -- flag
|
|
{ offset = 10, nation = xi.nation.OTHER }, -- Tahmasp
|
|
},
|
|
[xi.region.SARUTABARUTA] =
|
|
{
|
|
{ offset = 0, nation = xi.nation.SANDORIA }, -- Naguipeillont, R.K.
|
|
{ offset = 7, nation = xi.nation.SANDORIA }, -- Banege, R.K.
|
|
{ offset = 3, nation = xi.nation.SANDORIA }, -- flag
|
|
{ offset = 11, nation = xi.nation.SANDORIA }, -- flag
|
|
{ offset = 1, nation = xi.nation.BASTOK }, -- Ryokei, I.M.
|
|
{ offset = 8, nation = xi.nation.BASTOK }, -- Slow Axe, I.M.
|
|
{ offset = 4, nation = xi.nation.BASTOK }, -- flag
|
|
{ offset = 12, nation = xi.nation.BASTOK }, -- flag
|
|
{ offset = 2, nation = xi.nation.WINDURST }, -- Roshina-Kuleshuna, W.W.
|
|
{ offset = 9, nation = xi.nation.WINDURST }, -- Darumomo, W.W.
|
|
{ offset = 5, nation = xi.nation.WINDURST }, -- flag
|
|
{ offset = 13, nation = xi.nation.WINDURST }, -- flag
|
|
{ offset = 6, nation = xi.nation.BEASTMEN }, -- flag
|
|
{ offset = 14, nation = xi.nation.BEASTMEN }, -- flag
|
|
{ offset = 10, nation = xi.nation.OTHER }, -- Mahien-Uhien
|
|
},
|
|
[xi.region.KOLSHUSHU] =
|
|
{
|
|
{ offset = 0, nation = xi.nation.SANDORIA }, -- Bonbavour, R.K.
|
|
{ offset = 7, nation = xi.nation.SANDORIA }, -- Craigine, R.K.
|
|
{ offset = 3, nation = xi.nation.SANDORIA }, -- flag
|
|
{ offset = 11, nation = xi.nation.SANDORIA }, -- flag
|
|
{ offset = 1, nation = xi.nation.BASTOK }, -- Ishin, I.M.
|
|
{ offset = 8, nation = xi.nation.BASTOK }, -- Wise Turtle, I.M.
|
|
{ offset = 4, nation = xi.nation.BASTOK }, -- flag
|
|
{ offset = 12, nation = xi.nation.BASTOK }, -- flag
|
|
{ offset = 2, nation = xi.nation.WINDURST }, -- Ganemu-Punnemu, W.W.
|
|
{ offset = 9, nation = xi.nation.WINDURST }, -- Mashasha, W.W.
|
|
{ offset = 5, nation = xi.nation.WINDURST }, -- flag
|
|
{ offset = 13, nation = xi.nation.WINDURST }, -- flag
|
|
{ offset = 6, nation = xi.nation.BEASTMEN }, -- flag
|
|
{ offset = 14, nation = xi.nation.BEASTMEN }, -- flag
|
|
{ offset = 10, nation = xi.nation.OTHER }, -- Lobho Ukipturi
|
|
},
|
|
[xi.region.ARAGONEU] =
|
|
{
|
|
{ offset = 0, nation = xi.nation.SANDORIA }, -- Chegourt, R.K.
|
|
{ offset = 7, nation = xi.nation.SANDORIA }, -- Buliame, R.K.
|
|
{ offset = 3, nation = xi.nation.SANDORIA }, -- flag
|
|
{ offset = 11, nation = xi.nation.SANDORIA }, -- flag
|
|
{ offset = 1, nation = xi.nation.BASTOK }, -- Akane, I.M.
|
|
{ offset = 8, nation = xi.nation.BASTOK }, -- Three Steps, I.M.
|
|
{ offset = 4, nation = xi.nation.BASTOK }, -- flag
|
|
{ offset = 12, nation = xi.nation.BASTOK }, -- flag
|
|
{ offset = 2, nation = xi.nation.WINDURST }, -- Donmo-Boronmo, W.W.
|
|
{ offset = 9, nation = xi.nation.WINDURST }, -- Daruru, W.W.
|
|
{ offset = 5, nation = xi.nation.WINDURST }, -- flag
|
|
{ offset = 13, nation = xi.nation.WINDURST }, -- flag
|
|
{ offset = 6, nation = xi.nation.BEASTMEN }, -- flag
|
|
{ offset = 14, nation = xi.nation.BEASTMEN }, -- flag
|
|
{ offset = 10, nation = xi.nation.OTHER }, -- Mushosho
|
|
},
|
|
[xi.region.FAUREGANDI] =
|
|
{
|
|
{ offset = 0, nation = xi.nation.SANDORIA }, -- Parledaire, R.K.
|
|
{ offset = 7, nation = xi.nation.SANDORIA }, -- Leaufetie, R.K.
|
|
{ offset = 3, nation = xi.nation.SANDORIA }, -- flag
|
|
{ offset = 11, nation = xi.nation.SANDORIA }, -- flag
|
|
{ offset = 1, nation = xi.nation.BASTOK }, -- Akane, I.M.
|
|
{ offset = 8, nation = xi.nation.BASTOK }, -- Rattling Rain, I.M.
|
|
{ offset = 4, nation = xi.nation.BASTOK }, -- flag
|
|
{ offset = 12, nation = xi.nation.BASTOK }, -- flag
|
|
{ offset = 2, nation = xi.nation.WINDURST }, -- Ryunchi-Pauchi, W.W.
|
|
{ offset = 9, nation = xi.nation.WINDURST }, -- Chopapa, W.W.
|
|
{ offset = 5, nation = xi.nation.WINDURST }, -- flag
|
|
{ offset = 13, nation = xi.nation.WINDURST }, -- flag
|
|
{ offset = 6, nation = xi.nation.BEASTMEN }, -- flag
|
|
{ offset = 14, nation = xi.nation.BEASTMEN }, -- flag
|
|
{ offset = 10, nation = xi.nation.OTHER }, -- Gueriette
|
|
},
|
|
[xi.region.VALDEAUNIA] =
|
|
{
|
|
{ offset = 0, nation = xi.nation.SANDORIA }, -- Jeantelas, R.K.
|
|
{ offset = 7, nation = xi.nation.SANDORIA }, -- Pilcha, R.K.
|
|
{ offset = 3, nation = xi.nation.SANDORIA }, -- flag
|
|
{ offset = 11, nation = xi.nation.SANDORIA }, -- flag
|
|
{ offset = 1, nation = xi.nation.BASTOK }, -- Kaya, I.M.
|
|
{ offset = 8, nation = xi.nation.BASTOK }, -- Heavy Bear, I.M.
|
|
{ offset = 4, nation = xi.nation.BASTOK }, -- flag
|
|
{ offset = 12, nation = xi.nation.BASTOK }, -- flag
|
|
{ offset = 2, nation = xi.nation.WINDURST }, -- Magumo-Yagimo, W.W.
|
|
{ offset = 9, nation = xi.nation.WINDURST }, -- Tememe, W.W.
|
|
{ offset = 5, nation = xi.nation.WINDURST }, -- flag
|
|
{ offset = 13, nation = xi.nation.WINDURST }, -- flag
|
|
{ offset = 6, nation = xi.nation.BEASTMEN }, -- flag
|
|
{ offset = 14, nation = xi.nation.BEASTMEN }, -- flag
|
|
{ offset = 10, nation = xi.nation.OTHER }, -- Pelogrant
|
|
},
|
|
[xi.region.QUFIMISLAND] =
|
|
{
|
|
{ offset = 0, nation = xi.nation.SANDORIA }, -- Pitoire, R.K.
|
|
{ offset = 7, nation = xi.nation.SANDORIA }, -- Matica, R.K.
|
|
{ offset = 3, nation = xi.nation.SANDORIA }, -- flag
|
|
{ offset = 11, nation = xi.nation.SANDORIA }, -- flag
|
|
{ offset = 1, nation = xi.nation.BASTOK }, -- Sasa, I.M.
|
|
{ offset = 8, nation = xi.nation.BASTOK }, -- Singing Blade, I.M.
|
|
{ offset = 4, nation = xi.nation.BASTOK }, -- flag
|
|
{ offset = 12, nation = xi.nation.BASTOK }, -- flag
|
|
{ offset = 2, nation = xi.nation.WINDURST }, -- Tsonga-Hoponga, W.W.
|
|
{ offset = 9, nation = xi.nation.WINDURST }, -- Numumu, W.W.
|
|
{ offset = 5, nation = xi.nation.WINDURST }, -- flag
|
|
{ offset = 13, nation = xi.nation.WINDURST }, -- flag
|
|
{ offset = 6, nation = xi.nation.BEASTMEN }, -- flag
|
|
{ offset = 14, nation = xi.nation.BEASTMEN }, -- flag
|
|
{ offset = 10, nation = xi.nation.OTHER }, -- Jiwon
|
|
},
|
|
[xi.region.LITELOR] =
|
|
{
|
|
{ offset = 0, nation = xi.nation.SANDORIA }, -- Credaurion, R.K.
|
|
{ offset = 7, nation = xi.nation.SANDORIA }, -- Limion, R.K.
|
|
{ offset = 3, nation = xi.nation.SANDORIA }, -- flag
|
|
{ offset = 11, nation = xi.nation.SANDORIA }, -- flag
|
|
{ offset = 1, nation = xi.nation.BASTOK }, -- Calliope, I.M.
|
|
{ offset = 8, nation = xi.nation.BASTOK }, -- Dedden, I.M.
|
|
{ offset = 4, nation = xi.nation.BASTOK }, -- flag
|
|
{ offset = 12, nation = xi.nation.BASTOK }, -- flag
|
|
{ offset = 2, nation = xi.nation.WINDURST }, -- Ajimo-Majimo, W.W.
|
|
{ offset = 9, nation = xi.nation.WINDURST }, -- Ochocho, W.W.
|
|
{ offset = 5, nation = xi.nation.WINDURST }, -- flag
|
|
{ offset = 13, nation = xi.nation.WINDURST }, -- flag
|
|
{ offset = 6, nation = xi.nation.BEASTMEN }, -- flag
|
|
{ offset = 14, nation = xi.nation.BEASTMEN }, -- flag
|
|
{ offset = 10, nation = xi.nation.OTHER }, -- Kasim
|
|
},
|
|
[xi.region.KUZOTZ] =
|
|
{
|
|
{ offset = 0, nation = xi.nation.SANDORIA }, -- Eaulevisat, R.K.
|
|
{ offset = 7, nation = xi.nation.SANDORIA }, -- Laimeve, R.K.
|
|
{ offset = 3, nation = xi.nation.SANDORIA }, -- flag
|
|
{ offset = 11, nation = xi.nation.SANDORIA }, -- flag
|
|
{ offset = 1, nation = xi.nation.BASTOK }, -- Lindgard, I.M.
|
|
{ offset = 8, nation = xi.nation.BASTOK }, -- Daborn, I.M.
|
|
{ offset = 4, nation = xi.nation.BASTOK }, -- flag
|
|
{ offset = 12, nation = xi.nation.BASTOK }, -- flag
|
|
{ offset = 2, nation = xi.nation.WINDURST }, -- Variko-Njariko, W.W.
|
|
{ offset = 9, nation = xi.nation.WINDURST }, -- Sahgygy, W.W.
|
|
{ offset = 5, nation = xi.nation.WINDURST }, -- flag
|
|
{ offset = 13, nation = xi.nation.WINDURST }, -- flag
|
|
{ offset = 6, nation = xi.nation.BEASTMEN }, -- flag
|
|
{ offset = 14, nation = xi.nation.BEASTMEN }, -- flag
|
|
{ offset = 10, nation = xi.nation.OTHER }, -- Sowande
|
|
},
|
|
[xi.region.VOLLBOW] =
|
|
{
|
|
{ offset = 0, nation = xi.nation.SANDORIA }, -- Salimardi, R.K.
|
|
{ offset = 7, nation = xi.nation.SANDORIA }, -- Paise, R.K.
|
|
{ offset = 3, nation = xi.nation.SANDORIA }, -- flag
|
|
{ offset = 11, nation = xi.nation.SANDORIA }, -- flag
|
|
{ offset = 1, nation = xi.nation.BASTOK }, -- Sarmistha, I.M.
|
|
{ offset = 8, nation = xi.nation.BASTOK }, -- Dultwa, I.M.
|
|
{ offset = 4, nation = xi.nation.BASTOK }, -- flag
|
|
{ offset = 12, nation = xi.nation.BASTOK }, -- flag
|
|
{ offset = 2, nation = xi.nation.WINDURST }, -- Voranbo-Natanbo, W.W.
|
|
{ offset = 9, nation = xi.nation.WINDURST }, -- Orukeke, W.W.
|
|
{ offset = 5, nation = xi.nation.WINDURST }, -- flag
|
|
{ offset = 13, nation = xi.nation.WINDURST }, -- flag
|
|
{ offset = 6, nation = xi.nation.BEASTMEN }, -- flag
|
|
{ offset = 14, nation = xi.nation.BEASTMEN }, -- flag
|
|
{ offset = 10, nation = xi.nation.OTHER }, -- Bright Moon
|
|
},
|
|
[xi.region.ELSHIMO_LOWLANDS] =
|
|
{
|
|
{ offset = 0, nation = xi.nation.SANDORIA }, -- Zorchorevi, R.K.
|
|
{ offset = 7, nation = xi.nation.SANDORIA }, -- Mupia, R.K.
|
|
{ offset = 3, nation = xi.nation.SANDORIA }, -- flag
|
|
{ offset = 11, nation = xi.nation.SANDORIA }, -- flag
|
|
{ offset = 1, nation = xi.nation.BASTOK }, -- Mahol, I.M.
|
|
{ offset = 8, nation = xi.nation.BASTOK }, -- Bammiro, I.M.
|
|
{ offset = 4, nation = xi.nation.BASTOK }, -- flag
|
|
{ offset = 12, nation = xi.nation.BASTOK }, -- flag
|
|
{ offset = 2, nation = xi.nation.WINDURST }, -- Uphra-Kophra, W.W.
|
|
{ offset = 9, nation = xi.nation.WINDURST }, -- Richacha, W.W.
|
|
{ offset = 5, nation = xi.nation.WINDURST }, -- flag
|
|
{ offset = 13, nation = xi.nation.WINDURST }, -- flag
|
|
{ offset = 6, nation = xi.nation.BEASTMEN }, -- flag
|
|
{ offset = 14, nation = xi.nation.BEASTMEN }, -- flag
|
|
{ offset = 10, nation = xi.nation.OTHER }, -- Robino-Mobino
|
|
},
|
|
[xi.region.ELSHIMO_UPLANDS] =
|
|
{
|
|
{ offset = 0, nation = xi.nation.SANDORIA }, -- Ilieumort, R.K.
|
|
{ offset = 7, nation = xi.nation.SANDORIA }, -- Emila, R.K.
|
|
{ offset = 3, nation = xi.nation.SANDORIA }, -- flag
|
|
{ offset = 11, nation = xi.nation.SANDORIA }, -- flag
|
|
{ offset = 1, nation = xi.nation.BASTOK }, -- Mintoo, I.M.
|
|
{ offset = 8, nation = xi.nation.BASTOK }, -- Guddal, I.M.
|
|
{ offset = 4, nation = xi.nation.BASTOK }, -- flag
|
|
{ offset = 12, nation = xi.nation.BASTOK }, -- flag
|
|
{ offset = 2, nation = xi.nation.WINDURST }, -- Etaj-Pohtaj, W.W.
|
|
{ offset = 9, nation = xi.nation.WINDURST }, -- Ghantata, W.W.
|
|
{ offset = 5, nation = xi.nation.WINDURST }, -- flag
|
|
{ offset = 13, nation = xi.nation.WINDURST }, -- flag
|
|
{ offset = 6, nation = xi.nation.BEASTMEN }, -- flag
|
|
{ offset = 14, nation = xi.nation.BEASTMEN }, -- flag
|
|
{ offset = 10, nation = xi.nation.OTHER }, -- Mugha Dovajaiho
|
|
},
|
|
[xi.region.TULIA] =
|
|
{
|
|
{ offset = 0, nation = xi.nation.SANDORIA }, -- flag
|
|
{ offset = 1, nation = xi.nation.BASTOK }, -- flag
|
|
{ offset = 2, nation = xi.nation.WINDURST }, -- flag
|
|
{ offset = 3, nation = xi.nation.BEASTMEN }, -- flag
|
|
},
|
|
[xi.region.MOVALPOLOS] =
|
|
{
|
|
{ offset = 0, nation = xi.nation.SANDORIA }, -- flag
|
|
{ offset = 1, nation = xi.nation.BASTOK }, -- flag
|
|
{ offset = 2, nation = xi.nation.WINDURST }, -- flag
|
|
{ offset = 3, nation = xi.nation.BEASTMEN }, -- flag
|
|
{ offset = 4, nation = xi.nation.OTHER }, -- Bartabaq
|
|
},
|
|
[xi.region.TAVNAZIANARCH] =
|
|
{
|
|
{ offset = 0, nation = xi.nation.SANDORIA }, -- Jemmoquel, R.K.
|
|
{ offset = 7, nation = xi.nation.SANDORIA }, -- Chilaumme, R.K.
|
|
{ offset = 3, nation = xi.nation.SANDORIA }, -- flag
|
|
{ offset = 11, nation = xi.nation.SANDORIA }, -- flag
|
|
{ offset = 1, nation = xi.nation.BASTOK }, -- Yoram, I.M.
|
|
{ offset = 8, nation = xi.nation.BASTOK }, -- Ghost Talker, I.M.
|
|
{ offset = 4, nation = xi.nation.BASTOK }, -- flag
|
|
{ offset = 12, nation = xi.nation.BASTOK }, -- flag
|
|
{ offset = 2, nation = xi.nation.WINDURST }, -- Teldo-Moroldo, W.W.
|
|
{ offset = 9, nation = xi.nation.WINDURST }, -- Cotete, W.W.
|
|
{ offset = 5, nation = xi.nation.WINDURST }, -- flag
|
|
{ offset = 13, nation = xi.nation.WINDURST }, -- flag
|
|
{ offset = 6, nation = xi.nation.BEASTMEN }, -- flag
|
|
{ offset = 14, nation = xi.nation.BEASTMEN }, -- flag
|
|
{ offset = 10, nation = xi.nation.OTHER }, -- Jersey
|
|
},
|
|
}
|
|
|
|
local crystals =
|
|
{
|
|
[xi.item.FIRE_CRYSTAL ] = 12,
|
|
[xi.item.ICE_CRYSTAL ] = 12,
|
|
[xi.item.WIND_CRYSTAL ] = 12,
|
|
[xi.item.EARTH_CRYSTAL ] = 12,
|
|
[xi.item.LIGHTNING_CRYSTAL] = 12,
|
|
[xi.item.WATER_CRYSTAL ] = 12,
|
|
[xi.item.LIGHT_CRYSTAL ] = 16,
|
|
[xi.item.DARK_CRYSTAL ] = 16,
|
|
[xi.item.INFERNO_CRYSTAL ] = 12,
|
|
[xi.item.GLACIER_CRYSTAL ] = 12,
|
|
[xi.item.CYCLONE_CRYSTAL ] = 12,
|
|
[xi.item.TERRA_CRYSTAL ] = 12,
|
|
[xi.item.PLASMA_CRYSTAL ] = 12,
|
|
[xi.item.TORRENT_CRYSTAL ] = 12,
|
|
[xi.item.AURORA_CRYSTAL ] = 16,
|
|
[xi.item.TWILIGHT_CRYSTAL ] = 16,
|
|
}
|
|
|
|
local expRings =
|
|
{
|
|
[xi.item.CHARIOT_BAND] = { chargesWhenFull = 7, costPerCharge = 50 },
|
|
[xi.item.EMPRESS_BAND] = { chargesWhenFull = 7, costPerCharge = 100 },
|
|
[xi.item.EMPEROR_BAND] = { chargesWhenFull = 3, costPerCharge = 200 },
|
|
}
|
|
|
|
xi.conquest.toggleRegionalNPCs = function(zone)
|
|
-- Show/Hide regional NPCs
|
|
-- If there is a draw or a 1st place Alliance, those NPCs won't be available anywhere.
|
|
local id = zone:getID()
|
|
if
|
|
id == xi.zone.PORT_BASTOK or
|
|
id == xi.zone.SOUTHERN_SAN_DORIA or
|
|
id == xi.zone.WINDURST_WOODS
|
|
then
|
|
local regionalNPCNames =
|
|
{
|
|
'Nokkhi_Jinjahl',
|
|
'Ominous_Cloud',
|
|
'Valeriano',
|
|
'Mokop-Sankop',
|
|
'Cheh_Raihah',
|
|
'Nalta',
|
|
'Dahjal'
|
|
}
|
|
|
|
-- TODO: Do we need to worry about beastmen's rank?
|
|
local rankings =
|
|
{
|
|
{ GetNationRank(xi.nation.SANDORIA), xi.zone.SOUTHERN_SAN_DORIA },
|
|
{ GetNationRank(xi.nation.BASTOK), xi.zone.PORT_BASTOK },
|
|
{ GetNationRank(xi.nation.WINDURST), xi.zone.WINDURST_WOODS },
|
|
}
|
|
|
|
table.sort(rankings, function(a, b)
|
|
return a[1] < b[1]
|
|
end)
|
|
|
|
local firstPlaceZone = rankings[1][2]
|
|
-- check if the first and second are both rank 1 (thus a tie)
|
|
local firstAndSecondTie = rankings[1][1] == rankings[2][1]
|
|
|
|
if
|
|
firstPlaceZone == id and
|
|
not firstAndSecondTie
|
|
then
|
|
print('Showing regional conquest NPCs in: ' .. zone:getName())
|
|
else
|
|
print('Hiding regional conquest NPCs in: ' .. zone:getName())
|
|
end
|
|
|
|
for _, name in pairs(regionalNPCNames) do
|
|
local results = zone:queryEntitiesByName(name)
|
|
|
|
for _, entity in pairs(results) do
|
|
-- Will be the real entity if it has an X position
|
|
if math.abs(entity:getXPos()) > 0 then
|
|
-- Hide all of these NPCs by default
|
|
entity:setStatus(xi.status.DISAPPEAR)
|
|
|
|
-- If there is a clear winner, and not a tie, show the NPCs
|
|
if
|
|
id == firstPlaceZone and
|
|
not firstAndSecondTie
|
|
then
|
|
entity:setStatus(xi.status.NORMAL)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
local function getArg1(player, guardNation, guardType)
|
|
local pNation = player:getNation()
|
|
local output = 0
|
|
local signet = 0
|
|
local cipher = xi.extravaganza.campaignActive() * 20 * 65536
|
|
local voucher = player:hasKeyItem(xi.ki.CONQUEST_PROMOTION_VOUCHER) and 0x20000 or 0
|
|
|
|
if guardNation == xi.nation.WINDURST then
|
|
output = 33
|
|
elseif guardNation == xi.nation.SANDORIA then
|
|
output = 1
|
|
elseif guardNation == xi.nation.BASTOK then
|
|
output = 17
|
|
end
|
|
|
|
if guardNation == pNation then
|
|
signet = 0
|
|
else
|
|
signet = 7
|
|
if xi.conquest.areAllies(pNation, guardNation) then
|
|
signet = 2^(2 - pNation)
|
|
end
|
|
end
|
|
|
|
if guardNation == xi.nation.OTHER then
|
|
output = (pNation * 16) + (3 * 256) + 65537
|
|
else
|
|
output = output + 256 * signet
|
|
end
|
|
|
|
if guardType == xi.conquest.guard.CITY then
|
|
output = output + voucher
|
|
end
|
|
|
|
if guardType >= xi.conquest.guard.OUTPOST then
|
|
output = output - 1
|
|
end
|
|
|
|
if output >= 1792 and guardType >= xi.conquest.guard.OUTPOST then
|
|
output = 1808
|
|
end
|
|
|
|
return output + cipher
|
|
end
|
|
|
|
-- arg6 encodes a player's rank and nationality:
|
|
-- bits 1-4 encode the rank of the player (verified that bit 4 is part of the rank number so ranks could have gone up to 31.)
|
|
-- bits 5-6 seem to encode the citizenship as below. This part needs more testing and verification.
|
|
|
|
local function getArg6(player)
|
|
return player:getRank(player:getNation()) + (player:getNation() * 32)
|
|
end
|
|
|
|
-----------------------------------
|
|
-- (LOCAL) overseer stock
|
|
-----------------------------------
|
|
|
|
---@class overseerInvComming : { [integer] : { cp: integer, lvl: integer, item: xi.item, rank: integer? } }
|
|
local overseerInvCommon =
|
|
{
|
|
[32928] = { cp = 7, lvl = 1, item = xi.item.SCROLL_OF_INSTANT_RERAISE },
|
|
[32929] = { cp = 10, lvl = 1, item = xi.item.SCROLL_OF_INSTANT_WARP },
|
|
[32930] = { cp = 2500, lvl = 1, item = xi.item.RETURN_RING },
|
|
[32931] = { cp = 9000, lvl = 1, item = xi.item.HOMING_RING },
|
|
[32933] = { cp = 500, lvl = 1, item = xi.item.CHARIOT_BAND },
|
|
[32934] = { cp = 1000, lvl = 1, item = xi.item.EMPRESS_BAND },
|
|
[32935] = { cp = 2000, lvl = 1, item = xi.item.EMPEROR_BAND },
|
|
[32936] = { cp = 5000, lvl = 1, item = xi.item.WARP_RING },
|
|
[32937] = { cp = 1000, lvl = 1, item = xi.item.CIPHER_OF_TENZENS_ALTER_EGO },
|
|
[32938] = { cp = 1000, lvl = 1, item = xi.item.CIPHER_OF_RAHALS_ALTER_EGO },
|
|
[32939] = { cp = 1000, lvl = 1, item = xi.item.CIPHER_OF_KUKKIS_ALTER_EGO },
|
|
[32941] = { cp = 20000, lvl = 1, item = xi.item.REFINED_CHAIR_SET, rank = 10 },
|
|
[32942] = { cp = 1000, lvl = 1, item = xi.item.CIPHER_OF_MAKKIS_ALTER_EGO },
|
|
}
|
|
|
|
---@class overseerInvNation : { [xi.nation] : { [integer]: { rank: integer, cp: integer, lvl: integer, item: xi.item, place: integer? } } }
|
|
local overseerInvNation =
|
|
{
|
|
[xi.nation.SANDORIA] =
|
|
{
|
|
[32768] = { rank = 1, cp = 1000, lvl = 10, item = xi.item.ROYAL_ARCHERS_LONGBOW },
|
|
[32769] = { rank = 1, cp = 1000, lvl = 10, item = xi.item.ROYAL_ARCHERS_SWORD },
|
|
[32770] = { rank = 1, cp = 1000, lvl = 10, item = xi.item.ROYAL_FOOTMANS_BANDANA },
|
|
[32771] = { rank = 1, cp = 1000, lvl = 10, item = xi.item.ROYAL_FOOTMANS_GLOVES },
|
|
[32772] = { rank = 1, cp = 1000, lvl = 10, item = xi.item.ROYAL_FOOTMANS_BOOTS },
|
|
[32773] = { rank = 1, cp = 1000, lvl = 10, item = xi.item.ROYAL_ARCHERS_CESTI, place = 2 },
|
|
[32774] = { rank = 1, cp = 1000, lvl = 10, item = xi.item.ROYAL_FOOTMANS_TUNIC, place = 1 },
|
|
[32784] = { rank = 2, cp = 2000, lvl = 18, item = xi.item.ROYAL_SPEARMANS_SPEAR },
|
|
[32785] = { rank = 2, cp = 2000, lvl = 10, item = xi.item.ROYAL_FOOTMANS_VEST },
|
|
[32786] = { rank = 2, cp = 2000, lvl = 20, item = xi.item.ROYAL_FOOTMANS_TROUSERS },
|
|
[32787] = { rank = 2, cp = 2000, lvl = 20, item = xi.item.ROYAL_SPEARMANS_HORN, place = 2 },
|
|
[32788] = { rank = 2, cp = 2000, lvl = 20, item = xi.item.ROYAL_FOOTMANS_CLOGS, place = 1 },
|
|
[32800] = { rank = 3, cp = 4000, lvl = 30, item = xi.item.ROYAL_SQUIRES_HALBERD },
|
|
[32801] = { rank = 3, cp = 4000, lvl = 30, item = xi.item.ROYAL_SQUIRES_COLLAR },
|
|
[32802] = { rank = 3, cp = 4000, lvl = 30, item = xi.item.ROYAL_SQUIRES_HELM },
|
|
[32803] = { rank = 3, cp = 4000, lvl = 30, item = xi.item.ROYAL_SQUIRES_MUFFLERS },
|
|
[32804] = { rank = 3, cp = 4000, lvl = 30, item = xi.item.ROYAL_SQUIRES_SOLLERETS },
|
|
[32805] = { rank = 3, cp = 4000, lvl = 30, item = xi.item.ROYAL_SQUIRES_DAGGER, place = 2 },
|
|
[32806] = { rank = 3, cp = 4000, lvl = 30, item = xi.item.ROYAL_SQUIRES_MACE, place = 1 },
|
|
[32807] = { rank = 3, cp = 4000, lvl = 1, item = xi.item.SAN_DORIAN_RING, place = 1 },
|
|
[32816] = { rank = 4, cp = 8000, lvl = 40, item = xi.item.ROYAL_SWORDSMANS_BLADE },
|
|
[32817] = { rank = 4, cp = 8000, lvl = 40, item = xi.item.ROYAL_SQUIRES_CHAINMAIL },
|
|
[32818] = { rank = 4, cp = 8000, lvl = 40, item = xi.item.ROYAL_SQUIRES_BREECHES },
|
|
[32819] = { rank = 4, cp = 8000, lvl = 40, item = xi.item.ROYAL_SQUIRES_ROBE, place = 2 },
|
|
[32820] = { rank = 4, cp = 8000, lvl = 40, item = xi.item.ROYAL_SQUIRES_SHIELD, place = 1 },
|
|
[32832] = { rank = 5, cp = 16000, lvl = 50, item = xi.item.ROYAL_KNIGHT_ARMY_LANCE },
|
|
[32833] = { rank = 5, cp = 16000, lvl = 50, item = xi.item.TEMPLE_KNIGHT_ARMY_SWORD },
|
|
[32834] = { rank = 5, cp = 16000, lvl = 50, item = xi.item.ROYAL_KNIGHT_ARMY_SHIELD },
|
|
[32835] = { rank = 5, cp = 16000, lvl = 50, item = xi.item.TEMPLE_KNIGHT_ARMY_SHIELD },
|
|
[32836] = { rank = 5, cp = 16000, lvl = 50, item = xi.item.ROYAL_KNIGHT_ARMY_COLLAR },
|
|
[32837] = { rank = 5, cp = 16000, lvl = 50, item = xi.item.TEMPLE_KNIGHT_ARMY_COLLAR },
|
|
[32838] = { rank = 5, cp = 16000, lvl = 50, item = xi.item.ROYAL_KNIGHTS_MUFFLERS },
|
|
[32839] = { rank = 5, cp = 16000, lvl = 50, item = xi.item.ROYAL_KNIGHTS_SOLLERETS },
|
|
[32840] = { rank = 5, cp = 16000, lvl = 50, item = xi.item.ROYAL_KNIGHTS_BELT, place = 2 },
|
|
[32841] = { rank = 5, cp = 16000, lvl = 50, item = xi.item.ROYAL_KNIGHTS_CLOAK, place = 1 },
|
|
[32848] = { rank = 6, cp = 24000, lvl = 55, item = xi.item.ROYAL_ARMY_MANTLE },
|
|
[32849] = { rank = 6, cp = 24000, lvl = 55, item = xi.item.ROYAL_GUARDS_COLLAR },
|
|
[32850] = { rank = 6, cp = 24000, lvl = 55, item = xi.item.ROYAL_KNIGHTS_BASCINET },
|
|
[32851] = { rank = 6, cp = 24000, lvl = 55, item = xi.item.ROYAL_KNIGHTS_AKETON },
|
|
[32852] = { rank = 6, cp = 24000, lvl = 55, item = xi.item.ROYAL_KNIGHTS_CHAINMAIL, place = 1 },
|
|
[32853] = { rank = 6, cp = 24000, lvl = 55, item = xi.item.ROYAL_KNIGHTS_BREECHES, place = 1 },
|
|
[32854] = { rank = 6, cp = 24000, lvl = 55, item = xi.item.ROYAL_GUARDS_SHIELD, place = 2 },
|
|
[32855] = { rank = 6, cp = 24000, lvl = 55, item = xi.item.ROYAL_GUARDS_ROD, place = 1 },
|
|
[32856] = { rank = 6, cp = 24000, lvl = 55, item = xi.item.ROYAL_GUARDS_SWORD, place = 1 },
|
|
[32857] = { rank = 6, cp = 24000, lvl = 55, item = xi.item.ROYAL_GUARDS_FLEURET, place = 1 },
|
|
[32864] = { rank = 7, cp = 32000, lvl = 60, item = xi.item.TEMPLE_KNIGHTS_QUIVER },
|
|
[32865] = { rank = 7, cp = 32000, lvl = 60, item = xi.item.GRAND_KNIGHTS_LANCE, place = 2 },
|
|
[32866] = { rank = 7, cp = 32000, lvl = 60, item = xi.item.GRAND_KNIGHTS_RING, place = 1 },
|
|
[32880] = { rank = 8, cp = 40000, lvl = 65, item = xi.item.GRAND_TEMPLE_KNIGHTS_GAUNTLETS },
|
|
[32881] = { rank = 8, cp = 40000, lvl = 65, item = xi.item.GRAND_TEMPLE_KNIGHTS_BANGLES, place = 2 },
|
|
[32882] = { rank = 8, cp = 40000, lvl = 65, item = xi.item.GRAND_TEMPLE_KNIGHTS_COLLAR, place = 1 },
|
|
[32896] = { rank = 9, cp = 48000, lvl = 71, item = xi.item.RESERVE_CAPTAINS_GREATSWORD },
|
|
[32897] = { rank = 9, cp = 48000, lvl = 71, item = xi.item.RESERVE_CAPTAINS_PICK },
|
|
[32898] = { rank = 9, cp = 48000, lvl = 71, item = xi.item.RESERVE_CAPTAINS_MACE, place = 2 },
|
|
[32899] = { rank = 9, cp = 48000, lvl = 71, item = xi.item.RESERVE_CAPTAINS_LANCE, place = 1 },
|
|
[32912] = { rank = 10, cp = 56000, lvl = 1, item = xi.item.KINGDOM_AKETON, place = 1 },
|
|
[32932] = { rank = 10, cp = 5000, lvl = 1, item = xi.item.KINGDOM_SIGNET_STAFF },
|
|
[32940] = { rank = 10, cp = 10000, lvl = 1, item = xi.item.IMPERIAL_CHAIR_SET },
|
|
},
|
|
|
|
[xi.nation.BASTOK] =
|
|
{
|
|
[32768] = { rank = 1, cp = 1000, lvl = 10, item = xi.item.LEGIONNAIRES_KNUCKLES },
|
|
[32769] = { rank = 1, cp = 1000, lvl = 10, item = xi.item.LEGIONNAIRES_CROSSBOW },
|
|
[32770] = { rank = 1, cp = 1000, lvl = 10, item = xi.item.LEGIONNAIRES_AXE },
|
|
[32771] = { rank = 1, cp = 1000, lvl = 10, item = xi.item.LEGIONNAIRES_CAP },
|
|
[32772] = { rank = 1, cp = 1000, lvl = 10, item = xi.item.LEGIONNAIRES_MITTENS },
|
|
[32773] = { rank = 1, cp = 1000, lvl = 10, item = xi.item.LEGIONNAIRES_LEGGINGS },
|
|
[32774] = { rank = 1, cp = 1000, lvl = 10, item = xi.item.LEGIONNAIRES_STAFF, place = 2 },
|
|
[32775] = { rank = 1, cp = 1000, lvl = 10, item = xi.item.LEGIONNAIRES_SCYTHE, place = 1 },
|
|
[32784] = { rank = 2, cp = 2000, lvl = 18, item = xi.item.DECURIONS_HAMMER },
|
|
[32785] = { rank = 2, cp = 2000, lvl = 10, item = xi.item.LEGIONNAIRES_HARNESS },
|
|
[32786] = { rank = 2, cp = 2000, lvl = 20, item = xi.item.LEGIONNAIRES_SUBLIGAR },
|
|
[32787] = { rank = 2, cp = 2000, lvl = 20, item = xi.item.DECURIONS_DAGGER, place = 2 },
|
|
[32788] = { rank = 2, cp = 2000, lvl = 20, item = xi.item.DECURIONS_SHIELD, place = 1 },
|
|
[32800] = { rank = 3, cp = 4000, lvl = 30, item = xi.item.CENTURIONS_AXE },
|
|
[32801] = { rank = 3, cp = 4000, lvl = 10, item = xi.item.REPUBLICAN_BRONZE_MEDAL },
|
|
[32802] = { rank = 3, cp = 4000, lvl = 30, item = xi.item.CENTURIONS_VISOR },
|
|
[32803] = { rank = 3, cp = 4000, lvl = 30, item = xi.item.CENTURIONS_SCALE_MAIL },
|
|
[32804] = { rank = 3, cp = 4000, lvl = 30, item = xi.item.CENTURIONS_FINGER_GAUNTLETS },
|
|
[32805] = { rank = 3, cp = 4000, lvl = 30, item = xi.item.CENTURIONS_CUISSES },
|
|
[32806] = { rank = 3, cp = 4000, lvl = 30, item = xi.item.CENTURIONS_GREAVES },
|
|
[32807] = { rank = 3, cp = 4000, lvl = 30, item = xi.item.CENTURIONS_SWORD, place = 2 },
|
|
[32808] = { rank = 3, cp = 4000, lvl = 30, item = xi.item.LEGIONNAIRES_CIRCLET, place = 1 },
|
|
[32809] = { rank = 3, cp = 4000, lvl = 1, item = xi.item.BASTOKAN_RING, place = 1 },
|
|
[32816] = { rank = 4, cp = 8000, lvl = 40, item = xi.item.JUNIOR_MUSKETEERS_TUCK },
|
|
[32817] = { rank = 4, cp = 8000, lvl = 40, item = xi.item.IRON_MUSKETEERS_ARMET },
|
|
[32818] = { rank = 4, cp = 8000, lvl = 40, item = xi.item.IRON_MUSKETEERS_GAUNTLETS },
|
|
[32819] = { rank = 4, cp = 8000, lvl = 40, item = xi.item.IRON_MUSKETEERS_SABATONS },
|
|
[32820] = { rank = 4, cp = 8000, lvl = 40, item = xi.item.IRON_MUSKETEERS_GAMBISON, place = 2 },
|
|
[32821] = { rank = 4, cp = 8000, lvl = 40, item = xi.item.JUNIOR_MUSKETEERS_CHAKRAM, place = 1 },
|
|
[32832] = { rank = 5, cp = 16000, lvl = 50, item = xi.item.MUSKETEERS_SWORD },
|
|
[32833] = { rank = 5, cp = 16000, lvl = 30, item = xi.item.REPUBLICAN_IRON_MEDAL },
|
|
[32834] = { rank = 5, cp = 16000, lvl = 50, item = xi.item.IRON_MUSKETEERS_CUIRASS },
|
|
[32835] = { rank = 5, cp = 16000, lvl = 50, item = xi.item.IRON_MUSKETEERS_CUISSES },
|
|
[32836] = { rank = 5, cp = 16000, lvl = 50, item = xi.item.MUSKETEERS_POLE, place = 2 },
|
|
[32837] = { rank = 5, cp = 16000, lvl = 50, item = xi.item.MUSKETEER_GUN, place = 1 },
|
|
[32848] = { rank = 6, cp = 24000, lvl = 55, item = xi.item.REPUBLICAN_MYTHRIL_MEDAL },
|
|
[32849] = { rank = 6, cp = 24000, lvl = 55, item = xi.item.REPUBLICAN_ARMY_MANTLE },
|
|
[32850] = { rank = 6, cp = 24000, lvl = 55, item = xi.item.MUSKETEER_COMMANDERS_FALCHION, place = 2 },
|
|
[32851] = { rank = 6, cp = 24000, lvl = 55, item = xi.item.MUSKETEER_COMMANDERS_SHIELD, place = 2 },
|
|
[32852] = { rank = 6, cp = 24000, lvl = 55, item = xi.item.MUSKETEER_COMMANDERS_ROD, place = 1 },
|
|
[32853] = { rank = 6, cp = 24000, lvl = 55, item = xi.item.IRON_MUSKETEERS_GORGET, place = 1 },
|
|
[32864] = { rank = 7, cp = 32000, lvl = 60, item = xi.item.IRON_MUSKETEERS_QUIVER },
|
|
[32865] = { rank = 7, cp = 32000, lvl = 60, item = xi.item.GOLD_MUSKETEERS_UCHIGATANA, place = 2 },
|
|
[32866] = { rank = 7, cp = 32000, lvl = 60, item = xi.item.GOLD_MUSKETEERS_RING, place = 1 },
|
|
[32880] = { rank = 8, cp = 40000, lvl = 65, item = xi.item.PRAEFECTUSS_GLOVES },
|
|
[32881] = { rank = 8, cp = 40000, lvl = 65, item = xi.item.PRESIDENTIAL_HAIRPIN, place = 2 },
|
|
[32882] = { rank = 8, cp = 40000, lvl = 65, item = xi.item.REPUBLICAN_GOLD_MEDAL, place = 1 },
|
|
[32896] = { rank = 9, cp = 48000, lvl = 71, item = xi.item.SENIOR_GOLD_MUSKETEERS_SCYTHE },
|
|
[32897] = { rank = 9, cp = 48000, lvl = 71, item = xi.item.SENIOR_GOLD_MUSKETEERS_ROD },
|
|
[32898] = { rank = 9, cp = 48000, lvl = 71, item = xi.item.SENIOR_GOLD_MUSKETEERS_AXE, place = 2 },
|
|
[32899] = { rank = 9, cp = 48000, lvl = 71, item = xi.item.SENIOR_GOLD_MUSKETEERS_SCIMITAR, place = 1 },
|
|
[32912] = { rank = 10, cp = 56000, lvl = 1, item = xi.item.REPUBLIC_AKETON, place = 1 },
|
|
[32932] = { rank = 10, cp = 5000, lvl = 1, item = xi.item.REPUBLIC_SIGNET_STAFF },
|
|
[32940] = { rank = 10, cp = 10000, lvl = 1, item = xi.item.DECORATIVE_CHAIR_SET },
|
|
},
|
|
|
|
[xi.nation.WINDURST] =
|
|
{
|
|
[32768] = { rank = 1, cp = 1000, lvl = 10, item = xi.item.FREESWORDS_BOW },
|
|
[32769] = { rank = 1, cp = 1000, lvl = 10, item = xi.item.FREESWORDS_CLUB },
|
|
[32770] = { rank = 1, cp = 1000, lvl = 10, item = xi.item.FREESWORDS_BAGHNAKHS },
|
|
[32771] = { rank = 1, cp = 1000, lvl = 10, item = xi.item.FREESWORDS_SLOPS, place = 2 },
|
|
[32772] = { rank = 1, cp = 1000, lvl = 10, item = xi.item.FREESWORDS_STAFF, place = 1 },
|
|
[32784] = { rank = 2, cp = 2000, lvl = 18, item = xi.item.MERCENARYS_POLE },
|
|
[32785] = { rank = 2, cp = 2000, lvl = 20, item = xi.item.MERCENARYS_HACHIMAKI },
|
|
[32786] = { rank = 2, cp = 2000, lvl = 20, item = xi.item.MERCENARYS_GI },
|
|
[32787] = { rank = 2, cp = 2000, lvl = 20, item = xi.item.MERCENARYS_TEKKO },
|
|
[32788] = { rank = 2, cp = 2000, lvl = 20, item = xi.item.MERCENARYS_SITABAKI },
|
|
[32789] = { rank = 2, cp = 2000, lvl = 20, item = xi.item.MERCENARYS_KYAHAN },
|
|
[32790] = { rank = 2, cp = 2000, lvl = 20, item = xi.item.MERCENARYS_KNIFE, place = 2 },
|
|
[32791] = { rank = 2, cp = 2000, lvl = 20, item = xi.item.MERCENARYS_GREATSWORD, place = 1 },
|
|
[32800] = { rank = 3, cp = 4000, lvl = 30, item = xi.item.MERCENARY_CAPTAINS_SCYTHE },
|
|
[32801] = { rank = 3, cp = 4000, lvl = 30, item = xi.item.MERCENARY_CAPTAINS_HEADGEAR },
|
|
[32802] = { rank = 3, cp = 4000, lvl = 30, item = xi.item.MERCENARY_CAPTAINS_DOUBLET },
|
|
[32803] = { rank = 3, cp = 4000, lvl = 30, item = xi.item.MERCENARY_CAPTAINS_GLOVES },
|
|
[32804] = { rank = 3, cp = 4000, lvl = 30, item = xi.item.MERCENARY_CAPTAINS_HOSE },
|
|
[32805] = { rank = 3, cp = 4000, lvl = 30, item = xi.item.MERCENARY_CAPTAINS_GAITERS },
|
|
[32806] = { rank = 3, cp = 4000, lvl = 30, item = xi.item.MERCENARY_CAPTAINS_KUKRI, place = 2 },
|
|
[32807] = { rank = 3, cp = 4000, lvl = 30, item = xi.item.MERCENARY_CAPTAINS_BELT, place = 1 },
|
|
[32808] = { rank = 3, cp = 4000, lvl = 1, item = xi.item.WINDURSTIAN_RING, place = 1 },
|
|
[32816] = { rank = 4, cp = 8000, lvl = 40, item = xi.item.COMBAT_CASTERS_DAGGER },
|
|
[32817] = { rank = 4, cp = 8000, lvl = 40, item = xi.item.COMBAT_CASTERS_BOOMERANG },
|
|
[32818] = { rank = 4, cp = 8000, lvl = 10, item = xi.item.GREEN_SCARF },
|
|
[32819] = { rank = 4, cp = 8000, lvl = 40, item = xi.item.COMBAT_CASTERS_CLOAK },
|
|
[32820] = { rank = 4, cp = 8000, lvl = 40, item = xi.item.COMBAT_CASTERS_MITTS },
|
|
[32821] = { rank = 4, cp = 8000, lvl = 40, item = xi.item.COMBAT_CASTERS_SLACKS },
|
|
[32822] = { rank = 4, cp = 8000, lvl = 40, item = xi.item.COMBAT_CASTERS_SHOES },
|
|
[32823] = { rank = 4, cp = 8000, lvl = 40, item = xi.item.COMBAT_CASTERS_SCIMITAR, place = 2 },
|
|
[32824] = { rank = 4, cp = 8000, lvl = 40, item = xi.item.COMBAT_CASTERS_AXE, place = 1 },
|
|
[32832] = { rank = 5, cp = 16000, lvl = 50, item = xi.item.TACTICIAN_MAGICIANS_WAND, place = 2 },
|
|
[32833] = { rank = 5, cp = 16000, lvl = 30, item = xi.item.PAISLEY_SCARF },
|
|
[32834] = { rank = 5, cp = 16000, lvl = 50, item = xi.item.TACTICIAN_MAGICIANS_HAT, place = 2 },
|
|
[32835] = { rank = 5, cp = 16000, lvl = 50, item = xi.item.TACTICIAN_MAGICIANS_COAT },
|
|
[32836] = { rank = 5, cp = 16000, lvl = 50, item = xi.item.TACTICIAN_MAGICIANS_CUFFS },
|
|
[32837] = { rank = 5, cp = 16000, lvl = 50, item = xi.item.TACTICIAN_MAGICIANS_SLOPS },
|
|
[32838] = { rank = 5, cp = 16000, lvl = 50, item = xi.item.TACTICIAN_MAGICIANS_PIGACHES },
|
|
[32839] = { rank = 5, cp = 16000, lvl = 50, item = xi.item.TACTICIAN_MAGICIANS_ESPADON },
|
|
[32840] = { rank = 5, cp = 16000, lvl = 50, item = xi.item.TACTICIAN_MAGICIANS_HOOKS, place = 1 },
|
|
[32848] = { rank = 6, cp = 24000, lvl = 55, item = xi.item.CHECKERED_SCARF },
|
|
[32849] = { rank = 6, cp = 24000, lvl = 55, item = xi.item.FEDERAL_ARMY_MANTLE },
|
|
[32850] = { rank = 6, cp = 24000, lvl = 55, item = xi.item.WISE_WIZARDS_STAFF, place = 2 },
|
|
[32851] = { rank = 6, cp = 24000, lvl = 55, item = xi.item.WISE_WIZARDS_BILBO, place = 2 },
|
|
[32852] = { rank = 6, cp = 24000, lvl = 55, item = xi.item.WISE_WIZARDS_ANELACE, place = 1 },
|
|
[32864] = { rank = 7, cp = 32000, lvl = 60, item = xi.item.COMBAT_CASTERS_QUIVER },
|
|
[32865] = { rank = 7, cp = 32000, lvl = 60, item = xi.item.PATRIARCH_PROTECTORS_SHIELD, place = 2 },
|
|
[32866] = { rank = 7, cp = 32000, lvl = 60, item = xi.item.PATRIARCH_PROTECTORS_RING, place = 1 },
|
|
[32880] = { rank = 8, cp = 40000, lvl = 65, item = xi.item.MASTER_CASTERS_MITTS },
|
|
[32881] = { rank = 8, cp = 40000, lvl = 65, item = xi.item.MASTER_CASTERS_BRACELETS, place = 2 },
|
|
[32882] = { rank = 8, cp = 40000, lvl = 65, item = xi.item.WINDURSTIAN_SCARF, place = 1 },
|
|
[32896] = { rank = 9, cp = 48000, lvl = 71, item = xi.item.MASTER_CASTERS_BOW },
|
|
[32897] = { rank = 9, cp = 48000, lvl = 71, item = xi.item.MASTER_CASTERS_POLE },
|
|
[32898] = { rank = 9, cp = 48000, lvl = 71, item = xi.item.MASTER_CASTERS_BAGHNAKHS, place = 2 },
|
|
[32899] = { rank = 9, cp = 48000, lvl = 71, item = xi.item.MASTER_CASTERS_KNIFE, place = 1 },
|
|
[32912] = { rank = 10, cp = 56000, lvl = 1, item = xi.item.FEDERATION_AKETON, place = 1 },
|
|
[32932] = { rank = 10, cp = 5000, lvl = 1, item = xi.item.FEDERATION_SIGNET_STAFF },
|
|
[32940] = { rank = 10, cp = 10000, lvl = 1, item = xi.item.ORNATE_STOOL_SET },
|
|
},
|
|
}
|
|
|
|
local titlesGranted =
|
|
{
|
|
[0] = -- San d'Oria
|
|
{
|
|
[1] = xi.title.ROYAL_ARCHER,
|
|
[2] = xi.title.ROYAL_SPEARMAN,
|
|
[3] = xi.title.ROYAL_SQUIRE,
|
|
[4] = xi.title.ROYAL_SWORDSMAN,
|
|
[5] = xi.title.ROYAL_CAVALIER,
|
|
[6] = xi.title.ROYAL_GUARD,
|
|
[7] = xi.title.GRAND_KNIGHT_OF_THE_REALM,
|
|
[8] = xi.title.GRAND_TEMPLE_KNIGHT,
|
|
[9] = xi.title.RESERVE_KNIGHT_CAPTAIN,
|
|
[10] = xi.title.ELITE_ROYAL_GUARD,
|
|
},
|
|
[1] = -- Bastok
|
|
{
|
|
[1] = xi.title.LEGIONNAIRE,
|
|
[2] = xi.title.DECURION,
|
|
[3] = xi.title.CENTURION,
|
|
[4] = xi.title.JUNIOR_MUSKETEER,
|
|
[5] = xi.title.SENIOR_MUSKETEER,
|
|
[6] = xi.title.MUSKETEER_COMMANDER,
|
|
[7] = xi.title.GOLD_MUSKETEER,
|
|
[8] = xi.title.PRAEFECTUS,
|
|
[9] = xi.title.SENIOR_GOLD_MUSKETEER,
|
|
[10] = xi.title.PRAEFECTUS_CASTRORUM,
|
|
},
|
|
[2] = -- Windurst
|
|
{
|
|
[1] = xi.title.FREESWORD,
|
|
[2] = xi.title.MERCENARY,
|
|
[3] = xi.title.MERCENARY_CAPTAIN,
|
|
[4] = xi.title.COMBAT_CASTER,
|
|
[5] = xi.title.TACTICIAN_MAGICIAN,
|
|
[6] = xi.title.WISE_WIZARD,
|
|
[7] = xi.title.PATRIARCH_PROTECTOR,
|
|
[8] = xi.title.CASTER_CAPTAIN,
|
|
[9] = xi.title.MASTER_CASTER,
|
|
[10] = xi.title.MERCENARY_MAJOR,
|
|
},
|
|
}
|
|
|
|
local function getStock(player, guardNation, option)
|
|
local r = overseerInvCommon[option]
|
|
|
|
if r == nil then
|
|
if guardNation == xi.nation.OTHER then
|
|
r = overseerInvNation[player:getNation()][option]
|
|
else
|
|
r = overseerInvNation[guardNation][option]
|
|
end
|
|
end
|
|
|
|
return r
|
|
end
|
|
|
|
local function canBuyExpRing(player, item)
|
|
local text = zones[player:getZoneID()].text
|
|
|
|
-- check exp ring count
|
|
if xi.settings.main.ALLOW_MULTIPLE_EXP_RINGS ~= 1 then
|
|
for i = 15761, 15763 do
|
|
if player:hasItem(i) then
|
|
player:messageSpecial(text.CONQUEST + 60, 0, 0, item) -- You do not meet the requirements to purchase the <item>.
|
|
player:messageSpecial(text.CONQUEST + 50, 0, 0, item) -- Due to its special nature, you can only purchase or recharge <item> once until the conquest results tally is performed. Also, you cannot purchase this item if a similar item is already in your possession.
|
|
|
|
return false
|
|
end
|
|
end
|
|
end
|
|
|
|
-- one exp ring per conquest tally
|
|
if
|
|
xi.settings.main.BYPASS_EXP_RING_ONE_PER_WEEK ~= 1 and
|
|
player:getCharVar('CONQUEST_RING_RECHARGE') ~= 0
|
|
then
|
|
player:messageSpecial(text.CONQUEST + 60, 0, 0, item)
|
|
player:messageSpecial(text.CONQUEST + 50, 0, 0, item)
|
|
|
|
return false
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
-----------------------------------
|
|
-- (PUBLIC) conquest
|
|
-----------------------------------
|
|
|
|
xi.conquest.guard =
|
|
{
|
|
CITY = 1,
|
|
FOREIGN = 2,
|
|
OUTPOST = 3,
|
|
BORDER = 4,
|
|
}
|
|
|
|
xi.conquest.areAllies = function(nationA, nationB)
|
|
return IsConquestAlliance() and
|
|
GetNationRank(nationA) > 1 and
|
|
GetNationRank(nationB) > 1
|
|
end
|
|
|
|
xi.conquest.outpostFee = function(player, region)
|
|
if not hasOutpost(player, region) then
|
|
return 0
|
|
end
|
|
|
|
local fee = outposts[region].fee
|
|
if GetRegionOwner(region) == player:getNation() then
|
|
return fee
|
|
else
|
|
return fee * 3
|
|
end
|
|
end
|
|
|
|
xi.conquest.canTeleportToOutpost = function(player, region)
|
|
local outpost = outposts[region]
|
|
if
|
|
outpost == nil or
|
|
player:getMainLvl() < outpost.lvl or
|
|
not hasOutpost(player, region)
|
|
then
|
|
return false
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
xi.conquest.setRegionalConquestOverseers = function(region)
|
|
local zone = outposts[region].zone
|
|
|
|
if zone then
|
|
local base = zones[zone].npc.OVERSEER_BASE
|
|
local npcs = overseerOffsets[region]
|
|
|
|
if base and npcs then
|
|
|
|
-- update the npcs
|
|
local owner = GetRegionOwner(region)
|
|
for _, v in pairs(npcs) do
|
|
local npc = GetNPCByID(base + v.offset)
|
|
|
|
if npc then
|
|
if v.nation == owner then
|
|
npc:setStatus(xi.status.NORMAL)
|
|
else
|
|
npc:setStatus(xi.status.DISAPPEAR)
|
|
end
|
|
|
|
if v.nation == xi.nation.OTHER then
|
|
if owner == xi.nation.BEASTMEN or owner == xi.nation.NEUTRAL then
|
|
npc:setStatus(xi.status.DISAPPEAR)
|
|
else
|
|
npc:setStatus(xi.status.NORMAL)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
-----------------------------------
|
|
-- (PUBLIC) overseer
|
|
-----------------------------------
|
|
xi.conquest.overseerOnTrade = function(player, npc, trade, guardNation, guardType)
|
|
if xi.garrison.onTrade(player, npc, trade, guardNation) then
|
|
return
|
|
end
|
|
|
|
if player:getNation() == guardNation or guardNation == xi.nation.OTHER then
|
|
local item = trade:getItemId()
|
|
local tradeConfirmed = false
|
|
local mOffset = zones[player:getZoneID()].text.CONQUEST
|
|
|
|
-- DONATE CRYSTALS FOR RANK OR CONQUEST POINTS
|
|
if guardType <= xi.conquest.guard.FOREIGN and crystals[item] then
|
|
local pRank = player:getRank(player:getNation())
|
|
local pRankPoints = player:getRankPoints()
|
|
local addPoints = 0
|
|
|
|
for crystalId, crystalWorth in pairs(crystals) do
|
|
local count = trade:getItemQty(crystalId)
|
|
|
|
if count > 0 then
|
|
if pRank == 1 then
|
|
player:showText(npc, mOffset - 7) -- 'I cannot accept crystals from someone whose rank is still 1.'
|
|
break
|
|
elseif pRankPoints == 4000 then
|
|
player:showText(npc, mOffset + 43) -- 'You do not need to donate any more crystals at your current rank.'
|
|
break
|
|
else
|
|
trade:confirmItem(crystalId, count)
|
|
addPoints = addPoints + count * math.floor(4000 / (player:getRank(player:getNation()) * 12 - crystalWorth))
|
|
end
|
|
end
|
|
end
|
|
|
|
if addPoints > 0 and pRank ~= 1 and pRankPoints < 4000 then
|
|
if pRankPoints + addPoints >= 4000 then
|
|
player:setRankPoints(4000)
|
|
player:addCP(utils.clamp(pRankPoints + addPoints - 4000, 0, 1000))
|
|
player:showText(npc, mOffset + 44) -- 'Your rank points are full. We've added the excess to your conquest points.'
|
|
else
|
|
player:addRankPoints(addPoints)
|
|
player:showText(npc, mOffset + 45) -- 'We've awarded you rank points for the crystals you've donated.'
|
|
end
|
|
|
|
player:confirmTrade()
|
|
tradeConfirmed = true
|
|
end
|
|
end
|
|
|
|
-- RECHARGE EXP RING
|
|
if not tradeConfirmed and expRings[item] and npcUtil.tradeHas(trade, item) then
|
|
if
|
|
xi.settings.main.BYPASS_EXP_RING_ONE_PER_WEEK == 1 or
|
|
player:getCharVar('CONQUEST_RING_RECHARGE') == 0
|
|
then
|
|
local ring = expRings[item]
|
|
|
|
-- find the item so can determine the actual charges used
|
|
-- (if still some charges left then recharging is proportionally less CP)
|
|
local ringItem = player:findItem(item)
|
|
if ringItem then
|
|
-- by default assume all charges used and calculate CP cost for a full recharge
|
|
local cpCost = ring.chargesWhenFull * ring.costPerCharge
|
|
|
|
-- calculate the charges used (clamp to ensure no strangeness)
|
|
local chargesLeft = utils.clamp(ringItem:getCurrentCharges(), 0, ring.chargesWhenFull)
|
|
local chargesUsed = ring.chargesWhenFull - chargesLeft
|
|
|
|
-- player trying to recharge a full ring so notify player and exit
|
|
if chargesUsed == 0 then
|
|
player:showText(npc, mOffset + 57, item) -- 'The <item> is already fully charged.'
|
|
return
|
|
-- player has used some but not all charges so calculate the CP cost for recharge
|
|
elseif
|
|
chargesUsed > 0 and
|
|
chargesUsed < ring.chargesWhenFull
|
|
then
|
|
cpCost = chargesUsed * ring.costPerCharge
|
|
end
|
|
|
|
-- if enough CP then perform the recharge
|
|
if player:getCP() >= cpCost then
|
|
player:delCP(cpCost)
|
|
player:confirmTrade()
|
|
player:addItem(item)
|
|
player:setCharVar('CONQUEST_RING_RECHARGE', 1, NextConquestTally())
|
|
player:showText(npc, mOffset + 58, item, cpCost, chargesUsed) -- 'Your ring is now fully recharged.'
|
|
else
|
|
player:showText(npc, mOffset + 55, item, cpCost) -- 'You do not have the required conquest points to recharge.'
|
|
end
|
|
-- could not find the player's current ring so stop attempt
|
|
else
|
|
return
|
|
end
|
|
else
|
|
player:showText(npc, mOffset + 56, item) -- 'Please be aware that you can only purchase or recharge <item> once during the period between each conquest results tally.
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
xi.conquest.overseerOnTrigger = function(player, npc, guardNation, guardType, guardEvent, guardRegion)
|
|
local pNation = player:getNation()
|
|
|
|
if xi.garrison.onTrigger(player, npc) then
|
|
return
|
|
end
|
|
|
|
-- EXPEDITIONARY FORCE: Collect expired insignia and give awards
|
|
-- Any of the 3 gate guards or the embassy guards for the player's nation.
|
|
if
|
|
pNation == guardNation and
|
|
guardType <= xi.conquest.guard.FOREIGN
|
|
then
|
|
local stamp = player:getCharVar('[ExpForce]NextConquestTally')
|
|
if stamp ~= 0 and stamp < NextConquestTally() then
|
|
-- Dispose of every expired insignia on the way in (paid and unpaid both do this).
|
|
local mOffset = zones[player:getZoneID()].text.CONQUEST
|
|
for _, data in pairs(exForceMenuData) do
|
|
if player:hasKeyItem(data.ki) then
|
|
player:messageSpecial(mOffset + 121, data.ki)
|
|
player:delKeyItem(data.ki)
|
|
end
|
|
end
|
|
|
|
-- Calculate the CP reward
|
|
local participation = player:getCharVar('[ExpForce]Participation')
|
|
local controlled = 0
|
|
for regionId in pairs(exForceMenuData) do
|
|
if
|
|
bit.band(participation, bit.lshift(1, regionId)) ~= 0 and
|
|
GetRegionOwner(regionId) == player:getNation()
|
|
then
|
|
controlled = controlled + 1
|
|
end
|
|
end
|
|
|
|
player:setCharVar('[ExpForce]AwardCP', exForceCPRewardTable[controlled])
|
|
player:setCharVar('[ExpForce]Participation', 0)
|
|
player:setCharVar('[ExpForce]NextConquestTally', 0)
|
|
end
|
|
end
|
|
|
|
-- SUPPLY RUNS
|
|
if
|
|
pNation == guardNation and
|
|
areSuppliesRotten(player, npc, guardType)
|
|
then
|
|
return
|
|
elseif
|
|
pNation == guardNation and
|
|
guardType >= xi.conquest.guard.OUTPOST and
|
|
canDeliverSupplies(player, guardNation, guardEvent, guardRegion)
|
|
then
|
|
return
|
|
|
|
-- JEUNO OVERSEERS
|
|
elseif guardType == xi.conquest.guard.CITY and guardNation == xi.nation.OTHER then
|
|
local a1 = getArg1(player, guardNation, guardType)
|
|
local a3 = GetConquestBalance()
|
|
local a6 = getArg6(player)
|
|
local a7 = player:getCP()
|
|
|
|
player:startEvent(guardEvent, a1, 0, a3, 0, 0, a6, a7, 0)
|
|
|
|
-- CITY AND FOREIGN OVERSEERS
|
|
elseif guardType <= xi.conquest.guard.FOREIGN then
|
|
local a1 = getArg1(player, guardNation, guardType)
|
|
local a2 = getExForceAvailable(player, npc, guardNation)
|
|
local a3 = GetConquestBalance()
|
|
local a4 = suppliesAvailableBitmask(player, guardNation)
|
|
local a5 = player:getTeleport(guardNation)
|
|
local a6 = getArg6(player)
|
|
local a7 = player:getCP()
|
|
local a8 = getExForceReward(player, guardNation)
|
|
|
|
player:startEvent(guardEvent, a1, a2, a3, a4, a5, a6, a7, a8)
|
|
|
|
-- OUTPOST AND BORDER OVERSEERS
|
|
elseif guardType >= xi.conquest.guard.OUTPOST then
|
|
local a1 = getArg1(player, guardNation, guardType)
|
|
if a1 == 1808 then -- non-allied nation
|
|
player:startEvent(guardEvent, a1, 0, 0, 0, 0, player:getRank(player:getNation()), 0, 0)
|
|
else
|
|
player:startEvent(guardEvent, a1, 0, 0x3F0000, 0, 0, getArg6(player), 0, 0)
|
|
end
|
|
end
|
|
end
|
|
|
|
xi.conquest.overseerOnEventUpdate = function(player, csid, option, guardNation)
|
|
local pNation = player:getNation()
|
|
|
|
if guardNation == xi.nation.OTHER then
|
|
guardNation = pNation
|
|
end
|
|
|
|
local stock = getStock(player, guardNation, option)
|
|
|
|
-- EXPEDITIONARY FORCE - Region select
|
|
if
|
|
option >= 131078 and
|
|
option <= 131092
|
|
then
|
|
local regionId = getExForceRegion(option)
|
|
local numberRequired = exForceNumberRequiredTable[GetNationRank(guardNation)]
|
|
local minLevel = exForceMenuData[regionId].lvl
|
|
local failCode = exForceValidateSignup(player, guardNation, minLevel, numberRequired)
|
|
|
|
-- One or more party members are below the minimum required level
|
|
if failCode == 4 then
|
|
player:updateEvent(4, 0, 0, 0, 0, 0, minLevel)
|
|
|
|
-- All other fail codes
|
|
elseif failCode ~= 0 then
|
|
player:updateEvent(failCode)
|
|
|
|
-- Badge granted in overseerOnEventFinish
|
|
else
|
|
player:updateEvent(5)
|
|
end
|
|
|
|
elseif stock ~= nil then
|
|
local pRank = GetNationRank(pNation)
|
|
local u1 = 2 -- default: player is correct job and level to equip item
|
|
local u2 = 0 -- default: player has enough CP for item
|
|
local u3 = stock.item -- default: the item ID we're purchasing
|
|
|
|
if not player:canEquipItem(stock.item, false) then -- can't equip
|
|
u1 = 0 -- can't equip due to job
|
|
elseif stock.lvl > player:getMainLvl() then
|
|
u1 = 1 -- can't equip due to level
|
|
end
|
|
|
|
if stock.cp > player:getCP() then
|
|
u2 = 1
|
|
end
|
|
|
|
if
|
|
option >= 32933 and
|
|
option <= 32935 and
|
|
player:hasKeyItem(xi.ki.CONQUEST_PROMOTION_VOUCHER)
|
|
then
|
|
u2 = 0
|
|
end
|
|
|
|
local rankCheck = true
|
|
if
|
|
guardNation ~= xi.nation.OTHER and
|
|
guardNation ~= pNation and
|
|
GetNationRank(guardNation) <= pRank
|
|
then -- buy from other nation, must be higher ranked
|
|
rankCheck = false
|
|
elseif
|
|
guardNation ~= xi.nation.OTHER and
|
|
stock.place ~= nil and
|
|
guardNation ~= pNation
|
|
then -- buy from other nation, cannot buy items with nation rank requirement
|
|
rankCheck = false
|
|
elseif stock.place ~= nil and pRank > stock.place then -- buy from own nation, check nation rank
|
|
rankCheck = false
|
|
end
|
|
|
|
if rankCheck and u2 == 0 then
|
|
player:setLocalVar('boughtItemCP', stock.item) -- set localVar for later cheat prevention
|
|
end
|
|
|
|
player:updateEvent(u1, u2, u3)
|
|
end
|
|
end
|
|
|
|
-- Handle item purchuase.
|
|
local function handlePurchuase(player, option, pNation, pRank, guardNation, mOffset)
|
|
local stock = getStock(player, guardNation, option)
|
|
if not stock then
|
|
return
|
|
end
|
|
|
|
local boughtItem = player:getLocalVar('boughtItemCP')
|
|
player:setLocalVar('boughtItemCP', 0)
|
|
|
|
if stock.item ~= boughtItem then
|
|
player:messageSpecial(mOffset + 61, stock.item) -- 'Your rank is too low to purchase the <item>.'
|
|
return
|
|
end
|
|
|
|
-- validate rank
|
|
if stock.rank and pRank < stock.rank then
|
|
player:messageSpecial(mOffset + 61, stock.item) -- 'Your rank is too low to purchase the <item>.'
|
|
return
|
|
end
|
|
|
|
local isEXPRing = option >= 32933 and option <= 32935
|
|
if isEXPRing and not canBuyExpRing(player, stock.item) then
|
|
return
|
|
end
|
|
|
|
local price = stock.cp
|
|
if
|
|
stock.rank and
|
|
player:getNation() ~= guardNation and
|
|
guardNation ~= xi.nation.OTHER
|
|
then
|
|
if price <= 8000 then
|
|
price = price * 2
|
|
else
|
|
price = price + 8000
|
|
end
|
|
end
|
|
|
|
if player:getCP() >= price then
|
|
if npcUtil.giveItem(player, stock.item) then
|
|
player:delCP(price)
|
|
end
|
|
elseif isEXPRing and player:hasKeyItem(xi.ki.CONQUEST_PROMOTION_VOUCHER) then
|
|
if npcUtil.giveItem(player, stock.item) then
|
|
player:delKeyItem(xi.ki.CONQUEST_PROMOTION_VOUCHER)
|
|
player:setCharVar('CONQUEST_RING_RECHARGE', 1, NextConquestTally())
|
|
end
|
|
else
|
|
player:messageSpecial(mOffset + 62, 0, 0, stock.item) -- 'You do not have enough conquest points to purchase the <item>.'
|
|
return
|
|
end
|
|
|
|
if stock.rank then
|
|
player:setTitle(titlesGranted[pNation][stock.rank])
|
|
end
|
|
end
|
|
|
|
xi.conquest.overseerOnEventFinish = function(player, csid, option, guardNation, guardType, guardRegion)
|
|
local pNation = player:getNation()
|
|
local pRank = player:getRank(pNation)
|
|
local mOffset = zones[player:getZoneID()].text.CONQUEST
|
|
|
|
if xi.garrison.onEventFinish(player, csid, option, guardNation, guardType, guardRegion) then
|
|
return
|
|
end
|
|
|
|
-- Signet -> Grant.
|
|
if option == 1 then
|
|
xi.conquest.bestowSignet(player, pNation, pRank, mOffset)
|
|
|
|
-- Supply Run -> Finish.
|
|
elseif option == 2 then
|
|
if guardNation ~= pNation then
|
|
return
|
|
end
|
|
|
|
if guardType < xi.conquest.guard.OUTPOST then
|
|
return
|
|
end
|
|
|
|
local sRegion = player:getCharVar('supplyQuest_region')
|
|
if sRegion ~= guardRegion then
|
|
return
|
|
end
|
|
|
|
local sOutpost = outposts[sRegion]
|
|
if not player:hasKeyItem(sOutpost.ki) then
|
|
return
|
|
end
|
|
|
|
player:delKeyItem(sOutpost.ki)
|
|
player:addCP(sOutpost.cp)
|
|
player:messageSpecial(mOffset) -- 'You've earned conquest points!'
|
|
player:setCharVar('supplyQuest_started', 0)
|
|
player:setCharVar('supplyQuest_region', 0)
|
|
player:setCharVar('supplyQuest_fresh', 0)
|
|
|
|
if not player:hasTeleport(guardNation, sRegion + 5) then
|
|
player:addTeleport(guardNation, sRegion + 5)
|
|
end
|
|
|
|
-- Homepoint -> Set.
|
|
elseif option == 4 then
|
|
if player:delGil(setHomepointFee(player, guardNation)) then
|
|
player:setHomePoint()
|
|
player:messageSpecial(mOffset + 94) -- 'Your home point has been set.'
|
|
else
|
|
player:messageSpecial(mOffset + 95) -- 'You do not have enough gil to set your home point here.'
|
|
end
|
|
|
|
-- Expeditionary Force -> Teleport. Order is: Signet, Remove badge, Obtain KI, obtain Glyph.
|
|
elseif option == 5 then
|
|
local badge = player:getStatusEffect(xi.effect.EF_BADGE)
|
|
local regionId = badge:getPower()
|
|
local overseer = player:getEventTarget()
|
|
|
|
-- Only stamp when starting a fresh batch in case of a tally that lands mid-menu.
|
|
if player:getCharVar('[ExpForce]NextConquestTally') == 0 then
|
|
-- Needed to know when the key item expires. Okay to overwrite as cleanup occurs when initiating conversation.
|
|
player:setCharVar('[ExpForce]NextConquestTally', NextConquestTally())
|
|
end
|
|
|
|
xi.conquest.bestowSignet(player, pNation, pRank, mOffset)
|
|
|
|
-- Replace badge with key item
|
|
player:delStatusEffect(xi.effect.EF_BADGE)
|
|
npcUtil.giveKeyItem(player, exForceMenuData[regionId].ki)
|
|
|
|
-- If you have a glyph from the city, you cannot get a second one.
|
|
local cityGlyphs = exForceCityGlyphTable[pNation]
|
|
if
|
|
not player:hasItem(cityGlyphs[1]) and
|
|
not player:hasItem(cityGlyphs[2]) and
|
|
not player:hasItem(cityGlyphs[3])
|
|
then
|
|
npcUtil.giveItem(player, exForceGateGlyphTable[overseer:getName()])
|
|
end
|
|
|
|
-- Outpost warp player
|
|
player:addStatusEffect(xi.effect.TELEPORT, {
|
|
power = xi.teleport.id.OUTPOST,
|
|
duration = 1,
|
|
origin = player,
|
|
icon = 0,
|
|
subPower = regionId,
|
|
})
|
|
|
|
-- Expeditionary Force -> Grant CP.
|
|
elseif option == 7 then
|
|
local cp = player:getCharVar('[ExpForce]AwardCP')
|
|
player:addCP(cp)
|
|
player:messageSpecial(mOffset + 124, 0, cp) -- "You received x conquest points!"
|
|
player:messageSpecial(mOffset + 122) -- "Your invalid insignias have been disposed of.""
|
|
player:setCharVar('[ExpForce]AwardCP', 0)
|
|
|
|
-- Expeditionary Force -> Quit.
|
|
elseif option == 8 then
|
|
player:delStatusEffect(xi.effect.EF_BADGE)
|
|
|
|
-- PURCHASE CP ITEM
|
|
elseif option >= 32768 and option <= 32944 then
|
|
handlePurchuase(player, option, pNation, pRank, guardNation, mOffset)
|
|
|
|
-- Supply Run -> Begin.
|
|
elseif
|
|
option >= 65541 and
|
|
option <= 65565 and
|
|
guardType <= xi.conquest.guard.FOREIGN
|
|
then
|
|
local region = option - 65541
|
|
local outpost = outposts[region]
|
|
|
|
if outpost then
|
|
npcUtil.giveKeyItem(player, outpost.ki)
|
|
player:setCharVar('supplyQuest_started', VanadielUniqueDay())
|
|
player:setCharVar('supplyQuest_region', region)
|
|
player:setCharVar('supplyQuest_fresh', NextConquestTally())
|
|
end
|
|
|
|
-- Expeditionary Force -> Region Selected.
|
|
elseif
|
|
option >= 131078 and
|
|
option <= 131092
|
|
then
|
|
local regionId = getExForceRegion(option)
|
|
player:delStatusEffect(xi.effect.EF_BADGE) -- We can get here if we already have the badge. No need for check as delStatusEffect covers it.
|
|
player:addStatusEffect(xi.effect.EF_BADGE, { power = regionId, origin = player, flag = xi.effectFlag.ON_ZONE })
|
|
end
|
|
end
|
|
|
|
-----------------------------------
|
|
-- (PUBLIC) vendor
|
|
-----------------------------------
|
|
xi.conquest.vendorOnTrigger = function(player, vendorRegion, vendorEvent)
|
|
local pNation = player:getNation()
|
|
local owner = GetRegionOwner(vendorRegion)
|
|
local nation = 0
|
|
local fee = xi.conquest.outpostFee(player, vendorRegion)
|
|
|
|
if owner == pNation then
|
|
nation = 1
|
|
elseif xi.conquest.areAllies(pNation, owner) then
|
|
nation = 2
|
|
end
|
|
|
|
player:startEvent(vendorEvent, nation, fee, 0, fee, player:getCP(), 0, 0, 0)
|
|
end
|
|
|
|
xi.conquest.vendorOnEventUpdate = function(player, vendorRegion)
|
|
local fee = xi.conquest.outpostFee(player, vendorRegion)
|
|
|
|
player:updateEvent(player:getGil(), fee, 0, fee, player:getCP())
|
|
end
|
|
|
|
xi.conquest.vendorOnEventFinish = function(player, option, vendorRegion)
|
|
local fee = xi.conquest.outpostFee(player, vendorRegion)
|
|
|
|
if option == 1 then
|
|
xi.shop.outpost(player)
|
|
elseif option == 2 then
|
|
if player:delGil(fee) then
|
|
player:addStatusEffect(xi.effect.TELEPORT, { power = xi.teleport.id.HOME_NATION, duration = 1, origin = player, icon = 0, subPower = vendorRegion })
|
|
end
|
|
elseif option == 6 then
|
|
player:delCP(fee)
|
|
player:addStatusEffect(xi.effect.TELEPORT, { power = xi.teleport.id.HOME_NATION, duration = 1, origin = player, icon = 0, subPower = vendorRegion })
|
|
end
|
|
end
|
|
|
|
-----------------------------------
|
|
-- (PUBLIC) outpost teleport NPC
|
|
-----------------------------------
|
|
xi.conquest.teleporterOnTrigger = function(player, teleporterNation, teleporterEvent)
|
|
local sandyRegions = getRegionsMask(xi.nation.SANDORIA)
|
|
local bastokRegions = getRegionsMask(xi.nation.BASTOK)
|
|
local windyRegions = getRegionsMask(xi.nation.WINDURST)
|
|
local beastmenRegions = getRegionsMask(xi.nation.BEASTMEN)
|
|
local allowedTeleports = getAllowedTeleports(player, teleporterNation)
|
|
local nationBits = player:getNation() + bit.lshift(teleporterNation, 8)
|
|
|
|
player:startEvent(teleporterEvent, sandyRegions, bastokRegions, windyRegions, beastmenRegions, 0, nationBits, player:getMainLvl(), allowedTeleports)
|
|
end
|
|
|
|
xi.conquest.teleporterOnEventUpdate = function(player, csid, option, teleporterEvent)
|
|
if csid == teleporterEvent then
|
|
local region = option - 1073741829
|
|
local fee = xi.conquest.outpostFee(player, region)
|
|
local cpFee = fee / 10
|
|
|
|
player:updateEvent(player:getGil(), fee, 0, cpFee, player:getCP())
|
|
end
|
|
end
|
|
|
|
xi.conquest.teleporterOnEventFinish = function(player, csid, option, teleporterEvent)
|
|
if csid == teleporterEvent then
|
|
-- TELEPORT WITH GIL
|
|
if option >= 5 and option <= 23 then
|
|
local region = option - 5
|
|
local fee = xi.conquest.outpostFee(player, region)
|
|
|
|
if
|
|
xi.conquest.canTeleportToOutpost(player, region) and
|
|
player:delGil(fee)
|
|
then
|
|
player:addStatusEffect(xi.effect.TELEPORT, { power = xi.teleport.id.OUTPOST, duration = 1, origin = player, icon = 0, subPower = region })
|
|
end
|
|
|
|
-- TELEPORT WITH CP
|
|
elseif option >= 1029 and option <= 1047 then
|
|
local region = option - 1029
|
|
local cpFee = xi.conquest.outpostFee(player, region) / 10
|
|
|
|
if
|
|
xi.conquest.canTeleportToOutpost(player, region) and
|
|
player:getCP() >= cpFee
|
|
then
|
|
player:delCP(cpFee)
|
|
player:addStatusEffect(xi.effect.TELEPORT, { power = xi.teleport.id.OUTPOST, duration = 1, origin = player, icon = 0, subPower = region })
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
-----------------------------------
|
|
-- (PUBLIC) conquest messages
|
|
-----------------------------------
|
|
xi.conquest.sendConquestTallyStartMessage = function(player, messageBase)
|
|
player:messageText(player, messageBase, 5)
|
|
end
|
|
|
|
-- City areas, though not technically conquest areas, should show the tally end message.
|
|
xi.conquest.sendCityConquestTallyEndMessage = function(player, messageBase, ranking, isConquestAlliance)
|
|
-- Tallying conquest results...
|
|
player:messageText(player, messageBase + 1, 5)
|
|
|
|
-- Global balance of power message
|
|
xi.conquest.sendBalanceOfPowerMessage(player, messageBase, ranking, isConquestAlliance)
|
|
end
|
|
|
|
-- Used for non city conquest areas. shows tally end message + owner of the region.
|
|
xi.conquest.sendConquestTallyEndMessage = function(player, messageBase, owner, ranking, isConquestAlliance)
|
|
-- Tallying conquest results...
|
|
player:messageText(player, messageBase + 1, 5)
|
|
|
|
if owner == xi.nation.NEUTRAL then
|
|
player:messageText(player, messageBase + 6, 5) -- This region is currently neutral.
|
|
else
|
|
player:messageText(player, messageBase + 2 + owner, 5) -- This region is currently under <nation> control.
|
|
end
|
|
|
|
-- Global balance of power message
|
|
xi.conquest.sendBalanceOfPowerMessage(player, messageBase, ranking, isConquestAlliance)
|
|
end
|
|
|
|
-- Helper method for sendConquestTallyUpdateMessage and sendConquestTallyEndMessage
|
|
xi.conquest.sendBalanceOfPowerMessage = function(player, messageBase, ranking, isConquestAlliance)
|
|
local offset = 0
|
|
if bit.band(ranking, 0x03) == 0x01 then
|
|
offset = offset + 7 -- 7
|
|
if bit.band(ranking, 0x30) == 0x10 then
|
|
offset = offset + 1 -- 8
|
|
if bit.band(ranking, 0x0C) == 0x0C then
|
|
offset = offset + 1 -- 9
|
|
end
|
|
elseif bit.band(ranking, 0x0C) == 0x08 then
|
|
offset = offset + 3 -- 10
|
|
if bit.band(ranking, 0x30) == 0x30 then
|
|
offset = offset + 1 -- 11
|
|
end
|
|
elseif bit.band(ranking, 0x0C) == 0x04 then
|
|
offset = offset + 6 -- 13
|
|
end
|
|
elseif bit.band(ranking, 0x0C) == 0x04 then
|
|
offset = offset + 15 -- 15
|
|
if bit.band(ranking, 0x30) == 0x02 then
|
|
offset = offset + 3 -- 18
|
|
if bit.band(ranking, 0x03) == 0x03 then
|
|
offset = offset + 1 -- 19
|
|
end
|
|
elseif bit.band(ranking, 0x30) == 0x10 then
|
|
offset = offset + 6 -- 21
|
|
end
|
|
elseif bit.band(ranking, 0x30) == 0x10 then
|
|
offset = offset + 23 -- 23
|
|
if bit.band(ranking, 0x0C) == 0x08 then
|
|
offset = offset + 3 -- 26
|
|
if bit.band(ranking, 0x30) == 0x30 then
|
|
offset = offset + 1 -- 27
|
|
end
|
|
end
|
|
end
|
|
|
|
player:messageText(player, messageBase + offset, 5) -- Global balance of power:
|
|
|
|
if isConquestAlliance then
|
|
if bit.band(ranking, 0x03) == 0x01 then
|
|
player:messageText(player, messageBase + 50, 5) -- Bastok and Windurst have formed an alliance.
|
|
elseif bit.band(ranking, 0x0C) == 0x04 then
|
|
player:messageText(player, messageBase + 51, 5) -- San d'Oria and Windurst have formed an alliance.
|
|
elseif bit.band(ranking, 0x30) == 0x10 then
|
|
player:messageText(player, messageBase + 52, 5) -- San d'Oria and Bastok have formed an alliance.
|
|
end
|
|
end
|
|
end
|
|
|
|
xi.conquest.sendConquestTallyUpdateMessage = function(player, messageBase, owner, ranking, influence, isConquestAlliance)
|
|
if owner == xi.nation.NEUTRAL then
|
|
player:messageText(player, messageBase + 31, 5) -- Conquest update: This region is currently neutral.
|
|
else
|
|
player:messageText(player, messageBase + 32 + owner, 5) -- Conquest update: This region is currently under <nation> control.
|
|
end
|
|
|
|
if influence >= 64 then
|
|
player:messageText(player, messageBase + 37, 5) -- The beastmen are on the rise.
|
|
elseif influence == 0 then
|
|
player:messageText(player, messageBase + 36, 5) -- All three nations are at a deadlock.
|
|
else
|
|
local sandoria = bit.band(influence, 0x03)
|
|
local bastok = bit.rshift(bit.band(influence, 0x0C), 2)
|
|
local windurst = bit.rshift(bit.band(influence, 0x30), 4)
|
|
|
|
player:messageText(player, messageBase + 41 - sandoria, 5) -- Regional influence: San d'Oria
|
|
player:messageText(player, messageBase + 45 - bastok, 5) -- Regional influence: Bastok
|
|
player:messageText(player, messageBase + 49 - windurst, 5) -- Regional influence: Windurst
|
|
end
|
|
|
|
if isConquestAlliance then
|
|
if bit.band(ranking, 0x03) == 0x01 then
|
|
player:messageText(player, messageBase + 53, 5) -- Bastok and Windurst are currently allies.
|
|
elseif bit.band(ranking, 0x0C) == 0x04 then
|
|
player:messageText(player, messageBase + 54, 5) -- San d'Oria and Windurst are currently allies.
|
|
elseif bit.band(ranking, 0x30) == 0x10 then
|
|
player:messageText(player, messageBase + 55, 5) -- San d'Oria and Bastok are currently allies.
|
|
end
|
|
end
|
|
end
|
|
|
|
xi.conquest.onConquestUpdate = function(zone, updatetype, influence, owner, ranking, isConquestAlliance)
|
|
-- onConquestUpdate is called for zones in city regions as well
|
|
-- in such cases, owner and influence is undetermined, so we call a city specific method.
|
|
local regionId = zone:getRegionID()
|
|
if regionId > xi.region.TAVNAZIANARCH and regionId < xi.region.DYNAMIS then
|
|
xi.conquest.onCityConquestUpdate(zone, updatetype, ranking, isConquestAlliance)
|
|
return
|
|
end
|
|
|
|
local messageBase = zones[zone:getID()].text.CONQUEST_BASE
|
|
local players = zone:getPlayers()
|
|
|
|
-----------------------------------
|
|
-- WARNING: This is iterating every player in a zone, be careful not
|
|
-- : to put expensive operations like db reads in here!
|
|
-----------------------------------
|
|
for _, player in pairs(players) do
|
|
if updatetype == conquestConstants.TALLY_START then
|
|
xi.conquest.sendConquestTallyStartMessage(player, messageBase)
|
|
|
|
elseif updatetype == conquestConstants.TALLY_END then
|
|
xi.conquest.sendConquestTallyEndMessage(player, messageBase, owner, ranking, isConquestAlliance)
|
|
|
|
elseif updatetype == conquestConstants.UPDATE then
|
|
xi.conquest.sendConquestTallyUpdateMessage(player, messageBase, owner, ranking, influence, isConquestAlliance)
|
|
end
|
|
end
|
|
end
|
|
|
|
xi.conquest.onCityConquestUpdate = function(zone, updatetype, ranking, isconquestAlliance)
|
|
local messageBase = zones[zone:getID()].text.CONQUEST_BASE
|
|
local players = zone:getPlayers()
|
|
|
|
-----------------------------------
|
|
-- Once per zone logic
|
|
-----------------------------------
|
|
|
|
-- Triggers regional npc updates for city zones only
|
|
if updatetype == conquestConstants.TALLY_END then
|
|
xi.conquest.toggleRegionalNPCs(zone)
|
|
end
|
|
|
|
-----------------------------------
|
|
-- WARNING: This is iterating every player in a zone, be careful not
|
|
-- : to put expensive operations like db reads in here!
|
|
-----------------------------------
|
|
for _, player in pairs(players) do
|
|
if updatetype == conquestConstants.TALLY_START then
|
|
xi.conquest.sendConquestTallyStartMessage(player, messageBase)
|
|
|
|
elseif updatetype == conquestConstants.TALLY_END then
|
|
xi.conquest.sendCityConquestTallyEndMessage(player, messageBase, ranking, isconquestAlliance)
|
|
end
|
|
end
|
|
end
|