Skip to content

A boat is an identity, not a plank of wood - and ports have inns now - #4

Merged
tastybento merged 1 commit into
developfrom
boats-are-identities-and-ports-have-inns
Aug 9, 2026
Merged

A boat is an identity, not a plank of wood - and ports have inns now#4
tastybento merged 1 commit into
developfrom
boats-are-identities-and-ports-have-inns

Conversation

@tastybento

Copy link
Copy Markdown
Member

Playtest findings from 2026-08-08, plus the two features that came out of the same session.

Boats

  • Matching by material instead of identity, in two places. BoatCraftListener's refit broke up the first hull of the old boat's wood in the pack — with a stranger's oak hull aboard, that is somebody else's boat. StarterKit's spawn auto-launch had the same bug. Both now match the record id, fall back to an unstamped hull of that type only when nothing carries the id, and never touch a hull stamped with another record.
  • A hold changing hands in silence. Picking up a hull you own re-points your active boat and demotes whatever you were sailing (the respawn loaner) to an unowned OLD BOAT — with no message at all. boat.own-resumed / boat.own-aboard now say what happened, rate-limited through the existing prompt suppression.
  • A duplication route through the pickup listener. The claim-outright branch removed the ground item and handed over a stamped copy but never cancelled the event; vanilla adds the stack it captured regardless. Two items, one record. Cancelled now.
  • /tw chart could not answer "where is my old boat?" The no-arg chart raises holograms only, and worthMarking skips a boat that is carried or within 32 blocks — so at a quay it drew nothing. It now sends the two text bearings as well.

Economy

  • Pale oak had no base price and no fuel value, so the wood the top two hulls are built from was unsellable and unburnable. Mangrove had fuel but no price. Both fixed.
  • Farm ports sell white wool, cooked beef and mutton, plus one dyed colour of their own (seeded per island, so the same port always sells the same wool). Outfitter stock, not cargo — trader-bought cargo can only leave the hold by sale or destruction, so wool bought as cargo could never become a bed.
  • The 15 dyed wools needed explicit prices: most dyes come from flowers, which have no price, so recipe derivation returned zero for every colour.

Inns

"It's very difficult to sleep — there are no beds", and structurally so. Ports whose type is in ocean.inn-island-types (LUXURY, AGRICULTURAL, FOREST by default) now carry a 5×5 room in the island's own planks with a doorway to the plaza, a lantern, and a made bed — both halves with agreeing Bed block data. Sleeping sets the respawn point as any bed does; BED is not on the port deny list. Only affects plazas not yet generated.

Every map and list changed here also had to change in config.yml: BentoBox replaces them rather than merging, so a code default alone fixes nothing on a server that already has a config.

Version bumped to 0.2.0. New tests: BoatIdentityTest (7) plus inn and flock-colour guards in IslandDecoratorTest. 610 tests green.

🤖 Generated with Claude Code

https://claude.ai/code/session_014as2obVi1QJj8CRTSqXBRr

Playtest, straight after the loaner fix: died, was lent the bamboo raft,
walked over an oak hull at spawn and pocketed it with NO message of any
kind; dropped the raft, picked it back up, and the oak boat vanished from
the pack; /tw chart mentioned no OLD BOAT at all.

Matching by MATERIAL instead of identity, twice. BoatCraftListener's
refit broke up the first hull of the old boat's wood it found in the
pack - with a stranger's oak hull aboard, that is somebody else's boat.
StarterKit's spawn auto-launch had the same bug: it consumed whatever
hull matched the type and launched OUR record out of it. Both now match
the record id, fall back to an unstamped hull of that type only when
nothing carries the id, and never touch a hull stamped with another
record. Two oak boats are not the same boat; this rule has now cost four
playtests.

A hold changing hands in silence. Picking up a hull you own re-points
your active boat and demotes whatever you were sailing - here, the loaner
handed over a minute earlier - to an unowned OLD BOAT, and said nothing
at all. boat.own-resumed / boat.own-aboard now say which boat is the hold
and what became of the other, rate-limited through the existing prompt
suppression so a full pack cannot spam it.

A duplication route through the pickup listener: the "nothing to lose,
claim it outright" branch removed the ground item and handed over a
stamped copy but never cancelled the event, and vanilla adds the stack it
captured regardless of the entity dying. Two items, one record - exactly
what the rest of that class exists to prevent. Cancelled now.

/tw chart could not answer "where is my old boat?". The no-argument chart
raises holograms only, and worthMarking deliberately skips a boat that is
carried or within 32 blocks, so at a quay it draws nothing and a sailor
cannot tell "no OLD BOAT" from "the marker did not draw". It now sends
the two text bearings as well.

Economy, same session: pale oak was missing from every table - no base
price and no fuel value - so the wood the top two hulls are built from
was literally unsellable and unburnable. Mangrove had fuel but no price.

Somewhere to sleep. "It's very difficult to sleep - there are no beds",
and structurally so: this is an ocean, a bed needs a floor that is not
moving, and until you claim an islet there is nowhere to put one. Ports
whose type is in ocean.inn-island-types (LUXURY, AGRICULTURAL, FOREST)
now carry an inn: a 5x5 room in the island's own planks, doorway to the
plaza, lantern on the beam, and a made bed - both halves with agreeing
Bed block data, because a half bed cannot be slept in. It stands across
the plaza from the galley and never on the spawn pad. BED is not on the
port deny list, so it is usable at visitor rank, and sleeping sets the
respawn point the way any bed does.

Farm ports sell white wool, cooked beef and mutton, plus ONE dyed colour
of their own (TypeEconomy.localWool, seeded from the island cell - the
same port always sells the same wool, so a sailor after a colour has
somewhere to sail to). Outfitter stock, deliberately: trader-bought cargo
may only leave the hold by sale or destruction, so wool bought as cargo
could never become a bed. The 15 dyed wools needed explicit prices - most
dyes come from flowers, which have no price, so recipe derivation
returned zero for every colour and none of them were tradeable at all.

Note that every map and list here had to change in config.yml too:
BentoBox REPLACES them rather than merging, so a code default alone fixes
nothing on a server that already has a config.

Version 0.2.0. New tests: BoatIdentityTest (7) plus inn and flock-colour
guards in IslandDecoratorTest. 610 tests green.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014as2obVi1QJj8CRTSqXBRr
@sonarqubecloud

sonarqubecloud Bot commented Aug 9, 2026

Copy link
Copy Markdown

@tastybento
tastybento merged commit 03a0817 into develop Aug 9, 2026
3 checks passed
@tastybento
tastybento deleted the boats-are-identities-and-ports-have-inns branch August 9, 2026 01:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant