Roguefort Playtest v0.16.4 - Patch Notes - "Hammer and Tongs"

Roguefort Playtest · published

Roguefort Playtest - 0.16.4

Hello affineurs!

I've been hard at it over the past fortnight and this update packs in two weeks of work into one build. The game should feel more polished to play (especially co-op), the majority of the reported bug fixes should be resolved, and it should feel like a lot less jank and a lot more polish.

Lo and behold, when I tallied it up there were 733 commits between 0.15.0 (the last playtest build on Steam) and 0.16.4 (this one), with hundreds of Discord bug reports closed, and a huge amount of refactoring work to provide the runway and the tools/tests for debugging at scale and at the root cause. So, it's been a busy couple weeks :-). Thanks for your patience and all your hard work.

Co-op got a lot of work in this update. Around sixty of the fixes here are multiplayer, and they are not polish - they are the reasons co-op was not really playable. The single worst one is that on Steam's peer-to-peer transport, the join packet carrying the host's world (chunk edits, chests, everything you had built) was over the size limit and vanished silently, with the failure swallowed. The joiner then walked around a world that regenerated from scratch: invisible walls, trees back, chests gone. That packet is now split into pieces and reassembled. (rubberychicken found it - thanks).

* Joining someone's game used to hand you their character. Their level, their perks, their pets, their mounts, their backpack tier, their card collection. A joiner is now a fresh character, and only the things that should carry over do. (rubberychicken)

* A joiner could not die. A lethal hit left them at 0 HP but still standing and still acting, and the stuck death record then froze the world for everyone - enemies asleep, turn counter stopped, no healing. That whole cluster is closed, along with the sealed-in-a-locked-house bug it caused.

Under the hood, the refactor work was HUGE this fortnight, including:

* I pulled apart the entre turn loop and rebuilt it from the ground up. Fire, zones, turrets, party combat, boss kills, livestock, ship autopilot, burglary, NPC streaming, the settlement simulation and the per-settlement pass all moved out of one very large function, in steps, with an 8-seed byte-identical replay check run after each one. The five tick stages - vitals, buffs, environmental hazards, regeneration and the vampire tick - are now computed by a single core that returns a result, rather than mutating state in place.

* The game now has one seeded random number stream, seeded from the world seed and saved with it, replacing 40 hand-copied definitions of the same generator. Item ids mint from a counter restored out of the save. The upshot is that the same seed and the same inputs produce a byte-identical world, which is what the replay corpus checks on every change.

* I did a huge amount of work on the unit tests and tooling that helps to catch bugs and verify correctness of the many systems and functions in the game. It is now much harder for anything to regress (e.g. fixing A and B breaks Y), so we should see smoother sailing on the whack-a-mole game of bug fixes.

In other news, a moment of dev shame for me here but I discovered "undo" has never actually worked. Not for co-op, not for anyone, not since Adventure Mode shipped. Ctrl+Z was a dead key while the help screen advertised it. Building cleared the undo stack in the same breath that filled it. It works now (ring the bell, shame shame shame).

No kill underground has ever counted for a bounty, a defend contract, a sabotage or a clear-the-village quest. Not a wrong condition - the code returned early on anything that was not the overworld, which was defensive rather than deliberate. Underground kills now credit against the dungeon entrance's overworld tile. (theartolater, who reported it as a cave-bear question, and like so many bugs it opened up a world of... more bugs... but in a good way!)

Dropping an item on a tile replaced that tile. A door with a sword on it became an open, transparent hole you could shoot through. Stairs with loot on them stopped being stairs. A farm plot became plain ground. Three separate threads, one mechanism, and the reporters worked it out between themselves in the replies before I did. (nalathnidragon and rubberychicken.)

Dungeon floors were losing their map and respawning their enemies. Every interior in the game - dungeons, cheese caves, cellar taverns, inns - shares one cache that was capped at five entries by deleting the oldest. Stepping into an inn to heal burned a floor off the dungeon you were still running. (rubberychicken)

