The Silk Web | DEVLOG
www.thesilkweb.tsw/devlogconnected

DEVLOG

Weather that is never saved

2026-09-23 · world · rendering

Built a general particle engine, originally scoped as just a few bugs drifting over the catching areas, that also now carries mosquitoes over lakes, falling autumn leaves, cave mist and the sky itself.

Added sky weather (rain, snow, fog) as a layer on top of the existing ground weather reading rather than a replacement for it. A cold marsh in the snow now drains stamina harder than either condition alone.

Sky weather is never saved: each day's sky is rolled from the world seed and the date, the same trick terrain regeneration already uses, and a day's weather now opens at a rolled hour and lasts a rolled few instead of running midnight to midnight.

Fixed new games often opening in rain, fair odds but read as broken, by forcing the first day of every world clear.

Fixed a bug the last missing test file caught: switching from one weather type to another cleared the old particles but kept a spawn credit that had been piling up, so the new weather arrived as one sudden burst instead of fading in.

Trust level needed no new save data at all

2026-09-17 · progression · online · design

Added a 50-level trust progression track that reuses the lifetime stats already computed for the leaderboard (steps, captures, dissections, resources gathered, days survived) instead of adding new save fields. It is derived, not stored, and recomputed once on load.

Changed perks to apply only from the current tier rather than every tier passed through, after an earlier draft implied they stacked. The trust page now shows only the perks in effect and one line naming the next unlock.

Fixed both new laptop tabs shipping empty and freezing laptop input, because neither had been added to the screen's own control list. The screen now checks on construction that every tab's focus target is a real registered control.

Noted that trust can go down: losing a neglected pet lowers the total by the same amount gaining one raised it, since pets owned reads a live count rather than a lifetime one.

Fixed a real leaderboard bug the same day: submitting your stats was the only way to see them, so a returning player continuing an existing save, who had necessarily already submitted once, saw an empty prompt asking them to sleep and submit again. Added a dedicated standing lookup instead of relying on the client's own session cache.

Kept the leaderboard's scoring formula server-side only rather than mirrored in client config, so it can be retuned without a client rebuild, and weighted steps walked far below every other stat on purpose, since steps are the one stat that can be farmed for free by holding a direction key in an open field. A player's best-ever score is kept through an atomic update, so a run ending in permadeath never costs them their position.

Rebuilding the paperdoll from four sliders to eight real garments

2026-09-17 · content · ui · feel

Replaced the original four-slot character creator, body type, clothing, hair and hat with five options each, which had been a worked example of the system rather than a settled design.

Removed body type entirely down to one silhouette with only skin colour left as a variable.

Landed on eight slots at three type options apiece for the slots that carry a type, six animation frames each, working out to exactly the same number of tile indices the old roster already occupied, so the shared tileset image did not need to grow.

Moved eyebrows to draw above hair after playtesting found a fringe could hide the eyebrow choice completely.

Logged eyebrows and eyes as a known risk rather than solving it immediately: both are one or two pixel features that read fine zoomed in on the character creator but may be close to invisible in the actual world view.

The dissection table finally opens

2026-09-15 · content · mechanics

Wired up the dissection table, which had been real placed furniture since M7, purchasable and positioned by world generation, with pressing E on it doing nothing but show a not ready yet message.

Added a three-state screen: pick a caught bug, confirm the specimen will not survive dissection, then read the result.

Dissection reads the same player state as a sale or a terrarium slot, and removes the bug from wherever it currently is, carried or stored, the same way selling already does.

Changed the Bug-pedia's gating: a species caught but never dissected still appears, just without its full write-up, so the catalogue reads as curiosity satisfied rather than a species-seen checklist.

The laptop grew a browser

2026-09-15 · ui · online

Replaced the laptop's single ten-tab strip with a browser: a home screen listing five named websites plus Bug-pedia as a standalone app, each site owning only its own tabs.

