Skip to content

Release 0.3.0 - #9

Merged
tastybento merged 13 commits into
mainfrom
develop
Sep 4, 2026
Merged

tastybento merged 13 commits into
mainfrom
develop

Conversation

@tastybento

Copy link
Copy Markdown
Member

Names in the player's own language, and the 0.2.1 that was never published.

Goods, fuel and hulls translate themselves (#7, #8). Every item name a player saw was the material enum prettified. ItemNames now gives the locale's own materials.<key> line when written, and otherwise a MiniMessage lang_or tag: BentoBox substitutes variables and then parses the string, so dialogs, the hold GUI, holograms and boss bars render the item in the client's language for free. Chat, which BentoBox flattens to legacy, falls back to English unless the locale line is filled. Enchantment names on the shelf go the same way, and a player-given item name is escaped before substitution, which closes a MiniMessage injection into the dialogs.

Port names transliterate (#8). A name is 2–4 tokens from the Elite digraph table; NameGenerator.tokens exposes them and PortNames.display maps each through name-token.<syllable> in the viewer's locale. The canonical name stays the island's identity everywhere else, held byte-identical by a 40,000-hash test. The star chart draws the transliterated name only when the ASCII map font can; the spawn port is named by spawn.name.

The last English out of the code (#8). Island type reached players as the raw enum in five places, three places used a hardcoded band name, /tw prices prettified the category enum. All via getLocaleKey(); SecurityBand.getDisplayName() is deleted. LocaleKeyTest checks every enum constant, name token and traded material (including the outfitter's shelf, which is code, not config) has a locale line.

Simplified Chinese ships (#8). zh-CN.yml: every key, checked by script for key, placeholder and tag parity.

Also: hold tooltips break on newlines instead of clipping; boat item name, lore and the floating label are written in the owner's locale; the BentoBox behaviours the item-name design rests on are pinned by a test against the real Util.

From 0.2.1 (#6): SUGAR_CANE is contraband alongside SUGAR, in the code default and config.yml; the dead economy.unstamped-sellables knob and the item.stamp locale line are gone.

⚠️ Admins with an existing config must add SUGAR_CANE to illegal-trade.contraband-materials by hand (lists replace, they do not merge). Locale files gain 217 keys automatically on load, but three reworded lines (hold.border-lore, hold.tnt-lore, ui.market.buying-body) keep their old text until the file is regenerated. The draft release notes spell this out.

633 tests green. No hold, boat or ocean model change; existing worlds and databases carry over untouched.

The draft is flagged as a pre-release so the reporter of #7 can try the 0.3.0-SNAPSHOT first: https://github.com/BentoBoxWorld/TradeWinds/releases

🤖 Generated with Claude Code

https://claude.ai/code/session_011kwguMkwTr1i1C8qxqrbYT

tastybento and others added 13 commits August 8, 2026 18:57
Version to 0.2.1-SNAPSHOT: 0.2.0 is out, and the next thing to land will
be a fix.

First of those: sugar cane is contraband now. One cane crafts into one
sugar, so a hold full of cane walked through a customs scan clean and
became contraband on the far side with a single click - the whole crime
layer was theatre for anyone who had read a recipe book (Ben, playtest).

SUGAR_CANE joins SUGAR in illegal-trade.contraband-materials, in the code
default AND in config.yml: a list in config REPLACES the default rather
than merging, so shipping one without the other fixes nothing on a server
that already has a config. Knock-on effects, all intended - farm ports no
longer stock cane over the counter (saleCatalog filters contraband),
customs scans catch it in hold and pockets, and the black-market premium
applies to it.

The rule for when the list grows next, now in the config comment: list
the FEEDSTOCK as well as the finished good.

611 tests green.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014as2obVi1QJj8CRTSqXBRr
Custom stamping is gone (it went with the hold plan on 2026-08-01) but its
paperwork stayed: economy.unstamped-sellables sat in config.yml listing
SUGAR, with no @ConfigEntry behind it and nothing in the codebase reading
it - a knob that promised "traders buy this even WITHOUT a customs stamp"
and did nothing at all. Deleted, with the locale item.stamp ("Customs
Stamped") that nothing renders any more.

The comments that outlived the feature go too: Contraband's javadoc still
described stamping as the boundary of what may be sold, the booty settings
claimed drops were "customs-stamped, so salvage can be sold", the buying
page told players their goods were stamped, and CustomsService.sellableAt
called the band rule an addition "on top of the customs stamp" when it is
now the only thing that refuses a sale.

611 tests green.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014as2obVi1QJj8CRTSqXBRr
Open 0.2.1, and make the feedstock as illegal as the good
The market subtitle, warp tooltips, chart holograms and the chart and
admin listings printed the raw enum for an island's type (AGRICULTURAL),
three places still used a hardcoded English band name although
tradewinds.band.* has existed for months, and /tw prices prettified the
category enum. All of it now goes through getLocaleKey(), the English
display name on SecurityBand is gone, and the dash and question-mark
placeholders come from tradewinds.general too. LocaleKeyTest checks
every enum constant has its line. First of three commits for #7.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011kwguMkwTr1i1C8qxqrbYT
Every item name shown to a player was the material enum prettified, which
no locale could touch (#7). ItemNames now gives the locale's own line
(tradewinds.materials.<key>) when the translator wrote one, and otherwise
a MiniMessage lang_or tag: BentoBox substitutes variables and then parses
the string, so in dialogs, GUIs and holograms the client renders the
item's name in its own language for free, and chat, which BentoBox
flattens to legacy text, falls back to the English name. Enchantment
names on the shelf go the same way. Player-given item names are escaped
before substitution, closing a MiniMessage injection into the dialogs.
en-US.yml lists every traded material, blank by default, and
LocaleKeyTest keeps the list complete.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011kwguMkwTr1i1C8qxqrbYT
Port names are procedural, so no locale could list them (#7). Every
name is 2-4 tokens from the Elite digraph table, though, and a locale CAN
list those: NameGenerator now exposes the token sequence (its joined
name is byte-identical to before - a 40,000-hash test holds it to the old
implementation, because the name is the island's identity in every
existing world), and PortNames maps each token through
tradewinds.name-token.<syllable> for the viewer's locale. Every
player-facing line switches to the display name; the island registry,
resident tags, logs and admin commands keep the canonical one. The star
chart draws the transliterated name only when the map font can - it is
ASCII bitmap and throws on anything else - so a Chinese locale sees
Chinese names everywhere but the chart. The on token is quoted in the
locale: bare on/off/yes/no are YAML booleans.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011kwguMkwTr1i1C8qxqrbYT
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011kwguMkwTr1i1C8qxqrbYT
Variables are substituted and then the string is parsed as MiniMessage,
and the legacy flattener prints a translatable's fallback. Both are
checked against the real BentoBox Util so a core change fails the build
here rather than in a playtest.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011kwguMkwTr1i1C8qxqrbYT
… the locale

Playtest with a Chinese BentoBox locale and an English client (#7): the
spawn port read Spawn everywhere because its name is given, not
generated, so the token table never touched it - PortNames now maps it to
tradewinds.spawn.name. The outfitter's gear (rod, compass, iron kit, bed,
pickaxe, mutton) is code, not config, so the materials list and its
completeness test had missed it. And a boat's baked-in text - item name,
lore, floating label - was written with the console's locale; it is now
the owner's when they are online, and the hull's own item name goes
through tradewinds.item.boat-name so it follows the locale (or the
client) like every other material.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011kwguMkwTr1i1C8qxqrbYT
The border pane's six-clause instruction was one clipped line, in every
language (playtest 2026-09-04). Hold lore keys now split on newlines
into lore lines, the convention BentoBox's own panels use; each line
carries its own colour tags because an open tag does not reach the next
line. The border and TNT tooltips are rewritten as short lines.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011kwguMkwTr1i1C8qxqrbYT
Every key of en-US, checked by script for key, placeholder and tag
parity. Materials are filled with the official zh-CN item names so chat
lines name goods in Chinese too, the port-name syllables are
transliterated (the lone A is 亚 rather than 阿 so no two English names
can collapse into one Chinese one), and the spawn port is 出生港.
Requested in #7.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011kwguMkwTr1i1C8qxqrbYT
Names in the player's own language: goods, ports, types and bands (#7)
@sonarqubecloud

sonarqubecloud Bot commented Sep 4, 2026

Copy link
Copy Markdown

@tastybento
tastybento merged commit b79d4a1 into main Sep 4, 2026
5 checks passed
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