58 lines
3.4 KiB
Markdown
58 lines
3.4 KiB
Markdown
# ludic.gear
|
|
|
|
Tiers of kit bought one at a time with money once a vendor knows you, the numbers each tier is
|
|
worth, what is in the hand, and the charges that burn down while in use - a torch's flame, a
|
|
battery. Uses [`ludic.base`](../ludic.base/README.md) and nothing else.
|
|
|
|
```ludic
|
|
import "ludic.gear"
|
|
```
|
|
|
|
The game fills three open registries, usually from resource files: `def GearKinds from
|
|
"gear.lres"`, `def GearValues from "gear_values.lres"`, `def GearCharges from "gear_charges.lres"`.
|
|
A kind's names, blurbs and vendor, and what running out of a charge means, are the game's.
|
|
|
|
## The rules it keeps
|
|
|
|
1. **A tier is bought flat.** `gear_buy(k)` wants the next tier's `rep` in `GearPurse.rep()` and its
|
|
`cost` in `GearPurse.money()`, spends it through `GearPurse.spend`, and says `GEAR_BOUGHT`.
|
|
Nothing about a tier's price moves with a shop's curve or its week.
|
|
2. **The kind's item follows, and an item carried counts.** A kind with an `item` puts one in the
|
|
pack when bought and none is there, and `gear_sync()` (after every load) lifts a kind to its
|
|
first tier when the pack already carries the item.
|
|
3. **A tier decides numbers by table.** `gear_value(v)` is `GearValues[v].at[level]`, the last entry
|
|
holding past the end; `gear_mult(k)` is the kind's own `mult` the same way (1.0 when it has
|
|
none). `gear_stack_limit(base, mult)` keeps a single thing single and never scales a stack to
|
|
nothing.
|
|
4. **A charge burns only while it runs, by game hours.** A `hand` charge runs only while its item
|
|
is held, and a new thing in the hand puts it out. One that reaches zero stops and says
|
|
`GEAR_RAN_OUT`; replacing a burnt torch is the game's.
|
|
|
|
## The ports
|
|
|
|
```ludic
|
|
export port GearPurse { money: fn() -> int, spend: fn(int) -> bool, rep: fn() -> int } # required
|
|
export port GearPack { count: fn(int) -> int, add: fn(int, int) -> int } # unbound: empty, takes nothing
|
|
export port GearWorld { hidden: fn(int) -> bool } # unbound: every kind on sale
|
|
```
|
|
|
|
## API
|
|
|
|
| | |
|
|
| --- | --- |
|
|
| `GearKind { key, vendor, icon, tiers, blurb, howto, names, cost, rep, item, start, mult }`, `open registry GearKinds ... as GEAR` | a kind: per tier to buy, `names` / `cost` / `rep`; `start` the level a trip begins at |
|
|
| `GearValue { key, gear, at }`, `open registry GearValues ... as GV` | a number a kind's tier decides, per level from 0 |
|
|
| `GearCharge { key, item, full, per_hour, rate, hand }`, `open registry GearCharges ... as CHARGE` | a charge; `rate` a value's index to burn by instead of `per_hour` |
|
|
| `gear_level(k)`, `gear_set_level(k, lv)`, `gear_owned(k)`, `gear_best(k)`, `gear_level_name(k, lv)` | what is owned |
|
|
| `gear_next_name(k)`, `gear_next_cost(k)`, `gear_next_rep(k)`, `gear_can_buy(k)`, `gear_buy(k)`, `gear_kinds_at(vendor)`, `gear_sync()` | buying |
|
|
| `gear_mult(k)`, `gear_value(v)`, `gear_stack_limit(base, mult)` | what a tier is worth |
|
|
| `gear_hand()`, `gear_set_hand(it)`, `gear_lit()` | the hand |
|
|
| `gear_charge_of(it)`, `gear_charge(c)`, `gear_charge_set(c, v)`, `gear_charge_fill(c)`, `gear_running(c)`, `gear_run(c, on)` | the charges |
|
|
| `gear_facts() -> Queue<GearFact>` | `{ what: GEAR_BOUGHT / GEAR_RAN_OUT, kind, level, cost, charge, item }` |
|
|
| `gear_reset()`, `gear_save()`, `gear_load(v, version)`, `gear_system()` | `"gear"`, `PH_SIMULATE`: the burn each tick; the levels and charges saved by key (the hand is not) |
|
|
|
|
## Tests
|
|
|
|
```bash
|
|
ludic test packages/ludic.gear
|
|
```
|