Garden Place handles buying and selling, Tools 'ants Tuff covers gear, Butter Fly covers food and resources, Snail Mail covers post and ranks, and Wanna-Bee Friends covers pets.

Backspace now steps back to the site list from anywhere inside a site.

A site is just a display name, an address and a list of tabs, so the next online feature is one new row instead of a redesigned tab strip.

The player becomes an animated paperdoll

2026-09-10 · content · feel · rendering

Replaced the player's single static glyph with four independently chosen, independently coloured, animating layers: body, clothing, hair and hat.

Settled scope up front: one facing only, front-on, no mirroring, and deliberately no facing concept added anywhere else in movement or rendering.

Found the cheap path through a real engine constraint: a map entity draws through the map renderer's own font, and the rendering library has no per-entity font override, so every paperdoll layer had to already be a real glyph in the world tileset. That made the feature nearly free instead of limiting it.

Built the frame timer as a plain, headless-testable float accumulator rather than reaching for the rendering library's own animation component, specifically so the frame arithmetic could be covered by a real test. Idle and walk keep separate phases, so stopping mid-stride resumes idle correctly instead of snapping.

Recorded a real limitation rather than working around it: the headless screen dump stores one glyph per cell, so it structurally cannot show four alpha-blended layers and falls back to showing the body layer alone.

Eighty-eight percent less RAM: chunking the overworld like a Zelda game

2026-08-20 · performance · world

Found the overworld map was allocating one real cell object per tile regardless of world size, measured at about 88 percent of exterior memory use at the largest world setting.

Changed world generation to only ever produce logical data, biome ids, structure placement, a walkability grid, instead of a live map, and added a chunk builder that turns that data into one real, playable section at a time.

Reused the same identity-known-now, built-lazily, cached-thereafter pattern the cabin and cave systems already used, extended from a sparse set of sites to a regular grid covering the whole world.

Kept the camera scrolling smoothly within a chunk exactly as before, and made only crossing a chunk boundary a hard cut, using the same screen wipe a cabin door already used.

Left the save format completely unchanged, since chunking is purely a runtime memory detail, confirmed by the full test suite passing unchanged including the check that generation output has not shifted by a single tile.

The E that was never really floating

2026-08-18 · rendering · testing

Replaced the interaction prompt's rendering. It used to overwrite the map tile directly (glyph swapped, background blended, original values stashed and restored on walk-away), which meant the tile was genuinely gone, not just covered, for as long as the prompt showed.

Reused the forest canopy technique instead: a decorative entity one cell above the target with no background of its own, so the ground reads through around the glyph.

This also removes a race against the system that repaints every tile at sunrise and sunset. The old stash-and-restore approach had already caused a bug once from exactly that timing.

The first test written for the new version failed immediately on a real crash: the map only allocated one entity layer, and asking for a layer above the canopy threw instead of clamping. That would have fired the first time a player stood next to anything at all in the live game.

Teaching without a tutorial

2026-08-18 · design · ui

Added 15 one-time tutorial tips in place of a guided first day or a startup wall of controls, each firing the first time its subject actually matters: the first searchable log, the first nightfall, the first time too tired to keep searching, the first time owning a rope underground.

Each tip fires once per save, ever, and a tool tip only exists if the player already owns that tool.

Tip triggers deliberately avoid the moments the story screens already own (first catch, first bug stored, first sale), so the two systems never teach the same beat twice.

Most tips watch a state rather than an event, for example standing next to a desk, polled together on one check that collapses to a single boolean.

From one giant do-it-all check to a thousand real tests

2026-08-18 · testing · design

Replaced the old verification system, one hand-rolled, ever-growing method per feature area that stopped checking at its first failure, with a real test project.

Split its methods into one independent test per checkable claim, landing at just over a thousand tests with real per-test pass and fail instead of one shared true or false.

Kept it as a sibling project to the game rather than folding it inside, referencing the game project directly so it can be run on its own.

Carried the same split into the sound engine, whose generic behaviour tests moved into their own sibling suite, leaving only the tests that depend on this game's own real sound content behind.

Paired the suite with a headless render dump that draws every screen to image frames, since this environment cannot press real keys, making the test suite and the dump together the whole verification strategy here.

Chasing the Saturn

2026-08-18 · audio · feel · rendering

Moved the sound engine's reference hardware to a fuller sound chip, in stages, aiming for a richer signal chain rather than a full rebuild around recorded samples.

Found that three rounds of reverb tuning had gone nowhere because the offline listening tool never actually applied the output stage at all, so every sound anyone had judged by ear had been completely dry.

Found the reverb had also been silently mono, using identical filters and timing on both channels, and fixed it with real damping, pre-delay and a proper stereo spread.

Fixed a constant, inaudible offset left over from an old output stage that was quietly building up into an audible hum inside the reverb, caught by a new test that checks a sound's reverb tail actually fades to silence.

Raised the voice pool to 32 slots, added a filter, pan and LFO to every voice, then deleted the old output emulation for clean audio, which promptly revealed aliasing that stage had been hiding until a band-limited waveform fixed it.

Pulled the finished engine out into its own standalone library afterward, with no dependencies beyond the base framework, so it can be reused outside this game without being pulled apart.

The game got a reason to exist

2026-08-13 · story · content

Added a framing story: a lone entomologist with one field season to prove a protected tract is worth keeping, against an Environment Office that has already decided to raze it.

Wrote 29 full-screen story moments across 13 trigger kinds, all running on the existing Yarn dialogue system already used for in-game mail rather than a new content format.

Some triggers can fire more than once per save, and the queue that consumes them can already chain several story beats off one trigger. That capability existed before any content used it.

Movement stopped snapping

2026-08-12 · feel

Added a separate cosmetic visual position that eases toward the player's real grid position each step, instead of the camera and sprite snapping tile to tile.

Fixed a duplicate-render bug where hiding the real entity during a glide was not actually suppressing its rendering.

Fixed the glide reading as dash-then-pause by matching its speed to the real step cadence instead of a fixed duration.

Fixed camera shake in small rooms, caused by the sub-cell camera pan computing a scroll offset for room that did not exist.

Fixed diagonal steps never being smoothed: velocity per step is now derived from that step's own distance and the time until the next one, needing no tuning constant.

Postcards, and the bug the tests caught

2026-08-12 · online · testing

Replaced free-text player mail with an allowlisted set of postcard templates, turning a content-moderation problem into a volume-control one.

Added three server-side caps: a daily send limit per account, a cap on how many unread postcards one sender can occupy in a recipient's inbox, and an inbox limit that rejects new mail rather than evicting the oldest, since eviction is itself the flood attack.

Wrote the project's first server-side test suite, which caught a real bug immediately: the delete endpoint was doing a hard delete, silently erasing the sender's own copy of a shared message. Deletion is a soft-delete flag now.

Shipping a single-file build, and the two bugs that broke it

2026-08-12 · distribution · design

Added publish scripts producing a self-contained single-file build for every platform the rendering library actually ships native libraries for, checked against its own dependency manifest rather than guessed.

Fixed a DLL not found error that was reported as missing natives but was actually the opposite: the natives were embedded inside the single executable, and the rendering host cannot find them there because it resolves them with a raw library load plus a path probe that returns empty under single-file publish. The relevant flag is off in both scripts now.

Fixed a second bug that only appeared once the first was fixed: every content path in the game was relative, so a published build launched from a different working directory could not find its own fonts. It now redirects to its own install directory, only when the content is not already reachable from wherever it started.

Verified both fixes against a real extracted build, launched from its own folder and from an unrelated one.

Why the sound effects aren't recordings

2026-08-11 · audio · mechanics

