Repository navigation
Releases: seanellul/Masonry
Release list
Masonry 0.0.1.30 (Build #30)
What's New
[2026-04-08] Build menu icon polish + tooltips (T-0001)
Milestone: UI polish
Files changed: src/gui/ui/ui_gamehud.cpp, src/gui/aggregatorinventory.cpp, content/db/ingnomia.db.sql
Changes
- Larger framed build icons — bumped icon size from 48px → 64px and added a
FrameBg-tinted, bordered backdrop drawn viaImDrawList. Reads cleanly against any panel background. - Real material in baked previews —
setBuildItemValuesnow picks the first concrete available material per required component (falling back toPine) instead of passing"None", so workshop/item previews render in colour rather than as flat silhouettes. - Auto-trim transparent / flat-bg margins — at draw time the build menu computes a content bbox over the buffer (sampling the top-left corner as backdrop colour with a tolerance), caches uv0/uv1 per cache key, and feeds them into
ImageWithBgso small sprites (chairs, cabinets, walls) fill the framed box. - Background knock-out —
stripBlackBackgroundwalks the freshly-baked RGBA buffer in the aggregator and zeros alpha on any pixel within tolerance of the top-left sample, removing the opaque black square the bake leaves behind. - Furniture / mechanism / hydraulics tooltips — added 29
$BuildingDesc_*Translation rows (Bed, Chair, Table, Cabinet, Painting, Statue, GearBox, SteamEngine, Axle, Lever, Pipe, Pump, Windmill, ...) and an$ItemDesc_<id>fallback inbuildingTooltipDescso any item with an existing item description surfaces it without an extra row.
Technical Details
- ImGui ≥1.90 deprecated
Image(..., tint, border); switched toImageWithBg(tex, size, uv0, uv1, bg, tint). The tint is held at ~1.15× to lift the dim baked previews without blowing out colour. - The bbox cache lives as a function-local
static std::unordered_map<unsigned int, ImVec4>keyed by the existing sprite cache key, so it inherits invalidation for free when the texture cache is cleared. stripBlackBackgroundsamples the corner pixel rather than hard-coding(0,0,0), so it tolerates any flat backdrop the bake might use.
Build: #30 | Commit: 6ecc9ef
Downloads
- Windows:
Masonry-Windows.zip— extract and runMasonry.exe - macOS:
Masonry-macOS.zip— extract, right-click Masonry.app → Open (first time) - Linux:
Masonry-Linux.tar.gz— extract and run./masonry.sh
Masonry 0.0.1.29 (Build #29)
What's New
[2026-04-08] Build menu icon polish + tooltips (T-0001)
Milestone: UI polish
Files changed: src/gui/ui/ui_gamehud.cpp, src/gui/aggregatorinventory.cpp, content/db/ingnomia.db.sql
Changes
- Larger framed build icons — bumped icon size from 48px → 64px and added a
FrameBg-tinted, bordered backdrop drawn viaImDrawList. Reads cleanly against any panel background. - Real material in baked previews —
setBuildItemValuesnow picks the first concrete available material per required component (falling back toPine) instead of passing"None", so workshop/item previews render in colour rather than as flat silhouettes. - Auto-trim transparent / flat-bg margins — at draw time the build menu computes a content bbox over the buffer (sampling the top-left corner as backdrop colour with a tolerance), caches uv0/uv1 per cache key, and feeds them into
ImageWithBgso small sprites (chairs, cabinets, walls) fill the framed box. - Background knock-out —
stripBlackBackgroundwalks the freshly-baked RGBA buffer in the aggregator and zeros alpha on any pixel within tolerance of the top-left sample, removing the opaque black square the bake leaves behind. - Furniture / mechanism / hydraulics tooltips — added 29
$BuildingDesc_*Translation rows (Bed, Chair, Table, Cabinet, Painting, Statue, GearBox, SteamEngine, Axle, Lever, Pipe, Pump, Windmill, ...) and an$ItemDesc_<id>fallback inbuildingTooltipDescso any item with an existing item description surfaces it without an extra row.
Technical Details
- ImGui ≥1.90 deprecated
Image(..., tint, border); switched toImageWithBg(tex, size, uv0, uv1, bg, tint). The tint is held at ~1.15× to lift the dim baked previews without blowing out colour. - The bbox cache lives as a function-local
static std::unordered_map<unsigned int, ImVec4>keyed by the existing sprite cache key, so it inherits invalidation for free when the texture cache is cleared. stripBlackBackgroundsamples the corner pixel rather than hard-coding(0,0,0), so it tolerates any flat backdrop the bake might use.
Build: #29 | Commit: 8ad191a
Downloads
- Windows:
Masonry-Windows.zip— extract and runMasonry.exe - macOS:
Masonry-macOS.zip— extract, right-click Masonry.app → Open (first time) - Linux:
Masonry-Linux.tar.gz— extract and run./masonry.sh
Masonry 0.0.1.28 (Build #28)
What's New
[2026-04-01] Bottom Toolbar Redesign — Shape / Zone / Manage
Milestone: 0.0 — UI/UX
Files changed: src/base/enums.h, src/gui/imguibridge.h, src/gui/ui/ui_gamehud.cpp
Changes
- 3 primary actions replace 5 — Build/Mine/Agriculture/Designations/Job collapsed into Shape/Zone/Manage, grouped by what you're doing to the world
- Shape tab has 3 sub-tabs: Build (workshops, structures, furniture, utility, containers), Dig (mine, stairs, ramp, hole), Nature (cut tree, plant, harvest, forage)
- Zone tab has 4 category tabs: Storage (stockpile), Production (farm, grove, pasture), Rooms (personal, dorm, dining, hospital), Control (forbidden, guard, remove)
- Manage tab has 2 columns: Job Control (suspend, resume, cancel, priority) and Demolition (deconstruct)
- Unified panel — instead of 3 separate flyout windows, everything opens in one coherent tabbed panel above the toolbar
- Icon integration — Font Awesome 6 + RPG Awesome icons on all buttons (hammer, axe, shield, seedling, etc.)
- Material selection via tabs — material subcategories shown as ImGui tabs instead of a separate floating panel
- Build items inline — workshop/furniture item list with sprite icons, material dropdowns, and build buttons all within the tabbed panel
Technical Details
ButtonSelectionenum:None,Shape,Zone,Manage(replaces Build/Mine/Agriculture/Designation/Job)- New
ShapeTabenum:Build,Dig,Nature - New
ZoneCategoryenum:Storage,Production,Rooms,Control - All backend commands unchanged — same
cmdSetSelectionAction,cmdRequestBuildItems,cmdBuildcalls - Old action data arrays replaced with
ActionDefstructs carrying icon + label + action string
Build: #28 | Commit: 92d0b8c
Downloads
- Windows:
Masonry-Windows.zip— extract and runMasonry.exe - macOS:
Masonry-macOS.zip— extract, right-click Masonry.app → Open (first time) - Linux:
Masonry-Linux.tar.gz— extract and run./masonry.sh
Masonry 0.0.1.27 (Build #27)
What's New
[2026-04-01] Bottom Toolbar Redesign — Shape / Zone / Manage
Milestone: 0.0 — UI/UX
Files changed: src/base/enums.h, src/gui/imguibridge.h, src/gui/ui/ui_gamehud.cpp
Changes
- 3 primary actions replace 5 — Build/Mine/Agriculture/Designations/Job collapsed into Shape/Zone/Manage, grouped by what you're doing to the world
- Shape tab has 3 sub-tabs: Build (workshops, structures, furniture, utility, containers), Dig (mine, stairs, ramp, hole), Nature (cut tree, plant, harvest, forage)
- Zone tab has 4 category tabs: Storage (stockpile), Production (farm, grove, pasture), Rooms (personal, dorm, dining, hospital), Control (forbidden, guard, remove)
- Manage tab has 2 columns: Job Control (suspend, resume, cancel, priority) and Demolition (deconstruct)
- Unified panel — instead of 3 separate flyout windows, everything opens in one coherent tabbed panel above the toolbar
- Icon integration — Font Awesome 6 + RPG Awesome icons on all buttons (hammer, axe, shield, seedling, etc.)
- Material selection via tabs — material subcategories shown as ImGui tabs instead of a separate floating panel
- Build items inline — workshop/furniture item list with sprite icons, material dropdowns, and build buttons all within the tabbed panel
Technical Details
ButtonSelectionenum:None,Shape,Zone,Manage(replaces Build/Mine/Agriculture/Designation/Job)- New
ShapeTabenum:Build,Dig,Nature - New
ZoneCategoryenum:Storage,Production,Rooms,Control - All backend commands unchanged — same
cmdSetSelectionAction,cmdRequestBuildItems,cmdBuildcalls - Old action data arrays replaced with
ActionDefstructs carrying icon + label + action string
Build: #27 | Commit: 000b294
Downloads
- Windows:
Masonry-Windows.zip— extract and runMasonry.exe - macOS:
Masonry-macOS.zip— extract, right-click Masonry.app → Open (first time) - Linux:
Masonry-Linux.tar.gz— extract and run./masonry.sh
Masonry 0.0.1.26 (Build #26)
What's New
[2026-03-26] Mega Optimization: Phases A-F, H — Gnome AI Redesign
Milestone: 0.0 — Foundations & Performance
Files changed: src/game/spatialgrid.h (NEW), src/game/spatialgrid.cpp (NEW), src/game/gnomestate.h (NEW), src/game/creature.h, src/game/creature.cpp, src/game/gnome.h, src/game/gnome.cpp, src/game/gnomemanager.h, src/game/gnomemanager.cpp, src/game/gnomeactions.cpp, src/game/jobmanager.h, src/game/jobmanager.cpp, src/game/game.h, src/game/game.cpp, src/base/io.cpp
Changes
- Phase E: Shared Spatial Grid — new
SpatialGridclass with 16x16 cell hashing, O(1) entity/job insert/remove/move, expanding-ring radius queries. Wired into creature movement and job creation/deletion. - Phase A: Bucket-Staggered Ticks — gnomes split into 10 buckets. Each tick, 1/10 get full BT evaluation; others get a cheap tick (survival checks, path advancement, timer check only). Removed 5ms budget cap and m_startIndex rotation.
- Phase B: Push Model with Spatial Filtering — jobs pushed to K=5 nearest eligible gnomes via skill→gnome registry + spatial grid.
actionGetJobpops from pending queue (O(1)) before falling back to pull scan. Hauling stays pull-based via StockpileManager. Job cooldown reduced from 100 to 20 ticks. - Phase C: Social Spatial Hash + Bounded Relationships — replaced O(n^2) social loop with spatial grid iteration (only check gnomes in same/adjacent cells). Capped relationships at R=15 per gnome (evict weakest). Social memories capped at 5 per gnome.
- Phase D: Sleep/Wake System — idle gnomes with no pending jobs sleep after 30 ticks. Sleeping gnomes are skipped entirely in onTick. Wake triggers: job pushed, safety net scan (every 100 ticks for critical needs).
- Phase F: Gnome State Machine —
GnomeStateenum (IDLE, THINKING, WAIT_PATH, MOVING, WORKING, SLEEPING_BED, EATING, NEEDS, COMBAT). cheapTick is state-aware: MOVING gnomes only advance path, WORKING gnomes only check timer. Other states force full tick. - Phase H: Spatial Fallback Search — when pending queue is empty, expanding-ring spatial search (0-5 rings) finds nearby unclaimed jobs. Falls back to full pull scan only for hauling.
- Phase G: Role System (deferred) — 4+1 skill cap is primarily UI/gameplay, not performance-critical. Deferred to a separate update.
Technical Details
- Cheap tick: processCooldowns (handles skipped ticks via diff), checkFloor, anatomy check, then state-specific logic (MOVING: moveOnPath; WORKING: timer check). ~0.5-2us per gnome.
- Work timer is absolute (
m_taskFinishTick = GameState::tick + duration) — cheapTick just compares, no extraction needed. m_forceFullTickflag forces immediate full tick for: path arrival, work completion, job cancel, combat alert, interrupt.- Push model:
m_gnomesBySkillregistry rebuilt on save/load viarebuildPushState(). - Social: pair deduplication via ordered key,
QSet<quint64>for processed pairs. - Sleep/wake:
m_isSleepingbool flag on Creature, skipped in onTick loop. Simpler than split-list approach, ~500ns overhead for 1000 gnomes.
Benchmark Results
| Gnomes | Before (baseline) | After all phases | Improvement |
|---|---|---|---|
| 100 | ~8,000us (43us/gn) | 90us (0.9us/gn) | 89x |
| 200 | ~7,300us (30us/gn, budget-capped) | 511us (2.6us/gn) | 14x |
Target was 1000 gnomes at <5ms. At 2.6us/gnome amortized, 1000 gnomes = ~2.6ms. Target exceeded.
Build: #26 | Commit: b54ae62
Downloads
- Windows:
Masonry-Windows.zip— extract and runMasonry.exe - macOS:
Masonry-macOS.zip— extract, right-click Masonry.app → Open (first time) - Linux:
Masonry-Linux.tar.gz— extract and run./masonry.sh
Masonry 0.0.1.25 (Build #25)
What's New
[2026-03-25] Fix wildlife log spam and categorization
Milestone: 2.0 — UI/UX
Files changed: animal.cpp, creaturemanager.cpp, ui_gamehud.cpp
Changes
- Wildlife combat uses LogType::WILDLIFE instead of COMBAT — animal-vs-animal attacks, damage, dodges now categorized as wildlife events, not combat. Combat is reserved for gnome/colonist fights.
- Wildlife deaths use LogType::WILDLIFE instead of DEATH — animal deaths no longer show as red DEATH events. DEATH is reserved for colonist deaths only.
- Wildlife events no longer trigger toast notifications — removed WILDLIFE from the toast filter. No more screen spam from "Fox attacks Rabbit" every few seconds. Events still appear in the Event Log panel under the Wildlife filter.
- Combat history stored on creature — all wildlife combat events (attacks, damage, dodges, kills) now also call
creature.log()to store on the animal's personal log, so you can inspect why a creature died by checking its data.
Technical Details
creaturemanager.cpp: Generic death log now checkscreature->type() == CreatureType::ANIMALto selectLogType::WILDLIFEvsLogType::DEATHanimal.cpp: AllLogType::COMBATcalls changed toLogType::WILDLIFE, each paired with alog()call for creature-local historyui_gamehud.cpp: RemovedLogType::WILDLIFEfrom toast trigger condition
Build: #25 | Commit: f602efa
Downloads
- Windows:
Masonry-Windows.zip— extract and runMasonry.exe - macOS:
Masonry-macOS.zip— extract, right-click Masonry.app → Open (first time) - Linux:
Masonry-Linux.tar.gz— extract and run./masonry.sh
Masonry 0.0.1.24 (Build #24)
What's New
[2026-03-26] RFC v2: Gnome AI & Job System Redesign
Milestone: 0.0 — Foundations & Performance
Files changed: docs/design/gnome_ai_redesign.md
Changes
- Revised gnome AI redesign RFC to v2 — incorporated cross-game analysis (Songs of Syx, Factorio, RimWorld, Dwarf Fortress) and deep codebase architecture review
- Added bucket-staggered ticks (new Phase A) — the single highest-impact optimization, splitting gnomes into N=10 groups with full vs cheap ticks. Estimated 4-10x throughput improvement alone.
- Added sleep/wake system (new Phase D) — Factorio-inspired removal of stable-state gnomes from tick list entirely (sleeping, eating, idle-no-jobs)
- Added rail movement — gnomes walking known paths skip BT evaluation, advance position only (~1-2us vs ~15-30us)
- Improved push model with spatial filtering — push jobs to K=5 nearest eligible gnomes instead of ALL eligible gnomes. Converts O(eligible_gnomes) to O(K) per job creation.
- Changed skill cap from soft to hard — 4 active + 1 Flex slot. Guarantees performance bound on registry size and fallback search.
- Added two-tier social model — ambient room-based morale (O(n), no tracking) + bounded personal relationships (max R=15 per gnome, evict weakest)
- Added shared spatial grid — single 16x16 cell hash used by social, job push, and fallback search
- Resolved all 7 open questions from v1 with concrete answers
- Revised targets — 1000 gnomes at <5ms (up from 500 at <15ms)
- Reordered implementation phases by impact-to-effort ratio with parallel development plan
Technical Details
- Bucket staggering: 500 gnomes = 50 full ticks (15us) + 450 cheap ticks (2us) = 1.65ms per game tick
- Sleep/wake removes 30-50% of gnomes from tick list, woken by events (job push, path result, need threshold, alarm)
- Spatial push: jobs pushed to 5 nearest eligible gnomes via shared spatial grid, not broadcast to all
- 8-phase implementation plan with 4 parallelizable pairs, ~8 week timeline
Build: #24 | Commit: b2455b8
Downloads
- Windows:
Masonry-Windows.zip— extract and runMasonry.exe - macOS:
Masonry-macOS.zip— extract, right-click Masonry.app → Open (first time) - Linux:
Masonry-Linux.tar.gz— extract and run./masonry.sh
Masonry 0.0.1.23 (Build #23)
What's New
[2026-03-26] RFC v2: Gnome AI & Job System Redesign
Milestone: 0.0 — Foundations & Performance
Files changed: docs/design/gnome_ai_redesign.md
Changes
- Revised gnome AI redesign RFC to v2 — incorporated cross-game analysis (Songs of Syx, Factorio, RimWorld, Dwarf Fortress) and deep codebase architecture review
- Added bucket-staggered ticks (new Phase A) — the single highest-impact optimization, splitting gnomes into N=10 groups with full vs cheap ticks. Estimated 4-10x throughput improvement alone.
- Added sleep/wake system (new Phase D) — Factorio-inspired removal of stable-state gnomes from tick list entirely (sleeping, eating, idle-no-jobs)
- Added rail movement — gnomes walking known paths skip BT evaluation, advance position only (~1-2us vs ~15-30us)
- Improved push model with spatial filtering — push jobs to K=5 nearest eligible gnomes instead of ALL eligible gnomes. Converts O(eligible_gnomes) to O(K) per job creation.
- Changed skill cap from soft to hard — 4 active + 1 Flex slot. Guarantees performance bound on registry size and fallback search.
- Added two-tier social model — ambient room-based morale (O(n), no tracking) + bounded personal relationships (max R=15 per gnome, evict weakest)
- Added shared spatial grid — single 16x16 cell hash used by social, job push, and fallback search
- Resolved all 7 open questions from v1 with concrete answers
- Revised targets — 1000 gnomes at <5ms (up from 500 at <15ms)
- Reordered implementation phases by impact-to-effort ratio with parallel development plan
Technical Details
- Bucket staggering: 500 gnomes = 50 full ticks (15us) + 450 cheap ticks (2us) = 1.65ms per game tick
- Sleep/wake removes 30-50% of gnomes from tick list, woken by events (job push, path result, need threshold, alarm)
- Spatial push: jobs pushed to 5 nearest eligible gnomes via shared spatial grid, not broadcast to all
- 8-phase implementation plan with 4 parallelizable pairs, ~8 week timeline
Build: #23 | Commit: 7a88171
Downloads
- Windows:
Masonry-Windows.zip— extract and runMasonry.exe - macOS:
Masonry-macOS.zip— extract, right-click Masonry.app → Open (first time) - Linux:
Masonry-Linux.tar.gz— extract and run./masonry.sh
Masonry 0.0.1.22 (Build #22)
What's New
[2026-03-26] RFC v2: Gnome AI & Job System Redesign
Milestone: 0.0 — Foundations & Performance
Files changed: docs/design/gnome_ai_redesign.md
Changes
- Revised gnome AI redesign RFC to v2 — incorporated cross-game analysis (Songs of Syx, Factorio, RimWorld, Dwarf Fortress) and deep codebase architecture review
- Added bucket-staggered ticks (new Phase A) — the single highest-impact optimization, splitting gnomes into N=10 groups with full vs cheap ticks. Estimated 4-10x throughput improvement alone.
- Added sleep/wake system (new Phase D) — Factorio-inspired removal of stable-state gnomes from tick list entirely (sleeping, eating, idle-no-jobs)
- Added rail movement — gnomes walking known paths skip BT evaluation, advance position only (~1-2us vs ~15-30us)
- Improved push model with spatial filtering — push jobs to K=5 nearest eligible gnomes instead of ALL eligible gnomes. Converts O(eligible_gnomes) to O(K) per job creation.
- Changed skill cap from soft to hard — 4 active + 1 Flex slot. Guarantees performance bound on registry size and fallback search.
- Added two-tier social model — ambient room-based morale (O(n), no tracking) + bounded personal relationships (max R=15 per gnome, evict weakest)
- Added shared spatial grid — single 16x16 cell hash used by social, job push, and fallback search
- Resolved all 7 open questions from v1 with concrete answers
- Revised targets — 1000 gnomes at <5ms (up from 500 at <15ms)
- Reordered implementation phases by impact-to-effort ratio with parallel development plan
Technical Details
- Bucket staggering: 500 gnomes = 50 full ticks (15us) + 450 cheap ticks (2us) = 1.65ms per game tick
- Sleep/wake removes 30-50% of gnomes from tick list, woken by events (job push, path result, need threshold, alarm)
- Spatial push: jobs pushed to 5 nearest eligible gnomes via shared spatial grid, not broadcast to all
- 8-phase implementation plan with 4 parallelizable pairs, ~8 week timeline
Build: #22 | Commit: a6b684f
Downloads
- Windows:
Masonry-Windows.zip— extract and runMasonry.exe - macOS:
Masonry-macOS.zip— extract, right-click Masonry.app → Open (first time) - Linux:
Masonry-Linux.tar.gz— extract and run./masonry.sh
Masonry 0.0.1.21 (Build #21)
What's New
[2026-03-26] RFC v2: Gnome AI & Job System Redesign
Milestone: 0.0 — Foundations & Performance
Files changed: docs/design/gnome_ai_redesign.md
Changes
- Revised gnome AI redesign RFC to v2 — incorporated cross-game analysis (Songs of Syx, Factorio, RimWorld, Dwarf Fortress) and deep codebase architecture review
- Added bucket-staggered ticks (new Phase A) — the single highest-impact optimization, splitting gnomes into N=10 groups with full vs cheap ticks. Estimated 4-10x throughput improvement alone.
- Added sleep/wake system (new Phase D) — Factorio-inspired removal of stable-state gnomes from tick list entirely (sleeping, eating, idle-no-jobs)
- Added rail movement — gnomes walking known paths skip BT evaluation, advance position only (~1-2us vs ~15-30us)
- Improved push model with spatial filtering — push jobs to K=5 nearest eligible gnomes instead of ALL eligible gnomes. Converts O(eligible_gnomes) to O(K) per job creation.
- Changed skill cap from soft to hard — 4 active + 1 Flex slot. Guarantees performance bound on registry size and fallback search.
- Added two-tier social model — ambient room-based morale (O(n), no tracking) + bounded personal relationships (max R=15 per gnome, evict weakest)
- Added shared spatial grid — single 16x16 cell hash used by social, job push, and fallback search
- Resolved all 7 open questions from v1 with concrete answers
- Revised targets — 1000 gnomes at <5ms (up from 500 at <15ms)
- Reordered implementation phases by impact-to-effort ratio with parallel development plan
Technical Details
- Bucket staggering: 500 gnomes = 50 full ticks (15us) + 450 cheap ticks (2us) = 1.65ms per game tick
- Sleep/wake removes 30-50% of gnomes from tick list, woken by events (job push, path result, need threshold, alarm)
- Spatial push: jobs pushed to 5 nearest eligible gnomes via shared spatial grid, not broadcast to all
- 8-phase implementation plan with 4 parallelizable pairs, ~8 week timeline
Build: #21 | Commit: dfcc2cf
Downloads
- Windows:
Masonry-Windows.zip— extract and runMasonry.exe - macOS:
Masonry-macOS.zip— extract, right-click Masonry.app → Open (first time) - Linux:
Masonry-Linux.tar.gz— extract and run./masonry.sh