The Game · Game changes

What changed in the game

The game’s own changelog, newest first. Every change is written down with what the player sees, how it was built, which tests cover it, and what to remember for the Unreal Engine port. (The changes to this website are on the Changes history page.)

Unreal export tool
  • New Unity menu item Embers > Export > Unreal data and scenes (UnrealExport.cs, also -executeMethod EmbersOfOlympus.EditorTools.UnrealExport.Run): writes JSON for every ScriptableObject (372), every material (430) and the five scenes (objects with world transforms, meshes, materials, lights, colliders, game components and their fields, fog and sky settings) plus the terrain heightmaps as 16-bit RAW, to UNREAL_EXPORT_DIR (default D:/Dev/unreal-export). It is the data side of the Unreal port plan in the NAS folder Unreal Port Plan.
  • Not exported: terrain plants and layer paint, animation controllers, UI Toolkit layouts, procedural mesh geometry.
  • Tests: no game code changed.
  • Unreal: this is the bridge: the export is imported by editor Python scripts (see the plan).
Zone B: huts, gorge niches; Keres and shades checked build 2026-10-30_0410
  • The camp's lean-tos gained a back wall and a left side wall of laid brush on stakes, so they read as huts and not as roofed tables.
  • The descent to the Ploutonion has six votive niche slabs (stone slabs with a recess, a terracotta figure and an oil lamp, two of them lit) standing along both sides of the approach.
  • Keres and shades in Zone B checked in a preview: the Keres is already a small bat-winged clawed spirit and the shade a pale hooded robed ghost, which is what the plan asks for, so they are left as they are. (The Zone A hoplite and First Furrow shades are separate and already done.)
  • Tests: 278 EditMode and 29 PlayMode pass. Seen in renders only.
  • Unreal: the niche slab is a small modular prop with a lamp socket.

Zone B fixes after playing: cypress, stream, Pylartes build 2026-10-29_2300
  • Found in play from two screenshots: the white cypress looked like stacked balls and the black stream came out bright blue. Pylartes was a cone with a ball head.
  • The cypress is one flame-shaped mesh with a ragged, slightly twisted surface and a needle-speckle texture, both for the road and the altar's corners. (The first version of the mesh had a NaN at the tip and was invisible: caught by checking its bounds.)
  • The black stream is near-black with no sky reflection (the environment reflection is off), its ripple much fainter.
  • Pylartes (Hekate Kleidouchos) is rebuilt: a robe with vertical folds and a gold hem, a veil behind, a head with brow, nose, eyes, cheeks, mouth and hair, a gold polos crown of rays, arms with elbows and hands, a ring-bowed key with a toothed bit, and a torch with a flared bronze cup. Her collider and the fight are unchanged.
  • The "floating flames" seen beside the gate were checked and are the torch posts' own fires, not a bug (the dark posts vanish against the sky).
  • Tests: 278 EditMode and 29 PlayMode pass.
  • Unreal: a sculpted Hekate mesh with a verdigris bronze material would replace this primitive build.
Greek display names for Zone B and the boss arena build 2026-10-29_2211
  • Display text only (ids, keys and saves unchanged): the Cutters' Camp is the Anthrakeion; the Old Altar is the Bomos of Demeter Chloe; the Ploutonion Approach is the Katabasis; the Threshold Warden is Pylartes, the Gate-Barrer; the Mouth of the Ploutonion is the Gates of Plouton; Polydegmon's Intake Pools are Lethe Pools, The Pull is The Acheron, The Received are The Unburied. Quest objectives keep the old name beside the new one ("the Anthrakeion, the Cutters' Camp") so the player can still follow them.
  • The waypoint-order test now expects the new names.
  • Not renamed: the Sacred Grove (the scene name stays), the zone's NPCs, the bestiary text bodies; the boss phase names (The Intake, The Threshold) stay because they are the boss's own.
  • Tests: 278 EditMode and 29 PlayMode pass.
  • Unreal: string table entries only; the keys stay.