Replaced the original sound effects, a synthesizer playing a 63 megabyte recorded soundfont, after confirming the problem was structural: a recording of a chip cannot do per-tick pitch slides, modulation sweeps, or the noise channel real sound effects lean on.

Built a real FM and pulse-and-noise synthesis engine from scratch instead, with no new dependency, after deliberately rejecting a ready-made emulator core over its license.

Found and fixed four unrelated bugs already hiding in the old sound content while investigating: several footstep cues had silently fallen back to a grand piano patch, every channel carried an unwanted reverb send, there was noticeable input-to-sound latency, and pitch-bending on real captured drum hits had never been used.

Fixed a bug where fast walking sounded like a held note instead of noise, because the noise generator was reseeding to the same value on every retrigger and a held movement key was producing identical noise bursts back to back.

Measured actual output level instead of guessing and found triggering every cue at once peaked at a fifth of the ceiling, so the anti-clipping headroom divisor was cut for a real threefold loudness gain.

Pets that can die of loneliness

2026-08-10 · progression · mechanics

Added pets as purchasable companions through the Silk Web's own shop, the same purchase path as tools and resources.

Gave pets a continuous friendship score raised three separate ways: playing, with a cooldown so it cannot be farmed by mashing, a small passive gain for whichever pet is currently out as your active companion, and treats bought with currency, the only way to reach a benched pet at all.

Added real stakes to neglect: a two day grace period before friendship starts decaying, and a six day threshold before the pet is permanently removed from the save.

Scaled catch and rarity perks by friendship, up to one and a half times at maximum, rather than just switching them on or off.

Rivers that actually flow downhill

2026-08-07 · worldgen · world

Replaced the first river and lake pass, which classified connected blobs of water noise by shape, with real hydrology: priority-flood depression filling followed by flow direction and flow accumulation over the elevation map.

Checked a predicted sea-level recalibration rather than assuming it was needed, and found it was not.

Changed forest-versus-grassland selection from a single moisture threshold to a three-axis climate rule using elevation, temperature and moisture, which is what let savanna and rock garden join later as pure content instead of new generator code.

Added flower gardens as a noise-based inclusion stamped inside grassland rather than a biome of their own, reusing the same mechanism later reused again for catching-area patches.

Measured the full hydrology pass at 450 milliseconds on a large world rather than assuming it was too slow to ship.

Building a world you can stand in

2026-08-06 · world · mechanics · design

Generated cabins and their interiors as a rectangle with each corner independently notched by a random square, chosen over blob-style growth because it reads as an actual building rather than a cave.

Changed saves to store only the world seed and its dimensions and regenerate terrain byte for byte on load, instead of storing terrain tile by tile, so save size scales with what the player owns and catches rather than with world size.

Kept the world ticking while the player is indoors by sharing one clock instance between the exterior and interior controllers, so time never stops just because the active map changed.

Replaced the original one-tool-equipped-at-a-time system with a real owned-tool inventory after playtesting made buying a new tool silently replace the old one read as a bug.

Added the first laptop, with mail, buying and selling all reachable from it by the end of day two.

The very first playable slice

2026-08-05 · world · design

Shipped with exactly three biomes, grassland, forest and water, loaded from JSON and hot-reloadable in debug builds, with no bugs or plants anywhere in the game yet.

Proved the script host with a smoke-test script that only logs, and the dialogue host with a smoke-test conversation that auto-picks its first option, since there was no UI yet to ask a human. Real content for either came later.

Generated the overworld from two independent noise channels, one for land against water, one for grassland against forest, instead of the rendering library's own dungeon-shaped generator steps, which do not fit an open overworld.

Built continuous held-key movement from day one, reading raw held key state against real delta time rather than moving the player one tile per keypress.

Fixed a real bug where pressing Escape to the pause menu could leave every key unresponsive afterward, traced to the rendering library's own focus stack rather than game logic.

↑↓ moveENTER selectTAB next pageBKSP backL Language© Nightly Bug Games