landsandboat/scripts/globals/conquest.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