landsandboat/scripts/globals/regimes.lua
2026-02-20 18:42:33 -07:00

1508 lines
54 KiB
Lua

-----------------------------------
-- Fields and Grounds of Valor
--
-- https://www.bg-wiki.com/bg/Fields_of_Valor
-- https://www.bg-wiki.com/bg/Grounds_of_Valor
-- http://ffxiclopedia.wikia.com/wiki/Category:Fields_of_Valor
-- http://ffxiclopedia.wikia.com/wiki/Grounds_of_Valor
-- http://ffxiclopedia.wikia.com/wiki/Field_Manual
-- http://ffxiclopedia.wikia.com/wiki/Grounds_Tome
-----------------------------------
require('scripts/globals/extravaganza')
require('scripts/globals/npc_util')
require('scripts/globals/roe')
require('scripts/globals/teleports')
-----------------------------------
xi = xi or {}
xi.regime = xi.regime or {}
xi.regime.type =
{
FIELDS = 1,
GROUNDS = 2,
}
-----------------------------------
-- FoV/GoV training regime information
-- { n1, n2, n3, n4, low, high, reward, regimeId },
-- n1, n2, n3, n4 = number of monsters needed
-- low, high are the level range
-- reward is the gil/tabs you get for completing
-----------------------------------
local regimeInfo =
{
-----------------------------------
-- Fields of Valor information
-----------------------------------
[xi.regime.type.FIELDS] =
{
sharedOptions =
{
[18] = { page = 1 },
[34] = { page = 2 },
[50] = { page = 3 },
[66] = { page = 4 },
[82] = { page = 5 },
},
updateOptions =
{
[ 1] = { review = true },
[ 6] = { details = true },
},
finishOptions =
{
[ 3] = { act = 'CANCEL_REGIME', cost = 0, discounted = 0 },
[ 21] = { act = 'REPATRIATION', cost = 50, discounted = 10 },
[ 37] = { act = 'RERAISE', cost = 10, discounted = 5 },
[ 53] = { act = 'REGEN', cost = 20, discounted = 10 },
[ 69] = { act = 'REFRESH', cost = 20, discounted = 10 },
[ 85] = { act = 'PROTECT', cost = 15, discounted = 5 },
[101] = { act = 'SHELL', cost = 15, discounted = 5 },
[117] = { act = 'DRIED_MEAT', cost = 50, discounted = 25, food = true },
[133] = { act = 'SALTED_FISH', cost = 50, discounted = 25, food = true },
[149] = { act = 'HARD_COOKIE', cost = 50, discounted = 25, food = true },
[165] = { act = 'INSTANT_NOODLES', cost = 50, discounted = 25, food = true },
[181] = { act = 'CIPHER_KORU', cost = 300, discounted = 300 },
[197] = { act = 'CIPHER_SAKURA', cost = 300, discounted = 300 },
-- TODO: implement elite training
-- ELITE_INTRO = 36,
-- ELITE_CHAP1 = 52,
-- ELITE_CHAP2 = 68,
-- ELITE_CHAP3 = 84,
-- ELITE_CHAP4 = 100,
-- ELITE_CHAP5 = 116,
-- ELITE_CHAP6 = 132,
-- ELITE_CHAP7 = 148,
},
zone =
{
[xi.zone.WEST_RONFAURE] =
{
event = 61,
page =
{
{ 6, 0, 0, 0, 1, 6, 270, 1 },
{ 6, 0, 0, 0, 2, 6, 285, 2 },
{ 5, 1, 0, 0, 4, 7, 300, 3 },
{ 4, 2, 0, 0, 4, 8, 315, 4 },
{ 6, 1, 0, 0, 4, 8, 330, 56 },
},
},
[xi.zone.EAST_RONFAURE] =
{
event = 61,
page =
{
{ 6, 0, 0, 0, 1, 5, 270, 64 },
{ 6, 0, 0, 0, 2, 5, 285, 65 },
{ 7, 0, 0, 0, 2, 6, 300, 66 },
{ 4, 2, 0, 0, 3, 6, 315, 67 },
{ 4, 2, 0, 0, 4, 8, 330, 68 },
},
},
[xi.zone.LA_THEINE_PLATEAU] =
{
event = 61,
page =
{
{ 3, 3, 0, 0, 8, 12, 330, 5 },
{ 3, 5, 0, 0, 11, 13, 360, 69 },
{ 8, 0, 0, 0, 12, 13, 390, 6 },
{ 5, 3, 0, 0, 11, 14, 420, 70 },
{ 5, 3, 0, 0, 10, 15, 450, 71 },
},
},
[xi.zone.VALKURM_DUNES] =
{
event = 47,
page =
{
{ 7, 1, 0, 0, 15, 19, 475, 7 },
{ 6, 2, 0, 0, 15, 22, 500, 8 },
{ 5, 3, 0, 0, 18, 23, 525, 9 },
{ 4, 4, 0, 0, 20, 23, 550, 10 },
{ 4, 2, 0, 0, 22, 25, 575, 57 },
},
},
[xi.zone.JUGNER_FOREST] =
{
event = 32,
page =
{
{ 8, 2, 0, 0, 15, 18, 480, 58 },
{ 9, 0, 0, 0, 21, 22, 540, 11 },
{ 8, 1, 0, 0, 21, 23, 570, 12 },
{ 7, 2, 0, 0, 22, 25, 600, 13 },
{ 6, 3, 0, 0, 24, 25, 630, 14 },
},
},
[xi.zone.BATALLIA_DOWNS] =
{
event = 61,
page =
{
{ 5, 2, 0, 0, 23, 26, 630, 72 },
{ 5, 2, 0, 0, 23, 28, 650, 73 },
{ 4, 3, 0, 0, 25, 28, 670, 15 },
{ 5, 2, 2, 0, 26, 32, 700, 74 },
{ 9, 0, 0, 0, 31, 32, 730, 75 },
},
},
[xi.zone.NORTH_GUSTABERG] =
{
event = 266,
page =
{
{ 6, 0, 0, 0, 1, 6, 270, 16 },
{ 6, 0, 0, 0, 3, 6, 285, 17 },
{ 5, 1, 0, 0, 3, 7, 300, 18 },
{ 4, 2, 0, 0, 3, 8, 315, 19 },
{ 3, 4, 0, 0, 3, 8, 330, 59 },
},
},
[xi.zone.SOUTH_GUSTABERG] =
{
event = 61,
page =
{
{ 6, 0, 0, 0, 1, 6, 270, 76 },
{ 7, 0, 0, 0, 2, 5, 285, 77 },
{ 3, 3, 0, 0, 3, 6, 300, 78 },
{ 7, 0, 0, 0, 3, 6, 315, 79 },
{ 5, 2, 0, 0, 4, 8, 330, 80 },
},
},
[xi.zone.KONSCHTAT_HIGHLANDS] =
{
event = 61,
page =
{
{ 4, 2, 0, 0, 8, 11, 340, 81 },
{ 4, 2, 0, 0, 9, 12, 360, 82 },
{ 3, 3, 0, 0, 10, 12, 330, 20 },
{ 6, 0, 0, 0, 9, 15, 380, 83 },
{ 2, 2, 2, 0, 12, 14, 400, 84 },
},
},
[xi.zone.PASHHOW_MARSHLANDS] =
{
event = 28,
page =
{
{ 9, 0, 0, 0, 20, 21, 540, 21 },
{ 8, 1, 0, 0, 20, 22, 570, 22 },
{ 7, 2, 0, 0, 21, 23, 600, 23 },
{ 6, 3, 0, 0, 22, 25, 630, 24 },
{ 5, 4, 1, 0, 22, 25, 660, 60 },
},
},
[xi.zone.ROLANBERRY_FIELDS] =
{
event = 61,
page =
{
{ 5, 2, 0, 0, 25, 26, 670, 85 },
{ 4, 3, 0, 0, 25, 28, 690, 25 },
{ 6, 2, 0, 0, 26, 32, 710, 86 },
{ 6, 2, 0, 0, 27, 33, 740, 87 },
{ 5, 0, 0, 0, 36, 37, 800, 88 },
},
},
[xi.zone.BEAUCEDINE_GLACIER] =
{
event = 218,
page =
{
{ 9, 2, 0, 0, 34, 38, 810, 46 },
{ 8, 3, 0, 0, 34, 39, 855, 47 },
{ 7, 4, 0, 0, 37, 42, 900, 48 },
{ 6, 4, 1, 0, 37, 43, 945, 49 },
{ 5, 4, 2, 0, 40, 43, 990, 50 },
},
},
[xi.zone.XARCABARD] =
{
event = 48,
page =
{
{ 9, 3, 0, 0, 42, 46, 900, 51 },
{ 8, 4, 0, 0, 42, 45, 950, 52 },
{ 7, 4, 1, 0, 42, 48, 1000, 53 },
{ 6, 4, 2, 0, 42, 48, 1050, 54 },
{ 5, 4, 3, 0, 45, 52, 1100, 55 },
},
},
[xi.zone.CAPE_TERIGGAN] =
{
event = 61,
page =
{
{ 4, 4, 0, 0, 62, 66, 1300, 104 },
{ 4, 5, 0, 0, 64, 68, 1320, 105 },
{ 4, 5, 0, 0, 64, 69, 1340, 106 },
{ 7, 3, 0, 0, 66, 74, 1390, 107 },
{ 4, 5, 0, 0, 71, 79, 1450, 108 },
},
},
[xi.zone.EASTERN_ALTEPA_DESERT] =
{
event = 61,
page =
{
{ 10, 0, 0, 0, 30, 34, 810, 109 },
{ 3, 1, 7, 0, 35, 40, 830, 110 },
{ 3, 1, 7, 0, 35, 44, 870, 111 },
{ 5, 2, 2, 1, 44, 49, 950, 112 },
{ 3, 3, 2, 1, 45, 49, 970, 113 },
},
},
[xi.zone.WEST_SARUTABARUTA] =
{
event = 52,
page =
{
{ 6, 0, 0, 0, 1, 5, 270, 26 },
{ 6, 0, 0, 0, 2, 5, 285, 27 },
{ 5, 1, 0, 0, 3, 8, 300, 28 },
{ 4, 2, 0, 0, 4, 8, 315, 29 },
{ 4, 2, 0, 0, 4, 8, 330, 61 },
},
},
[xi.zone.EAST_SARUTABARUTA] =
{
event = 61,
page =
{
{ 6, 0, 0, 0, 1, 6, 270, 89 },
{ 6, 0, 0, 0, 1, 8, 285, 90 },
{ 6, 0, 0, 0, 2, 6, 300, 91 },
{ 4, 2, 0, 0, 3, 6, 315, 92 },
{ 4, 3, 0, 0, 3, 6, 330, 93 },
},
},
[xi.zone.TAHRONGI_CANYON] =
{
event = 61,
page =
{
{ 3, 3, 0, 0, 7, 12, 330, 30 },
{ 8, 0, 0, 0, 11, 13, 450, 31 },
{ 4, 2, 0, 0, 7, 11, 315, 94 },
{ 3, 3, 0, 0, 8, 12, 370, 95 },
{ 3, 4, 0, 0, 12, 16, 475, 96 },
},
},
[xi.zone.BUBURIMU_PENINSULA] =
{
event = 51,
page =
{
{ 7, 1, 0, 0, 15, 19, 475, 32 },
{ 6, 2, 0, 0, 15, 23, 500, 33 },
{ 5, 3, 0, 0, 20, 24, 525, 34 },
{ 4, 4, 0, 0, 21, 24, 550, 35 },
{ 4, 3, 0, 0, 22, 27, 575, 62 },
},
},
[xi.zone.MERIPHATAUD_MOUNTAINS] =
{
event = 46,
page =
{
{ 9, 0, 0, 0, 20, 21, 540, 36 },
{ 8, 1, 0, 0, 20, 22, 570, 37 },
{ 7, 2, 0, 0, 21, 23, 600, 38 },
{ 6, 3, 0, 0, 22, 25, 630, 39 },
{ 3, 5, 0, 0, 25, 27, 660, 63 },
},
},
[xi.zone.SAUROMUGUE_CHAMPAIGN] =
{
event = 61,
page =
{
{ 4, 3, 0, 0, 25, 28, 690, 40 },
{ 4, 4, 0, 0, 26, 32, 710, 97 },
{ 2, 5, 0, 0, 26, 34, 710, 98 },
{ 3, 5, 0, 0, 27, 33, 730, 99 },
{ 5, 3, 0, 0, 36, 38, 770, 100 },
},
},
[xi.zone.THE_SANCTUARY_OF_ZITAH] =
{
event = 61,
page =
{
{ 7, 2, 0, 0, 40, 44, 900, 114 },
{ 7, 3, 0, 0, 41, 46, 940, 115 },
{ 7, 3, 0, 0, 41, 46, 980, 116 },
{ 7, 3, 0, 0, 42, 47, 1020, 117 },
{ 3, 5, 0, 0, 44, 50, 1100, 118 },
},
},
[xi.zone.ROMAEVE] =
{
event = 61,
page =
{
{ 3, 3, 0, 0, 60, 65, 1300, 119 },
{ 7, 0, 0, 0, 64, 69, 1330, 120 },
{ 7, 0, 0, 0, 65, 69, 1360, 121 },
{ 6, 1, 0, 0, 78, 82, 1540, 122 },
{ 6, 1, 0, 0, 79, 82, 1570, 123 },
},
},
[xi.zone.YUHTUNGA_JUNGLE] =
{
event = 61,
page =
{
{ 4, 5, 0, 0, 30, 35, 820, 124 },
{ 7, 4, 0, 0, 32, 37, 840, 125 },
{ 10, 0, 0, 0, 34, 36, 860, 126 },
{ 4, 6, 0, 0, 34, 38, 880, 127 },
{ 4, 6, 0, 0, 34, 41, 920, 128 },
},
},
[xi.zone.YHOATOR_JUNGLE] =
{
event = 61,
page =
{
{ 3, 6, 0, 0, 35, 39, 840, 129 },
{ 3, 6, 0, 0, 35, 40, 880, 130 },
{ 10, 0, 0, 0, 40, 44, 920, 131 },
{ 7, 3, 0, 0, 40, 46, 940, 132 },
{ 10, 0, 0, 0, 45, 49, 1000, 133 },
},
},
[xi.zone.WESTERN_ALTEPA_DESERT] =
{
event = 61,
page =
{
{ 7, 3, 0, 0, 40, 45, 920, 134 },
{ 5, 1, 4, 0, 44, 49, 980, 135 },
{ 10, 1, 0, 0, 47, 53, 1020, 136 },
{ 2, 8, 0, 0, 51, 56, 1080, 137 },
{ 4, 6, 0, 0, 54, 58, 1140, 138 },
},
},
[xi.zone.QUFIM_ISLAND] =
{
event = 33,
page =
{
{ 9, 1, 0, 0, 26, 29, 630, 41 },
{ 8, 2, 0, 0, 26, 29, 665, 42 },
{ 7, 3, 0, 0, 28, 29, 700, 43 },
{ 6, 4, 0, 0, 28, 30, 735, 44 },
{ 5, 4, 1, 0, 28, 34, 770, 45 },
},
},
[xi.zone.BEHEMOTHS_DOMINION] =
{
event = 61,
page =
{
{ 3, 2, 0, 0, 41, 44, 350, 101 },
{ 3, 2, 0, 0, 41, 46, 400, 102 },
{ 3, 2, 0, 0, 43, 47, 450, 103 },
},
},
[xi.zone.VALLEY_OF_SORROWS] =
{
event = 61,
page =
{
{ 5, 2, 0, 0, 66, 72, 1220, 139 },
{ 5, 1, 0, 0, 66, 74, 1260, 140 },
{ 4, 1, 0, 0, 69, 74, 1300, 141 },
},
},
[xi.zone.RUAUN_GARDENS] =
{
event = 73,
page =
{
{ 8, 3, 0, 0, 72, 76, 1450, 142 },
{ 8, 3, 0, 0, 73, 78, 1500, 143 },
{ 11, 0, 0, 0, 75, 78, 1550, 144 },
{ 2, 2, 2, 0, 78, 79, 1600, 145 },
{ 2, 2, 2, 0, 78, 79, 1600, 146 },
},
},
},
},
-----------------------------------
-- Grounds of Valor information
-----------------------------------
[xi.regime.type.GROUNDS] =
{
sharedOptions =
{
[ 18] = { page = 1 },
[ 34] = { page = 2 },
[ 50] = { page = 3 },
[ 66] = { page = 4 },
[ 82] = { page = 5 },
[ 98] = { page = 6 },
[114] = { page = 7 },
[130] = { page = 8 },
[146] = { page = 9 },
[162] = { page = 10 },
},
updateOptions =
{
[ 1] = { review = true },
[ 5] = { details = true },
[ 7] = { prowess = true },
},
finishOptions =
{
[ 3] = { act = 'CANCEL_REGIME', cost = 0, discounted = 0 },
[ 20] = { act = 'REPATRIATION', cost = 50, discounted = 10 },
[ 36] = { act = 'CIRCUMSPECTION', cost = 5, discounted = 5 },
[ 52] = { act = 'HOMING_INSTINCT', cost = 50, discounted = 25 },
[ 68] = { act = 'RERAISE', cost = 10, discounted = 5 },
[ 84] = { act = 'RERAISE_II', cost = 20, discounted = 10 },
[100] = { act = 'RERAISE_III', cost = 30, discounted = 15 },
[116] = { act = 'REGEN', cost = 20, discounted = 10 },
[132] = { act = 'REFRESH', cost = 20, discounted = 10 },
[148] = { act = 'PROTECT', cost = 15, discounted = 5 },
[164] = { act = 'SHELL', cost = 15, discounted = 5 },
[180] = { act = 'HASTE', cost = 20, discounted = 10 },
[196] = { act = 'DRIED_MEAT', cost = 50, discounted = 25, food = true },
[212] = { act = 'SALTED_FISH', cost = 50, discounted = 25, food = true },
[228] = { act = 'HARD_COOKIE', cost = 50, discounted = 25, food = true },
[244] = { act = 'INSTANT_NOODLES', cost = 50, discounted = 25, food = true },
[260] = { act = 'DRIED_AGARICUS', cost = 50, discounted = 25, food = true },
[276] = { act = 'INSTANT_RICE', cost = 50, discounted = 25, food = true },
[292] = { act = 'CIPHER_SAKURA', cost = 300, discounted = 300 },
[308] = { act = 'CIPHER_KORU', cost = 300, discounted = 300 },
},
zone =
{
[xi.zone.THE_BOYAHDA_TREE] =
{
event = 17,
page =
{
{ 3, 3, 0, 0, 60, 63, 1470, 719 },
{ 4, 3, 0, 0, 62, 66, 1720, 720 },
{ 4, 3, 0, 0, 62, 67, 1760, 721 },
{ 4, 2, 0, 0, 72, 75, 1770, 722 },
{ 3, 4, 0, 0, 72, 76, 1830, 723 },
{ 4, 3, 0, 0, 72, 78, 1900, 724 },
{ 3, 3, 0, 0, 74, 78, 1640, 725 },
{ 2, 2, 2, 0, 102, 105, 2040, 726 },
},
},
[xi.zone.MIDDLE_DELKFUTTS_TOWER] =
{
event = 18,
page =
{
{ 4, 3, 0, 0, 25, 34, 1090, 782 },
{ 4, 3, 0, 0, 25, 34, 1090, 783 },
{ 4, 4, 0, 0, 30, 34, 1290, 784 },
},
},
[xi.zone.UPPER_DELKFUTTS_TOWER] =
{
event = 20,
page =
{
{ 6, 0, 0, 0, 34, 35, 1010, 785 },
{ 2, 2, 2, 0, 62, 69, 1520, 786 },
{ 2, 2, 2, 0, 62, 69, 1520, 787 },
{ 2, 2, 2, 0, 65, 69, 1540, 788 },
{ 2, 2, 2, 0, 65, 69, 1540, 789 },
},
},
[xi.zone.TEMPLE_OF_UGGALEPIH] =
{
event = 83,
page =
{
{ 3, 3, 0, 0, 51, 57, 1450, 790 },
{ 4, 2, 0, 0, 51, 57, 1450, 791 },
{ 4, 2, 0, 0, 51, 57, 1450, 792 },
{ 3, 3, 0, 0, 61, 63, 1630, 793 },
{ 3, 3, 0, 0, 61, 67, 1650, 794 },
{ 3, 3, 0, 0, 61, 68, 1660, 795 },
},
},
[xi.zone.DEN_OF_RANCOR] =
{
event = 13,
page =
{
{ 3, 3, 0, 0, 60, 64, 1370, 796 },
{ 4, 2, 0, 0, 60, 67, 1500, 797 },
{ 6, 0, 0, 0, 62, 69, 1820, 798 },
{ 4, 2, 0, 0, 62, 69, 1640, 799 },
{ 4, 2, 0, 0, 62, 76, 1650, 800 },
{ 5, 1, 0, 0, 73, 81, 1690, 801 },
{ 3, 3, 0, 0, 74, 79, 1640, 802 },
{ 4, 2, 0, 0, 75, 80, 1790, 803 },
},
},
[xi.zone.RANGUEMONT_PASS] =
{
event = 24,
page =
{
{ 4, 1, 0, 0, 3, 5, 270, 602 },
{ 5, 1, 0, 0, 25, 30, 930, 603 },
{ 4, 2, 0, 0, 26, 30, 860, 604 },
{ 4, 2, 0, 0, 26, 30, 860, 605 },
{ 4, 2, 0, 0, 30, 34, 970, 606 },
{ 5, 2, 0, 0, 87, 92, 2260, 607 },
{ 3, 3, 0, 0, 88, 90, 2260, 608 },
{ 3, 3, 0, 0, 88, 90, 1850, 609 },
},
},
[xi.zone.BOSTAUNIEUX_OUBLIETTE] =
{
event = 114,
page =
{
{ 5, 0, 0, 0, 52, 54, 1110, 610 },
{ 4, 2, 0, 0, 52, 59, 1320, 611 },
{ 5, 1, 0, 0, 56, 63, 1430, 612 },
{ 9, 0, 0, 0, 65, 68, 2050, 613 },
{ 6, 1, 0, 0, 94, 97, 2300, 614 },
{ 6, 1, 0, 0, 95, 97, 2300, 615 },
{ 6, 0, 0, 0, 96, 97, 1960, 616 },
{ 2, 5, 0, 0, 95, 99, 2480, 617 },
},
},
[xi.zone.TORAIMARAI_CANAL] =
{
event = 100,
page =
{
{ 3, 3, 0, 0, 47, 52, 1260, 618 },
{ 2, 2, 2, 0, 52, 57, 1410, 619 },
{ 3, 3, 0, 0, 53, 57, 1500, 620 },
{ 3, 4, 0, 0, 60, 65, 1690, 621 },
{ 4, 3, 0, 0, 95, 97, 2240, 622 },
{ 5, 2, 0, 0, 95, 98, 2170, 623 },
{ 5, 2, 0, 0, 96, 98, 2250, 624 },
{ 8, 2, 0, 0, 94, 99, 2050, 625 },
},
},
[xi.zone.ZERUHN_MINES] =
{
event = 210,
page =
{
{ 3, 0, 0, 0, 1, 3, 90, 626 },
{ 3, 0, 0, 0, 2, 4, 110, 627 },
{ 5, 2, 0, 0, 75, 78, 1640, 628 },
{ 5, 2, 0, 0, 75, 79, 1600, 629 },
{ 5, 2, 0, 0, 75, 80, 1700, 630 },
},
},
[xi.zone.KORROLOKA_TUNNEL] =
{
event = 4,
page =
{
{ 2, 4, 0, 0, 20, 26, 780, 727 },
{ 3, 3, 0, 0, 22, 30, 870, 728 },
{ 4, 2, 0, 0, 23, 31, 950, 729 },
{ 6, 0, 0, 0, 28, 31, 980, 730 },
{ 3, 3, 0, 0, 29, 33, 930, 731 },
{ 4, 0, 0, 0, 30, 33, 770, 732 },
{ 6, 0, 0, 0, 35, 37, 1030, 733 },
{ 4, 3, 0, 0, 87, 91, 2140, 734 },
},
},
[xi.zone.KUFTAL_TUNNEL] =
{
event = 29,
page =
{
{ 3, 3, 0, 0, 60, 64, 1440, 735 },
{ 5, 1, 0, 0, 60, 66, 1480, 736 },
{ 3, 3, 0, 0, 60, 66, 1380, 737 },
{ 4, 2, 0, 0, 60, 67, 1550, 738 },
{ 3, 3, 0, 0, 63, 69, 1410, 739 },
{ 3, 3, 0, 0, 65, 69, 1540, 740 },
{ 3, 3, 0, 0, 77, 80, 1660, 741 },
{ 3, 3, 0, 0, 99, 103, 1900, 742 },
},
},
[xi.zone.SEA_SERPENT_GROTTO] =
{
event = 24,
page =
{
{ 3, 3, 0, 0, 35, 39, 1040, 804 },
{ 2, 4, 0, 0, 37, 41, 1050, 805 },
{ 5, 1, 0, 0, 41, 45, 1180, 806 },
{ 4, 2, 0, 0, 43, 48, 1190, 807 },
{ 4, 2, 0, 0, 44, 48, 1220, 808 },
{ 3, 3, 0, 0, 62, 67, 1470, 809 },
{ 3, 3, 0, 0, 62, 69, 1480, 810 },
{ 3, 3, 0, 0, 66, 69, 1500, 811 },
},
},
[xi.zone.VELUGANNON_PALACE] =
{
event = 4,
page =
{
{ 10, 0, 0, 0, 72, 72, 2390, 743 },
{ 7, 0, 0, 0, 74, 77, 1900, 744 },
{ 7, 0, 0, 0, 75, 78, 1920, 745 },
{ 7, 0, 0, 0, 76, 79, 2120, 746 },
{ 7, 0, 0, 0, 77, 80, 2230, 747 },
{ 6, 0, 0, 0, 79, 80, 2180, 748 },
},
},
[xi.zone.THE_SHRINE_OF_RUAVITAU] =
{
event = 61,
page =
{
{ 10, 0, 0, 0, 71, 71, 2370, 749 },
{ 6, 0, 0, 0, 71, 74, 2080, 750 },
{ 7, 0, 0, 0, 75, 80, 1930, 751 },
{ 7, 0, 0, 0, 77, 82, 2150, 752 },
{ 7, 0, 0, 0, 79, 82, 2050, 753 },
{ 7, 0, 0, 0, 81, 84, 2390, 754 },
},
},
[xi.zone.LOWER_DELKFUTTS_TOWER] =
{
event = 40,
page =
{
{ 3, 3, 0, 0, 25, 30, 900, 777 },
{ 3, 3, 0, 0, 25, 30, 900, 778 },
{ 3, 3, 0, 0, 25, 30, 930, 779 },
{ 4, 2, 0, 0, 25, 32, 980, 780 },
{ 4, 2, 0, 0, 25, 35, 940, 781 },
},
},
[xi.zone.KING_RANPERRES_TOMB] =
{
event = 100,
page =
{
{ 3, 3, 0, 0, 3, 8, 380, 631 },
{ 4, 2, 0, 0, 5, 11, 420, 632 },
{ 2, 2, 2, 0, 12, 16, 610, 633 },
{ 3, 3, 0, 0, 14, 17, 590, 634 },
{ 2, 2, 2, 0, 21, 23, 864, 635 },
{ 6, 1, 0, 0, 78, 80, 1520, 636 },
{ 5, 2, 0, 0, 77, 80, 1690, 637 },
{ 5, 2, 0, 0, 80, 83, 1720, 638 },
},
},
[xi.zone.DANGRUF_WADI] =
{
event = 160,
page =
{
{ 4, 1, 0, 0, 3, 8, 280, 639 },
{ 3, 2, 0, 0, 5, 9, 350, 640 },
{ 3, 2, 0, 0, 11, 14, 490, 641 },
{ 4, 2, 0, 0, 86, 89, 1830, 642 },
{ 5, 2, 0, 0, 86, 90, 1650, 643 },
{ 5, 2, 0, 0, 86, 90, 1840, 644 },
{ 2, 2, 2, 0, 90, 91, 1860, 645 },
{ 5, 2, 0, 0, 90, 93, 2260, 646 },
},
},
[xi.zone.INNER_HORUTOTO_RUINS] =
{
event = 100,
page =
{
{ 2, 3, 0, 0, 1, 6, 250, 647 },
{ 2, 3, 0, 0, 1, 7, 270, 648 },
{ 3, 2, 0, 0, 15, 20, 610, 649 },
{ 4, 2, 0, 0, 22, 26, 840, 650 },
{ 3, 3, 0, 0, 78, 82, 1750, 651 },
{ 3, 3, 0, 0, 79, 82, 1760, 652 },
{ 2, 4, 0, 0, 81, 83, 1770, 653 },
{ 2, 4, 0, 0, 81, 84, 1780, 654 },
},
},
[xi.zone.ORDELLES_CAVES] =
{
event = 100,
page =
{
{ 3, 3, 0, 0, 18, 21, 730, 655 },
{ 4, 2, 0, 0, 21, 27, 840, 656 },
{ 5, 1, 0, 0, 17, 26, 800, 657 },
{ 3, 3, 0, 0, 23, 26, 850, 658 },
{ 4, 2, 0, 0, 26, 28, 950, 659 },
{ 4, 1, 0, 0, 29, 34, 830, 660 },
{ 3, 3, 0, 0, 84, 86, 1810, 661 },
{ 3, 3, 0, 0, 86, 88, 1890, 662 },
},
},
[xi.zone.OUTER_HORUTOTO_RUINS] =
{
event = 110,
page =
{
{ 1, 1, 1, 1, 10, 14, 340, 663 },
{ 1, 1, 1, 1, 15, 19, 450, 664 },
{ 1, 1, 1, 1, 20, 24, 540, 665 },
{ 1, 1, 1, 1, 25, 29, 590, 666 },
{ 1, 1, 1, 1, 30, 34, 650, 667 },
{ 1, 1, 1, 1, 35, 39, 700, 668 },
{ 5, 1, 0, 0, 81, 85, 1840, 669 },
{ 5, 1, 0, 0, 82, 85, 1850, 670 },
},
},
[xi.zone.THE_ELDIEME_NECROPOLIS] =
{
event = 100,
page =
{
{ 6, 0, 0, 0, 42, 46, 950, 671 },
{ 6, 0, 0, 0, 46, 49, 1030, 672 },
{ 4, 2, 0, 0, 51, 54, 1300, 673 },
{ 5, 1, 0, 0, 50, 55, 1340, 674 },
{ 3, 3, 0, 0, 53, 56, 1330, 675 },
{ 3, 3, 0, 0, 60, 63, 1470, 676 },
{ 3, 3, 0, 0, 91, 95, 1890, 677 },
{ 3, 3, 0, 0, 91, 95, 1890, 678 },
},
},
[xi.zone.GUSGEN_MINES] =
{
event = 100,
page =
{
{ 6, 0, 0, 0, 20, 27, 660, 679 },
{ 2, 4, 0, 0, 20, 24, 800, 680 },
{ 2, 4, 0, 0, 21, 26, 790, 681 },
{ 2, 2, 2, 0, 28, 31, 1050, 682 },
{ 3, 3, 0, 0, 30, 34, 970, 683 },
{ 3, 3, 0, 0, 32, 36, 1000, 684 },
{ 2, 5, 0, 0, 85, 87, 1890, 685 },
{ 2, 5, 0, 0, 85, 89, 2180, 686 },
},
},
[xi.zone.CRAWLERS_NEST] =
{
event = 100,
page =
{
{ 3, 3, 0, 0, 40, 44, 1160, 687 },
{ 3, 3, 0, 0, 45, 49, 1230, 688 },
{ 3, 3, 0, 0, 49, 52, 1280, 689 },
{ 4, 2, 0, 0, 50, 54, 1300, 690 },
{ 2, 2, 2, 0, 53, 58, 1340, 691 },
{ 3, 3, 0, 0, 59, 63, 1470, 692 },
{ 4, 3, 0, 0, 91, 93, 2190, 693 },
{ 4, 3, 0, 0, 92, 96, 2220, 694 },
},
},
[xi.zone.MAZE_OF_SHAKHRAMI] =
{
event = 100,
page =
{
{ 3, 2, 0, 0, 15, 18, 550, 695 },
{ 4, 2, 0, 0, 18, 23, 700, 696 },
{ 2, 4, 0, 0, 22, 26, 840, 697 },
{ 2, 4, 0, 0, 26, 31, 920, 698 },
{ 4, 2, 0, 0, 26, 31, 820, 699 },
{ 5, 1, 0, 0, 27, 33, 840, 700 },
{ 3, 3, 0, 0, 83, 85, 1840, 701 },
{ 3, 3, 0, 0, 86, 88, 1830, 702 },
},
},
[xi.zone.GARLAIGE_CITADEL] =
{
event = 110,
page =
{
{ 4, 2, 0, 0, 40, 43, 1160, 703 },
{ 4, 2, 0, 0, 40, 44, 1160, 704 },
{ 2, 4, 0, 0, 46, 49, 1240, 705 },
{ 4, 2, 0, 0, 51, 55, 1310, 706 },
{ 3, 3, 0, 0, 52, 58, 1330, 707 },
{ 2, 2, 1, 0, 59, 62, 1270, 708 },
{ 5, 2, 0, 0, 91, 96, 1840, 709 },
{ 4, 3, 0, 0, 92, 96, 2220, 710 },
},
},
[xi.zone.FEIYIN] =
{
event = 100,
page =
{
{ 4, 2, 0, 0, 40, 43, 1180, 711 },
{ 4, 2, 0, 0, 43, 46, 1240, 712 },
{ 5, 1, 0, 0, 50, 55, 1310, 713 },
{ 4, 2, 0, 0, 50, 56, 1310, 714 },
{ 5, 1, 0, 0, 50, 58, 1340, 715 },
{ 3, 3, 0, 0, 59, 63, 1470, 716 },
{ 4, 2, 0, 0, 95, 99, 2060, 717 },
{ 4, 3, 0, 0, 95, 99, 2250, 718 },
},
},
[xi.zone.IFRITS_CAULDRON] =
{
event = 51,
page =
{
{ 4, 1, 0, 0, 61, 68, 1270, 755 },
{ 4, 1, 0, 0, 61, 68, 1570, 756 },
{ 4, 1, 0, 0, 62, 69, 1280, 757 },
{ 3, 2, 0, 0, 62, 73, 1310, 758 },
{ 3, 2, 0, 0, 62, 73, 1380, 759 },
{ 4, 2, 0, 0, 69, 74, 1610, 760 },
{ 4, 2, 0, 0, 71, 78, 1650, 761 },
{ 4, 2, 0, 0, 71, 78, 1760, 762 },
},
},
[xi.zone.QUICKSAND_CAVES] =
{
event = 15,
page =
{
{ 3, 3, 0, 0, 51, 55, 1310, 812 },
{ 3, 3, 0, 0, 51, 58, 1360, 813 },
{ 3, 3, 0, 0, 51, 59, 1230, 814 },
{ 7, 0, 0, 0, 52, 59, 1480, 815 },
{ 3, 3, 0, 0, 52, 59, 1470, 816 },
{ 3, 3, 0, 0, 56, 59, 1360, 817 },
{ 3, 3, 0, 0, 62, 65, 1570, 818 },
{ 3, 3, 0, 0, 65, 69, 1540, 819 },
},
},
[xi.zone.GUSTAV_TUNNEL] =
{
event = 17,
page =
{
{ 2, 2, 1, 0, 44, 49, 1040, 763 },
{ 2, 2, 2, 0, 45, 49, 1230, 764 },
{ 3, 2, 1, 0, 65, 68, 1490, 765 },
{ 3, 3, 0, 0, 73, 76, 1620, 766 },
{ 5, 1, 0, 0, 75, 78, 1700, 767 },
{ 5, 1, 0, 0, 75, 79, 1680, 768 },
{ 4, 2, 0, 0, 76, 80, 1710, 769 },
{ 5, 2, 0, 0, 100, 103, 2310, 770 },
},
},
[xi.zone.LABYRINTH_OF_ONZOZO] =
{
event = 3,
page =
{
{ 2, 3, 0, 0, 45, 49, 1050, 771 },
{ 3, 2, 0, 0, 50, 53, 1070, 772 },
{ 3, 2, 0, 0, 50, 54, 1140, 773 },
{ 3, 2, 0, 0, 55, 59, 1130, 774 },
{ 4, 1, 0, 0, 70, 74, 1350, 775 },
{ 4, 2, 0, 0, 95, 98, 1920, 776 },
},
},
},
},
}
local function getPageByRegimeId(regimeType, zoneId, regimeId)
local info = regimeInfo[regimeType]
if not info then
return nil
end
info = info.zone[zoneId]
if not info then
return nil
end
info = info.page
if not info then
return nil
end
for _, v in pairs(info) do
if v[8] == regimeId then
return v
end
end
return nil
end
local function getPageByNum(regimeType, zoneId, pageNum)
local info = regimeInfo[regimeType]
if not info then
return nil
end
info = info.zone[zoneId]
if not info then
return nil
end
info = info.page
return info[pageNum]
end
local function getUpdateOpts(regimeType)
local out = {}
for k, v in pairs(regimeInfo[regimeType].updateOptions) do
out[k] = v
end
for k, v in pairs(regimeInfo[regimeType].sharedOptions) do
out[k] = v
end
return out
end
local function getFinishOpts(regimeType)
local out = {}
for k, v in pairs(regimeInfo[regimeType].finishOptions) do
out[k] = v
end
for k, v in pairs(regimeInfo[regimeType].sharedOptions) do
out[k] = v
end
return out
end
-- first time an effect is applied, use basePower
-- each additional time an effect is applied, use addPower
-- can stack each effect up to maxStack times, per https://ffxiclopedia.fandom.com/wiki/Grounds_of_Valor#Prowesses
local prowessData =
{
{ effect = xi.effect.PROWESS_CASKET_RATE, basePower = 4, addPower = 4, maxStack = 5 },
{ effect = xi.effect.PROWESS_SKILL_RATE, basePower = 4, addPower = 4, maxStack = 11 },
{ effect = xi.effect.PROWESS_CRYSTAL_YIELD, basePower = 4, addPower = 4, maxStack = 5 },
{ effect = xi.effect.PROWESS_TH, basePower = 1, addPower = 1, maxStack = 3 },
{ effect = xi.effect.PROWESS_ATTACK_SPEED, basePower = 400, addPower = 400, maxStack = 4 },
{ effect = xi.effect.PROWESS_HP_MP, basePower = 3, addPower = 1, maxStack = 11 },
{ effect = xi.effect.PROWESS_ACC_RACC, basePower = 4, addPower = 4, maxStack = 11 },
{ effect = xi.effect.PROWESS_ATT_RATT, basePower = 4, addPower = 4, maxStack = 11 },
{ effect = xi.effect.PROWESS_MACC_MATK, basePower = 4, addPower = 4, maxStack = 10 },
{ effect = xi.effect.PROWESS_CURE_POTENCY, basePower = 4, addPower = 4, maxStack = 5 },
{ effect = xi.effect.PROWESS_WS_DMG, basePower = 2, addPower = 2, maxStack = 5 },
{ effect = xi.effect.PROWESS_KILLER, basePower = 4, addPower = 4, maxStack = 2 },
}
local function addGovProwessBonusEffect(player)
-- make a table of prowesses that are not yet maxed
local availableProwesses = {}
for i = 1, #prowessData do
local p = prowessData[i]
local e = player:getStatusEffect(p.effect)
if not e or e:getPower() < (p.basePower + p.addPower * (p.maxStack - 1)) then
table.insert(availableProwesses, p)
end
end
-- pick one and apply
if #availableProwesses > 0 then
local p = availableProwesses[math.random(1, #availableProwesses)]
local e = player:getStatusEffect(p.effect)
-- get current power
local power = 0
if e then
power = e:getPower()
player:delStatusEffectSilent(p.effect)
end
-- add either basePower or addPower
if power == 0 then
power = p.basePower
else
power = power + p.addPower
end
-- set effect
player:addStatusEffect(p.effect, { power = power, origin = player, icon = 0 })
player:messageBasic(p.effect - 168)
end
end
-- function made global to be called by hunts.lua
xi.regime.clearRegimeVars = function(player)
player:setCharVar('[regime]type', 0)
player:setCharVar('[regime]zone', 0)
player:setCharVar('[regime]id', 0)
player:setCharVar('[regime]repeat', 0)
player:setCharVar('[regime]lastReward', 0)
for i = 1, 4 do
player:setCharVar('[regime]needed' .. i, 0)
player:setCharVar('[regime]killed' .. i, 0)
end
end
xi.regime.bookOnTrigger = function(player, regimeType)
local cipher = 0 -- Trust Alter Ego Extravaganza
local active = xi.extravaganza.campaignActive()
if
active == xi.extravaganza.campaign.SPRING_FALL or
active == xi.extravaganza.campaign.BOTH
then
cipher = 3
end
local info = regimeInfo[regimeType].zone[player:getZoneID()]
-- checks if hunt is active, if so prompts player to cancel
if player:getCharVar('[hunt]status') >= 1 then
player:startEvent(info.event, 0, 0, 3, 1, 0, 0, player:getCurrency('valor_point'), player:getCharVar('[hunt]id'))
elseif
(regimeType == xi.regime.type.FIELDS and xi.settings.main.ENABLE_FIELD_MANUALS == 1) or
(regimeType == xi.regime.type.GROUNDS and xi.settings.main.ENABLE_GROUNDS_TOMES == 1)
then
-- arg2 is a bitmask that controls which pages appear for examination
-- here, we only show pages that have regime info
-- arg4 reduces prices of field suppord
local pages = #info.page
local arg2 = 0
local arg4 = 0
for i = 1, 10 do
if i > pages then
arg2 = arg2 + 2^i
end
end
if player:hasKeyItem(xi.ki.RHAPSODY_IN_WHITE) then
arg4 = 1
end
player:startEvent(info.event, 0, arg2, cipher, arg4, 0, 0, player:getCurrency('valor_point'), player:getCharVar('[regime]id'))
else
player:printToPlayer('Disabled.')
end
end
xi.regime.bookOnEventUpdate = function(player, option, regimeType)
local page = getPageByRegimeId(player:getCharVar('[regime]type'), player:getCharVar('[regime]zone'), player:getCharVar('[regime]id'))
-- check valid option
local opts = getUpdateOpts(regimeType)
local opt = opts[option]
if not opt then
return
end
-- review current training regime: progress on mobs
if opt.review and page then
local n1 = (page[1] ~= 0) and player:getCharVar('[regime]killed1') or 0
local n2 = (page[2] ~= 0) and player:getCharVar('[regime]killed2') or 0
local n3 = (page[3] ~= 0) and player:getCharVar('[regime]killed3') or 0
local n4 = (page[4] ~= 0) and player:getCharVar('[regime]killed4') or 0
player:updateEvent(page[1], page[2], page[3], page[4], n1, n2, n3, n4)
-- review current training regime: level range and training area
elseif opt.details and page then
player:updateEvent(0, 0, 0, 0, 0, page[5], page[6], 0)
-- TO DO: read about prowesses
elseif opt.prowess then
player:updateEvent(0, 0, 0, 0, 0, 0, 0, 0)
-- select a regime
elseif opt.page then
page = getPageByNum(regimeType, player:getZoneID(), opt.page)
if page then
player:updateEvent(page[1], page[2], page[3], page[4], 0, page[5], page[6], page[8])
end
end
end
xi.regime.bookOnEventFinish = function(player, option, regimeType)
local zoneId = player:getZoneID()
local msgOffset = zones[zoneId].text.REGIME_REGISTERED
local tabs = player:getCurrency('valor_point')
local regimeRepeat = bit.band(option, 0x80000000)
local hasKI = player:hasKeyItem(xi.ki.RHAPSODY_IN_WHITE)
option = bit.band(option, 0x7FFFFFFF)
if option == 7 then
xi.hunts.clearHuntVars(player)
end
-- check valid option
local opts = getFinishOpts(regimeType)
local opt = opts[option]
if not opt then
return
end
local cost = opt.cost
-- charges player differently if they hold RoV KeyItem
if cost and hasKI then
cost = opt.discounted
end
-- check player has enough tabs
if cost and cost > tabs then
player:showText(player, msgOffset + 1032) -- You do not have enough tabs.
return
end
-- check player can eat
if opt.food and player:hasStatusEffect(xi.effect.FOOD) then
player:messageBasic(xi.msg.basic.IS_FULL)
return
end
-- purchase a service
if opt.act then
local act = opt.act
player:delCurrency('valor_point', cost)
switch (act) : caseof
{
['CANCEL_REGIME'] = function()
xi.regime.clearRegimeVars(player)
player:showText(player, msgOffset + 2) -- Training regime canceled.
end,
['REPATRIATION'] = function()
player:addStatusEffect(xi.effect.TELEPORT, { power = xi.teleport.id.HOME_NATION, duration = 1, origin = player, icon = 0 })
end,
['CIRCUMSPECTION'] = function()
player:delStatusEffectSilent(xi.effect.SNEAK)
player:addStatusEffect(xi.effect.SNEAK, { duration = 900 * xi.settings.main.SNEAK_INVIS_DURATION_MULTIPLIER, origin = player, tick = 10 })
player:delStatusEffectSilent(xi.effect.INVISIBLE)
player:addStatusEffect(xi.effect.INVISIBLE, { duration = 900 * xi.settings.main.SNEAK_INVIS_DURATION_MULTIPLIER, origin = player, tick = 10 })
end,
['HOMING_INSTINCT'] = function()
player:addStatusEffect(xi.effect.TELEPORT, { power = xi.teleport.id.WARP, duration = 3, origin = player, icon = 0 })
end,
['RERAISE'] = function()
player:delStatusEffectSilent(xi.effect.RERAISE)
player:addStatusEffect(xi.effect.RERAISE, { power = 1, duration = 7200, origin = player })
end,
['RERAISE_II'] = function()
player:delStatusEffectSilent(xi.effect.RERAISE)
player:addStatusEffect(xi.effect.RERAISE, { power = 2, duration = 7200, origin = player })
end,
['RERAISE_III'] = function()
player:delStatusEffectSilent(xi.effect.RERAISE)
player:addStatusEffect(xi.effect.RERAISE, { power = 3, duration = 7200, origin = player })
end,
['REGEN'] = function()
player:delStatusEffectSilent(xi.effect.REGEN)
player:addStatusEffect(xi.effect.REGEN, { power = 1, duration = 3600, origin = player, tick = 3 })
end,
['REFRESH'] = function()
player:delStatusEffectSilent(xi.effect.REFRESH)
player:addStatusEffect(xi.effect.REFRESH, { power = 1, duration = 3600, origin = player, tick = 3 }) -- Does indeed get overwriten by regular refresh.
end,
['PROTECT'] = function()
local mLvl = player:getMainLvl()
local power = 220
local tier = 5
if mLvl < 27 then
power = 20
tier = 1
elseif mLvl < 47 then
power = 50
tier = 2
elseif mLvl < 63 then
power = 90
tier = 3
elseif mLvl < 76 then
power = 140
tier = 4
end
local bonus = 0
if player:getMod(xi.mod.ENHANCES_PROT_SHELL_RCVD) > 0 then
bonus = 2 -- 2x Tier from MOD
end
power = power + (bonus * tier)
player:delStatusEffectSilent(xi.effect.PROTECT)
player:addStatusEffect(xi.effect.PROTECT, { power = power, duration = 1800, origin = player, tier = tier })
end,
['SHELL'] = function()
local mLvl = player:getMainLvl()
-- Shell V (75/256)
local power = 2930
local tier = 5
if mLvl < 37 then
power = 1055 -- Shell I (27/256)
tier = 1
elseif mLvl < 57 then
power = 1641 -- Shell II (42/256)
tier = 2
elseif mLvl < 68 then
power = 2188 -- Shell III (56/256)
tier = 3
elseif mLvl < 76 then
power = 2617 -- Shell IV (67/256)
tier = 4
end
local bonus = 0
if player:getMod(xi.mod.ENHANCES_PROT_SHELL_RCVD) > 0 then
bonus = 39 -- (1/256 bonus buff per tier of spell)
end
power = power + (bonus * tier)
player:delStatusEffectSilent(xi.effect.SHELL)
player:addStatusEffect(xi.effect.SHELL, { power = power, duration = 1800, origin = player, tier = tier })
end,
['HASTE'] = function()
player:delStatusEffectSilent(xi.effect.HASTE)
player:addStatusEffect(xi.effect.HASTE, { power = 1000, duration = 600, origin = player })
end,
['DRIED_MEAT'] = function()
player:addStatusEffect(xi.effect.FOOD, { power = 1, duration = 1800, origin = player, sourceType = xi.effectSourceType.FOOD })
end,
['SALTED_FISH'] = function()
player:addStatusEffect(xi.effect.FOOD, { power = 2, duration = 1800, origin = player, sourceType = xi.effectSourceType.FOOD })
end,
['HARD_COOKIE'] = function()
player:addStatusEffect(xi.effect.FOOD, { power = 3, duration = 1800, origin = player, sourceType = xi.effectSourceType.FOOD })
end,
['INSTANT_NOODLES'] = function()
player:addStatusEffect(xi.effect.FOOD, { power = 4, duration = 1800, origin = player, sourceType = xi.effectSourceType.FOOD })
end,
['DRIED_AGARICUS'] = function()
player:addStatusEffect(xi.effect.FOOD, { power = 5, duration = 1800, origin = player, sourceType = xi.effectSourceType.FOOD })
end,
['INSTANT_RICE'] = function()
player:addStatusEffect(xi.effect.FOOD, { power = 6, duration = 1800, origin = player, sourceType = xi.effectSourceType.FOOD })
end,
['CIPHER_SAKURA'] = function()
if not npcUtil.giveItem(player, xi.item.CIPHER_OF_SAKURAS_ALTER_EGO) then
player:addCurrency('valor_point', 300) --refund player if they can't obtain
end
end,
['CIPHER_KORU'] = function()
if not npcUtil.giveItem(player, xi.item.CIPHER_OF_KORU_MORUS_ALTER_EGO) then
player:addCurrency('valor_point', 300) --refund player if they can't obtain
end
end,
}
-- select a training regime
elseif opt.page then
local page = getPageByNum(regimeType, zoneId, opt.page)
if page then
if regimeRepeat ~= 0 then
regimeRepeat = 1
end
player:setCharVar('[regime]type', regimeType)
player:setCharVar('[regime]zone', zoneId)
player:setCharVar('[regime]id', page[8])
player:setCharVar('[regime]repeat', regimeRepeat)
for i = 1, 4 do
player:setCharVar('[regime]killed' .. i, 0)
player:setCharVar('[regime]needed' .. i, page[i])
end
player:showText(player, msgOffset)
player:showText(player, msgOffset + 1)
-- Records of Eminence: Undertake a FoV Training Regime
if player:getEminenceProgress(3) and regimeType == xi.regime.type.FIELDS then
xi.roe.onRecordTrigger(player, 3)
end
-- Records of Eminence: Undertake a GoV Training Regime
if player:getEminenceProgress(11) and regimeType == xi.regime.type.GROUNDS then
xi.roe.onRecordTrigger(player, 11)
end
end
end
end
xi.regime.checkRegime = function(player, mob, regimeId, index, regimeType)
-- dead players, or players not on this training regime, get no credit
-- also prevents error when this function is called onMobDeath from a mob not killed by a player
if
not player or
player:getHP() == 0 or
player:getCharVar('[regime]id') ~= regimeId
then
return
end
-- people in alliance get no fields credit unless FOV_REWARD_ALLIANCE is 1 in settings/main.lua
if
xi.settings.main.FOV_REWARD_ALLIANCE ~= 1 and
regimeType == xi.regime.type.FIELDS and
player:checkSoloPartyAlliance() == 2
then
return
end
-- people in alliance get no grounds credit unless GOV_REWARD_ALLIANCE is 1 in settings/main.lua
if
xi.settings.main.GOV_REWARD_ALLIANCE ~= 1 and
regimeType == xi.regime.type.GROUNDS and
player:checkSoloPartyAlliance() == 2
then
return
end
-- mobs that give no XP give no credit
if not player:checkKillCredit(mob) then
return
end
-- get number of this mob needed, and killed so far
local needed = player:getCharVar('[regime]needed' .. index)
local killed = player:getCharVar('[regime]killed' .. index)
-- already finished with this mob
if killed == needed then
return
end
-- increment number killed
killed = killed + 1
player:messageBasic(xi.msg.basic.FOV_DEFEATED_TARGET, killed, needed)
player:setCharVar('[regime]killed' .. index, killed)
-- this mob is not yet finished
if needed > killed then
return
end
-- get page information
local page = getPageByRegimeId(player:getCharVar('[regime]type'), player:getCharVar('[regime]zone'), player:getCharVar('[regime]id'))
if not page then
return
end
-- this page is not yet finished
for i = 1, 4 do
if player:getCharVar('[regime]killed' .. i) < page[i] then
return
end
end
-- get base reward
player:messageBasic(xi.msg.basic.FOV_COMPLETED_REGIME)
local reward = page[7]
-- adjust reward down if regime is higher than server mob level cap
-- example: if you have mobs capped at level 80, and the regime is level 100, you will only get 80% of the reward
if
xi.settings.main.NORMAL_MOB_MAX_LEVEL_RANGE_MAX > 0 and
page[6] > xi.settings.main.NORMAL_MOB_MAX_LEVEL_RANGE_MAX
then
local avgCapLevel = (xi.settings.main.NORMAL_MOB_MAX_LEVEL_RANGE_MIN + xi.settings.main.NORMAL_MOB_MAX_LEVEL_RANGE_MAX) / 2
local avgMobLevel = (page[5] + page[6]) / 2
reward = math.floor(reward * avgCapLevel / avgMobLevel)
end
-- prowess buffs from completing Grounds regimes
if regimeType == xi.regime.type.GROUNDS then
addGovProwessBonusEffect(player)
-- repeat clears bonus
if player:hasStatusEffect(xi.effect.PROWESS) then
-- increase reward based on number of clears. hard caps at 2x base reward.
local govClears = player:getStatusEffect(xi.effect.PROWESS):getPower()
local baseReward = reward
reward = reward * (100 + (govClears * 4)) / 100
reward = utils.clamp(reward, 0, baseReward * 2)
-- increment clears
player:delStatusEffectSilent(xi.effect.PROWESS)
player:addStatusEffect(xi.effect.PROWESS, { power = govClears + 1, origin = player })
else
-- keep track of number of clears
player:addStatusEffect(xi.effect.PROWESS, { power = 1, origin = player })
end
end
-- award gil and tabs once per day, or at every page completion if REGIME_WAIT is 0 in settings.lua
local vanadielEpoch = VanadielUniqueDay()
if
xi.settings.main.REGIME_WAIT == 0 or
player:getCharVar('[regime]lastReward') < vanadielEpoch
then
-- gil
player:addGil(reward)
player:messageBasic(xi.msg.basic.FOV_OBTAINS_GIL, reward)
-- tabs
local tabs = math.floor(reward / 10) * xi.settings.main.TABS_RATE
tabs = utils.clamp(tabs, 0, 50000 - player:getCurrency('valor_point')) -- Retail caps players at 50000 tabs
player:addCurrency('valor_point', tabs)
player:messageBasic(xi.msg.basic.FOV_OBTAINS_TABS, tabs, player:getCurrency('valor_point'))
player:setCharVar('[regime]lastReward', vanadielEpoch)
end
-- Award EXP for page completion
-- Player must be equal or greater than REGIME_REWARD_THRESHOLD levels below the minimum suggested level
if player:getMainLvl() >= math.max(1, page[5] - xi.settings.main.REGIME_REWARD_THRESHOLD) then
player:addExp(reward * xi.settings.main.BOOK_EXP_RATE)
end
-- repeating regimes
if player:getCharVar('[regime]repeat') == 1 then
for i = 1, 4 do
player:setCharVar('[regime]killed' .. i, 0)
end
player:messageBasic(xi.msg.basic.FOV_REGIME_BEGINS_ANEW)
else
xi.regime.clearRegimeVars(player)
end
end