Changelog¶
All notable changes to Dungeon Crawler Framework are documented here. The format is based on Keep a Changelog, and the project aims to follow Semantic Versioning.
[Unreleased]¶
Added¶
- Dedicated save folder —
SaveSystemnow writes allsave_*.jsonfiles into aDungeon Crawler Framework/sub-folder ofApplication.persistentDataPathinstead of the bare persistent data directory. The folder name is a single constant,SaveSystem.SaveFolderName(set to""to disable the sub-folder), and every read / write / delete path resolves through the sharedSaveSystem.SaveDirectory, so the location stays consistent across the asset. See Save System. - Loading screen image — the load/continue overlay (
LoadingFadeOverlay) now shows aloading.pngsprite (loaded from anyResourcesfolder) centered and aspect-preserved over the black background, fading out as one unit via aCanvasGrouponce the scene is ready. Previously the boot overlay was a plain black screen, so the loading image only appeared on stairs transitions, not at game start. Falls back to plain black if the sprite is missing. - Party Fall Animation — new
PartyFallAnimationcomponent on the party root. When the party falls into a trapdoor or a plain pit, the rig accelerates downward (≈2 s) with a camera tumble and a scream/fall sound, and the game-over screen appears only after the drop. Waits for the party to reach the cell center before dropping, drops a.mp3straight into a Fall Sound field (no AudioSource wiring), and handles bare pits automatically via Handle Plain Pits. See Party Fall Animation. - Trapdoor open/close sounds —
TrapDoorTraphas an Audio section with Open Sound and Close Sound mp3 fields (auto AudioSource) plus a shared Sound Volume, and a new On Trap Opened event that fires when the hatch opens regardless of who is standing on it. - Trapdoor fall-animation sync —
TrapDoorTraphas a new Damage Delay For Fall Anim field that holds the (possibly lethal) damage back until the fall animation has played, so the game-over menu no longer freezes the drop on frame one. - Enemy Attack Sound Delay —
EnemyDatahas a new Attack Sound Delay field so the attack sound lands on the visual hit (the paw/claw connecting) instead of on frame 0 of the attack animation. Audio counterpart of Attack Connect Time. - ProjectileTrap Aim Target —
ProjectileTraphas a new optional Aim Target field. Drag aTransformfrom thePartyVisualsprefab (e.g. a child at chest height namedAimTarget) into this slot and projectiles will arc vertically toward that point instead of traveling flat. Leave empty for the original flat, direction-only shot. - Unified pit & trapdoor system — the Pit cell type is removed. All holes in the floor now use the TrapDoor cell type with a pit mesh (dark void, walls on all sides). Without a
TrapDoorTrapcomponent the cell is a plain instant-kill pit. AddingTrapDoorTrapunlocks full trap mechanics: levers, delays, animated hatches, reset, custom damage, events. - Inventory stack count badge —
InventorySlotUInow shows the stack quantity as a small number in the bottom-right corner of a slot whenever the count is greater than 1. The label is optional in the prefab (assign aTextfield, or name a childCount/Quantity/Amount); if none exists, one is created automatically at runtime with a drop shadow for readability andraycastTargetoff so it never blocks drag/drop or clicks. - Auto Load Save In Editor toggle —
SaveSystemhas a new Editor section with an Auto Load Save In Editor switch (off by default). When off, pressing Play in the editor no longer auto-loads the level save, so scene items, enemies and doors stay in their authored state for level design. Standalone builds and the explicit Load / Continue flow are unaffected. Turn it on to test save loading from the editor.
Added (previous)¶
- This MkDocs Material documentation site, with search and GitHub Pages deployment.
- Dedicated documentation pages for all five editors, plus Architecture and API reference.
- Spell audio —
SpellEffectDefinitionnow hascastSound,impactSound,castVolumeandimpactVolumefields. Sounds play at the correct world-space position viaAudioSource.PlayClipAtPoint. Both slots are exposed directly in the Spell Editor under the new VFX & Audio section so no Inspector digging is needed. - HealthBarAnchor component — place this on an empty child GameObject in the enemy prefab to control the HP bar position visually in the Scene view. The red bar gizmo shows exactly where the bar will float. Replaces the
healthBarYOffsetandhealthBarZOffsetfields that were previously on EnemyData. - VFXAimPoint component — place this on an empty child GameObject in the enemy prefab at chest height. Spell projectiles and impact VFX aim at this transform's world position. The cyan sphere and crosshair gizmo make placement easy in the Scene view. Replaces the
vfxAimYOffsetfield that was previously on EnemyData. - Corridor spell targeting — hostile spells now scan the entire corridor in the party's facing direction and target the first living enemy found, not just the enemy in the adjacent cell. The scan respects closed doors and walls — spells cannot pass through them.
-
Casting into empty corridors — hostile spells can be cast even when no enemy is present. The projectile flies straight forward and the impact VFX plays at the wall or closed door at the end of the corridor, matching the feel of classic dungeon crawlers.
-
Weapon and item audio —
ItemDatahas a new Audio section withAttack Sound(weapon swing),Equip Sound,Pickup Sound,Drop Soundand a sharedItem Sound Volumeslider.HandSlotUIaddsDefault Swing Sound(fallback when a weapon has no attack sound) andMiss Sound. All item sounds play at the camera position (2D). - Footstep and party-hit audio —
PartyVisualsnow has aFootstep Soundsarray (randomly chosen on every step) and aParty Hit Soundplayed whenever an enemy's attack lands. Both play through a 2D AudioSource on the PartyVisuals GameObject. - Pickup audio —
WorldItem.TryPickUp()plays the item'sPickup Soundat the item's world position when the party successfully picks it up. - Trigger audio —
TriggerSourcebase class now hasInteract SoundandInteract Volumefields. All interactive sources (WallButton, WallLever, WallKeyhole and any custom source) play this sound automatically on successful interaction.TriggerOpenDoorhas separateOpen Sound,Close SoundandDoor Sound Volumefields that play at the door's world-space position (3D spatial audio).
Fixed¶
- Trapdoor game-over menu —
TrapDoorTrapnow applies fall damage throughPartySystem.DamageMemberinstead ofmember.TakeDamagedirectly, so the party-wipe check runs and the game-over menu actually opens after a lethal fall. - Stackable items now actually stack — items flagged
stackableshipped withmaxStack = 1, so each pickup landed in its own slot and the count never rose above 1.ItemData.OnValidatenow keeps the two fields consistent (stackable forcesmaxStackto at least 2; non-stackable forces it back to 1), and theLifebloodPotionasset is set tomaxStack = 99. Same-type pickups merge into one slot and show the count badge. - Duplicated world items disappearing on Play — duplicating a
WorldItem(Ctrl+D or prefab instances) could copy the serializeduniqueId, and the save system hides every item whose id is in the picked-up list — so duplicates of a previously collected item vanished on load.WorldItemnow claims and de-collides itsuniqueIdinAwake(the earliest, system-independent point, before items are hidden), using a registry that resets per scene load so saved ids stay stable.
Changed¶
- Backpack stacks are picked up one at a time — left-clicking a stacked backpack slot now takes a single unit onto the cursor and leaves the rest behind (the count decreases by one), instead of lifting the whole stack as one block. Repeat clicks peel items off one by one; clicking a same-type slot while holding one returns it to the stack. Affects
CharacterInventoryUI; equipment, chests and world pickups are unchanged. EnemyData— removedhealthBarYOffset,healthBarZOffset, andvfxAimYOffset. Position the HP bar and VFX aim point using the new prefab child components instead.- Spell Editor section renamed from 4. VFX to 4. VFX & Audio.
RunePanelUIerror message when no enemy is in range changed from "No enemy in front!" to "No enemy in range!" to reflect the broader corridor scan.
[1.0.0]¶
First public release of Dungeon Crawler Framework.
Added¶
- Character Generator — visual party builder with Stats, Races, Classes and Characters tabs; portrait import, four stat-roll modes (Balanced, Class, Heroic, Cursed), starter equipment, permadeath, and one-click party asset generation.
- Dungeon Generator — procedural generation with BSP and Maze algorithms, ready-made presets, manual tile editing, layout snapshots, door/trap/secret-wall/chest libraries, unique-ID generation, and JSON export.
- Inventory Editor — item authoring with a random stat generator, equipment sets, and weighted loot tables (Pick One / Pick N / Roll All) with a built-in loot simulator and auto-generate presets.
- Spell Editor — rune palette (up to a 3×3 grid), recipe editor with conflict checking, seven effect types, VFX generation, and one-click Save & Sync that auto-wires the magic system to the scene.
- Enemy Spawner — three-column window for assembling enemies, browsing and assigning loot tables by drag-and-drop, placing enemies into the scene, and saving reusable encounter presets; runtime support for respawn, initial delay and patrol routes.
- Core framework —
CrawlerServicesservice locator, shared grid types (GridPosition,Direction), and module interfaces for grid, party, inventory, magic, enemies, triggers and saving. - Save System — persistence of party, enemy and grid state via the
ISaveable/ISaveSystemcontract. - Sample scene demonstrating a fully wired setup.
Version numbers
Replace the placeholder version above with your actual Asset Store release version when you publish. Add a new dated section under [Unreleased] for each update so customers can track changes.