Commit Graph
198 Commits
Author SHA1 Message Date
Richard Zink ee7b76fa6a Manual AI seats for matches: host toggles empty seats, co-op allies fight heroes 2026-11-05 06:38:38 +01:00
Richard Zink 3492eacd59 Fog of war lifts three tiles beyond sight 2026-11-04 21:46:31 +01:00
Richard Zink f164293d21 Remove stale play standalone file: README and INSTALL point to the title-screen download 2026-11-04 20:39:10 +01:00
Richard Zink 5928acf7f6 Co-op campaign matches and command markers: mission relay, allied masters, temporary flags 2026-11-04 20:07:06 +01:00
Richard Zink dc22e27184 Multiplayer continues after a player leaves: AI side takeover, background match while menus are open, match chat, five-tile fog start 2026-11-04 18:07:02 +01:00
Richard Zink 2721638910 Keep the pause menu when returning from the multiplayer page 2026-11-04 15:33:30 +01:00
Richard Zink 7ed630c6f2 Unlock summoning and spawn starting imps for every match master, with side-correct worker counting 2026-11-04 15:10:01 +01:00
Richard Zink eb11cca8cb Smooth camera and unit motion: display positions, camera target smoothing, pan speed setting 2026-11-04 13:56:11 +01:00
Richard Zink 583c3fcdaf Multiplayer client relay bridge and match lobby menu: WebSocket bridge, match lobby page, order relay, confirmed turns, checksums, chat, abort/resume 2026-11-04 12:47:34 +01:00
Richard Zink 848ab0f677 Match relay in the save/login service: WebSocket rooms, seats, ready, 100 ms turn confirmation and checksum relay 2026-11-04 11:48:09 +01:00
Richard Zink 42034b062b Match loop on the client side: orders go to the server, a confirmed turn steps the world five times, and a checksum of the shared state catches worlds that diverge 2026-11-04 11:07:24 +01:00
Richard Zink 87890adc53 Masters for a match: the four sides red, green, blue and yellow (side 4 gets its own owner), and start_masters gives every master his core and his starting area 2026-11-04 10:55:17 +01:00
Richard Zink 35ddfa134c Simulation runs in fixed steps of 1/50 s (50 steps a second) instead of 1/20 s, with at most twelve catch-up steps in one frame 2026-11-04 10:04:44 +01:00
Richard Zink dd4bb75b24 Game version in the menu: VERSION holds vYYYYMM-NNNNN, shown on the title screen and in the pause menu, tools/bump_version.py raises it with every change 2026-11-04 09:57:10 +01:00
Richard Zink 1ec7492189 Multiplayer step B: every player order is a command (dig, build, cast, hand, orders) and the simulation runs in fixed 50 ms steps, so single player and a match take the same path 2026-11-04 09:57:02 +01:00
Richard ZinkandClaude Opus 5.5 d6bcce3a76 Multiplayer plan: deterministic lockstep, steps A-F
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 08:34:55 +01:00
Richard ZinkandClaude Opus 5.5 ada14951c4 Crookfinger's voice: he babbles in a squeaky imp language in the rhythm of his hints, important messages and the mission briefings (can be switched off in the sound settings)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 08:25:31 +01:00
Richard ZinkandClaude Opus 5.5 776c9ad9de Digging orders reach into the fog: unexplored blocks are picked like walls and marked tiles glow dark yellow in the dark
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 08:20:17 +01:00
Richard ZinkandClaude Opus 5.5 2de0a1de8a Wilder maps: rivers of water and lava across free maps (neutral bridges), natural caverns until about a quarter of every map is open
- caverns in free play and the campaign (mission pieces, fortresses, islands, sealed caves and dwarf caves stay untouched)
- caverns sometimes hold a pool of water or lava, veins in their walls, rarely a small treasure or a creature in chains to free
- rivers keep away from the start; test: open share, liquids and a hero path to the core
- standalone file in play/ rebuilt

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 08:15:34 +01:00
Richard ZinkandClaude Opus 5.5 51814b8ac8 Creature overview: a toolbar button opens the list of all creatures grouped by kind (level, mood, wage, job, health) with wages and mood in total; a click moves the camera there
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 08:02:29 +01:00
Richard ZinkandClaude Opus 5.5 bbab2b5a58 Bestiary pictures the right way up (PNG export writes rows bottom up)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 07:53:39 +01:00
Richard ZinkandClaude Opus 5.5 0606c1f994 Orders: attack (fighting creatures nearby go for an enemy or enemy tower) and guard (up to three creatures hold a room for two minutes); right click with an order tool cancels
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 07:52:03 +01:00
Richard ZinkandClaude Opus 5.5 b3583f5e7e README as a small game website in Crookfinger's voice; INSTALL.md, BESTIARY.md, playable standalone file
- README: logo, badges (Rust, WebAssembly, Claude Code, MIT), intro addressed to the master, features with screenshots, the household, how to play, licences and credits
- INSTALL.md: server, PWA, building, tests, savegame service and API, languages, how to refresh generated files
- BESTIARY.md generated from the game's data (tools/make_bestiary.py) with exported sprites and icons (docs/img, test export_doc_images)
- play/DungeonCraft.html: the whole game in one file to download and play offline

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 07:46:37 +01:00
Richard ZinkandClaude Opus 5.5 4ce2c2919e Three new heroes: giant, fairy spy, battle mage
- giant (from wave 6): slow and enormous, smashes doors three times as hard and wrecks traps by standing next to them
- fairy spy (from wave 3): flies, finds the dungeon's traps (marked with a glint) so the heroes wreck them, and heals heroes around it
- battle mage (from wave 4): throws fireballs with splash and blasts reinforced walls (steel resists him better)
- sprites, bestiary texts EN/DE, test: fairies find traps, giants wreck them

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 07:40:20 +01:00
Richard ZinkandClaude Opus 5.5 a58497e3a9 Five new rooms: prison, graveyard, guard post, arena, sacrifice altar; new creature: the revenant
- prison: captured heroes sit in cells apart from the torture chamber, do not defect and starve in time; the hand can move prisoners between cells and torture
- graveyard: the fallen are buried there; after a while some rise as revenants (undead: no food, no sleep, life drain from level 5)
- guard post: creatures hold the position and attack whatever comes into view
- arena: creatures spar in pairs for fast, free experience, at the cost of bruises
- sacrifice altar: creatures dropped on it are sacrificed; certain pairs bring a rare creature, otherwise a blessing (mood and mana)
- researched in the library, campaign unlocks, textures, furniture, texts EN/DE, bestiary

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 07:35:12 +01:00
Richard ZinkandClaude Opus 5.5 2c8db33a69 Creature personality: favourite rooms, hatreds and brawls, abilities learned with the level
- every kind loves one room (working there lifts the mood) and cannot stand certain other kinds; close by they sour each other's mood and now and then brawl (they stop at 30% health)
- learned abilities: imps dig faster, kobold dash, spider web, mage shadow step, ogre stomp, jailer shackle, priestess healing pulse, chainbreaker whirlwind, bat shriek, gargoyle stone form, owl volley, wyrm inferno, cogling bomb
- bestiary lists likes, hatreds and the ability (highlighted from its level on)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 07:25:47 +01:00
Richard ZinkandClaude Opus 5.5 240e89d9cb Fog of war: unexplored darkness until the dungeon's ground, creatures or towers come close
- explored tiles stay known (saved compactly as bits), enemies are only drawn while in sight; sight runs along open ground, walls block it
- unexplored tiles are black blocks; units, towers, torches, furniture, portals, gate and rival cores in the dark are hidden; minimap and tile info too
- the nearest portal is known from the start; the seer's eye opens a wide area for 20 seconds without remembering it

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 07:18:55 +01:00
Richard ZinkandClaude Opus 5.5 7f4d5ca7b4 Eight new spells: seer's eye, cave-in, haste, stoneskin, gold rain, invisibility, plague, quake
- researched in the library (and unlocked in the campaign), in the spells menu with own icons and a radius under the pointer
- haste speeds up everything a creature does, stoneskin halves damage, invisible creatures are ignored by enemies and towers until they attack (drawn see-through), plague spreads among enemies, quake hurts and stuns enemies only, cave-in turns floor back into earth
- particles for every spell

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 07:07:52 +01:00
Richard ZinkandClaude Opus 5.5 a54316c86e Research in the library: rooms, spells, towers, traps and doors are discovered in a fixed order
- studying creatures collect research points (mages and owls best, higher levels faster); studying gives less mana than before
- free play starts with the basics; campaign missions know what their story allows and can research what the next four missions would bring
- research shown in the top bar; the library's info lists the current item and what comes next; locked tools say whether they can be researched

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 07:00:33 +01:00
Richard ZinkandClaude Opus 5.5 4f20223c93 Traps and doors made in a new forge room, installed by imps; new creature: the cogling
- forge room: creatures work there (coglings fastest), the work goes into the oldest planned trap or door; finished pieces wait as crates, imps carry and install them
- traps: spike pit, poison vent (cloud), fire jet, stone roller, alarm bell (calls creatures), rune mine (one big blast), frost glow (slows around it)
- doors: wood, iron, magic (hurls attackers back); own creatures pass, enemies smash them on their way; clicking a door with a door tool locks it for everybody
- new 'Traps' category in the toolbar, forge in the rooms; texts EN/DE, bestiary entries; atlas grown for new textures and icons
- tests: forge to installed trap, spikes hurt, doors lock and get smashed

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 06:55:37 +01:00
Richard ZinkandClaude Opus 5.5 1696297ac3 Minimap view outline is cut at the map border instead of squeezing its corners; beds grow out of the floor while their creature sets them up
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 06:27:02 +01:00
Richard ZinkandClaude Opus 5.5 468fa03db9 Unit rings and shadows lie on bridge decks; beds appear only once their creature has set them up
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 06:17:22 +01:00
Richard ZinkandClaude Opus 5.5 80982b71f7 Particle effects: falling trails behind projectiles, exploding fireballs and cannonballs, arrows stuck in walls and floors
- projectiles get styles: arrows (shaft and fletching), cannonballs and fireballs fly in an arc, shadow, holy, arcane, rune and magic bolts with their own glow
- trails of embers, sparks, motes or smoke that drift down to the floor
- fireballs explode on the ground (flash, shock wave, embers, smoke, scorch mark), cannonballs burst into stones, dirt, sparks and smoke
- arrows stay stuck in walls (or glance off into the floor) for five minutes, at most 400; they drop out when the wall is dug away
- spells: lightning sprays sparks and scorches the floor, healing lifts green motes, level-ups and summoning rain sparkles; digging throws earth, gold pops coins
- particles are never saved and use their own random numbers

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 20:29:32 +01:00
Richard ZinkandClaude Opus 5.5 33b9879b4c Dark demonic dungeon towers, a beating crystal heart and demon gate portals
- own towers in black obsidian and dark iron with red glowing joints, bone spikes, skulls, chains; arrow spire with a ballista, hellmouth cannon with a demon-head barrel, dark spire with horns and a crystal; every level adds parts
- soul core: a crystal heart beating lub-dub (faster when hurt, cracked at low health) held by chains on an obsidian throne, veins with a pulse across the floor, rising embers
- portals: an arch of stone and bone with a skull and horns, a vertical vortex with runes and falling sparks; grey and dead until claimed

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 20:18:50 +01:00
Richard ZinkandClaude Opus 5.5 90a05a86d8 Knight towers in bright limestone with dark blue shadows and royal blue wood and fittings (more contrast)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 20:03:32 +01:00
Richard ZinkandClaude Opus 5.5 f359671dac Title menu background: an endless battle at a bridge over an underground river
- dungeon creatures against knights, balanced reinforcements for the weaker side
- towers on both banks; heavy units go for them, destroyed towers are rebuilt after 25 s
- the camera slowly circles the bridge; battle sounds stay muted; the demo is never saved

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 15:51:35 +01:00
Richard ZinkandClaude Opus 5.5 d06ce2edb5 Units face eight directions and animate their actions
- five sprite views per kind and gear tier (front, front three-quarter, profile, back three-quarter, back), mirrored for the other three directions; chosen from the unit's facing and the camera
- units face where they walk, dig, repair or fight
- animations: imps stomp while claiming (squash on landing), swing while digging, hammer while repairing; lunges in combat, punches in training, nodding while eating, swaying while reading or praying, breathing when idle, leaning back with loads, lying in bed, chained creatures pulling at their chains, flyers flapping

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 15:41:09 +01:00
Richard ZinkandClaude Opus 5.5 1016ee5d6c Bestiary in the title and pause menu; attacks look bigger with the unit level
- tabs: creatures, humans (incl. cave dwarves), dungeon buildings and towers, ranks
- every unit at every level: sprite with gear, rank badge, health, attack, range, speed, wage or bounty, what attracts it
- Crookfinger's texts: loving about the creatures, disgusted about the humans (EN/DE)
- projectiles, hit sparks and splashes grow with the attacker's level, with halos from Lv 5 and glow at Lv 9+

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 15:32:18 +01:00
Richard ZinkandClaude Opus 5.5 9a9f04ae1f Dwarf caves in all modes: neutral dwarves guard a hoard and sometimes a rune chest; the rune forge tower; imps repair towers before claiming
- 1-4 cave slots by map size, 50% each (at least one); knight treasure caves only where a mission places them
- dwarves fight intruders near the cave, never chase far, heal at home, grow with distance and the player's army, never count for victory
- rune chest: one free rune forge tower (chain bolt to three more enemies), upgradeable for gold, sold once it comes back (next mission / free play at once), unbuilt ones carry over
- new tool (key N) shown in the tower menu while a rune tower can be built or upgraded

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 15:14:36 +01:00
Richard ZinkandClaude Opus 5.5 d92b45a0b8 Credit Claude Code: note at the top of the README, in CREDITS and the standalone file; pixel-art mark with link next to the licence on title and login screens
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 14:44:28 +01:00
Richard ZinkandClaude Opus 5.5 ea0623fbe3 Campaign of 30 missions: six against the rival masters Mossgrim and Lady Nightwell, islands, mana springs, sealed caves with chained creatures
- missions interleaved into one story (EN/DE), new epilogue, map sizes grow to 176x176
- islands in water or lava with treasure and/or a mana spring; rivers at least four tiles wide
- sealed caves with treasure and a chained creature that joins once the cave is claimed
- new goals: rival cores, mana springs, freed creatures
- rival messages name the masters; new progress key for the new mission order

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 14:36:45 +01:00
Richard ZinkandClaude Opus 5.5 dd16c684e5 Free game against rival dungeon masters (green, blue) and/or the humans
- One opponent on maps up to 128x128, two on bigger maps; with a chance of one in two one of
  them is the humans' gate instead of a rival master