Ground you had already explored was re-clouding once a save got big. Two separate 2,000-entry caps, neither of which touched the list of chunk keys the fog actually reads. Real saves hit 4,500 chunks, which is why it read as "sometimes". (Elfie)

The Crossing's main quest could not be finished. Act I picked its target from four hardcoded capital coordinates on the curated continent, so on a Worldforge shore it pointed at a landmass you are not standing on. Unfinishable on all twelve seeds I sampled. Two more story dead ends on the same shore went with it. The Crossing won't have the main story, which makes sense because it's more of a "Dwarf Fortress" kind of sandbox mode with procedural terrain, simulated history, etc. (aj01657 and sky4ce09)

That's it from me - what follows below is essentially the commit messages, organised into dot points and categories with the help of Claude. So, it's still me, but full disclosure that I needed the help of an LLM to organise and polish it all. If you've ever seen the commit messags from busy devs, you will know what I mean. If you don't want to read onwards then the above covers off the main stuff, and below is the carefully detailed version for posterity.

Thanks to everyone who posted a thread that is closed in this build, in order of the number of posts (and apologies if I missed anyone - just let me know):

rubberychicken, nalathnidragon, thesquirrel_74982, samv123, theartolater, arkhaven, sarcen, urughak, datsheeptho, _herrschneider, avocado8716, aj01657, sky4ce09, anhalter438, aog, bossman62, elfietheesp55, geno0917, yah3699.

Thank you so much again and I'm super excited to see what the next 2 weeks brings.

Tim

-=-=-=-=-=-=-=-=- Detailed Patch Notes -=-=-=-=-=-=-=-=-

**Co-op: joining a game**

* Fixed a joiner walking through invisible walls in a world that did not match
the host's - regrown trees, missing chests, terrain that was never edited.
The join snapshot is one transport frame carrying every world change the host
has made, and on Steam's peer-to-peer transport anything over about a megabyte
was dropped without an error. Frames above 256KB now split into numbered parts
and are put back together on arrival, and a send failure is now logged loudly
instead of being swallowed. There is also a watchdog on the client that
notices when a join frame never arrives. (rubberychicken)
* A joiner is a fresh character. Joining used to clone the host's loaded save
and repaint six fields over it, so you arrived with the host's level, XP,
perks, terroir state, mount, pack animal, backpack tier, quick-slot food, HP
pools, buffs, skills and card collection. Only your slot identity, spawn and
guild kit carry over now. Reconnecting to a session you were already in leaves
your character alone. (rubberychicken)
* Fixed a co-op host not starting in its own guild's country. The guild was
dropped rather than passed through on the host's own spawn. (aj01657)
* The world's housing generation setting now crosses the wire at join. A joiner
regenerates the world from the host's seed, and this one input never travelled
with it, so every joiner used the current setting while a host on an older
world used the legacy one. It sizes settlement footprints - measured at 44x48
against 60x65 on a tier-3 village - which moves every building in every
village and changes which ones fit. (yah3699)
* The settlement NPC registry now crosses the wire. A joiner derived the seeded
half itself but never received the accumulated half - deaths, memory,
marriages, departures - so a villager the party watched die was still alive in
the joiner's tooltip.
* Ping is readable. A pong carried only the replier's id and not whose ping it
answered, so with three or more people connected you were subtracting one
machine's clock from another's. That is where the negative pings, the
six-digit ones and the "over 9000" came from. (rubberychicken, datsheeptho)

**Co-op: your character, your screen**

