Files
code_of_conquest_dnd/client/scripts/state/currency.gd
Phillip Tarrant 8f3aa75fa9 chore(warnings): silence the four pre-existing script warnings the creation screen surfaced
Not errors and not regressions — Godot printed them on every script reload
and they predate M4-b. Cleared so a real warning is not lost in the noise:

- Redundant `const ContentDB`/`const NewGame` preloads that shadowed their
  own `class_name` globals (character_creation.gd, creation_draft.gd) — the
  class is already global, so the const bought nothing.
- Two `log` locals shadowing the built-in `log()` — renamed to `out`
  (canon_log.from_dict) and `canon` (NewGame.construct); the "log" dict KEY
  is the public contract and is unchanged.
- currency.format's copper->denomination division is integer BY DESIGN (the
  remainder is carried, not lost) — annotated `@warning_ignore` to say so.

319 client tests green; headless parse reports none of the four sites.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 20:09:29 -05:00

47 lines
1.5 KiB
GDScript

class_name Currency
extends RefCounted
## Money. Everything is stored in COPPER — one integer, on GameState.purse_copper.
## The denominations exist so a bounded §6 move can name a unit (give_item(gold)
## is +10,000c); they are NOT stored buckets, so change-making never arises.
##
## The ratios are rules and live here in code. PRICES are content and live in
## /content (roadmap: "the economy is two systems"). Formatting happens only at
## the display edge — this is the one place that knows what "12g 40s 8c" means.
const COPPER := 1
const SILVER := 100
const GOLD := 10000
const VALUES := {"copper": COPPER, "silver": SILVER, "gold": GOLD}
static func is_currency(item_id: String) -> bool:
return VALUES.has(item_id)
static func value(item_id: String) -> int:
return int(VALUES.get(item_id, 0))
static func format(copper: int) -> String:
# Empty denominations are suppressed and at least one unit always shows:
# "0c", "47c", "1g 8c", "12g 40s". "0g 0s 8c" reads as a spreadsheet, not a
# purse — and being broke should read as poverty (§3).
if copper <= 0:
return "0c"
var parts: Array[String] = []
var left := copper
@warning_ignore("integer_division") # denomination math — the remainder is carried, not lost
var gold := left / GOLD
if gold > 0:
parts.append("%dg" % gold)
left -= gold * GOLD
@warning_ignore("integer_division")
var silver := left / SILVER
if silver > 0:
parts.append("%ds" % silver)
left -= silver * SILVER
if left > 0:
parts.append("%dc" % left)
return " ".join(parts)