aboutsummaryrefslogtreecommitdiff
path: root/internal/game/casino.go
diff options
context:
space:
mode:
authorhistoria <[not public]>2026-09-16 02:14:02 -0400
committerhistoria <[not public]>2026-09-16 02:14:02 -0400
commitad60843fbf577eda80105e3916822d663aaefcb3 (patch)
tree68092a6403fdb2992ef92cfe0e2dd62b479935aa /internal/game/casino.go
parent61881fd0c1a7066293f552be1a747143f70d03ff (diff)
downloadthehouseoficarus-ad60843fbf577eda80105e3916822d663aaefcb3.tar.gz
fix: economy recovery double-refund/erased-liability/cap-drops, entity editor path traversal
Diffstat (limited to 'internal/game/casino.go')
-rw-r--r--internal/game/casino.go13
1 files changed, 9 insertions, 4 deletions
diff --git a/internal/game/casino.go b/internal/game/casino.go
index 3f06b41..bc1e690 100644
--- a/internal/game/casino.go
+++ b/internal/game/casino.go
@@ -82,15 +82,20 @@ func (w casinoWallet) PayCredits(amount int) error {
}
creditsBefore := w.p.Credits
chipsBefore := countChips(w.p)
- creditsAfter, err := addCreditsChecked(creditsBefore, amount)
- if err != nil {
- return err
- }
+ creditsAfter, capErr := addCreditsChecked(creditsBefore, amount)
+ // The journal record is written FIRST, even when the economy cap
+ // blocks the payout: a won settlement must never be silently dropped.
+ // With the cap blocking, the balance is unchanged and the open record
+ // keeps the owed amount durable; startup recovery re-applies it once
+ // the balance has room below the cap.
rec, err := w.g.Economy.start("payout", w.p, 0, amount,
creditsBefore, creditsAfter, chipsBefore, chipsBefore)
if err != nil {
return casino.ErrWalletPersistence
}
+ if capErr != nil {
+ return capErr
+ }
w.p.Credits = creditsAfter
if err := w.g.AccountStore.SaveCharacter(w.p); err != nil {
w.p.Credits = creditsBefore