- Simplified rival masters (rival.rs): own soul core and dungeon (lair, treasury to loot) that
  grows ring by ring, creatures appear and get stronger over time, guard the dungeon and attack
  in groups - the player, the other master or the humans' gate; a fallen core puts the master
  out and frees its ground
- The humans attack everybody: waves now and then march on a rival master
- Sides for units: all other sides are enemies; towers and contested ground follow them; the
  hand cannot pick up rival creatures; the flag next to a rival core attacks it
- Difficulty (easy / medium / hard) in the New Game dialog
- Colours: green and blue floors, cores, unit rings, minimap, HUD bars of the rival cores
- Victory in free games: every rival core and the gate (if any) destroyed
- Tests for setups, growth and attacks, elimination and victory, humans against rivals

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 14:11:23 +01:00
Richard ZinkandClaude Opus 5.5 52c4d1caf8 Creatures report at the portal and set up their bed; payday wages are fetched from the treasury
- New creatures report at the portal (2 s), walk to the lair (flyers: aerie), set up their
  bed (4 s) and only then do as they like; without a reachable lair they start right away
- Payday: the training bill is paid at once; every creature goes for its wage at a random
  moment within about a minute, to the nearest treasury tile holding treasure (or the core),
  and takes it out of that tile; no gold = an angry creature; unreachable = paid anyway