* Fixed damage aimed at the host landing on whichever client happened to be
acting. One cause behind four reported symptoms, including the host dying in
strict turn mode and P2 dropping to 0 health at the same instant. (yah3699)
* A client is told about its own damage. Damage announcements and floating text
were addressed to whoever was taking the turn rather than to whoever the
damage happened to, so P2 saw the host's numbers and none of their own.
(geno0917)
* An acting client now stands where it stands. The position used for most of the
turn was the host's tile on every client turn that was not a move, so a client
who walked away from the host was invisible to the world on those turns.
* Fixed a joiner's combat death never landing. The death watcher read the wrong
slot's health, so a joiner killed on its own turn stayed at 0 HP and not
downed - unable to die, still able to act and still able to revive the host -
while the stale death record short-circuited every later turn's world tick.
Enemies stopped moving, the turn counter froze, nothing healed.
* Fixed the co-op world freezing after a player is downed. An environmental
death on a host with a standing partner wrote the defeat, had it swallowed by
the downed handler, then wrote the death record straight back with nothing to
clear it. From then on every turn driven by a standing player returned before
the world ticked. Eating still worked, which is why it read as a partial
freeze. (yah3699, geno0917)
* Fixed players sealed inside a barred home by "The door is locked. Nobody is
home." The gate that decides whether you are crossing in from outside read a
cache that only fills during a full world tick. With the tick stalled, every
direction was refused, including the way out. (yah3699)
* A prone reviver stays prone.
* Fixed a joiner's move firing the host's armed spell. A remote move replayed
while the host was aiming was reinterpreted as a cast click, fired the host's
spell from the joiner's tile, and tore down the host's aim.
* A blow that lands on the partner now pays the partner's defences. Evasion,
thorns, thorns-on-miss and drain all route through the non-acting player's
own numbers now, as do charge-based healing effects.
* Creature awareness is per player. Being spotted used to be a property of the
creature, so one player being noticed disarmed everybody else's backstab. A
creature is now aware only of players it has actually seen or been provoked
by. Solo play and old saves behave exactly as before. (thesquirrel_74982)
* Auras, the vampire check and movement speed are read per slot rather than off
whichever body the screen happened to be showing.
* Shy flora reacts to every player present, not just one.
* The kill-credit and payout stats read the body that acted, not the body the
screen is bound to.

**Co-op: what you can see happening**

* A spell is drawn on every screen. Spell visuals went straight to the local
effects engine, so a client shipped the intent and rendered nothing while the
host's replay flashed only the host's screen. Nobody ever saw a spell that a
client cast, including the client that cast it. (arkhaven)
* A joiner sees its partner swing. Attack effects crossed the wire but the lunge
itself went to the local animation engine, so the host saw joiners swing and
joiners saw frozen partners.
* The screen that shakes is the screen that acted. Mining, build refusals, boss
kills and quakes shook the host's screen for every joiner's action, and the
joiner felt nothing.
* The boat under you is yours, and the boat under your partner is drawn. Boats
rendered from a single view slot, so a partner at sea appeared as a walking
figure on water. A routed hit now damages the hull it should - the non-acting
sailor's boat previously took no hull damage at all and the sailor ate the
full raw blow.
* The hostility warning lands on the screen of the player who caused it.
* A spoiled milk message tells you whose milk spoiled.
* The sky is the host's. A client's teleport, including the jump that join
hydration itself performs, re-rolled the weather locally over the mirrored
copy. Rain on one screen and none on the other, every time.
* A wildfire the host is running now crosses the wire.

**Co-op: building, containers and trade**

* Fixed the party's construction record never crossing the wire.
* A joiner's build is the joiner's build. Placement resolved the build type from
the host's own armed build state, so with the host holding a mode armed - which
the build flyout does for bulk building - every joiner placement came out as
the host's type. Doors became walls. Furniture rotation and custom art now
ride the wire too, and a bump is never mistaken for a build.
* Fixed two chest operations landing in the same window destroying or
duplicating items. All six chest operations read their starting point from
render-synced state, so two operations arriving before the screen updated both
computed from the same pre-operation array. Take-all twice duplicated the
chest, two deposits destroyed the first one.
* A client's Take All now happens.
* Craft and Cook now cross the wire from a client.
* All five vendor operations work from the joiner's seat.
* Stockpile painting works on a client. The corner anchor was one piece of state
living on the host, so two people painting at once measured rectangles from
each other's corners, and a client never set its own anchor at all - which is
what the hover preview is gated on, so you painted blind.
* A water barrel is one gauge on every machine. Barrel water lived only in local
state with no channel of any kind, so a barrel the host drank from never moved
for the joiner.
* Identify and curse-lift are committed by the host. Arming the mode locally was
right; committing it locally was not, so the item read identified for one
frame and then the next snapshot put the "???" back - without returning the
Affineur's Nose the attempt had already spent. You paid and got nothing.
* The fishery crosses the wire. Catch records only ever ran on the host, so a
joiner fished at pristine odds forever and kept pulling rare fish out of water
the host had already emptied.
* Bump quest turn-ins and the hermit's gifts now reach the host instead of being
client-side predictions that the next snapshot reverted.
* The porter's directions and the reputation-gated exact location reveal are
applied by the host, so the porter stops being re-payable and the 5 gold you
spend on directions does not evaporate.
* Dungeon chest loot rolls from the chest's own identity rather than from where
each machine's random number stream happens to be, so the client stops
announcing one item while the host grants another.
* Fixed a dungeon a client entered spitting the whole party out where the host
had been standing. (yah3699)

