84 lines
3.2 KiB
Lua
84 lines
3.2 KiB
Lua
-- TODO:
|
|
-- - Allied notes
|
|
-- - Racing game
|
|
-- - Non-premium pricing
|
|
|
|
describe('Chocobo Rental', function()
|
|
---@type CClientEntityPair
|
|
local player
|
|
-- The data we'll be testing
|
|
local chocoboTable = xi.chocobo.chocoboInfo[xi.zone.LA_THEINE_PLATEAU]
|
|
|
|
before_each(function()
|
|
player = xi.test.world:spawnPlayer({ level = 20, zone = xi.zone.LA_THEINE_PLATEAU })
|
|
player:addKeyItem(xi.ki.CHOCOBO_LICENSE)
|
|
end)
|
|
|
|
after_each(function()
|
|
-- Reset sales after each test
|
|
chocoboTable.sales = 0
|
|
end)
|
|
|
|
it('players under 20 cant ride', function()
|
|
player:setLevel(19) -- Even with a license!
|
|
player.entities:gotoAndTrigger('Coumaine', { eventId = 121 })
|
|
end)
|
|
|
|
it('players without a license cant ride', function()
|
|
player:delKeyItem(xi.ki.CHOCOBO_LICENSE)
|
|
player.entities:gotoAndTrigger('Coumaine', { eventId = 121 })
|
|
end)
|
|
|
|
it('players without enough gil cant ride', function()
|
|
-- This returns the correct event but it should NOT mount the PC
|
|
player.entities:gotoAndTrigger('Coumaine', { eventId = 120 })
|
|
player.assert.no:hasEffect(xi.effect.MOUNTED)
|
|
player.assert.no:hasAnimation(xi.animation.CHOCOBO)
|
|
end)
|
|
|
|
it('players meeting all qualifications can ride', function()
|
|
player:setGil(140) -- First sale is always 140g for a level 20 PC
|
|
player.entities:gotoAndTrigger('Coumaine', { eventId = 120 })
|
|
player.assert:hasEffect(xi.effect.MOUNTED)
|
|
player.assert:hasAnimation(xi.animation.CHOCOBO)
|
|
end)
|
|
|
|
it('price increases after each sale', function()
|
|
-- Setup stubs to ensure they get called when renting a chocobo
|
|
local increaseSalesStub = stub('xi.chocobo.increaseSales')
|
|
local getPriceStub = stub('xi.chocobo.getPrice')
|
|
|
|
player:setGil(140)
|
|
player.entities:gotoAndTrigger('Coumaine', { eventId = 120, finishOption = 0 })
|
|
player.assert:hasEffect(xi.effect.MOUNTED)
|
|
player.assert:hasGil(0)
|
|
increaseSalesStub:called(1)
|
|
getPriceStub:called(1)
|
|
|
|
-- Next getPrice should be 5% higher
|
|
local expectedPrice = math.floor(140 + 140 * 0.05)
|
|
assert(xi.chocobo.getPrice(player) == expectedPrice, 'Chocobo price did not increase')
|
|
end)
|
|
|
|
it('price decreases every minute', function()
|
|
local onTimeServerTickStub = stub('xi.chocobo.onTimeServerTick')
|
|
|
|
-- Simulate that 1000 sales have occured
|
|
-- Verify that the price reflects the change
|
|
chocoboTable.sales = 1000
|
|
local expectedPrice = math.floor(140 + 140 * (0.05 * 1000))
|
|
assert(xi.chocobo.getPrice(player) == expectedPrice, 'Chocobo price did not increase')
|
|
|
|
-- Now pass 1 Vanadiel minute (25 ticks)
|
|
-- TODO: Figure out a better notation?
|
|
for _ = 1, 25 do
|
|
xi.test.world:tick(xi.tick.TIME)
|
|
end
|
|
|
|
-- Verify that the function was called 25 times and the price decreased
|
|
expectedPrice = math.floor(140 + 140 * (0.05 * 999))
|
|
onTimeServerTickStub:called(25)
|
|
assert(chocoboTable.sales == 999, 'Chocobo sales did not decrease after 1 minute')
|
|
assert(xi.chocobo.getPrice(player) == expectedPrice, 'Chocobo price did not decrease')
|
|
end)
|
|
end)
|