- Tests for the arrival and the walking payday

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 13:49:13 +01:00
Richard ZinkandClaude Opus 5.5 f13ab1a629 Service: set-password maintenance command for forgotten passwords
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 13:44:15 +01:00
Richard ZinkandClaude Opus 5.5 359000afa3 Gear is part of the sprites; more detailed towers and gates
- Level gear is painted into five sprite variants per kind (shoulder pieces, helmet with horns
  or plume, cape, gold with crown), derived from each silhouette, so it moves, sways and
  flips with the unit; billboards use the 12x12 cell with the gear border
- Arrow tower: plinth, masonry courses, arrow slits, corbels, wooden platform, merlons,
  pennant and ladder; cannon tower: round body with iron bands, carriage, barrel with muzzle
  ring, cannon balls; magic tower: stepped base, buttresses, glowing rune bands
- Hero gate / gate of the order: plinths, banded pillars, capitals, stepped arch with
  keystone, half-raised portcullis, banners of the order

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 13:40:56 +01:00
Richard ZinkandClaude Opus 5.5 c9848c8948 User accounts, login before the title screen, own savegames per user, standalone download
- Service: accounts with Argon2 password hashes and session tokens; the first login creates
  the admin (shared savegames of before move to the admin); the admin creates and deletes
  users; everybody can change the password; savegames are stored and listed per user
