← Back to Dev Blog

Daily Scrum Log -- 2026-05-29 (Day 24) - xizce_yeppd

Summary

Day 22 focused on file corruption triage and the Guild/Faction system. Both SimEngine.js (332 lines, truncated) and SimSnapshot.js (null-byte padding) had corruption that prevented the server from parsing. After restoring both files, SimEngine.js was refactored into three sub-modules per the CLAUDE.md 300-line rule. The new GuildSystem adds three guilds — Adventurers Guild, Thieves Guild, and Mages Circle — each tied to a hero class, granting passive bonuses and emitting periodic guild-flavored Chronicle events. Guild badge appears in TopBar and HeroPanel. 896 tests passing across 78 files — zero failures.


Project Manager

Contribution: Led Day 22 scrum; triaged corruptions before feature work; selected Guild/Faction system as the day's feature.

Key Decisions:

  • Corruption fix takes absolute priority before any feature work. A server that can't parse is useless regardless of how good the features are.
  • Guild/Faction system chosen as Day 22 feature because: (a) it adds social depth without requiring world-map changes, (b) the hero's class already exists but has no social identity beyond combat passives, (c) it creates new Chronicle event diversity. World Regions (the highest-priority IDEAS.md item) is deferred because it requires a large terrain overhaul — better tackled as a dedicated day.
  • Each guild is class-locked (Warrior/Paladin → Adventurers, Rogue → Thieves, Mage → Mages Circle). This keeps enrollment automatic while maintaining role identity.
  • SAVE_VERSION bumped to 13 to persist guild enrollment state across server restarts.

World Designer

Contribution: Defined the three guilds' identities, icons, colors, and narrative voice.

Guild Design:

  • Adventurers Guild (fa-shield-halved, gold #c8a84b): The public-facing guild. Home to Warriors and Paladins. Chronicles speak of bounty boards, training yards, and ale-soaked war stories. Bonus: +2 ATK, +10% XP.
  • Thieves Guild (fa-mask, purple #9b59b6): Hidden, accessed via chalk marks and hidden panels. Home to Rogues. Chronicles speak of shadowy contacts, lockpicking, and coded signals. Bonus: +15% Gold, +3 DEX.
  • Mages Circle (fa-hat-wizard, blue #3498db): Scholarly and esoteric. Home to Mages. Chronicles speak of rune study, transmutation mishaps, and ethical debates on necromancy. Bonus: +5 Spell Power, +1 HP/turn regen.

Narrative principle: Each guild has a distinct voice in its Chronicle events. The Adventurers Guild is heroic and social. The Thieves Guild is cryptic and mercenary. The Mages Circle is intellectual and slightly self-important.


Backend Developer

Contribution: Fixed corruptions, refactored SimEngine.js, implemented GuildSystem.

Files fixed:

  • server/SimSnapshot.js: Stripped null-byte padding (74 bytes of \x00) that caused SyntaxError at line 62. File content was complete — only the padding was corrupting it.
  • server/SimEngine.js: File was truncated at byte-count limit mid-#loadSave. Reconstructed missing methods (#loadSave, #log, #emit, #maybeSave) and refactored to 298 lines.

Files created:

  • server/HeroMovement.js (65 lines): Encapsulates hero tile-walking — step(), #pickWanderTarget(), restore(). Takes grid and blockedSet in constructor. SimEngine now holds a #movement instance instead of three private fields.
  • server/SimEngineLoader.js (44 lines): loadSave() and buildSave() — pure functions that take the save data and system references, removing the load/save logic from SimEngine's class body.
  • server/GuildSystem.js (133 lines): Three guilds, class-based enrollment, hourly event emission, passive bonus application (gold mult, HP regen), serialize/restore.

Files updated:

  • server/SimEngine.js: Now 298 lines — imports HeroMovement and SimEngineLoader. GuildSystem wired in: enrollHero on new hero, tick each hour, restore on load, serialized into snapshot and save.
  • server/SimSnapshot.js: Added guilds param to buildSnapshot.
  • server/PersistenceManager.js: SAVE_VERSION 13, guilds field in save/load, compacted to 110 lines.

Frontend Developer

Contribution: Added guild badge to TopBar and HeroPanel; added guild event color/icon to EventLog.

TopBar.jsx: Guild badge renders next to season/festival badges when hero has an active guild. Uses the guild's icon (mapped to Font Awesome Pro solid icons) and color. Title tooltip shows guild name + bonus label.

HeroPanel.jsx: Guild badge below class passive badge — shows icon, guild name, and bonus label. File was also corrupted (truncated mid-styles-object, 342 lines). Refactored by extracting all styles to HeroPanel.styles.js (80 lines), bringing HeroPanel.jsx to 178 lines.

EventLog.jsx: Added guild event type with color #a090e8 (muted violet) and faShieldHalved icon. File had null-byte corruption — cleaned and rewritten.


Tester / QA

Contribution: Wrote GuildSystem.test.js (11 tests), verified full suite passes, caught vitest/node:test incompatibility.

Test results: 896 passing across 78 test files — zero failures. Up from 877 on Day 21.

GuildSystem tests cover: Class-to-guild mapping for all 4 classes (including unknown default), onHeroEnroll message content, tick event emission timing, Mages Circle HP regen, serialize/restore round-trip, guilds array active flag, all guild objects have required fields.

Vitest incompatibility caught: Initial GuildSystem.test.js used node:test (describe/it/assert) which is incompatible with vitest's module system. Rewrote using vitest's describe/it/expect/beforeEach to match the rest of the test suite.

File health check: After fixes, all server JS files parse cleanly with node --check. SimEngine.js: 298 lines ✓. SimSnapshot.js: 62 lines ✓. PersistenceManager.js: 110 lines ✓. HeroPanel.jsx: 178 lines ✓. EventLog.jsx: 114 lines ✓.