**Co-op: network traffic**

The snapshot the host sends every frame used to ship whole arrays. It now ships
changes only, with a full frame at least every sixteen and on every join.

* Creatures were 60.7% of a fat frame and now ship as a
delta.
* Inventory ships as slot changes: 54 bytes a frame against 12,273 measured.
* Players ship as slot changes: 579 bytes a frame against 7,354 measured.
* Nine more world arrays followed - animals, party, companions, stabled
companions, workers and the four one-per-tile station arrays.

**Quests and the main story**

* Fixed The Crossing's Act I main quest pointing at a continent you are not on.
The Act I leader was picked by distance from four hardcoded curated-world
capital coordinates, and on a Worldforge shore no such leader exists at all,
so the game was choosing between points on the wrong landmass. Unfinishable on
all twelve sampled seeds. (aj01657)
* Fixed two more story dead ends on The Crossing: the second story quest's
destination settlement going missing, and the fourth getting stuck when its
dungeon had already been cleared. (sky4ce09)
* Fixed authored main quest stages that could not be handed back to their giver.
(avocado8716)
* Fixed the save-time quest prune archiving Act I and Act III stages.
(arkhaven)
* No kill underground has ever credited a bounty, defend, sabotage or
village-clear contract. Every kill outside the overworld returned early,
because a creature's coordinates inside a dungeon are local and feeding them
to the faction lookup reads a meaningless world tile. Underground kills now
count, measured from the dungeon entrance's overworld tile. It was never a
name-matching problem - cave bears always matched "bear". (theartolater)
* Fixed indirect kills not counting. Four of the seven kill-reward blocks
credited the statistic and dropped the quest credit. (theartolater,
nalathnidragon)
* Fixed aura and companion kills crediting nothing. Three damage ticks sit below
both of the turn's reward sweeps, so the only thing that ever saw the corpses
they made was a bare health filter. A cheese fire or poison aura awarded XP
and nothing else - no quest credit, no on-kill perks, no gold, no loot, no log
line - so wearing an aura cheese made "kill 5 wraiths" stop advancing on any
wraith your aura finished. The companion flame salamander and the sporeling's
poison awarded nothing at all.
* Fixed murdering townsfolk crediting a "clear hostiles" village quest.
* Fixed quest markers pointing at the quest giver instead of the destination. (theartolater, rubberychicken)
* Fixed the quest tracker reading distances like "35952 tiles E" in dungeons.
World coordinates were being differenced against scene-local player
coordinates. (nalathnidragon)
* Fixed Brinehold's tradition quest rejecting fish you had caught - "a cooked
fish" was being matched as a literal item id. (_herrschneider)
* Fixed a player-built waystone being offered as an "investigate" quest target.
(thesquirrel_74982)
* Fixed six tutorial defects from one report: no bread on completion, and five
others, including a hatchet rule that existed as two copies that had drifted
apart. (samv123)
* Fixed the tutorial placing its berry bush and its wild thyme in deep water on
some seeds. The placement gate was reading raw terrain noise rather than the
map the player actually walks - on the reported seed that is 301 water tiles
against 15, and the 15 are the bug. (samv123)

**Dungeons**

