Skip to content

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 folderSaveSystem now writes all save_*.json files into a Dungeon Crawler Framework/ sub-folder of Application.persistentDataPath instead 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 shared SaveSystem.SaveDirectory, so the location stays consistent across the asset. See Save System.
  • Loading screen image — the load/continue overlay (LoadingFadeOverlay) now shows a loading.png sprite (loaded from any Resources folder) centered and aspect-preserved over the black background, fading out as one unit via a CanvasGroup once 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 PartyFallAnimation component 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 .mp3 straight into a Fall Sound field (no AudioSource wiring), and handles bare pits automatically via Handle Plain Pits. See Party Fall Animation.
  • Trapdoor open/close soundsTrapDoorTrap has 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 syncTrapDoorTrap has 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 DelayEnemyData has 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 TargetProjectileTrap has a new optional Aim Target field. Drag a Transform from the PartyVisuals prefab (e.g. a child at chest height named AimTarget) 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 TrapDoorTrap component the cell is a plain instant-kill pit. Adding TrapDoorTrap unlocks full trap mechanics: levers, delays, animated hatches, reset, custom damage, events.
  • Inventory stack count badgeInventorySlotUI now 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 a Text field, or name a child Count / Quantity / Amount); if none exists, one is created automatically at runtime with a drop shadow for readability and raycastTarget off so it never blocks drag/drop or clicks.
  • Auto Load Save In Editor toggleSaveSystem has 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 audioSpellEffectDefinition now has castSound, impactSound, castVolume and impactVolume fields. Sounds play at the correct world-space position via AudioSource.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 healthBarYOffset and healthBarZOffset fields 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 vfxAimYOffset field 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 audioItemData has a new Audio section with Attack Sound (weapon swing), Equip Sound, Pickup Sound, Drop Sound and a shared Item Sound Volume slider. HandSlotUI adds Default Swing Sound (fallback when a weapon has no attack sound) and Miss Sound. All item sounds play at the camera position (2D).

  • Footstep and party-hit audioPartyVisuals now has a Footstep Sounds array (randomly chosen on every step) and a Party Hit Sound played whenever an enemy's attack lands. Both play through a 2D AudioSource on the PartyVisuals GameObject.
  • Pickup audioWorldItem.TryPickUp() plays the item's Pickup Sound at the item's world position when the party successfully picks it up.
  • Trigger audioTriggerSource base class now has Interact Sound and Interact Volume fields. All interactive sources (WallButton, WallLever, WallKeyhole and any custom source) play this sound automatically on successful interaction. TriggerOpenDoor has separate Open Sound, Close Sound and Door Sound Volume fields that play at the door's world-space position (3D spatial audio).

Fixed

  • Trapdoor game-over menuTrapDoorTrap now applies fall damage through PartySystem.DamageMember instead of member.TakeDamage directly, so the party-wipe check runs and the game-over menu actually opens after a lethal fall.
  • Stackable items now actually stack — items flagged stackable shipped with maxStack = 1, so each pickup landed in its own slot and the count never rose above 1. ItemData.OnValidate now keeps the two fields consistent (stackable forces maxStack to at least 2; non-stackable forces it back to 1), and the LifebloodPotion asset is set to maxStack = 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 serialized uniqueId, 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. WorldItem now claims and de-collides its uniqueId in Awake (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 — removed healthBarYOffset, healthBarZOffset, and vfxAimYOffset. 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.
  • RunePanelUI error 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 frameworkCrawlerServices service 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 / ISaveSystem contract.
  • 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.