- Game: login page before the title (only when the service is reachable), with licence and
  repository link; account page (password, logout; users for the admin); text fields with
  Tab/Enter, masked passwords, browser dialog on touch screens; long status messages wrap
- Download Standalone: DungeonCraft.html with the game embedded (built in the Docker image,
  served to logged-in users via nginx auth_request); works from file:// without server and
  opens downloaded savegames
- Without the service (standalone, local files) there is no login, savegame files as before

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 13:33:22 +01:00
Richard ZinkandClaude Opus 5.5 8853d84564 Steel walls: plate earth walls next to own ground with steel
- New tool Steel (key O, orders category; campaign from mission 11): 80 gold per earth wall,
  40 for a reinforced wall; riveted iron plate texture
- Heroes dig through steel 20 times slower than through earth and avoid it (path cost 300)
- Selling turns a steel wall back into a reinforced wall and refunds half the plating
- Texts EN/DE, test

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 13:10:04 +01:00
Richard ZinkandClaude Opus 5.5 f298e13d6e Title screen: licence line and a link to the repository at the bottom
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 13:06:58 +01:00
Richard ZinkandClaude Opus 5.5 6e257e4034 The jailer works on prisoners in the torture chamber: 2.5 times the chance to defect
Jailers pick a prisoner nobody works on yet (their favourite work), stand next to it and
torment it; with a jailer about 28 of 40 prisoners defect instead of about 18. Test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 13:04:07 +01:00
Richard ZinkandClaude Opus 5.5 b7d7fc2b52 Aerie and flying creatures: bats, chain gargoyles, arcane owls, ember wyrms
- New room: aerie (key Y, rooms category, campaign from mission 7); flyers sleep there
- Arrivals: aerie 4+ bats; + torture chamber gargoyles; + library owls; big aerie and treasury
  (16+ each) a rare ember wyrm; portal checks free places in lairs and aerie separately
- Flyers cross water and lava (path finding, flag, attacks), are not burnt by lava, patrol far
  when idle, attack single enemies, flee to the aerie below 25% health and rest there up to 75%
- Owls shoot arcane bolts, the wyrm breathes fire with splash damage; shots from the air
- Hovering sprites with flapping, aerie floor, perches, roosts, plinths, twig and ember nests
- Room counts are recounted on load (no longer stored); tests for flying and arrivals

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 13:01:26 +01:00