The Dryad Blight as a hamadryad build 2026-10-29_2121
  • The Blight keeps its bark-and-root Meshy body, now warmed to the colour of dead pine bark and dressed as the offerings left on a felled tree: a crown of dry leaves, strands of dry-leaf hair down the back and past the face, a red ribbon tied at the waist with long tails, and a clay figure on a cord at the hip.
  • How: ShadeGear.DressBlight, called by MeshyArt.ApplyEnemyModels right after the body prefab is saved (so a rebuild keeps it). The Blight's stats, roots, Fire weakness and behaviour are unchanged.
  • Not done: the carved face in the stump (the plan's idea) and the leaf hair falling in strands is simple. The ribbon is a plain flat band.
  • Tests: 278 EditMode and 29 PlayMode pass. Seen in a preview render in a plain scene, not in the grove or in motion.
  • Unreal: a leaf-card hair and ribbon on the bark creature; the offerings are small props on a socket.
Zone B, second pass: Hiera Hodos, black stream, Katabasis, Hekate as the Warden build 2026-10-29_2044
  • The deep grove has the Hiera Hodos: a road of laid flagstones about 6 m wide from the Old Altar to the Warden's choke, with grave stelai (four lettered with Attic names: NIKIAS, KALLIAS, KLEINIAS, STRATON) and herms alternating along its edge, bronze tripod braziers, white-grey flame-shaped cypress by the verge, and a black still stream with a faint drifting ripple beside it.
  • The Threshold Warden is now Hekate Kleidouchos, holder of the keys (title Pylartes, the Gate-Barrer): a tall verdigris bronze figure in a long robe with a gold polos crown, a great key in one hand and a lit torch in the other, on a stone plinth. The Meshy warrior statue is out; its collider, stats and fight are unchanged. The boundary stones at the choke are plain standing stones (no glowing runes).
  • The way down to the Ploutonion (the Katabasis) is framed by a plain Doric door-frame (square fluted posts, an architrave with a triglyph frieze, a cornice and a low pediment), with a shrine of Hekate Propylaia with two torches on one side, a herm of Hermes Psychopompos and two pithoi of kykeon on the other.
  • How: ZoneBGreek.HieraHodos, BlackStream, Katabasis, Hekate, called from ZoneBBuilder; the Dryad Blight, the Keres and the shades are not restyled yet.
  • Tests: 278 EditMode and 29 PlayMode pass. Seen in renders from above (the road, the Warden from two angles, the gate); the stream and stelai lettering not close up.
  • Unreal: the Warden is a character blueprint with a bronze material; the road is a spline of paving meshes with stelai and herm props.
Zone B, first pass: the Anthrakeion, the Bomos of Demeter Chloe, no glowing mushrooms build 2026-10-29_2026
  • The Cutters' Camp is the Anthrakeion: three brushwood lean-tos (replacing the cloth tents), two domed charcoal clamps with a thin smoking vent and a red glow at the draught holes, two piles of stacked pine trunks, an ox-cart with solid disc wheels, an overseer's table with wax tablets and a tally of coins, chopping blocks with axes, and bundles of brushwood. The Meshy camp kit (tents and a wooden fence) and the trunk-and-stump set (another wooden fence) are gone.
  • The Old Altar is the Bomos of Demeter Chloe: flagstones inside a low dry-stone temenos wall (open to the south), three steps up to the altar, a relief stele of Demeter, Kore and Triptolemos in the back wall, offering bowls and pinakes, a sheaf of barley tied with red wool, a pomegranate tree, a well, and cypress at the wall corners. The flat black slab is gone.
  • Stumps in the camp and the cut grove sometimes carry a red ribbon and a clay figure; six boundary stones are lettered HOROS in the old Attic hand (carved as a normal map), knocked over or leaning.
  • Removed (not Greek): the glowing mushrooms and crystals along the trail, the cyan rune stones and their lights. The forest now plants only the pack's pines (its "oaks" are maple-leaved), no fantasy-pack tree. Wooden fences became dry-stone walls: the barricade for the Guard-or-Bar choice and the seal at the Warden's choke.
  • How: new Editor/ZoneBGreek.cs, called from ZoneBBuilder before the terrain; PloutonionGreek.CarvedMaterial is shared (with Eta and Iota added). Route, quests, NPCs, enemies and spawners are unchanged.
  • Tests: 278 EditMode and 29 PlayMode pass. Seen in renders of the camp and altar only (dark, from above); the trees were not checked in detail. Play_ZoneB_Monitor3.bat starts a new game in the grove.
  • Unreal: the camp and the temenos are modular props (lean-to, clamp, cart, wall course); the lettering is a decal with a normal map.
Zone A finished: paving, water, stone walls, the First Furrow as a shade build 2026-10-29_1916
  • The gate court's paving no longer reads as a chessboard: a bed of packed stone under bigger, slightly overlapping slabs at gentle angles, in closer tones.
  • The Drowned Channel's water is glossy and dark with a faint rippling highlight that drifts (the same ripple map as the boss arena cisterns), tiled to the long strip so the ripples are not stretched.
  • The wooden rail fences along the south edge of the fields are dry-stone walls now, and the cutters' barrier across the Treeline road is a rubble wall, not a wooden fence (the period rule and the Zone A TODO).
  • The First Furrow (Bouzyges) is a human shade like the hoplite: a stocky Sidekick body in translucent cold light, with the ox-goad and a garland of grain, instead of the Meshy skeleton body. Both shades are a little more translucent and glow more, so they read as shades in the dark.
  • How: ZoneAGreek.GateCourt; ZoneABuilder (water material, StandingWater, the walls); WaterScroll.TilingXY; AssetStoreArt.BuildShade (the hoplite builder, generalised).
  • Gemini's Zone A guides (v2 and v3, identical text) were read: they match what Zone A already has (terraced fields, dry-stone walls, the herm at the crossroads, the threshing floor, the barrow-line, Bouzyges). The one thing not taken up is its stepped 3 m terraces; the plain stays open.
  • Tests: 278 EditMode and 29 PlayMode pass. Seen in renders of the gate court and the channel and a preview of the two shades; not played.
  • Unreal: dry-stone wall modules for field edges; the same human-shade character set (base mesh, ghost material, gear on bones) for all the dead.
Town portal casting restored; the marble doorway stands on the waypoint pads build 2026-10-29_1657
  • Reverted: the town portal you cast (and the way back in town) looks as it did before, the camera-facing vortex in its rune ring. The marble doorway was a misreading of where you wanted it.
  • New: every waypoint pad (the carved circle on the ground at Hermes' waypoints in the town, the Plain, the Grove and the boss arena's entrance) now has the marble doorway with the blue vortex standing on it instead of the circle: nothing on the floor. It is a little smaller than the preview (a 0.6 scale), always open, and turned once toward where the player arrived. If its art is missing it falls back to the old dais.
  • How: PortalVisual.Create takes marbleDoor and doorScale (off by default, so the town portal is unchanged); WaypointPadArt builds the doorway as its own object beside the pad (the pad is a squashed cylinder).
  • Tests: all existing tests pass (including the waypoint-pad test). Seen in an offscreen render; not in the running game.
  • Unreal: the waypoint is the marble doorway actor; the town portal keeps its own vortex-in-ring effect.
Town portals stand in a marble Greek doorway build 2026-10-29_1636
  • The town portal (both the one that opens while you channel it and the way back in town) is now a marble doorway with a blue vortex in it, replacing the camera-facing rune ring: three steps, two fluted Ionic columns with volute capitals, an architrave with a meander frieze, cornice, a pediment with a dark tympanum, and palmette acroteria. There is nothing on the floor. The doorway rises out of the ground as the portal opens and sinks as it closes, and stays put (it no longer turns to the camera): the channelled portal faces the player, and the return portal in town faces where arrivals appear.
  • How: new Runtime/World/PortalDoor.cs builds it from primitives merged into six meshes; PortalVisual uses it (and falls back to the old ring if the door's materials are missing); PortalAssets.Build now also makes the marble, flute, meander and gold materials and their textures in Resources/Portal; ReturnPortal turns the doorway toward the arrival point.
  • Tests: all existing tests pass (including the portal hum test). Seen in an offscreen render of the door (Embers/PortalShot); not yet seen in the running game, and the channelled one-step-ahead placement is unchecked.
  • Unreal: a modular marble doorway mesh with a swirling-vortex material in the opening; the vortex plane faces the doorway's front.
Unburied Hoplite is a human shade; boss door shut; Patroklos spelt right build 2026-10-29_1456
  • The Unburied Hoplite is no longer the Meshy skeleton glowing cyan. It is a human shade: the Synty Sidekick base body, translucent and cold, in its helm with horsehair crest, linen cuirass and skirt of leather strips (resized to fit a human), carrying its bronze spear and shield. The skeleton model is left out (the period rule: the Greek dead are shades, not skeletons). The First Furrow still uses its Meshy body and has not been changed.
  • The bronze door behind the boss is shut: two studded leaves meet in the middle, flush in the frame, with lion-mask ring knockers; a sliver of cold light shows down the seam and under the bottom edge.
  • The second stele now reads ΠΑΤΡΟΚΛΟΣ (the form the owner gave), not ΠΑΤΡΟΚΛΕΣ.
  • How: AssetStoreArt.BuildShadeHoplite (new) replaces the Meshy path for this enemy; ShadeGear.DressHoplite sizes changed; PloutonionGreek.Doorway leaves shut.
  • Tests: 278 EditMode and 29 PlayMode pass. The shade was seen in two small preview renders against a plain floor, not in the game.
  • Unreal: a human base mesh with a ghost material plus separate armour meshes on bones is cheaper to keep right than re-skinning a skeleton model.
Boss fight: ring floating in the air, invisible dome, readable health numbers build 2026-10-29_1425
  • Fixed: a pool or Toll ring aimed at a player standing in front of the krater floated about six metres up. The boss finds the floor under a point with a ray; the ray hit the boss's own tall collider box (and any creature). It now skips the boss's own colliders and creatures.
  • Fixed (found while checking that): the krater's plinth was a flattened cylinder primitive whose capsule collider turned into a 4 m sphere, an invisible dome round the krater that blocked walking and the camera, and gave the ring a second false floor. The plinth now uses its true mesh as its collider.
  • Health numbers are readable: bar text is larger, bold, with a soft shadow instead of a thin black outline (which swallowed the digits); the boss bar now shows current / max (percent), and the plain target frame is hidden while the target is the boss in the fight, so there is one bar, not two.
  • Tests: new BossArenaFloorTests (EditMode: no solid thing above walking height on the fight floor; it fails on the old scene and passes on the new). 278 EditMode and 29 PlayMode pass. The HUD text change was not looked at in the running game.
  • Unreal: do not build a collider from a squashed primitive; trace for ground while ignoring the boss's own volume.
Boss arena: cliff walls, tomb doors, cisterns build 2026-10-29_1312
  • The arena's cliffs are faced as a quarried limestone wall: courses of dressed blocks with chisel marks (a generated albedo and normal map), three projecting ledges and a coping, and twelve votive niches with a gable, a veiled terracotta figure and a lamp (half of them lit). The doorway bay, tomb bays and gorge are left open.
  • The tomb doors gained antae with capitals and bases, three rosettes on the lintel, a torch each side, and offerings on the steps (two white lekythoi and a pithos).
  • The Lethe cisterns are raised round basins: a stone curb, a coping of laid blocks, dark glossy water with faint rippling highlights that drift slowly (WaterScroll), a phiale and a kantharos on the rim; the spring beside the cypress has a lion-head spout in the wall.
  • How: PloutonionGreek (CliffDressing, Niche, QuarryMaterial, LetheMaterial, Cistern, additions to TombDoors); new runtime World/WaterScroll.cs. The facing panels stand in front of the terrain cliff (kept out of the ground lift) and have no colliders: the hidden cliff boxes still do the blocking.
  • Tests: 277 EditMode and 29 PlayMode pass. Seen in renders of the whole arena and of one tomb door; the spring's spout and the north wall niches were not seen up close.
  • Unreal: the cliff facing is a tiling quarry material (albedo plus normal) on wall meshes with a niche prefab; water is a glossy material with a slowly panning ripple normal.
Boss arena: the doorway in detail build 2026-10-29_1301
  • The Doric doorway has fluted columns (tapering, with entasis, twenty carved flutes), annuli and a curved echinus; a meander inlaid along the architrave; terracotta antefixes along the roof edge and a palmette acroterion on the ridge; bronze torch brackets with fire on the columns; and a pair of studded bronze door leaves standing ajar.
  • How: ColumnMesh (lathe) with ColumnMaterial (a generated flute normal map), WallBand for the meander, and door leaves and brackets built in PloutonionGreek.Doorway; the krater is now built before the doorway so the leaves can reuse its bronze.
  • Tests: 277 EditMode and 29 PlayMode pass. Seen in three in-engine renders.
  • Unreal: columns are a lathe or spline mesh with a tiling flute normal map; the door leaves are a bronze material with stud instances.
Boss arena: the krater in detail build 2026-10-29_1250
  • The krater is a finer vessel: a stepped foot and stem collars, a gilded foot band, a skin of bronze with verdigris in the hollows and raised work on it (a ring of tongues rising from the foot, a frieze of twelve supplicants with raised arms round the belly, a meander under the lip), an egg-and-dart course on the lip, two volute handles with scrolls and rosettes, and a lion-head spout with a mane pouring the libation.
  • How: the lathe mesh now has UVs; a generated albedo plus normal map (T_PlG_Krater and T_PlG_Krater_N) carries the relief; handles, lip, stem and spout are built in PloutonionGreek (VoluteHandle, LipAndStem, LionSpout, KraterMaterial).
  • Tests: 277 EditMode and 29 PlayMode pass. Seen in one close render from the front; the side and top views I tried were framed wrong and showed rock.
  • Unreal: the frieze and tongues are a tiling texture plus normal map on a lathe-style mesh; handles are tube splines; keep the hit flash pointed at the vessel mesh.
Boss arena: carved stone, cypress, thinner fog, carved names build 2026-10-29_1240
  • Stone now has real grain (the limestone texture), drum joints on the door posts, mutules and carved metope panels under the cornice, block joints round the plinth, a gable and antefix over each tomb door. The cypress is a tall flame-shaped column of overlapping lumps instead of a pebble stack. The ground fog is thinner (three emitters at about half size) so the door and krater read through it.
  • The names on the two steles are carved into the stone, not floating text: a generated albedo plus normal map with the letters cut in, in old Attic letter forms. Stele one reads ELPENOR (the unburied of Odyssey 11), stele two PATROKLES (the unburied of Iliad 23). The second stele's earlier text was mirrored and has gone. Both now face the arena.
  • Tests: 277 EditMode and 29 PlayMode pass. Looked at in renders; only the first stele was seen after carving.
  • Unreal: carve inscriptions as a normal map plus darkened albedo on a decal or the slab material; check text orientation from the viewing side (a quad faces -z in Unity).
Boss could not be killed; hands move; start in the boss arena build 2026-10-29_1219
  • Fixed: the Polydegmon sat at 0% and could not be killed. The new krater body is not under the boss object, so the boss's hit flash had no renderer and threw inside Health.ApplyDamage before Died was raised. The flash now ignores a missing renderer, and flashes the krater. Also fixed, found while testing the kill: the level-up refill asked for the plain class StaminaPool as a component and threw on every level-up (at the boss kill it stopped the loot being given); it now uses the motor's stamina.
  • The nine bronze hands rock slowly up and down about the rim, each on its own timing (RaisedHand). Stele made larger, lettering fitted, moved off the wall; the scanned rock faces on the north wall (loose vine tangles) are no longer placed.
  • Start in the boss arena: launch with -startscene SCN_Ploutonion_Mouth (any scene in the build) and New Game begins there; Play_BossArena_Monitor3.bat does it on screen 3.
  • Tests: new KillPathTests (a boss body without a renderer still raises Died; levelling up does not throw). 277 EditMode and 29 PlayMode pass. The kill itself was checked end to end in the boss scene (the boss is stilled and gives its loot) with a throwaway test.
  • Unreal: raise Died before any presentation callback, or isolate callbacks so one cosmetic failure cannot swallow the death; a boss whose visual body is a separate actor needs its hit flash pointed at it.
Boss arena as a Greek gate to Hades
  • The Mouth of the Ploutonion is dressed as a rock-cut Greek gate: a plain Doric doorway in a bay of the north cliff, a bronze krater (the Receiving Vessel) on a libation plinth with nine bronze open hands rising from its rim, a black basalt floor with an inlaid meander band and road, three Lethe cisterns, a white cypress and spring, a stele reading ELPENOR, braziers and torches, and a rock-cut tomb door in each side wall where the Unburied come out. The Meshy ring, the glowing rune ring and the painted cracks are no longer built; the bone-hand relics are bronze hands.
  • How: new Editor/PloutonionGreek.cs (primitives, lathe krater, generated meander and door-depth textures), called from PloutonionBuilder; three rock-cut bays added to the walkable set so the cliff steps back for the door and tombs. Boss, collider, add cracks and the 44 x 38 m arena unchanged.
  • Tests: 277 EditMode and 27 PlayMode pass. Looked at in four in-engine renders only; not played through.
  • Unreal: the doorway, krater and tomb frames are plain modular meshes (door frame, lathe vessel, hand = palm plus two-joint fingers); the meander is a tiled texture on a ring/strip mesh. Objects placed in a rotated holder need local positions; objects against a steep cliff must be excluded from the terrain-height lift.
Screen picker in Settings build 2026-10-29_0941
  • Settings > Graphics has a "Screen" dropdown (shown with two or more screens), each entry labelled by where it sits ("3: bottom left, 1920 x 1080"). Choosing one moves the window there at once and is remembered; the window opens there next time.
  • Why: a rotated (flipped) monitor made the game look and feel upside down; the player can now pick a normal one.
  • How: GameSettings.Monitor (-1 = system's choice), SettingsApplier.Screens/ScreenLabel/MoveToChosenScreen (Screen.MoveMainWindowTo), SettingsPanel dropdown, string ui.settings.monitor. Not in exclusive full screen (Unity cannot move that window). Tests: 277 EditMode (one new: setting saved and reloaded), 27 PlayMode.
  • Unreal: screen choice via the display-mode settings; do not assume the primary monitor is upright.

Zone A enemies: shades instead of skeletons
  • Unburied Hoplite: translucent pale shade with a cold glow, a Corinthian helm with a horsehair crest, a linen linothorax with pteryges, bronze spear and aspis. First Furrow (Bouzyges): shade tint, an ox-goad (kentron) instead of the scythe, a garland of grain.
  • How: new Editor/ShadeGear.cs (translucent ghost material per body, code-built gear parented to the bones), called from AssetStoreArt.SetEnemyModel; Zone A rebuild regenerates the model prefabs.
  • Tests: 276 EditMode, 27 PlayMode pass. Ids and stats unchanged (skeletal_hoplite stays the id; the display name is a separate step).
  • Unreal: ghost = transparent material with emissive tint; gear as skeletal-mesh sockets on head, chest, hips.
Zone A: drowned channel and Treeline in period
  • Channel: the bright plank bridge and the sawn log stack are gone; a stone slab bridge on three piers crosses at the sluice; stone-lined edges, reeds, two tipped pithoi, the well of Kallias with windlass and bucket.
  • Treeline: braziers either side of the sealed road, boundary stones, a small altar, cypresses, votive ribbons on the fence.
  • How: ZoneAGreek.Channel/Grove; the two Prop calls removed from ZoneABuilder. Tests: 276 EditMode, 27 PlayMode pass.
  • Unreal: slab bridge is decor (no collider); the sealed barrier keeps its box.
Zone A: gnarled olives and the pyrgos
  • Olives: split trunk, three leaning limbs, crown of many small silver-green clumps (First Furrow).
  • Pyrgos: mudbrick farm watchtower on a stone footing at (70, -14) by the crossroads: east door, slit windows, flat roof with beam-ends, yard wall, jars, torch, cypress. No battlements.
  • How: ZoneAGreek.Olive/Pyrgos; terrain flattened and cleared round the tower. Tests: 276 EditMode, 27 PlayMode pass.
  • Unreal: tower = box footing + box shaft with box colliders; olives are decor only.
Zone A restyled as an Attic plain
  • Gate court: flagstones, squared herm of Hermes, Hekate shrine, bronze tripod braziers, well, pithoi, boundary stones.
  • Threshing Floor: radial paving in a low dry-stone wall (open west and east), winnowing fans, sledge, altar of Triptolemos.
  • Barrow-line: roadside stelai with white-ground lekythoi, cypresses, tripods. First Furrow: bare earth, 22 m wall with two gaps, stelai, plough, braziers.
  • How: new Editor/ZoneAGreek.cs, called from ZoneABuilder; wheat cleared and soil painted under ring, court and halos. Tests: 276 EditMode, 27 PlayMode pass.
  • Unreal: same set pieces; wall colliders on the wall line only; keep the gaps where the road crosses.
The Telesterion rebuilt as the Periclean hall
  • New Telesterion.cs replaces the small pedimented temple (and TempleWeathering.cs, HubBuilder.BuildTelesterion and its collision, which are deleted). The hall is a 17 m square ashlar building (the real one was about 50 m; begun about 447 BC, inside the 447 to 406 BC window) centred at (20.5, 22.5) with its door (3 m wide, 4 m high) in the south wall: two 25 cm stylobate steps, thick walls with a cornice and a painted red band, three rows of seats (27 cm risers) along all four walls with an aisle through the south seats at the door, sixteen interior columns on a 4 by 4 grid, the Anaktoron (small inner shrine) in the middle, a hipped tile roof (one procedural mesh) with the opaion (roof lantern with dark openings and its own roof) over it, a ceiling with the opaion hole, four warm lamps and a cold opaion light inside, and a brazier either side of the door. No front porch: Philon's porch (about 310 BC) is later than the game.
  • The unfinished work: beside the hall's north-east corner, a timber derrick with a hanging block, dressed blocks and a stone block on a sledge, and mason's chippings (the war began in 431 BC and slowed the building). Colliders on the walls, seats, columns, Anaktoron and the blocks; the roof, lintel and cornice are visual only (group Surroundings_TelesterionRoof, exempt from the solid-props test).
  • Layout: TemplePosition is now (20.5, 22.5); the register tablet moved to z 33.5; the Density house at (24, 35.5) was removed; Crowd keeps the door court (14, 8, 13 by 7) and the west side lane clear. The three Telesterion tests were rewritten for the new hall (walk in through the door, the east wall holds from inside, the west wall holds from outside). 27 PlayMode and 276 EditMode pass.
  • Not done: the real hall's eight rows of seats, a second storey, painted frieze details, and an interior that the probe cameras could not show (I verified it by walking in, not by sight).
  • Unreal: a modular hall (walls, seat rows, columns, roof, opaion) with the same grid.
Weathered mixed terracotta roofs and an open, dark hearth plaza
  • Roofs: the base tile is duller and browner (0.40, 0.26, 0.19, smoothness 0.03, was a new-red), and there are now five tile tones (Laconian, Corinthian, ochre, sooty, base) picked per house, so the streets read as mixed weathered terracotta. Roof moss is fewer (4 patches, was 9), smaller (1.0 to 2.2 m) and duller, so the big green blotches are gone.
  • Plaza: the crowd pass keeps a 19.5 m radius clear round the fire (was 15.5); the carved floor and firelight pool are darker so the fire does the lighting; the bonfire light is lower (0.9 m), redder and stronger (range 20, intensity 6.5) and now casts soft shadows, so the robed figures throw long shadows as in the reference.
  • The four area PDFs were extended with a historical dossier each (the 447 to 406 BC timeline, the Eleusinian calendar, daily life, houses, ships, farming, the dead, sacred groves, the gate of Hades) and 12 AI period concept pictures plus in-engine pictures; see the NAS folder Area Design PDFs. The AI could not draw a Greek trireme (every try was a Viking ship), so the in-engine trireme is used.
  • Tests unchanged: 27 PlayMode and 276 EditMode pass.
  • Unreal: the same five tile materials as a roof-tile variation set; the bonfire as a shadow-casting point light.
Triremes replace the Norse longships
  • The four harbour ships are now Athenian triremes of the 5th century BC (the period rule, 447 to 406 BC), scaled to the harbour at 25 m by 3.4 m (the real ship was about 37 m by 5.5 m): a long, low carvel hull (smooth shell-first planking; the clinker laps and the clinker texture are gone), a bronze ram (embolon) with fins at the waterline, painted eyes, a low curved stem with a gilt akroterion (the Norse dragon head, teeth and mane are removed), a high curled stern with the aphlaston, an outrigger (parexeiresia) on each side carrying the top bank, three banks of oars (12 top and 12 middle oars a side, with lower and middle oar ports in the hull), cloth rail screens, a central gangway with cross beams instead of rowing benches, one mast with a brailed square sail, stays to stem and stern, two steering oars (pedalia), and stem, stern and masthead lamps. Skiffs are unchanged except for the smooth planking.
  • Hull meshes renamed Trireme_Hull and Trireme_Deck (the old Longship_* assets are no longer used). Ship colliders now span 25 m; all walk tests pass (27 PlayMode, 276 EditMode).
  • Not done: a merchantman (round-hulled trading ship), ship sheds on the quay, a mole, and the skiffs' final look; the sails' stripes are replaced by cream and a darker linen.
  • Unreal: one trireme skeletal mesh with socketed oars; a merchantman as a second.
Greek houses and roofs, and the period rule 447 to 406 BC
  • Period rule (owner, 2026-10-28): the game is set in the 5th century BCE, between 447 BC and 406 BC; all art must fit that window, nothing modern or later. Recorded in docs/GREEK-AUTHENTICITY.md, the NAS notes, the four area PDFs and memory.
  • TimberHouse redrawn as a Greek house (class name kept): stone socle, whitewash and clay walls, stone corner quoins and a string course, a stone lintel and step at the door, small high windows, a low-pitched terracotta roof (Rise 0.95, was 2.0) with ridge tiles and antefixes, a smoke vent instead of a chimney, no timber frames, braces, jetty or tie beams; variant 4 gets a two-column porch with a pent roof; variant 3 a flat clay roof with a parapet, round projecting beam ends and a roof hatch. Plaster washes now whitewash, limestone, clay and brick; roofs Laconian and Corinthian terracotta.
  • Period fixes: iron-hooped barrels became terracotta pithoi and amphorae (Clutter, MarketStall); twine-tied hay bales became loose straw heaps with sheaves; the candy-striped awnings became ochre and undyed linen; the glass-box door lantern became an oil lamp on a bracket.
  • Still out of period, to be replaced in later passes: the clinker longships (Norse), the tholos on the acropolis, the market stalls' stripes (muted, not removed), the town's timber gateway posts.
  • Tests: porch columns keep colliders. 27 PlayMode and 276 EditMode pass.
  • Unreal: a Greek house kit; the period rule in the art bible.
Crowd pass: scattered huts, stalls and piles
  • New Crowd.cs, run after all the compact slides (final coordinates): a seeded scatter that places one-storey cottages, market stalls and Clutter piles (new Clutter.PileAt) over the open ground, rejecting any spot that touches an existing renderer, the plaza ring (r 15.5), the gate street, the acropolis stair and its foot, the temple approach, any NPC, or any walk route the tests use (the yard lap, the gate walk, the pier walks, the quay and wall tests, all listed in Crowd.Routes and Crowd.Keep). Result this build: 1 hut, 4 stalls and 42 piles. Clearances were first too strict (24 piles only) then too loose (two piles blocked the pier walk and the lap); pile clearance is now 1.9 plus 60% of the radius, spread 1.1 to 1.5 m.
  • No test changes; 27 PlayMode and 276 EditMode pass. Adds a handful of lights (one per stall or hut).
  • Not done: stacked buildings, sheds on the walls, and a second market street on the east side; the plaza ring and the lanes were left clear on purpose.
  • Unreal: a PCG graph with the same exclusion shapes.
Harbour pass
  • Lamp glitter: every pier brazier lays a 9 m additive sparkle sheet on the water (T_Sparkle.png, generated: scattered bright points with cross flares, strongest in the middle; scrolled by WaterScroll), so the torches glitter on the sea as in the reference.
  • The two skiffs get a lantern each (light range 6) so they read at night; the harbour mist is denser (alpha 0.22, up to 90 puffs, 2.4 per second).
  • ShoreEdge: pale shallows and a foam wash along the whole south quay face (x -26 to 34, 12 overlapping strips, built at the pre-slide quay line so the south slide carries them).
  • Tests unchanged and passing: 27 PlayMode, 276 EditMode.
  • Not done: the west quay and pier legs have no shallows, there is no boathouse on a pier, and the ships are still small and dark from the overview camera.
  • Unreal: a glitter layer in the water material keyed to point-light positions.
Density pass
  • New Density.cs (built before the east and south compact slides, so it moves with its side): three more houses (two against the west wall at (-38, 3) and (-38, -6), one behind the temple at (24, 35.5), variants 9 to 11, each with a lantern light), seven market stalls (three along the east wall north of the acropolis stair, one in the south-east corner, three along the south quay) and a canvas canopy on the west side. A first canopy position at z 9 blocked the west pier walk and was moved.
  • All 27 PlayMode and 276 EditMode tests pass with no test changes. The stalls add one light each (range 8), the houses one each (range 6).
  • Not done: stacked or multi-level buildings, lean-to sheds on the walls, and a denser plaza centre ring; the town is still more open than the reference.
  • Unreal: placement lists as a data table feeding the house and stall kits.
Acropolis to the right, stair in the middle, fieldstone walls
  • Acropolis.Shift is now (-17.5, -76): the terraces, temples and tholos are centred on the middle of the east side (z -26 to 26) instead of the north-east corner. The town stair and the doorway moved to match: stair z -11.5 to 4.5, landing to 10.5, doorway z 4.8 to 10.2, so it climbs the middle of the east wall.
  • To clear the stair, MarketWest() slides everything between x 19.5 and 31, z -12 and 12 (Kerdon's stall and Kerdon, Tychon's table and Tychon, the two canvas canopies, their pools and props: 131 objects) 10 m west into the plaza's east edge, and a clutter prop that landed on the temple porch is cleared. East wall pilasters now at z -28, Hekate's niche at z -34, wall moss skips the stair zone.
  • Acropolis.StoneFacing: the terrace retaining walls are faced with three courses of the town's own SM_DryStoneWall along every platform edge (the lower terrace's west edge is the town wall; the temple-terrace stair is left open), the top course ending at the terrace.
  • Tests: the stair walk test re-aimed at the new stair and fence (z < 28.5), the east wall test starts at (28, -37). 27 PlayMode and 276 EditMode pass.
  • Unreal: the stair as one modular piece placed by a single marker; the terrace walls as the same wall kit on a spline.
Tighter south, and the outer stair removed
  • Removed the processional stair that ran from the gate road up to the acropolis (outside the wall); the stair inside the town that climbs to the terrace stays.
  • The south side moved 8 m north (HubBuilder.SouthSlide, SouthCut): CompactSouth() slides the whole south harbour (Port_South) and every town object south of z -23.5 and east of x -27 (189 objects: the south house row, NPCs, clutter, market stalls) 8 m north; the cobbled floor, the terrain's sunk rectangle and the south sea mask (PortBuilder.SeaMaskWorld) follow, with the west quay (x < -34) keeping its old south end. The town floor is now about 84 m north to south (was 92) and 77 m east to west (was 86).
  • TownWalkTests updated for the new layout: the south pier walk (z -32 start, stops at -42, -62 and -76; quay-edge assert at -42.6) and the yard lap (legs at x -2 and -3, then z -17). The south street clutter pile at x -3 was dropped to keep the lane open.
  • Not done: the north side (gate, bastion arc, north wall) was not moved: the arc, the sea mask and the road are all tied to those coordinates and the gain was small next to the risk. The gateway posts at z -22 stay and now stand close to the south house row.
  • Unreal: the layout constants in one data asset; the south harbour as a separate level instance.
Darker, deeper sea
  • The comparison showed a flat bright teal sea. Sea base colour (0.05, 0.38, 0.34) to (0.02, 0.20, 0.20): a deep dark teal. The shore strips (ShoreEdge) are now 7.5 m wide (from 4.4 to 5.2 m) and sit further out, with a slightly stronger shallows tint (alpha 0.3), so the water reads pale at the wall and falls away to deep water outward, as in the reference.
  • Unreal: the same base colour with a depth-based colour ramp in the water material.
Weathered stair and gateway
  • Acropolis.WeatherAccess: every lit material of the stair, landing and gateway is copied and dulled toward grey-green weathered stone (the gilt stays); 26 moss patches lie along the treads (heavier at the edges), six on the landing, moss and ivy strips run up the piers and the balustrade, dark stains stream under the cornice, and rubble lies at the foot of the stair and the piers. Flat decals and small loose pieces: no new colliders; walk tests unchanged and passing (27 PlayMode, 276 EditMode).
  • Unreal: the same masks over the architectural kit.
Grand stair and carved gateway
  • The acropolis stair is 9 m wide (x 22.5 to 31.5, 16 m run, still 32 treads with colliders) instead of 4 m, with a balustrade of posts and ball finials up its west side and a flared three-tread foot. The north-east house at (30, 33) that stood in the way was removed. The doorway is 5.4 m wide (z 34.6 to 40) and the landing runs to z 40.3.
  • Acropolis.GateFrame: the wall doorway is now a carved gateway on the town side: plinthed, fluted piers with Ionic-style capitals (neck, volutes, abacus), a three-band stepped architrave, a frieze of triglyphs and gilt rosettes, a dentilled cornice, a pediment with a gilt palmette and acroteria, flanking urns on plinths, a stepped threshold and a brazier either side. New material M_Acro_Gilt.
  • Tests unchanged and passing (27 PlayMode, 276 EditMode); the stair walk test still climbs it.
  • Unreal: the gateway as a modular architectural kit; the stair as a spline-mesh.
The acropolis merged with the town
  • Acropolis.Shift is now (-17.5, -20): the lower terrace (8 m) starts right at the east wall's outer face, beside the temple, from z 30 on.
  • New inside the town (Acropolis.Merge): a 32-tread stair (25 cm risers, each tread a collider) climbs the east wall from the market street (z 19) to a landing at 8 m (z 35 to 39), with braziers; a doorway is cut through the wall at z 35.4 to 39 (the wall is split into south, north and under-walkway boxes; the top wall courses over it are hidden; stone piers and a lintel frame it) and leads onto the terrace.
  • The lower terrace is walkable and fenced (invisible 14 m fence boxes round its edge, open only at the doorway), the grand stair to the temple terrace has a ramp collider, and the temples and the tholos have box colliders. CompactEast skips the new stair and collision groups.
  • Moved to make room: the canvas canopy from z 16 to z 11, the east clutter piles at z 21, 26, 31, the east pilasters at z 24 and 33, and the Triptolemos niche from z 27 to z -24. New test TheAcropolisStair_ClimbsToTheTerrace_AndTheTerraceIsFenced (27 PlayMode tests; EditMode 276).
  • Not done: the terrace temples are only boxes you cannot enter, the temple terrace itself is reachable but unfenced beyond the P1 fence, and the outside processional stair is still scenery.
  • Unreal: the stair as a level-sequence-free walkable blueprint; the fence as a nav-blocking volume.
Sea edge and softer ground
  • New ShoreEdge.cs: along the curved bastion (16 short strips) and the west wall, a pale teal shallows strip and a ragged foam wash (T_Shallows.png, T_Shore_Foam.png, generated, feathered at the ends so the strips blend) lie on the water just outside the wall foot, dense at the wall and fading seaward. Flat alpha decals in Surroundings_ShoreEdge.
  • GroundWear: patches are smaller (2.2 to 5.5 m) and softer (alpha 0.7 to 0.8) and more numerous (about 420 attempts), so the camouflage-like blobs break up into uneven wear.
  • Unreal: a shoreline foam mask in the water material driven by a distance field to the walls.
Brighter harbour
  • Sea base colour (0.02, 0.16, 0.155) to (0.05, 0.38, 0.34), smoothness 0.55 to 0.75, ripple strength 0.45 to 0.6: a lighter green-teal sea with more glint from the brazier and lantern lights, nearer the reference. Ship lanterns from the visibility pass now light the water beside the hulls.
  • Unreal: same water base colour; add a specular sparkle layer.
Denser ground wear
  • GroundWear: the dirt, moss and wet decals went from about 60 to about 200 and grew to 4.5 to 10 m (heavier toward the walls), debris from about 130 to about 380 pieces, and the area now ends at the compact east wall (x 31). The carved plaza ring and the gate street stay clear. All walk tests pass.
  • Unreal: raise the PCG debris density and the decal count the same way.
Weathered roofs and houses
  • TimberHouse.Age (seeded per house): each roof panel sways a little off true, nine moss patches lie on the tiles, and a mismatched repair patch of darker tiles covers a stretch per slope; damp moss creeps up the long walls from the foot; timber beam ends poke out of the jetty at the corners. New materials M_HT_MossRoof, M_HT_MossWall, M_HT_RoofPatch (a soot material is made but not yet used). Tests unchanged: 26/26 and 276/276.
  • Not done: sagging ridges, balconies on every house, and moss that follows the tile shape; the decals are flat quads over the roof.
  • Unreal: a roof material with a moss mask and tile-patch decals.
Compact layout: the east side closes in
  • The town is 9 m narrower: the east wall (and the north wall's east end, the wall courses and collision boxes) now stands at x 33 (HubBuilder.EastWallX) instead of 42, the cobbled floor and the terrain's sunk rectangle end there (the south quay court keeps its old reach to x 46), and the acropolis shift grew to (-19, -6) so its terrace and the processional stair still meet the corner.
  • CompactEast() slides everything that stood east of x 28.5 (the market stalls and canopies, Kerdon and Tychon, props, clutter, decals, lights: 238 objects) 9 m west, after the scene is built. The walls, floor, terrain, harbours and acropolis are built to the new size instead and are skipped. Wall niches, pilasters, moss and banners on the east face are positioned by the same constants.
  • The Telesterion moved from x 26 to x 17 (TemplePosition) and keeps its own group; a market clutter prop on its new porch was removed. The south-east house at (31, -33) was dropped. TownWalkTests: the temple frame (17, 21) and the yard lap re-routed (x 14 and 18 lanes, then (8, 10) and (6, 22) around the temple).
  • Still the same: the gate, the north and west walls, both harbours and every NPC west of x 28.5. The town is still wider than the reference's strip, now by about a tenth.
  • Unreal: the east wall and the slide are two numbers; keep the layout constants in one data asset.
Compact town: infill houses
  • Four infill houses with their doors turned to the plaza: (-31, -12) beside the temple, (18, -16) south-east of the plaza, and (20, 24) and (27, 26) in the north-east, each with its own lantern, pool and smoke (variants 8 and up). They sit clear of the gate street, the south doors (Melitta, Lykon), the lanes, the well, the torches and every leg of the yard-lap walk test.
  • A first attempt with a second row of houses in the south (z -22) was dropped: it cut across the lap test route and left the south-row doors opening onto a one-metre gap where two NPCs stand.
  • Deliberately not done: the walls, gate, floor outline and NPC positions are unchanged. Shrinking the square itself would mean moving the walls, both harbours' quays and every NPC and spawn, and rewriting the walk tests.
  • Unreal: the infill houses are four more instances of the house kit.
Layout: the acropolis against the town, and a processional stair
  • The reference shows the acropolis rising straight out of the town's corner; ours stood far back across an empty meadow. Acropolis.Shift (-10, -6) now slides the finished terraces, temples, stair and trees so the lower terrace starts at x 42, z 44, just beyond the town's north-east corner. The terrain cut-and-fill (Apply, Mask) takes the same shift, so the hill, the terrace paint and the tree clearing all follow.
  • New Acropolis.ProcessionalStair: a 28 m flight of 62 steps climbs east from the gate road (x 14, ground level) to the lower terrace (x 42, 8 m), 9 m wide, with a stepped parapet each side and four braziers a side. Scenery only (group Surroundings_ProcessionalStair, no colliders); its blocks reach 5 m down into the hill so no gap shows.
  • Deliberately not done: the town floor, walls, gate, houses and NPC positions are unchanged, because the walk tests, quest spawns and the harbours all depend on them. Making the town itself more compact would be a separate, larger change.
  • Unreal: the shift is just the actor offset of the acropolis blueprint; the stair as a spline-mesh.
Ship visibility
  • The ships were near-black shapes against the dark water. Hull, deck and sail-cloth colours are lifted (hull 0.78, 0.72, 0.66 with a near-white tint; deck near-white tint; sail cream 0.72, 0.64, 0.5), and each longship now hangs three lanterns (bow post, stern post, masthead), each a bronze frame, an unlit glowing glass and a warm point light (range 7 and 11, intensity about 2.3), so the hull is lit from within the harbour. Touches PortBuilder (Lantern, materials).
  • Unreal: the same lantern lights with a shadow-less rect light; keep the lifted albedo.
The plaza temple, aged
  • New TempleWeathering.cs, called after SM_Telesterion is placed: every material of the model is copied and re-tinted (stone to a warm weathered grey, tiles to a worn dark red-brown, matt), so the clean white temple becomes an old stone hall. Moss decals climb its walls and the front steps, ivy strips hang from the roofline down the long walls, the back wall and the four front columns, and rubble lies at the corners. Decals are flat (group Surroundings_TempleDecals); collision is untouched.
  • Unreal: a master material with a weathering mask on the temple, and the same decals.
Worn ground: earth, moss, wet stone, debris
  • New GroundWear.cs: lit alpha decals over the cobbles (generated T_Dirt_Patch0/1.png, T_Moss_Ground.png, T_Wet_Patch.png): about 60 patches thick at the wall feet and house gaps and thin on the lanes, a worn earth track down the gate street, and the carved plaza ring left clean. About 130 low pieces of debris: rubble heaps, broken planks, potsherds and bones (with the odd skull). Everything is flat or under 0.4 m, so it never blocks a step and the solid-props test still passes. Wet patches are matt (a glossy first try mirrored the sky as white squares).
  • Unreal: the same as decals or a runtime virtual texture blended over the plaza material; debris as a PCG scatter.
Grade pass: mist, whitecaps, sky, sea
  • Comparison with the reference showed my mist reading as white snow patches and the whitecaps as cloud shadows. Mist is now a thin cool haze (alpha 0.13, grey-teal, bigger puffs; the harbour mist 0.1), whitecaps are sparser, finer flecks at alpha 0.16 and 0.12.
  • Sky: a new storm panorama painted locally with FLUX schnell (grey-teal thunderheads, a lightning glow on the left, no purple), made seamless and swapped in for T_Sky_Eleusis_Dusk.png at exposure 0.55 (copy on the NAS: concepts-eleusis/sky_eleusis_storm_teal.png). The old magenta band is gone.
  • Light and sea: the dusk preset's sun, ambient and fog move from blue-violet to teal-grey, so water and stone stop turning lavender; the sea base colour is a deeper teal-green (0.02, 0.16, 0.155).
  • Unreal: same sky texture on the sky sphere with a teal-grey fog and sun colour; the sea material base colour as above.
Carved detail on the ships
  • Stem: gilt carved bands, a beast's head with a long snout, a toothed jaw, nostrils, ears, gilt eyes and a gilt mane. Stern: an aphlaston, the fan of seven alternating gilt and timber blades a Greek warship carries over its stern, with a gilt knob. Bow: a painted eye (ophthalmos) either side, a bronze ram (embolon) with three fins at the waterline, and a painted sheer band along each side following the sheer. New materials M_Port_Gilt, M_Port_Eye, M_Port_Pupil. Touches PortBuilder (Post, BowDetail).
  • Unreal: sculpt the stem head, aphlaston and ram as separate static meshes socketed to the hull; the eye as a decal.
Mist in the streets
  • New StreetMist.cs: six banks of low mist (south street, gate street, north wall foot, east wall foot, west quay, agora) as horizontal-billboard particle systems 45 to 60 cm above the ground, 7 to 12 m puffs drifting at 0.15 to 0.45 m/s, fading in and out, prewarmed. They use T_Mist_Puff.png and fall under the town-wide particle size cap (12% of the view), so they cannot fill the screen. Hooked in after AmberLight.Build.
  • Unreal: exponential height fog with a low-lying second layer, or a volumetric fog Niagara system along the same banks.
Swaying figures and carved statues
  • New runtime World/FigureSway: each robed figure rocks slowly about its feet (own phase and speed); the two with raised arms also lift and lower them; the kneeling ones sway less. Visual only (the collider stays on the root).
  • New Statue.cs: the four niche statues are no longer capsule dolls. Each is a lathe-turned chiton with deep twisting folds and a contrapposto lean, a belt, himation, carved head (nose, brow, hair; Demeter also veiled), two-segment arms and hands, on a three-part plinth, with its own attribute: Demeter (sheaf of grain), Kore (raised torch, poppy), Triptolemos (sceptre, ears of grain), Hekate (a torch in each hand). Marble is dimmed with a faint teal emission. The Hekate niche moved from z -10 to z 0.5 on the east wall, clear of the stalls.
  • Unreal: statues as static meshes sculpted properly (Nanite), the sway as a vertex-shader or a small tick on the actor.
Robed figures round the fire
  • PlazaCentre.Figures: ten hooded, robed figures stand in a loose ring about 5.6 m from the fire, facing it: two with arms raised to the flames, two kneeling with bowed heads, six standing with hands clasped. Each robe is one lathe-turned mesh (flared hem with cloth folds, narrow waist, rounded shoulders) in dusty brown, rust, slate or green-grey; the hood has a shadowed face. They are scenery people: a capsule collider each, no interaction, placed to clear the four lanes, the NPCs, the log stacks and the stash chest. The firelight and the pool decal shade them.
  • Unreal: skeletal mannequins with a cloth-sim robe and a looping prayer animation set; keep the ring layout as a spline of spawn points.
Whitecaps and amber lights
  • Whitecaps: two scrolling layers of foam flecks (T_Whitecaps_A.png, T_Whitecaps_B.png, tileable FFT noise stretched along the wind, alpha-blended unlit) float 5 and 8 cm above every sea plane and drift at different speeds and directions (PortBuilder.AddWhitecaps, reusing WaterScroll).
  • Amber: every house gets a lantern on a bracket beside its door with its own warm point light (range 8) and a soft additive pool on the cobbles (TimberHouse); every torch post and the four market stalls get a pool under their light (AmberLight.cs, flat decals in Surroundings_AmberPools). The shared pool material is M_Amber_Pool.
  • Unreal: whitecaps as a foam layer in the water material (or a second scrolling panner); amber pools as light functions or rect lights with a cookie.
House variety and chimney smoke
  • TimberHouse.Build takes a variant: 0 standard two-storey, 1 with a rear lean-to shed, 2 a one-storey cottage, 3 a tall three-storey house with two chimneys, 4 with a balcony and a hanging sign. The variant also picks one of four plaster washes (cream, grey, ochre, green-grey) and one of three tile weatherings (brown, slate, terracotta), the framing density, shutters on alternate houses, a door canopy on every third, and the chimney side. Two of every three houses smoke (the existing CFXR Smoke Source 3D, capped by TameSmoke). HubBuilder.BuildHouses passes the house index; the pier house stays the standard variant.
  • Unreal: one modular house kit (walls, jetty, roof, chimney as separate pieces) assembled per variant by a Blueprint or PCG graph.
Plaza centre: carved stone rings and firelight
  • New PlazaCentre.cs: the flat dark disc is now a 26 m carved floor (T_Plaza_Ring.png, generated: six bands of radial slabs, spokes, an eight-ray star, a ticked rim, moss in the joints) as a lit alpha decal so the bonfire shades the slabs; a wide additive firelight pool (T_Firelight_Pool.png); a kerb of 22 rough stones round the fire pit; log seats round the ring with gaps at the lanes. The kerb and logs are knee-high with no collision (stepped over); the decals are flat.
  • Unreal: the ring as a decal or a landscape-layer paint over the plaza; the firelight pool as a light function on the bonfire rather than a decal.
Wall dressing: moss, ivy, pilasters, statue niches, banners
  • New WallDecor.cs: soft moss patches (T_Moss_Patch.png) up and along the north, east and curved faces, ivy strips (T_Ivy_Strip.png) hanging from the wall top (both alpha decals in Surroundings_WallDecals, no collision), ten stone pilasters on the north and east walls, four arched statue niches (dark recess, stone jambs, lintel and sill, a robed weathered statue that glows faintly teal with a small cold light), and five cloth banners. Hooked in after Clutter.Build.
  • Unreal: moss and ivy as decals or spline-placed foliage cards; niches as a modular wall piece with an emissive statue and a rect light.
Street clutter pass
  • New Clutter.cs: about 22 piles at the wall feet (north, east, curved bastion) and in the gaps between houses, each of 3 to 5 pieces drawn from barrels (staves, belly, iron hoops, lid), stacked battened crates, firewood stacks between posts, hay bales with twine, sack heaps, rope coils and cloth drapes in rust, indigo, ochre and grey; three ladders lean on the walls. Timber uses the reference-cut plank texture. Solid pieces keep colliders; the gate street, the lanes and the agora are left clear; all walk tests still pass. Hooked in after BuildLivedIn.
  • Unreal: scatter these as a PCG graph (spline along wall feet, weighted prop list) instead of hand-placed clusters.
Audit against the reference: muted roofs, darker ground, teal sea
  • Roof tiles dulled from saturated red to weathered brown (TimberHouse), plaza paving tint darkened and cooled (HubBuilder), sea base colour nudged toward teal (PortBuilder). Blender repair of the AI longship hull (seed 33: voxel remesh, smooth, decimate, bake) was tried and rejected: the remesh left large holes and a warped hull. Script kept as tools/bl_repair.py.
  • Still open from the audit: dense street clutter, mossy and decorated walls (niches, statues, ivy), a stone-ringed plaza centre with firelight pooling, varied house styles and smoke, whitecaps on the sea, and warm amber light pools.
  • Unreal: grade the same way with a LUT; decals for moss and dirt.
Ship timber from the reference, mist and foam
  • Local AI pipeline (all licence-clean: Qwen-Image-Edit-2511 is Apache-2.0, TRELLIS.2 is MIT; Hunyuan3D was rejected because its licence excludes the EU): Qwen redraws the blurry reference boat crops as clean, sharp pictures, from which the clinker hull texture and the weathered plank texture were cut and made seamless (Art/Textures/Environment/T_Ship_Clinker.png, T_Ship_Planks.png). TRELLIS.2 was tried for whole hulls (45 to 90 s each) but produced torn, hollow shells, so the code-built hull stays and only takes the textures. Scripts: tools/comfy_qwen_edit.py, comfy_3d_lo.py, ship_tex.py, bl_render.py in the session scratchpad; trial renders on the NAS in art-work/embers-of-olympus/_tests/2026-10-28-boats.
  • Hulls use the clinker texture, decks and benches the plank texture. Low sea mist drifts over each bay (T_Mist_Puff.png, horizontal billboards, capped like all particles) and a faint foam band (T_Foam_Ring.png) rings every hull and skiff. Touches PortBuilder.
  • Unreal: the same textures on a ship static mesh; mist as a Niagara ribbon or exponential height fog volume near the water; foam as a decal or a water-body interaction.
Ships and boats, second pass
  • Hulls are broader and deeper (beam 4.0, freeboard 1.0) with real overlapping clinker strakes modelled into the mesh (every other row stands proud); weathered grey-brown instead of red. The stem now carries a carved beast head with a jaw and eyes; the stern keeps a knob. The furled sail is a row of ten rounded cream scallops with darker linings, lashed to the yard, instead of striped tubes. A lashed tarpaulin covers the cargo and a rope coil lies forward. Skiffs are larger (5.8 m). Touches PortBuilder.
  • Unreal: model the clinker laps in the hull mesh or a normal map; the sail is a cloth-simulated furled mesh.
Ships like the picture: clinker longships and skiffs
  • The four harbour ships are now open, clinker-built longships (15 m): a sheer sweeping up to a curled, knobbed stem and a taller stern post, a gunwale rail, six strakes up the side, seven thwarts with knees, stowed oars, a raked mast with a long yard, a furled sail in cream and rust folds, forestay, backstay and shrouds, a steering oar, and cargo. The old banks of oars and hung shields are gone. Two small rowing skiffs lie by the pier. Touches PortBuilder (HullMesh parameters, Ship, Skiff, Gunwale, Post).
  • Unreal: one skeletal or static longship mesh with a clinker normal map and a separate sail mesh; skiffs as a second small mesh; ShipRocking becomes a simple sine on the actor.
Darker sea, and the ships actually exist
  • Sea: base colour (0.015,0.075,0.10), smoothness 0.7 to 0.55, ripple strength 0.6 to 0.45, so it reads deep teal-navy under the storm sky instead of pale lavender.
  • Ships: the west harbour's four triremes had no hull or deck at all (only masts, oars and cargo floating). HullMesh rebuilt the same asset for the second harbour, which deleted the mesh the first harbour pointed at. Hull meshes are now cached per scene build and shared. The hull and deck triangles were also wound backwards, so they are flipped and the hull and deck materials are double-sided. The hull is lighter (0.66,0.50,0.38) so it reads at night.
  • Unreal: build the trireme as one static mesh with a planked material; do not generate the same asset twice under one name.
White blob found: the house gables
  • The bloom clamp shrank the blob and exposed its source: the gable-end triangles of the half-timbered houses glowed white with a black triangle inside. TimberHouse.GableMesh put both faces on shared vertices, so RecalculateNormals cancelled them to zero (NaN) and the bloom spread it. The two faces now have their own vertices and hand-set normals. The bloom clamp and duller puddles stay as safeguards.
  • Unreal: never author a double-sided triangle on shared vertices; duplicate the vertices or use a two-sided material.
White blob, third pass: bloom clamp and puddle glint
  • The blob still appeared at certain viewing angles (two screenshots, same spot, one clean and one blown out), with black specks at its centre. That is the signature of a single absurdly bright pixel bloomed across the screen: a lamp's specular glint on a mirror-smooth puddle. Fixes: bloom clamp 8 in every volume profile (DarkMood), puddle smoothness 0.92 to 0.7 with specular highlights off.
  • Unreal: set the Bloom max brightness clamp; keep puddle roughness above about 0.3 or use a water shader, so a point light cannot create a screen-filling highlight.
White blob again: every particle capped, not just smoke
  • The blob came back in a screenshot. The flame particles (torches, bonfire, braziers) shipped with a size cap of 5 screen-widths, so one next to the camera filled the view and bloomed to white. Every particle renderer in the town is now capped to 12% of the view (HubBuilder.TameSmoke), as are the portal embers, impact sparks and dust puffs. Smoke_CannotFillTheScreen now checks all particles. The house windows are unlit quads and the houses have no lights, so they were not the cause.
  • Unreal: set a maximum screen size on every Niagara sprite renderer; never leave it unbounded on additive flames.
Puddles look like water from above
  • Puddles were jet black seen from straight above (they mirrored the dark zenith). They now carry a storm-sky grey sheet with faint drop rings and a dark wet rim, lit by a soft emission. Touches PortBuilder (puddle material, generated texture Art/Textures/T_Puddle_Sky.png).
  • Unreal: use a water material with a sky-grey reflection and a ripple normal for puddles; do not rely on a reflection probe from above.
The terraced acropolis with the round temple
  • Three platforms are carved into the north-east hills (Acropolis.Apply merges into the terrain height in HubBuilder.BuildSurroundings; Acropolis.Mask keeps trees, rocks and rock-texture off them and paints them dry earth): a lower terrace (8 m), a temple terrace (11 m) and a hilltop (20 m). On them, built in code by Acropolis.Build: mossy retaining walls, a 16-step grand stair, a tholos (18 columns, round cella, conical tile roof, pink-gold glow), a hexastyle temple (6 x 11 columns) and a smaller one, a far hilltop temple, braziers with warm lights, and olive/forest trees along the rims. Scenery only: no colliders, group Surroundings_Acropolis (exempt from the solid-props test by name).
  • Unreal: landscape sculpt layers or Landscape Splines for the terraces, a modular temple Blueprint (columns as an instanced static mesh on a spline/circle).
The white bug: smoke blown out to a screen-sized blob
  • Reported with a screenshot: a huge white glowing ellipse over the left of the view. Smoke clouds (CFXR Smoke Source 3D, forge and chimneys) grow past the renderer's default cap of 50% of the viewport when the camera is near them and blow out to white under the bloom. Fix: HubBuilder.TameSmoke caps every smoke renderer at 12% of the view (maxParticleSize) and tints it a dim grey. Test: Smoke_CannotFillTheScreen. 26/26 PlayMode.
  • Unreal: Niagara sprite size clamp (Max Sprite Size/Screen Size) and a camera-distance fade on smoke.
Round granary stores like the reference
  • The two granaries are now round stone stores built in code by the new RoundGranary.Build(parent, at, faceYaw): a fieldstone drum (6 m across, 4 m high) with a mossy foot, three timber hoops and 14 timber staves, a timber door under a lintel with a stone step and hoist beam, five slit windows, a deep-overhanging conical dark tile roof (generated cone mesh with explicit slope normals), a loading hatch, a finial and a door lantern. Doors face the agora. One capsule Solid holds each store, roof included. Materials M_Granary_*.
  • Replaces the Meshy SM_Granary placements (the model stays in the project). The grey cylinders keep their collision, hidden.
  • Gotcha: a mesh with an outward and an underside triangle set sharing vertices has its normals cancel and renders black; use one outward winding and set normals by hand.
  • Tests unchanged and green: 25/25 PlayMode, 276/276 EditMode.
  • Unreal: a Blueprint of a cylinder mesh + cone mesh + door and hoop static meshes; the roof is a cone with a tiling tile material.
Timber market stalls like the reference
  • Kerdon's stall and the three east-wall stalls are now built in code by the new MarketStall.Build(parent, at, yaw, width): plank back and sides, a counter, a sloping dark tile roof with a fascia, a red-and-cream striped cloth awning over the customers, crates, a barrel, sacks and a heap of fruit on the counter, more crates and barrels at the sides, and a hanging lantern with a warm point light. Two canvas canopies (MarketStall.Canopy: four poles, a cream sheet, a red hem, barrels and crates) join the east market. Materials M_Stall_*; the frame, roof and base share the houses' M_HT_*. Each stall has one Solid box. Kerdon's old grey boxes keep their collision, hidden.
  • Replaces the Meshy SM_MerchantStall placements (the model stays in the project). Tychon's gambling table is unchanged.
  • Test: EveryProp_InTheTown_IsSolid now exempts Awning (cloth hung over the walkway, like the gateway beams). 25/25 PlayMode, 276/276 EditMode.
  • Unreal: a stall Blueprint (static mesh components + a point light), instanced along the wall; the awning stripes are one material with a stripe mask.
Half-timbered houses like the reference
  • Every town house (and the house at the foot of the pier, in both harbours) is now a half-timbered building: stone base, plaster panels in a dark timber frame with diagonal braces, a jettied upper storey on timber brackets, plaster gable ends with a tie beam and king post, a dark tile roof with overhang, a chimney, a door with lintel and warm lit windows. Built in code by the new TimberHouse.Build(parent, at, yaw, width, depth) (boxes plus a gable mesh; materials M_HT_*); width varies 7.6-9.2 m by house. Front is local +Z; HubBuilder.BuildHouses turns it to face the agora. One Solid box holds each house for collision (footprint, up to the ridge).
  • Replaces the Meshy SM_GreekHouse_A/B placements (the models stay in the project; the dusk tint pass on them is now idle).
  • Tests unchanged and green: 25/25 PlayMode (the every-prop-is-solid test covers the new houses), 276/276 EditMode.
  • Unreal: a modular building kit (wall panel, timber post, brace, roof) assembled in a Blueprint or a PCG graph; the same frame proportions (1.5 m bays, 1.8 + 2.0 m storeys).
The sea washes the curved bastion
  • The cobbled floor is now a cut mesh (HubBuilder.BuildFloor: rectangles plus a quarter disc under the arc, world-space UVs so the cobble tiling is unchanged) instead of a 100 m box, so nothing lies outside the bastion. The terrain there is carved to the sea bed (HubBuilder.NorthWestSea, merged into PortBuilder.SeaMaskWorld, so trees and rocks keep clear) and a new water plane (PortBuilder.SeaPatch, Sea_NorthWest, 5 cm under the main sea) fills it. The wall gets a course (and a deeper collider) standing in the water.
  • The west quay now ends at the bastion: cargo, tent, bollards and the low embankment north of z = 14 were dropped (they would have stood in the sea).
  • Tests unchanged and green: 25/25 PlayMode, 276/276 EditMode.
  • Unreal: a landscape with a water body (Water plugin) whose shoreline is the wall; the floor is the landscape itself, so no cut mesh is needed.
Curved north-west bastion like the reference
  • The north wall now swings round a quarter circle (centre (-27.5, 25), radius 17) and runs straight down the sea side (x = -44.5) to z = 14, where the quay begins. Visuals: 40 short wall pieces (2.2 m high, five courses, each turned to the tangent). Collision: eight rotated boxes round the arc plus one straight box; the quay strip behind the bastion is sealed with a barrier (Seal_WestQuay). Constants: ArcCentre, ArcRadius, WestWallX, WestWallEnd in HubBuilder.
  • The 11 m wall model saw-toothed on a curve; scaling it smaller and stacking more courses fixed that.
  • Test: the quay-edge test now starts north of the pier at z = 12.8 (the old spot is inside the bastion). 25/25 PlayMode.
  • Unreal: a spline mesh (the wall mesh along a spline) gives the curve for free; collision follows the spline.
Eleusis styled after the reference render
  • Sky: a new stormy thunderhead panorama painted locally (FLUX, T_Sky_Eleusis_Dusk.png, old one kept in the scratchpad), seam-blended; sky exposure 1.4.
  • Light: a red bonfire that throws long light (range 17, intensity 5.2), warmer and stronger torches and braziers, more fog (0.0036), exposure 1.7.
  • Stone: three wall courses (walls ~10 m, taller like the reference), dark wet flagstone plaza instead of the pale disc.
  • Houses: dusk-tinted plaster and tile (M_Town_SM_GreekHouse_*_Dusk), not white boxes. Sea: deeper teal. Ground: terraced hills behind the town (steps quantised in land.Extra), drier earth.
  • Clutter: jars, sacks and goods piled at the foot of the north and east walls.
  • Tests unchanged and green: 25/25 PlayMode, 276/276 EditMode.
  • Still unlike the reference: curved walls, half-timbered house models, terraced acropolis with a tholos, boat and dock models (all need new art).
  • Unreal: sky = a skydome material with a lightning flash event; wall height is a spline mesh scale; terraces = landscape layers or sculpted steps.
Eleusis rebuilt: great gate in the back wall, a second harbour to the south, the market on the east wall
  • Walls: the back (north) wall now holds the great gate (HubGateX/GateX = 4); the east wall is whole; the south wall is gone, replaced by a quay and sea. The Plain road runs out of the north gate (terrain flattened there, no trees on it); the from_plain spawn is just inside it, facing south.
  • Two harbours: PortBuilder.Build(town, name, yaw): the west bay (yaw -90, as before) and a new south bay (yaw 180, Port_South), each with a pier, jetty, four triremes, braziers and cargo. SeaMaskWorld is the larger of the two bay masks, so terrain and trees keep clear of both. The second sea plane sits 3 cm lower so the two planes never fight where they overlap. Materials are made once per scene.
  • The market: Kerdon's stall and Tychon's table moved to the east wall (stalls turned to face west), three more stalls with goods along the wall.
  • Gate street: the waypoint pad, the Shrine of Hermes, the codex tablet, Euodos, Chiron, the road herm, two torches and the dog moved to the north gate; the north houses at the gate street were removed; the gate walker now walks the street.
  • Everything else is kept: every NPC and service, stash, bounty board, forge, occultist, return portal, start/portal spawns, the granary quest hatch.
  • Tests: three new walk tests (north gate reachable and held shut, north and east walls solid, south pier walkable and south quay edge closed); lap re-aimed. 25/25 PlayMode, 276/276 EditMode. EveryProp_InTheTown_IsSolid still passes.
  • Tried and set aside: TRELLIS.2 image-to-3D (the high-resolution stage took ~25 min per step on this GPU) and the SDXL ControlNet concept render (it reproduces our geometry; no gain in style). Assets stay Meshy + packs + code-built boats.
  • Unreal: the gate is a level-placed blueprint with a trigger volume (level streaming to the Plain); two harbours = two water bodies/planes with the same material; the walls are splines of the wall mesh.
Eleusis re-laid like the reference render, with wet mossy stone
  • Layout (option 1): the sea is now WEST of the town and the west wall is gone, so the town opens onto a stone quay with two piers (a main pier with a T-head, and a short jetty), four moored triremes and a house at the foot of the pier. The Telesterion moved to the north-east corner beside the gate, porch facing the plaza. The old north harbour is removed. The harbour is still built in one frame and turned a quarter (PortBuilder.Build ends with port.rotation = Euler(0,-90,0); SeaMaskWorld(x,z) = SeaMask(z,-x)). The temple is built at its old spot as one rigid group and carried (HubBuilder.TemplePosition, rotation 90): moving a built group is safer than editing its hard-coded collision.
  • Stone and ground (option 2): moss-green tint on every SM_DryStoneWall (M_Town_MossyWall), wetter and darker cobbles, 16 puddles that reflect the sky and fire, ferns along the north and south walls, a low fieldstone embankment along the quay edge.
  • Tests updated for the new positions (temple walk mapped through Temple()/Original(); pier, quay and lap re-aimed): 9/9 walk tests, 22 PlayMode, 276 EditMode.
  • Moved because they stood in the temple's new footprint: a market-clutter crate, the north walker's route, a pithos and a sack bundle.
  • Not matched: half-timbered houses (option 3, needs a model pack), mossy carved stone detail, the reference's boat and dock models.
  • Unreal: the temple/harbour re-position is a transform on a group; ground wetness = a roughness mask in the landscape material, puddles = decals or a water material.
Brighter dusk, teal sea
  • DarkMood.TownDusk brightened (sun 1.7, exposure 1.45, lighter ambient and fog) and the sea is a deeper teal (M_Port_Sea), after the owner's reference render (a lit teal sea, warm fires, bright stone). Still dusk. The reference's layout (docks inside the walls on the west, half-timbered houses, a round paved plaza under the temple corner) is NOT reproduced: ours is a north harbour and whitewashed houses; matching it exactly needs new art.
  • Unreal: exposure and tone are one post-process volume; the values are in TownDusk.
Eleusis: dusk, a harbour, ships, and every prop solid
  • Source: Eleusis Town &amp; Port Design Document.pdf (dark mythic hub, cold twilight vs warm fire, docks and triremes). This reverses the earlier daylight town (blue sky and sun, 2026-10-26): the town is now at dusk. The old look is still in code (DarkMood.TownDay, GreekSky); to go back, point HubBuilder.SetMood and the SetSceneLook call at them.
  • Look: DarkMood.TownDusk (cold blue sun, ambient, fog, +25 contrast, vignette 0.35, warm shadows) and a locally painted purple thunderhead sky (T_Sky_Eleusis_Dusk, FLUX, seamless, no mipmaps).
  • Harbour (PortBuilder): a bay north of the quay (terrain basin, sea plane with a scrolling normal map, no environment reflections so only fires glint on it), a gate in the north wall, a quay court with bollards, a pier with piles, a T-head, 11 braziers with warm lights, cargo, and three moored triremes generated in code (lofted hull mesh, deck, 36 oars, aspides along the rail, mast, furled sail, stays) that rock on the swell. Boats are code because Meshy credits (10) cannot pay for a textured model.
  • Solid: the quay edge, pier sides and T-head are barriers (the sea has no collider and is unreachable); the quay court is closed at both ends; 36+ town props that had no collider (torch posts, pithoi, banners, the Hestia hearth shrine, sacks, amphorae, log stacks, the olive, votive hangings, carts, tents, braziers) now have capsule or box colliders on unscaled SolidProps holders (PortBuilder.MakeSolid).
  • Tests: TownWalkTests: pier walk (gate to T-head, sides and end are barriers), quay edge closed, and EveryProp_InTheTown_IsSolid (every visible prop over 0.5 m has a collider where it stands). 9/9.
  • Lessons (these cost time): (1) a Meshy model placed by height can be very wide (the brazier is 5.7 m across at 1.35 m high); size by width and check; (2) colliders on a scaled and rotated model holder came out 88 m wide and dropped the hero through the world: build them on unscaled holders from world bounds; (3) Unity attaches a component only from a file named for its class: two components in one file silently go missing; (4) URP Lit tiles the normal map with the base map (mainTextureScale).
  • Not done: the document's NPC list (Damon, Kerdon as blacksmith, "Charon's Envoy" ferry) does not match the game's characters; fast travel by ship has no destination yet. The ships are stylised (no hull planking detail).
  • Unreal: sea = Water plugin or a plane with a scrolling normal; the trireme generator (a lofted cross-section mesh) ports as a procedural mesh or a one-off Blender export (the maths is in PortBuilder.HullMesh). Solid props = simple collision primitives per prop, never complex.

Greek authenticity pass 1: names
  • Display names only; ids, keys and saves are unchanged. Full table and reasons: docs/GREEK-AUTHENTICITY.md.
  • Bronze Knife -> Bronze Machaira; Sacrificial Blade -> Sphagion; Bronze Helm -> Corinthian Helm; Bronze Cuirass -> Bronze Thorax; Bronze Greaves -> Bronze Knemides; War Belt -> Zoster; Bronze Vambraces -> Bronze Arm-guards; Hornbow -> Scythian Bow.
  • Sigils -> Seals (Latin sigillum is not Greek; a sphragis is a seal). Skeletal Hoplite -> Unburied Hoplite (the restless unburied dead are the Greek idea; skeletons are not).
  • Potions: Healing Draught -> Kykeon / Hecamede's Kykeon (Iliad 11.638); Vigor Draught -> Wine of Maron / Neat Wine of Maron (Odyssey 9); Stamina Draught -> Honeyed Water / Hymettian Honey Water.
  • Unreal: names live in the localisation CSVs (narrative.csv, systems.csv; format key,en,notes). Unreal's String Table can import that CSV directly. Keep ids (item.bronze_helm) stable and change only the text, exactly as here.
Potions on the hotbar build 2026-10-27_1447
  • Z life, X vigor, C stamina slots sit in the hotbar row after skill slot 6: icon, count, cooldown veil, caption; empty = carved potion.
  • Unreal: UMG widget per slot bound to a potion-belt subsystem; the 5 s shared cooldown is one timestamp (_potionReadyAt).
Settings readability
  • Toggle and dropdown text was the engine theme's dark default on dark stone; fixed. The Controls page scrolls (fixed-height ScrollView).
  • Audio note no longer says music/effects are "to come".
  • Unreal: with UMG, set text colour in the style asset once; a scrolling list is a ScrollBox.
Close X on every window build 2026-10-27_1410
  • WindowChrome.AddCloseX adds a red X at the top right of: skill tree, trade, forge/occult, repairs, stash, travel, board, codex, quest log, map, settings, pause menu (inventory has its own). The second "Close" buttons were removed (X and Esc close).
  • Forge detail text was invisible (no default colour on the name label); fixed.
  • Unreal: one reusable "window frame" widget (frame + title + X) that all windows inherit.
Carved service windows and quest log build 2026-10-27_1359
  • Stash, trade, forge, repair, travel, map and menu windows use the carved 9-slice frame and plate buttons (Hud.uss).
  • Quest log is its own window: vertical-only scroll, one bordered card per quest (title, giver, steps, Track/Abandon).
  • Unreal: 9-slice = UMG Brush "Box" draw mode with margins; keep the margin numbers (70 px frame, 40 px buttons).
Potion belt, stamina potions, stash gold, bag build 2026-10-27_1344
  • Stamina potions (Minor 50%, Greater 100%), key C (rebindable; gamepad right shoulder). ConsumableEffect.StaminaPotion (appended: enums are saved by number).
  • Potion belt: potions do not take bag cells; PotionBelt stacks them per potion (limit 99), one box per kind above the bag, strongest drunk first, click a box to drink. Anything landing in a bag cell is swept onto the belt (old saves migrate). Saved as SaveData.Potions.
  • Bag 10 x 4 (40 cells). Gold bar four cells wide, centred. Gold in the stash: PlayerStash.Gold, shared by all characters (shared_stash.json, SaveData.StashGold), Deposit/Withdraw 100 and All.
  • More Stats / Fewer Stats: the stat list scrolls in a fixed box; the window no longer grows.
  • Tests: PotionBeltTests (EditMode), TownWindowsTests (belt, gold bar, scroll, stash gold).
  • Unreal: PotionBelt is plain C# with a Changed event: a UObject/subsystem. Gold-in-stash is one int in the shared save. Lesson: USS has no :not(); one silently disabled a whole stylesheet (UMG has no such trap).
Audio finally loads; portal hum build 2026-10-27_1233
  • Bug: AudioDirector loaded the sound bank from Resources path Audio/SoundBank, but the asset is Audio/Resources/SoundBank.asset, so the bank never loaded and the game was silent (no music, ambience, footsteps, effects). Fixed (SoundBank.ResourcePath = "SoundBank").
  • Portal hum: seamless loop (Audio/Fixes/Sfx_portal_loop.flac, local Stable Audio, 1.5 s equal-power crossfade), SoundId.PortalLoop, a 3D looping source on the return portal that swells in and out. Levels of all clips measured; none clip.
  • Unreal: MetaSounds/Sound Cues; keep the bank as one data asset; seamless loops: crossfade the tail into the head, then drop the tail.
UI kit regenerated locally, old sheets removed
  • 17 kit pieces (frames, buttons, sockets, parchment, bars) redrawn from our own stone texture plus drawn bevels, Greek key bands, rosettes, rings. Generator: art-work/embers-of-olympus/ui_kit_gen.py on the NAS. 30 unused older sheets deleted (backed up outside the project).
  • Git history still contains the old files (first commit onward).
  • Unreal: export the pieces as PNGs with their slice margins; the generator can re-emit them at any size.
Skill tree and inventory restyle
  • Skill tree: tab per tree, icon sockets by tier with a rank box, arrows between tiers (dim while locked), footer "Skill Points Remaining: N" + respec. Arrows show tier flow only: nodes have no prerequisites, just points-in-tree gating (a design fact worth knowing for the port).
  • Inventory: paper doll (11 slots around the body), carved silhouette in each empty slot (local FLUX, desaturated), black bag cells, gold bar, red X.
  • Unreal: the layout numbers are in Inventory.uss (.inv-doll, .eq-*).
Collider and walk checks
  • Sampled walkable ground in all four zones for invisible colliders; only intentional ones remain. Grove stumps get box colliders. New test walks a real lap of the Eleusis yard. Plain/Grove/Ploutonion NavMesh routes verified.
  • Unreal: character-capsule walk tests translate to automation tests with a possessed pawn.
Plain playtest fixes
  • Invisible wall round the Threshing Floor: a flattened cylinder primitive carries a capsule collider whose height cannot be below its width (18 m tall). Removed. Standing water was a bright mirror; now murky.
  • Unreal: use a box/none collider for flat decals and discs. Water: low smoothness, no sky reflection, dark mud under it.
Environment pass
  • Ploutonion: cavern-roof sky, painted rifts, fallen-hoplite relics. Plain: low terraces, blight stories (olive + broken pillar, spilled pithoi, wilted shrines) on scorched-earth patches. Eleusis: off-ruler houses, refugee camp, cart, withered sacred olive, timber gateway, dimmer agora. Grove: root knolls, dead trees, offerings, felled trunks. Dust motes; SSAO stronger (0.7 / 0.45).
  • All stat names now have localisation entries (30 added; ItemText.StatName falls back to words).
  • Source of the plan: Embers of Olympus - Environment Design &amp; Polish Recommendations.pdf (Downloads).
  • Unreal: environmental "stories" are positions along paths + a ground-paint mask; port as PCG graphs or placement data.