mirror of
https://github.com/bryanthaboi/gen1recomp.git
synced 2026-08-16 08:11:35 +02:00
71 lines
2.4 KiB
Lua
71 lines
2.4 KiB
Lua
-- The player's coin case: engine/events/money.asm GiveCoins / TakeCoins /
|
|
-- CheckCoins, transcribed onto save.player.coins.
|
|
--
|
|
-- This used to live inside src/ui/gen2/PrizeMenu.lua, which is a registered
|
|
-- screen module (Screens.lua id Gen2PrizeMenu). The slot machine and card
|
|
-- flip screens read the same case, so a mod that replaces the prize-counter
|
|
-- screen has no business also replacing the coin case those other two
|
|
-- screens depend on. It is model, not menu, so it lives here instead.
|
|
--
|
|
-- MAX_COINS is 9999 (constants/misc_constants.asm) and Save.MAX_COINS is the
|
|
-- same number on the save side (src/core/gen2/Save.lua), which is also where
|
|
-- Save.normalize re-clamps a loaded file.
|
|
local Save = require("src.core.gen2.Save")
|
|
|
|
local CoinCase = {}
|
|
|
|
CoinCase.MAX_COINS = Save.MAX_COINS
|
|
|
|
function CoinCase.coins(save)
|
|
local player = save and save.player
|
|
return (player and player.coins) or 0
|
|
end
|
|
|
|
-- GiveCoins: add, and if the total passes MAX_COINS write MAX_COINS back and
|
|
-- return carry. Returns the new balance and whether the case capped.
|
|
function CoinCase.giveCoins(save, amount)
|
|
local player = save and save.player
|
|
if not player then return 0, false end
|
|
local total = (player.coins or 0) + math.floor(amount or 0)
|
|
if total >= CoinCase.MAX_COINS then
|
|
player.coins = CoinCase.MAX_COINS
|
|
return player.coins, true
|
|
end
|
|
player.coins = total
|
|
return total, false
|
|
end
|
|
|
|
-- TakeCoins: subtract, and on borrow leave the case at zero rather than
|
|
-- wrapping (`; leave with 0 coins`).
|
|
function CoinCase.takeCoins(save, amount)
|
|
local player = save and save.player
|
|
if not player then return 0, false end
|
|
local total = (player.coins or 0) - math.floor(amount or 0)
|
|
if total < 0 then
|
|
player.coins = 0
|
|
return 0, true
|
|
end
|
|
player.coins = total
|
|
return total, false
|
|
end
|
|
|
|
-- CheckCoins -> CompareMoneyAction, which writes wScriptVar.
|
|
-- constants/script_constants.asm: HAVE_MORE 0, HAVE_AMOUNT 1, HAVE_LESS 2.
|
|
CoinCase.HAVE_MORE = 0
|
|
CoinCase.HAVE_AMOUNT = 1
|
|
CoinCase.HAVE_LESS = 2
|
|
|
|
function CoinCase.checkCoins(save, amount)
|
|
local have = CoinCase.coins(save)
|
|
amount = math.floor(amount or 0)
|
|
if have < amount then return CoinCase.HAVE_LESS end
|
|
if have == amount then return CoinCase.HAVE_AMOUNT end
|
|
return CoinCase.HAVE_MORE
|
|
end
|
|
|
|
function CoinCase.canAfford(save, cost)
|
|
return CoinCase.checkCoins(save, cost) ~= CoinCase.HAVE_LESS
|
|
end
|
|
|
|
return CoinCase
|