* Fixed dungeon floors losing their map and their cleared enemies after a trip
out.
(rubberychicken)
* Fixed dungeon bosses being unable to path through doors. (rubberychicken)
* Fixed dungeon percentage cleared moving when you merely walk around. The
estimate is now pinned at first entry. (rubberychicken)
* Fixed "BOSS SLAIN" and boss loot printing above the killing blow. (urughak)
* Fixed the ">" key doing nothing when you were already standing on a dungeon
entrance. Entering is a bump, and stepping out of a dungeon leaves you on the
mouth, so there was no bump left to make. (rubberychicken)
* Fixed "<" refusing to leave a dungeon with an enemy in sight, even when you
were already standing on the stairs.
* Fixed a dropped item paving over the tile it lands on. Three threads, one cause.
(nalathnidragon, rubberychicken, theartolater)
* Fixed a phasing creature standing in a doorway being untouchable. (rubberychicken)

**The world and settlements**

* Fixed dungeons generating inside towns.
(avocado8716)
* Fixed toll gates standing in bare grass with no road and no wall near them.
Market-town toll bars were seated by a road model that could not see the
actual roads. 34 stranded gate clusters on the curated continent, now zero.
(datsheeptho)
* Fixed explored ground clouding back over. Overworld exploration is stored as a
per-chunk bitfield plus an uncapped set of chunk keys, and there are two
2,000-entry caps on the bitfields - one at runtime, one at save - neither of
which touches the key set. The code's own comment records real saves at 4,500
chunks, so both caps are reached in ordinary play. (elfietheesp55)
* Fixed roads outside town granting no speed bonus. The road class ladder had no
entry for the "path" class, which is about 70% of stamped road tiles.
(nalathnidragon)
* Fixed night ambushes inside towns. The ambient spawner refuses to put a
creature inside a settlement and raids refuse to besiege one, but the
narrator's danger events build and place their own packs and saw neither gate.
Their only suppression was the safe-homeland bubble measured from your base,
which is exactly why it read as "Roquelle is not exempt while other towns
are". (aog)
* Fixed creatures appearing out of nowhere in plain sight. The narrator's
cluster spawns never saw the visibility gate the ambient spawner enforces.
(avocado8716)
* Fixed autopath leaving the road for the last move of every segment. The
endpoint was an arbitrary point in open country rather than a road tile.
(rubberychicken)
* Fixed enemy soldiers of different factions standing in a battleground ignoring
each other. The hostility grouping skipped the very creatures the spawn site
promises will fight. (rubberychicken)
* Fixed a barred house staying locked with "nobody is home" while somebody was
clearly home, and the matching case where a worker was at work. Both now use
the physical body rather than the schedule.
* Fixed the "sleepwalking" NPC - the inspect readout said "asleep at home" while
the body was still walking there. (avocado8716, theartolater)
* Fixed the farmer's apparent time loop, which was a reconciler measuring
against a daily rhythm nothing has followed since July. (theartolater)
* Fixed livestock walking backwards. Livestock is the one mover that returns no
move intent, so nothing ever set its facing. (datsheeptho)
* Fixed a phantom overworld house record challenging you on bare terrain during
a burglary.
* Fixed teleport-unstick dropping you inside a building shell.

**Items, inventory and trade**

