Files
gen1recomp/src/core/gen2/CoinCase.lua
T
bryanthaboi ae6cac89e1 G2 support
2026-08-11 11:53:30 -04:00

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