* Fixed items picked up off the ground vanishing. The pack has two live views of
itself and pickup only advanced one of them, while every other in-turn writer
read the second - so the pickup message printed and the item was gone.
(sarcen)
* Fixed a chest's overflow item vanishing when your pack was full. Every path
that puts an item in the pack asks about capacity first except the one that
applies market and auction results, so a returned unsold lot landed in a pack
already at 30 of 30 and left it at 31 of 30. Overflow now spills to the
ground, for trade, buyouts, wins, unsold returns, cancellations, mail, vault
and chest withdrawals alike. (rubberychicken)
* Fixed river pebbles and similar items refusing to stack in a chest. Two
hand-maintained copies of one rule that had drifted apart by exactly one
entry. (bossman62)
* Fixed an item you picked up appearing to vanish when your pack was sorted.(urughak)
* Fixed a general store scattering identical rows down the shelf instead of
grouping them. (nalathnidragon)
* Fixed ammunition being an infinite gold press. Pack sizes are now printed
on the shelf row - the "x4" that was there meant four packs left in stock,
sitting exactly where a pack size would go, and now reads "4 left".
(rubberychicken)
* Fixed being told your pack was full when buying ammunition that would have
gone straight into the quiver, and the larger half of the same miss: a
full-pack archer being refused their own spent arrows off the ground.
(rubberychicken)
* Fixed the perk reroll charging you and giving nothing back. The reroll count
lived inside the modal, so closing and reopening reset the escalating cost
ladder to 50 gold and reverted the slate to the one you had just paid to leave.
Both are now persisted, and the slate seed is pinned at the first paid reroll.
An unpaid slate still refreshes. (sarcen)
* Fixed locked harvest tools and fishing rods being skipped by auto-tool, from a
retain check left behind by a change that no longer exists. (nalathnidragon)
* Fixed harvest tools being designated as your swap weapon. (thesquirrel_74982)
* Fixed the Hatchet appearing in the Forge upgrade menu but not being
upgradeable - the menu asked three of the six questions the upgrade itself
asks. (nalathnidragon)
* Fixed rare items captioned "Common". The rarity word was read off a baked
field that only some item creators stamp. (thesquirrel_74982)
* Fixed foraged Wild Strawberries not counting as food. Bump-foraging started
paying out named flora, which never carried a hunger value. (samv123)
* Fixed four books sharing a title with three other books. Nothing ever checked
that a book's title was its own. (arkhaven)
* Fixed Homing Whey refusing to work in dungeons and in The Old Mouth. The scan
for your home chest read the active map, so world coordinates were being used
to index dungeon space. (arkhaven)
* Fixed a terroir shrine offering your cast history instead of what is in your
pack. It listed spells you had cast on wheels you no longer carried and
omitted the wheels you were holding. (urughak)
* Fixed Reserve Marks reading as lost against your level - the panel showed the
balance and never the two flows that produced it. (arkhaven)
* Fixed the Herder's Charcoal Sketch and similar pickups appearing to vanish.
See the sort fix above; nothing was ever lost. (urughak)

**Combat, spells and stealth**

* Sneak attack bonuses now roll from both hands and share one cap, so an offhand
Murderous dagger procs at full value. The 40% ceiling is unchanged.
* Fixed offhand weapons not triggering manna-on-kill. (sarcen)
* Fixed manna-on-kill evaporating when you cast from a full pool - the cast's
cost was deducted after its own killing blow. (nalathnidragon)
* Fixed spell levels appearing to stop counting. Nothing was lost or banked:
those casts never counted. (urughak)
* Fixed ethereal enemies bleeding. "Bloodless" was a per-row opt-in that exactly
two of the roughly 205 bestiary rows carried, so every ghost, wraith, shade,
revenant, wisp and ice construct fed a lifesteal build at full rate - while the
vampire melee feed used a different test and disagreed about the same creature.
(rubberychicken)
* Fixed Rind Wall being invisible and un-inspectable inside a cloud. Overlapping
zones resolved by cast order, so the cloud drawn first hid the wall.
(rubberychicken)
* Fixed Aftershock echoing as a 3x3 at the cursor instead of repeating the
spell's own shape. The echo carried a radius, and beam, cone and arc spells
declare none. (nalathnidragon)
* Fixed the reflect kill printing nothing at all. It was the last kill site that
paid out gold and items without writing a log line. (samv123)
* Fixed a charger stuck showing a red "About to CHARGE" badge without ever
charging - the charge state machine only ticks while the creature is hunting.
(rubberychicken)
* Fixed the enemy-alert cue firing on town guards. Hunting is every archetype's
combat state, so the alert could not tell who had acquired whom.
(thesquirrel_74982)
* Fixed the masteries bar reading empty at exactly 80 casts. The tab
hand-rolled the band maths and fell back to a one-cast band at Master.
* Fixed the fishing depletion message telling you the water was empty when it
was not, and the at-sea depletion message never firing at all.

**NPCs and settlements you talk to**

* Eating and drinking from the inventory panel while downed is refused, as it
already was from every other route. Slowly starving while downed is also
fixed. (rubberychicken)
* Fixed "quantum" NPCs - one person in two places. (rubberychicken)
* Fixed the five faction names taking a "the" they should not. Eleven separate
places concatenated "the " by hand, so all five factions read wrong
everywhere. Whether a faction takes an article is now a property of the
faction, so a future one can ask for it. (nalathnidragon)
* Fixed the sailor being unable to talk about the storm - the weather test read
a field that does not exist.

**Interface, controls and audio**

* Undo works. Building pushed its undo entry and then ran the turn in the same
handler, and the turn clears the undo stack unconditionally - so the entry
landed and was wiped a moment later, every time, since the original Adventure
Mode commit. The help screen has advertised "undo the last build" that whole
time. The clear is now an age rule: the turn keeps what it produced and drops
what is older.
* Fixed duplicate waypoints. Two bugs in one: the id was the millisecond clock,
so two waypoints made in the same millisecond collided and deleting one
deleted both; and the name came from the current count, so making five,
deleting the second and making another named it after a number already in use.
(urughak)
* Fixed Caps Lock behaving as a held Shift for gameplay keys. (theartolater)
* Fixed the Town Chronicle row in the Panels panel closing the panel and opening
nothing. The hub is the controller player's only route to most of those
panels. (samv123)
* Bound the Ledger panel to Shift+E. It had no default binding at all and
rendered as a literal "?", which is Help's real key - so the one panel nobody
could find advertised a hotkey that did nothing, wearing another panel's key
while doing it. Unbound actions now render as a dash. (rubberychicken)
* Fixed four boxes that could not hold their own text at the large font setting:
the quest Accept and Deny buttons, the confirm dialogs, the inventory slot
labels that read "WEAP..." and "QUIV...", the stat string that pushed the drop
button past its own row border, and the belt row's "refill - not near water".
Text grows to 1.32x at that setting and the boxes did not. There is now a
check that drives the real components at that scale and asserts geometrically
that every child sits inside the box it is drawn in. (rubberychicken)
* Fixed the Sector Journal running off the screen. Nothing in the modal was
height-bounded and the settlement tab bar wraps. (arkhaven)
* Fixed Enter and the A button never ending an NPC conversation. The speech
bubble gated its input on gameplay while the app was in dialogue mode.
(rubberychicken, anhalter438)
* Fixed Settings and Gameplay selecting two rows at once - the focusable count
never gained the "confirm before stealing" row. (samv123)
* Fixed Ride, Dismiss mount and Dismiss pack animal being mouse-only. There was
no keyboard or controller clause for either animal. (_herrschneider)
* Fixed auto-move not being cancelled by a mouse click.
* Fixed the black flash and resize when the top HUD bar reflows the canvas.
(thesquirrel_74982)
* Fixed the sun icon showing on the first Evening turn - the dusk ramp was
computed in a way that landed one floating-point step below its threshold.
(rubberychicken)
* Fixed the home pointer using taxicab distance and a four-glyph arrow. It had
grown its own convention. (nalathnidragon)
* Fixed named flora being indistinguishable from tall grass in ASCII view. The
cell builder coloured the glyph from the character rather than from the
species. (nalathnidragon)
* Fixed the "boiling with baitfish" particle sticking to the top-left tile of
the affected area and hopping as you walk. Its position came from the order
the viewport was scanned in rather than from the cell. (nalathnidragon)
* Fixed island names on the world map ignoring the font size setting, and
centred the rumour pin glyph from its measured ink rather than two hand-tuned
constants.
* Fixed the ping being unreadable against snow. (rubberychicken)
* Fixed the boat sprite drawing on land - the hull was located by the "@" glyph,
which every NPC shares - and two boats alternating on every boarding, because
the boarding step took whichever hull came first in the bag. (rubberychicken)
* Fixed the +2 gold from the Open Palm perk not appearing in the combat log.
(samv123)
* Fixed bow shot sounds playing in reverse. The twang sample is a two-part file.
(urughak)