Souls Mobile Engine — V1.0

Features Overview

A production-ready, mobile-optimized Souls-like engine built as an Unreal Engine plugin. Every system listed below is included and fully functional.

40+
Systems
100%
Blueprint
Mobile
Optimized
V 1.0
Initial Release — Full Feature Set

All core combat, RPG, UI, AI, and world systems included out of the box.

⚔️

Combo System

Light, heavy, and charge attacks with automatic combo chaining and montage-driven windows.

🛡️

Parry & Block

Timed parry with stagger feedback. Hold block with stamina drain and shield-break logic.

💨

Dodge & Roll

Physics-based dodge with i-frames, directional rolls, and Super Dodge multiplier support.

🎯

Lock-On Targeting

Auto and manual target acquisition with smooth camera interpolation and strafe locomotion.

🔥

Weapon Abilities

Data-driven special attacks per weapon. Configurable cooldowns, costs, and custom montages.

💥

Combat Feel

Hitstop, camera shake, hit flash, and trace-based hit detection with per-attack tuning presets.

🎭

Hit Reactions

Directional stagger, knockback, and step-in logic. Impact scales with weapon and ability type.

🔔

Animation Notifies

Custom notify states for combo windows, dodge invincibility, trace activation, and hitstop triggers.

🎮

Combat Input Sync

Input buffering ensures attacks, dodges, and blocks queue correctly during active montages.

🗡️

Weapon Configuration

Blueprint-driven weapon setup — sockets, meshes, montage sets, damage values, and moveset data assets.

🎬

Data-Driven Actions

Action Data Assets for reusable abilities — define montage, cost, cooldown, and effects in one asset.

Status Effects & Buffs

Stackable timed effects — poison, burn, slow, stat modifiers. Driven by Status Effect Data Assets.

❤️

Stats Component

HP, Stamina, Mana with regeneration, depletion, and event-driven UI updates.

🪙

Souls Economy

Souls currency with earn, lose-on-death, and recover-from-corpse mechanics.

🔥

Bonfire & Level Up

Rest point with stat leveling UI. Respawn enemies and restore player on rest.

🎒

Inventory System

Component-based inventory with add, remove, stack, and equip. Supports any item type via Data Assets.

📦

Item Data Assets

Master Data driven items — icons, descriptions, stats, effects, and categories in one asset.

🖼️

Inventory UI

Full mobile-optimized inventory widget with grid layout, item details, and drag-scroll support.

⚒️

Crafting System

Recipe Data Assets with ingredient validation. Crafting Station interactable with dedicated UI.

🤖

Enemy AI System

Behavior Tree-driven AI with detection, chase, attack patterns, and leash logic.

👹

Boss System

Multi-phase bosses with phase transitions, enrage, ability patterns, and dedicated health UI.

🏷️

Enemy Persistence

Save/load enemy states — killed enemies stay dead until bonfire rest or area reload.

🎯

Lock-On Target Marker

Visual indicator widget on locked enemies with smooth world-to-screen tracking.

🗡️

AI Ability Data Assets

Per-enemy attack configuration — range, cooldown, chance, montage, and impact preset per ability.

🏋️

Training Dummy

Non-hostile test target for combo and damage system validation.

Interaction System

Trace-based interact with prompt widget. Supports chests, doors, NPCs, pickups, and custom actors.

📦

Chest & Container

Loot containers with open animation, item drops, and optional Loot Widget for selective taking.

🗃️

Storage Box

Persistent world storage for depositing and withdrawing items between play sessions.

🪜

Ladder & Climbing

Interactable ladder with enter, climb, and exit montages. Supports variable heights.

🚪

Door Interactable

Openable/lockable doors with key-item validation and animation support.

💀

Dropped Souls Pickup

Death-dropped currency pickup with world indicator and auto-recovery on interact.

💎

Item & Currency Pickups

World-placed item pickups and currency orbs with interaction prompts.

☠️

Damage Volume

Environmental hazard zones with configurable damage, tick rate, and effect application.

🛒

Vendor NPC

Buy/sell merchant with item catalog, pricing, and full mobile shop UI.

💬

Dialog System

Data Asset-driven NPC conversations with branching dialog, choices, and events.

📱

Mobile HUD

Touch-optimized joystick, action buttons, HP/Stamina bars, and lock-on indicator.

💥

Floating Damage Text

World-space damage numbers with color coding, crit scaling, and animation curves.

🏠

Main Menu

Cinematic mobile main menu with New Game, Continue, and Settings flow.

⚙️

Settings Menu

Graphics quality, audio, sensitivity, and control customization with save/load.

Loading Screen

Seamless level transition with animated loading widget and tips system.

👹

Boss Health UI

Cinematic boss health bar with name, phase icons, and reveal animation.

Effect Icon Widget

Active buff/debuff display with timer, icon, and stack count indicators.

🔔

Interaction Prompt

Context-sensitive interaction UI with fade-in/out and action label.

Confirmation Dialog

Reusable yes/no confirmation popup for critical player actions.

💾

Professional Save System

Multi-slot save/load with auto-save. Stores inventory, stats, map, position, and world state.

📋

Save Slot UI

Visual save slot list with timestamps, play time, and delete confirmation.

🔄

Persistent Component

Reusable component for any actor that needs to save/restore state across sessions.

🛠️

Souls Developer Hub

Editor utility widget for quick asset creation, project validation, and workflow shortcuts.

🐛

Debug & Logging

On-screen debug overlay with verbose log categories for combat, AI, and inventory systems.

📱

Mobile Input Logic

Enhanced Input integration with mobile virtual joystick and context-sensitive action mapping.

🗺️

Showcase Route Guide

Pre-built demo level sequence for testing and demonstrating all kit features.

Editor Validation

Automated project validation tool that checks for missing references and configuration errors.

🧩

Component Architecture

Modular design — Combat, Stats, Inventory, Action, StatusEffect as independent components.

📐

Data Asset Pipeline

Items, weapons, actions, buffs, AI abilities, recipes, and dialogs all driven by Data Assets.

🔌

Plugin Structure

Self-contained Unreal plugin — drop into any project with zero coupling to game-specific code.

ARCHITECTURE

Blueprint Project Setup

How to correctly initialize a production-ready Souls-like character.

Souls Mobile Kit is designed as a complete Blueprint-friendly project. Most daily work happens in Blueprint assets: character setup, weapons, enemy tuning, animation montages, UI, and level design.

Documentation scope: This guide focuses on what you need inside Unreal Editor: which Blueprints to open, which properties to assign, and which animation notifies to place.
Details panel workflow: For a cleaner editor experience, treat Class Defaults as the place for high-level character or enemy setup only. Component systems are edited by selecting the component in the Blueprint Components panel first, such as CombatComponent, InventoryComponent, StatsComponent, ActionComponent, or StatusEffectComponent. This avoids large duplicated categories in the main actor details panel and keeps each system's settings in its own focused view.
Quick Start Blueprint Setup

Quick reference: player, weapon, and animation Blueprint setup flow.

1. Proper Inheritance

DO NOT start with a default Unreal character. To benefit from the combat and mobile logic, you must inherit from our base class:

1 Right Click in Content Browser -> Blueprint Class.

2 Search for SoulsCharacterBase in the All Classes list.

3 Open the new Blueprint and go to Class Defaults.

2. Core Movement Parameters

Parameter Name Field Type Description & Recommendations
Walk Speed
float
300.0 Baseline movement speed. Optimal for exploration and indoor environments.
Run Speed
float
600.0 Triggered when the mobile joystick is at its edge. Ideal for traversing open levels.
Dodge Speed
float
1200.0 The base launch velocity for physics dodges. Works in tandem with the Super Dodge multipliers.
Character Movement Component: Ensure Orient Rotation to Movement is set to TRUE and Use Controller Rotation Yaw is set to FALSE for the standard "Souls" exploration feel.

FIRST 15 MINUTES

Quick Start Setup

The minimum setup required to make the kit playable in a fresh Blueprint project.
Souls Mobile Engine Quick Start Flow

Use this as the one-screen checklist before testing the playable character.

1. Player Blueprint

1Create BP_SoulsCharacter and set the parent class to SoulsCharacterBase.

2Assign DefaultMappingContext, movement, look, dodge, attack, block, lock-on, and sprint actions.

3Assign MobileHUDClass on the player controller and DamageTextClass on the character.

4Set the default pawn in BP_SoulsGameMode.

2. Weapon Blueprint

1Create BP_Sword_001 from SoulsWeaponBase.

2Set AttachSocketName to RightHandSocket.

3Assign light, heavy, charge, block, and dodge montages when available.

4Call EquipWeapon from the character Blueprint begin play or from a loadout system.

3. Project Settings (Persistence)

1 Open Project Settings -> Maps & Modes.

2 Set Game Instance Class to BP_SoulsGameInstance.

3 Critical: If this is not set, the persistence system (Chests, Souls, Inventory) will not save to disk.

4. Mobile Entry Flow

1 Use MainMenu as the first level for the packaged demo.

2 Show WBP_MainMenu at level start.

3 Assign WBP_LoadingScreen on BP_SoulsGameInstance.

4 The menu automatically opens a new game map or continues from the saved map, then restores save data after loading.

5. Animation Blueprint

Variable Source Purpose
GroundSpeed SoulsCharacterBase Drives idle, walk, run, and sprint blendspaces.
Direction SoulsCharacterBase Used for 2D strafe or lock-on locomotion blendspaces.
bIsFalling SoulsCharacterBase Controls jump, fall, and landing transitions.
bIsSprinting SoulsCharacterBase Allows sprint-specific poses or camera feedback.
Pass condition: before adding advanced systems, the player should move, rotate, sprint, dodge, lock on to an enemy with the Enemy tag, equip a weapon, and consume stamina during attacks.

BLUEPRINT RECIPES

Practical Blueprint Recipes

Small copyable setup patterns for common kit tasks.

Equip Starter Weapon

  • Open BP_SoulsCharacter.
  • On begin play, call EquipWeapon.
  • Pass BP_Sword_001 or any weapon child class.
  • Confirm the mesh has RightHandSocket.

Enable Floating Damage

  • Create widget child of SoulsFloatingText.
  • Add a text block named DamageText.
  • Assign it to DamageTextClass.
  • Test with light attack trace damage.

Enemy Lock-On Target

  • Use BP_SoulsEnemyBase.
  • Add actor tag Enemy.
  • Keep collision query enabled on the pawn.
  • Assign lock-on indicator Niagara if available.

Mobile HUD

  • Create HUD child of SoulsMobileHUD.
  • Bind health and stamina bars.
  • Assign class in SoulsPlayerController.
  • Keep touch controls away from attack buttons.

Recommended Blueprint Responsibilities

Blueprint Area Should Contain Should Avoid
Character Blueprint Meshes, animation class, weapon class, HUD references, visual effects. Damage math, state rules, stamina rules, combo branching.
Weapon Blueprint Mesh, sockets, montages, damage numbers, block reduction. Manual overlap logic or per-frame Blueprint traces.
Enemy Blueprint Behavior tree asset, animation data, default weapon, tuning values. Duplicated AI decision trees outside the included behavior tree setup.

WORLD MODULES

Crafting System

Modular system for creating items from recipes at world stations.

The Crafting System allows players to transform collected materials and currency (Souls) into useful items. It is fully integrated with the Inventory, Stats, and Save systems.

Data
Recipe DA
  • Required ItemsArray
  • Souls Costint32
  • Result ItemDA
Logic
Crafting Component
  • Can Craft?Check
  • ConsumeInventory
  • Add ResultSuccess
UI
💻 Crafting Widget
  • Recipe ListScroll
  • DetailsPanel
  • Craft ButtonAction

1. Recipe Configuration (Data Asset)

Recipes are defined using USoulsCraftingRecipeDataAsset. Each recipe specifies the cost in souls, the required materials, and the outcome.

Field Description
RequiredItems An array of FSoulsItemStack (Item + Quantity).
CraftCostSouls Amount of Souls currency required to craft.
bIsRepeatable If false, the recipe disappears from the list after one successful craft (Saved persistently).
bConsumeIngredients Whether to remove required items from inventory upon success.
CraftTime / CraftingTimeSeconds Optional duration for timed crafting. Values above zero make the recipe complete after a progress timer instead of instantly.
bContinueCraftingWhileOffline If enabled, saved active crafting progress advances while the game is closed and can complete on the next load.

2. Crafting Station (Interactable)

Crafting happens at ASoulsCraftingStationInteractable actors. You can customize which recipes are available at specific stations.

Station Setup

  • Place a BP_SoulsCraftingStation in the level.
  • Assign your Recipes to the Recipes array.
  • Set the Station Display Name (e.g., "Blacksmith Anvil").
  • Assign WBP_SoulsCrafting to Crafting Widget Class.

3. Required Widget Bindings

To ensure the UI communicates correctly with the C++ backend, Widget Blueprints must use the expected names below.

WBP_SoulsCraftingRecipeRow
  • SelectButton: Button used to select the recipe row.
  • RecipeNameText: Displays the recipe display name.
  • ResultText: Displays the result item name.
  • IconItem: Optional image for the recipe/result icon.
WBP_SoulsCraftingRequirement
  • IconItem: Image for the required ingredient.
  • QuantityText: Required/owned amount such as 0/3.
  • ItemNameText: Optional ingredient label.
WBP_SoulsCrafting
  • RecipeList: Container for recipe rows.
  • DetailsPanelScroll: Fixed-height ScrollBox for long details.
  • RecipeNameText: Shows Select Recipe before selection and the selected recipe name after selection.
  • RecipeDescriptionText: Recipe description, hidden until selection.
  • RequiredItemsText: Comma-separated ingredients such as Sword x3, Axe x1.
  • RequiredItemsList: WrapBox/Panel showing ingredient icons and quantities.
  • IconItem: Optional large preview icon, hidden until selection.
  • ResultText: Result item and quantity.
  • SoulsCostText: Souls cost.
  • ProgressBarTime: Visible only while timed crafting is active.
  • TextTime: Remaining time text, visible only while timed crafting is active.
  • CraftButton: Starts the selected craft.
  • CloseButton: Closes the interface without cancelling active timed crafting.
  • FeedbackText: Hidden until success/failure feedback is needed.

4. Selection and Visibility Rules

  • No Selection: only RecipeNameText remains visible with Select Recipe. Details, icons, feedback, progress, and the craft action remain hidden or disabled.
  • Recipe Selected: the details panel shows the icon, description, comma-separated requirements, visual ingredient list, result, Souls cost, and craft action.
  • Missing Requirements: pressing Craft without enough items displays English feedback such as Missing required items or a missing-item summary.
  • Long Details: place the detail content inside DetailsPanelScroll with clipping enabled so long descriptions and ingredient lists scroll inside the panel instead of overflowing the UI.

5. Timed Crafting

Recipes with a crafting time use the active crafting state on the player's USoulsCraftingComponent. Only one active timed craft runs at a time.

  • Start: the system validates ingredients and Souls, consumes them at start, stores the pending result, and shows ProgressBarTime plus TextTime.
  • In Progress: closing the UI does not cancel crafting. Reopening the same station restores the selected active recipe and current remaining time.
  • Blocked Second Craft: trying to start another recipe while one is active returns feedback such as Crafting already in progress.
  • Completion: the pending result is added once, selection is cleared, progress/time widgets are hidden, and non-repeatable recipes are marked completed.

6. Professional Save Persistence

The crafting system participates in the full project save. Saving during an active timed craft records enough data to resume or finish it safely later.

Saved Field Purpose
ActiveRecipeIdIdentifies the recipe being crafted.
StationIdIdentifies the station that started the craft when available.
RemainingTime / TotalTimeRestores progress after load.
PendingResultItem / PendingResultQuantityPrevents result loss if the game is saved before completion.
bIngredientsConsumed / bSoulsCostConsumedPrevents duplicate ingredient or currency consumption.
CompletedRecipeIdsTracks non-repeatable recipes after successful completion.
No Duplication Rule: active timed crafting consumes costs once, saves the pending result, and grants the result once. If offline progress completes the craft before the next load, the result is granted on load and active crafting state is cleared.

7. Manual Validation Checklist

  • [ ] Naming: Is the button in the row named SelectButton?
  • [ ] Binding: Is the row widget class assigned in WBP_SoulsCrafting defaults?
  • [ ] Selection: Does clicking a row update the icon, details, requirements, result, and cost?
  • [ ] Requirements: Does RequiredItemsText display ingredients on one line with commas, and does RequiredItemsList show ingredient icons and quantities?
  • [ ] Feedback: Does missing inventory show clear feedback instead of crafting for free?
  • [ ] Timed Craft: Does a timed recipe show progress and remaining seconds only after Craft is pressed?
  • [ ] Reopen UI: If the UI is closed during timed crafting, does reopening restore the active recipe and remaining time?
  • [ ] Save/Load: If saved during timed crafting, does load resume or complete the craft without duplicating the result?
  • [ ] Non-repeatable: Does a non-repeatable recipe disappear or become unavailable only after successful completion?

COMBAT POLISH

Combat Feel & Trace Tuning

Optional data-driven tuning for hit impact, defensive feedback, and attack trace shapes.

Combat Feel Presets

SoulsCombatFeelPresetDataAsset lets designers tune the impact of individual attacks without changing combat code. A preset can define hitstop, impact SFX/VFX, block feedback, parry feedback, guard-break feedback, camera shake, and mobile vibration settings.

Use Combat Feel for presentation only: feel presets control what the hit looks, sounds, and feels like. They should not be used for balance numbers such as damage, guard stamina damage, poise damage, or knockback strength. Use Impact Tuning for those values.
Field Use It For Typical Notes
Hitstop Duration How long the impact pause lasts. Use short values for mobile responsiveness.
Hitstop Dilation How slow time becomes during the pause. Lower values feel heavier.
Impact SFX / VFX Played when a hit successfully connects. Use clear, short impact sounds for melee attacks.
Block / Parry / Guard Break Separate feedback for defensive outcomes. Use distinct audio so players can read the result quickly.
Camera Shake / Haptics Optional screen and mobile vibration feedback. Use carefully on repeated light attacks.
Safe fallback: if no feel preset is assigned, the attack uses the existing combat feedback behavior. Player actions and AI abilities can each use their own preset without forcing every attack to share the same feel.

Where To Assign Feel Presets

Asset Property Recommended Use
SoulsActionDataAsset Combat Feel Preset Player light attacks, heavy attacks, and weapon actions.
SoulsAIAbilityDataAsset Combat Feel Preset Enemy or boss abilities that need custom impact.

Camera Shake Setup

Camera shake is optional. Use it for heavy attacks, boss attacks, guard breaks, and strong ability impacts. Keep light attack shake subtle or leave it empty to protect mobile readability.

1 In the Content Browser, create a Blueprint class from CameraShakeBase.

2 Use a Wave Oscillator Camera Shake Pattern for simple melee impact shake.

3 Start with short values such as Duration 0.12 - 0.20, Blend In 0.02, and Blend Out 0.06 - 0.10.

4 Assign the shake asset to the relevant Combat Feel Preset.

5 Test in PIE and reduce amplitude if repeated hits feel noisy.

Attack Type Suggested Hitstop Suggested Camera Shake
Light attack 0.02 - 0.04 None or very subtle.
Heavy attack 0.05 - 0.09 Short pitch/roll shake.
Boss ability 0.07 - 0.12 Stronger shake, still under a quarter second.
Block or guard break 0.03 - 0.08 Different from normal hit impact so the player reads the result.

Trace Tuning

FSoulsTraceTuning allows a specific action, AI ability, or weapon to override trace values while keeping the existing Souls_EnableHitbox notify workflow intact.

Option Use It For Design Advice
Radius Override Make a hitbox wider or narrower for a specific move. Start small and use debug draw while tuning.
Socket Override Use different start/end sockets for a special attack. Useful for spear thrusts, shockwaves, or boss weapons.
Max Targets Limit how many actors one trace window can hit. Use 1 for narrow single-target strikes.
Allow Multi Hit Per Target Let one trace window hit the same actor more than once. Use only for spin, flurry, or repeated-hit animations.
Force Show Debug Show trace debug for one move while tuning. Disable it before shipping gameplay content.
Montage ownership: an AI ability feel preset applies to the montage owned by that ability. Normal enemy light or heavy attacks will not inherit an unrelated ability preset unless they have their own assigned feel data.

Attack Impact Tuning

FSoulsAttackImpactTuning provides a standardized structure for mathematical attack balancing. This allows you to override damage, knockback, guard pressure, poise pressure, and hit reaction intent without writing custom logic for every weapon ability or AI spell.

Parameter Function Design Use
Override Damage Allows this action or ability to change damage math. Leave disabled when the move should use default weapon or notify damage.
Damage Multiplier Multiplies the final calculated damage. Use for powerful charged attacks or special boss moves.
Flat Bonus Damage Adds a raw damage value after multipliers. Useful for spells or elemental explosions.
Override Knockback Allows this action or ability to change knockback strength. Leave disabled for normal attacks that should use existing light/heavy knockback.
Knockback Multiplier Scales the launch force applied to the target. Use for heavy slamming attacks or "shove" moves.
Force Guard Break Forces the target into a shield-break state if they are blocking. Ideal for unblockable heavy attacks.
Guard Stamina Damage Stamina damage applied to a blocking target. If the target has less stamina than the incoming value, stamina is reduced to zero and the guard can break.
Force Heavy Hit Reaction Forces a "Heavy" stagger animation on hit, regardless of poise. Ensures high-impact moves feel powerful.
Hit Reaction Type Requests a specific reaction style such as Light, Heavy, Ability, Guard Break, or Knockdown. Use Auto for normal attacks and explicit types for signature abilities.
Min Reaction Lock Time Minimum time before the current hit reaction can be replaced. Use for long heavy or knockdown reactions that should not be interrupted instantly.
Poise Damage Reduces the target's internal poise value. Drives the stun/stagger lifecycle.
Unified Integration: Impact Tuning is available in both SoulsActionDataAsset for player actions and SoulsAIAbilityDataAsset for enemy abilities. Use it to make each light attack, heavy attack, weapon art, boss attack, or AI ability produce a distinct gameplay result.

Impact Tuning Recipes

Move Recommended Impact Reason
Fast light hit DamageMultiplier 1.0, low or no poise damage, Reaction Auto. Keeps basic combat responsive without locking the target too often.
Heavy slash DamageMultiplier 1.4 - 2.0, knockback override, heavy reaction. Creates a clear difference between light and heavy attacks.
Guard pressure move GuardStaminaDamage 30 - 90, optional guard break on boss moves. Lets enemies punish passive blocking without making every attack unblockable.
Boss slam High poise damage, explicit heavy or knockdown reaction, stronger knockback. Makes boss attacks feel dangerous while staying data-driven.

Recommended Validation

  • Assign a feel preset to one player action and confirm only that action uses it.
  • Assign a feel preset to one AI ability and confirm normal enemy attacks do not inherit it.
  • Test block, parry, guard stamina damage, and guard-break feedback separately.
  • Confirm gameplay impact comes from Impact Tuning and visual/audio feel comes from Combat Feel Preset.
  • Enable trace debug on one tuned attack, check the hit shape, then disable debug again.
  • Confirm dodge, lock-on, and mobile movement remain responsive after repeated attacks.

COMBAT POLISH

Combat Vitality & Stability

Professional hit reactions, stagger gates, and aggressive AI movement flow.

1. Hit Reaction (Stagger) System

The system now supports nuanced hit reactions for both players and enemies, preventing combat from feeling "floaty."

Feature Logic Designer Control
Stagger Gating Calculates if a hit should trigger a "Light" or "Heavy" reaction based on force and damage flags. Set LightHitReactionMontage, HeavyHitReactionMontage, and optional ability-specific reaction montages on characters.
Reaction Cooldown Prevents animation spam during multi-hit attacks. Adjust HitReactionCooldown (default 0.45s) to control stagger pacing.
Heavy Threshold The force required to trigger a "Heavy" reaction for the Player. Adjust Heavy Hit Reaction Threshold in Player BP (Default: 600). Hits below this value trigger Light reactions.
Force Override Forces a heavy stagger regardless of thresholds or poise. Enable Force Heavy Hit Reaction in Attack Impact Data for signature boss moves.
Tuning Light vs Heavy Hits: The system determines the reaction style using the logic: Incoming Force >= Character Threshold.

To ensure an enemy's light attack triggers a Light Reaction on the player, ensure the player's Heavy Hit Reaction Threshold is HIGHER than the enemy's Light Hit Knockback Force.

2. AI Attack Step-In (Pressure)

Enemies now automatically "close the gap" when starting an attack, ensuring they stay aggressive and within range.

  • Automatic Lunge: Applies a forward impulse when a combo step or ability starts.
  • Range Sensitive: Only triggers if the target is within AttackStepInMaxRange but beyond AttackStepInStopDistance.
  • Integration: Works seamlessly with legacy combos and the unified AI ability system.
Enemy Field Use It For Suggested Start
Use Attack Step In Enables forward pressure at attack start. Enable on aggressive melee enemies.
Attack Step In Max Range Maximum distance where step-in is allowed. 250 - 500 for melee enemies.
Attack Step In Stop Distance Distance where the enemy should stop stepping in. 80 - 160 depending on weapon reach.
Attack Step In Impulse How strongly the enemy closes the gap. Start low and raise until attacks connect reliably.
Stability Note: The combat trace system safely handles interrupted attacks and targets destroyed mid-frame. Designers can tune hit reactions and step-in pressure without building custom Blueprint trace logic.

COMBAT ANIMATION

Animation Notify Setup

How attack montages drive traces, combo windows, parry impact timing, and combat cleanup.
Combat Notify Blueprint Flow

Attack montage timing: hitbox window, combo input window, and reset notify.

Required Notifies

Notify Use It For Important Values
Souls_EnableHitbox Notify state that starts and stops the weapon trace during the active hit frames. SocketStart, SocketEnd, TraceRadius, OverrideDamage.
Souls_AllowCombo Opens the input buffer so the next light or heavy attack can chain. Place after impact frames, not at the start of the swing.
Souls_ResetCombat Resets combo and returns the combat component to idle if no queued attack exists. Place near the end of each attack section.
Souls_ParryImpact Applies the stored parry finisher damage at the exact animation frame. Place inside ParryCounterMontage when the weapon or hand visually hits the parried enemy.
Socket requirement: weapon meshes should provide Socket_Start and Socket_End for traces, while the character skeleton should provide RightHandSocket for weapon attachment.

Montage Section Naming

The combo system expects montage sections named Attack_1, Attack_2, and Attack_3 when MaxCombo is set to 3. If a montage uses different names, attacks may play the first section repeatedly or fail to jump to the intended section.

Parry Counter Notify Timing

The parry system is animation-driven. A successful parry stores the enemy as the pending parry target, plays the player's ParryCounterMontage, and waits for Souls_ParryImpact. The enemy only receives Parry Finisher Damage when this notify fires.

Recommended timing: place Souls_ParryImpact on the exact frame where the counter attack visually connects. This keeps enemy death synchronized with the finisher animation instead of killing the enemy immediately when the parry succeeds.
Montage Required Setup Purpose
Parry Montage Assign in BP_SoulsCharacter > CombatComponent > Souls > Character > Parry. Short defensive animation played when the block button starts a parry attempt.
Counter Montage Add Souls_ParryImpact at the strike frame. Finisher animation that applies delayed parry damage through the notify.
Enemy Parried Montage Assign in BP_SoulsEnemyBase > Souls > Enemy > Parry. Stagger, dizzy, or guard-break reaction played while waiting for the counter impact.

API REFERENCE

SoulsCharacterBase Class

Complete index of Blueprint-accessible character properties and combat functions.
Recommended editing pattern: Open BP_SoulsCharacter and use Class Defaults for character-level setup such as input actions, movement speeds, animation data, camera tuning, death flow, and debug toggles. For subsystem settings, select the relevant component from the left Components panel before editing: CombatComponent for combat and lock-on, InventoryComponent for item slots and equipped items, StatsComponent for health/stamina/souls, and StatusEffectComponent for status and buff behavior. This is intentional and prevents the same settings from appearing multiple times in the actor defaults.

Blueprint-Callable Functions

Function Name Inputs Description
StartDodge Direction (Vector) Initializes the dodge sequence. Use this to bind to your input actions.
FindLockOnTarget None Performs a sphere trace (LockOnRadius) to find the nearest actor tagged "Enemy".
ClearLockOn None Resets camera and rotation logic to standard exploration mode.
EquipWeapon WeaponClass (SubclassOf) Spawns and attaches a weapon to the "Weapon_Socket" and initializes hitboxes.

Vital Properties (Categorized)

Camera & Juice

  • CameraBoom: SpringArm component with built-in Lag settings (Default: TargetArmLength 400).
  • bEnableFOVKick: Toggles cinematic zooming during high-action frames.
  • FOVReturnSpeed: Speed at which camera returns to normal after a dash.

Stats Integration

  • DodgeStaminaCost: How much stamina is consumed per roll (Default: 25.0).
  • bIgnoreDamage: System-managed flag for invincibility windows.

ADVANCED MOVEMENT

AAA Super Dodge PRO

The Souls_Super_Dodge (AnimNotifyState) is a high-performance movement driver. It eliminates the "floaty" feel of default Unreal movement by injecting precise impulses directly into the movement component.

Rotation Snap: The system captures your input direction at the exact frame the dodge starts and instantly rotates the character. No more fighting the camera.
Super Dodge Settings

Full Settings Reference:

  • [01] Initial Impulse Multiplier

    The "Pop" driver. Explodes the character in the input direction. Note: Scales both Physics and Root Motion. Recommended: 3.0.

  • [02] Continuous Force Multiplier

    Prevents slowing down during the animation. Essential for "sliding" dodges or long lunges. Recommended: 0.5 - 1.0.

  • [03] Ground Friction Override

    Controls the glide distance after the initial launch. Lower values (1.5) create a smooth, buttery slide. Higher values (10.0) cause a dead stop.

  • [04] Rotation Speed Override

    The steer-rate during the roll. Allows the player to change direction slightly while moving. Set to 50+ to give the player control.

  • [05] Reset Velocity at Start

    Toggles StopMovementImmediately(). Essential for balance, ensuring consistency regardless of player speed.

  • [06] Enable IFrames

    Safety first. Turns on damage immunity for the duration of the notify box. Frame-perfect protection.

  • [07] Trigger FOV Kick

    Toggles cinematic camera zooming to emphasize the "Kick" and impact of the dash.

  • [08] FOV Kick Intensity

    How far the camera expands. Use 10 - 15 for a powerful, high-action feel.

Pro Tuning Scenarios:

• Bloodborne Slide: Reset Velocity: True, Initial Impulse: 3.5, Ground Friction: 1.5, Continuous Force: 0.8.
• Dark Souls Heavy Roll: Reset Velocity: True, Initial Impulse: 1.1, Ground Friction: 8.0, Continuous Force: 0.0.

2. Technical Property Reference

Property Type Numerical Logic
Initial Impulse Multiplier float Scales character launch velocity at NotifyBegin. Default character Speed * Multiplier.
Continuous Force Multiplier float Applied every frame (Tick) to maintain momentum during the mid-roll phase.
Ground Friction Override float Directly modifies CharacterMovement->GroundFriction. Lower = more slide.
Rotation Speed Override float Increases yaw-snapping speed. Allows sharp turns during the dodge window.
bEnableIFrames bool Toggles bIgnoreDamage flag. Provides frame-perfect invulnerability.

3. Lock-On Dodge Behavior

When the player is locked onto an enemy, the dodge system switches to a precision-based resolution mode. This ensures that the character moves relative to the threat rather than simply forward.

Directional Logic

Joystick Input: The character will dodge in the exact world-space direction indicated by the joystick, relative to the camera and target.

Neutral Input (Backstep): If no movement input is detected while locked-on, the character will perform a Backstep (dodging directly away from the target).

Dynamic Montage Timing: The system automatically detects when the dodge animation (Montage) ends. Facing logic is suspended for the exact duration of the roll, preventing the character from snapping back to the enemy mid-animation.

Smooth Recovery: Immediately after the dodge ends, the character enters a dedicated recovery state to smoothly rotate back and face the threat, avoiding "jittery" transitions.

Property Default Description
bUseInputDirectionForLockOnDodge true If enabled, dodge direction follows the joystick during lock-on.
bBackstepWhenNoDodgeInput true If true, pressing dodge without moving results in a backstep away from the target.
bSuspendLockOnFacingDuringDodge true Disables forced-facing toward the target for the full duration of the dodge montage.
LockOnDodgeFacingSuspendExtraTime 0.1 Additional buffer time after the dodge ends before recovery begins.
LockOnPostDodgeFacingRecoverySpeed 15.0 Speed at which the character rotates back to face the enemy after a dodge.
LockOnPostDodgeFacingRecoveryMaxTime 0.5 Fail-safe duration for the recovery window.

COMBAT POLISH

Combat Input Synchronization

Ensuring animation integrity and preventing input conflicts.

Dodge-Attack Gating

To maintain high visual fidelity and prevent animation blending artifacts, the system enforces a strict relationship between dodging and attacking. This ensures that defensive maneuvers are not accidentally interrupted by aggressive inputs, while still allowing the player to escape danger at any time.

1. Input Interrupt Rules

Action A (Current) Action B (Requested) Result Reasoning
Attacking Dodge PERMITTED Dodge is a high-priority defensive escape and should always cancel offensive frames.
Dodging Attack (Any) BLOCKED Prevents "sliding attacks" and animation breaking during active dodge frames.
Dodging Weapon Ability BLOCKED Ensures weapon arts cannot be triggered during movement invulnerability.

2. How the Guard Works

The guard is implemented directly in the SoulsCharacterBase input entry points. Before any combat action is resolved, the system checks the character's internal bIsDodging state.

  • AttackLightInput: Rejects input if CombatComponent->bIsDodging is true.
  • AttackHeavyInput: Rejects input if CombatComponent->bIsDodging is true.
  • TryWeaponAbility: Returns false immediately if the character is in a dodge state.
  • Mobile-First Spam Protection: By blocking these inputs during dodge, the system naturally prevents button spamming from triggering an attack the moment the dodge ends (unless a separate buffer system is intentionally enabled).
Tuning Note: This "hard guard" ensures that the full dodge animation plays out. If you wish to allow an attack to start slightly before the dodge animation finishes, you must use a Souls_AllowCombo notify in the dodge montage to open a cancel window.

3. Manual Validation Checklist

  • [ ] Attack -> Dodge: Press Attack, then immediately press Dodge. The dodge should start and cancel the attack animation.
  • [ ] Dodge -> Attack: Press Dodge, then spam Light/Heavy attack during the roll. No attack should trigger until the character has fully finished the dodge and returned to Idle.
  • [ ] Dodge -> Ability: Press Dodge, then press the Weapon Ability button. The ability should not fire.
  • [ ] Stamina Integrity: Verify that blocked inputs do not consume stamina or trigger cooldowns.

CONTROL SYSTEMS

Mobile Control & Swipe Logic

Technical breakdown of how high-precision touch is handled.

Traditional mobile controls in Unreal feel slow and rigid. Our system uses a Raw Delta Capture method inside the SoulsPlayerController to ensure the camera feels exactly like a console analog stick.

1. Swipe Logic (Right Screen)

The Calculation

Delta = (CurrentTouch - LastTouch) * Sensitivity * DeltaTime

Instead of tracking a "joystick center", we track the frame-to-frame difference of your finger move. This allows for unlimited swipe area, meaning the player can move the camera regardless of where their finger starts on the right half of the screen.

2. Mobile Sensitivity Tuning

Variable Recommended Value Purpose
LookSensitivity 45.0 Overall speed of x/y rotation. Higher values allow for "180-degree" flicks.
SwipeDamping 0.1 Controls the "momentum" when you lift your finger. Lower = Sharper stop.
JoystickRadius 64.0 Deadzone for the virtual joystick. Crucial for different screen sizes.

GAMEPLAY MECHANICS

Stats & Regeneration Logic

In-depth look at the SoulsStatsComponent.

The Stamina Cycle

Stamina is the most important currency in a Souls-like. Our component handles this with a Dual-Stage Regeneration system:

  • Action Window: Regeneration stops for 1.2s (configurable) after any action (Dodge/Attack).
  • Regen Stage: Stamina fills linearly at 25.0 points per second.
  • Exhaustion: If Stamina reaches 0.0, the character enters "Exhausted" state where Sprint and Dodge are disabled until it reaches 20%.

2. Combat State Machine (Logic Hierarchy)

The system enforces a strict state machine to prevent animation glitches and ensure combat integrity. Below is the operational matrix:

State Priority Permitted Input Actions
Idle Baseline All actions enabled (Movement, Attack, Dodge, Block).
Attacking High Input Buffering (Light/Heavy), Dodge Canceling (Weapon Specific).
Dodging Critical No inputs accepted until Recovery Notify or Animation End.
Blocking Medium Parry Trigger (Timely Block), Slow Walk movement.
Stunned Lockdown Zero input permitted. State is cleared by animation end.

Stats Property Reference

Variable Type Functionality
MaxHealth float Maximum damage tolerance.
MaxStamina float Total stamina pool. (Affects how many times you can roll).
RegenRate float Stamina points recovered per second.
StaminaDelay float Delay before regeneration starts after an action.

ADVANCED SYSTEMS

Advanced Targeting System AAA

Weighted target selection, stable switching, automatic validation, and mobile-friendly lock-on feedback.

Overview

The Targeting System controls the player's lock-on target, camera focus, target marker, and lock-on dodge behavior. It is designed for mobile Soulslike combat where the player needs fast target acquisition, predictable switching, and stable camera recovery without adding a separate targeting component.

1. Setup Guide (Step-by-Step)

1 Enemy Tagging: Ensure any actor you want to target has the Tag Enemy added to its Actor Tags. If the actor has a Souls stats component, dead targets are ignored automatically.

2 Input Mapping: Bind an Input Action (e.g., IA_LockOn) to the LockOnAction property in your Character's SoulsEngine|Input category.

3 Component Config: In the SoulsCombatComponent, set your desired LockOnRadius, LockOnBreakDistance, scoring weights, switch threshold, and marker settings.

2. Weighted Target Selection

When lock-on is pressed, the system filters invalid candidates first, then scores the remaining enemies. This prevents the camera from locking to a poor target just because it is slightly closer.

  • Distance: nearby threats are favored using LockOnDistanceWeight.
  • Camera Intent: enemies near the camera center are favored using LockOnForwardWeight and bPreferScreenCenterTarget.
  • Validity: dead actors, missing enemy tags, destroyed actors, and out-of-range candidates are rejected.
  • Line of Sight: when bRequireLineOfSightForLockOn is enabled, enemies behind blocking geometry are ignored.
Pro Tip: Toggle bShowLockOnDebug in the Combat Component during development to inspect candidate scoring, rejection reasons, and selected target logs in the Output Log.

3. Mobile Target Switching

While locked on, look or swipe input can switch to another valid target. The switch path is tuned for mobile screens so small camera corrections do not cycle targets accidentally.

Setting Purpose Suggested Start
LockOnSwitchMinInput Minimum swipe/look strength before switching can happen. 0.55 - 0.75
LockOnSwitchCooldown Prevents multiple switches from one swipe. 0.30 - 0.50 seconds
TargetSwitchThreshold Legacy threshold used by the existing switch flow. Keep close to current project value

4. Auto-Clear And Marker Cleanup

When bAutoClearInvalidLockOnTarget is enabled, lock-on is released when the target dies, is destroyed, loses target validity, or exceeds LockOnBreakDistance. The widget marker and VFX indicator are cleared with the target so no orphan marker remains in the level.

5. Recommended Lock-On Tuning

Property Recommended Start When To Adjust
LockOnRadius 1800 - 2200 Increase for open arenas, reduce for dense rooms.
LockOnBreakDistance 2500 - 3000 Increase for bosses, reduce for close combat arenas.
LockOnForwardWeight 1.5 - 2.0 Increase if the system picks nearby side targets too often.
LockOnDistanceWeight 0.5 - 1.0 Increase if the system ignores close threats too often.
bRequireLineOfSightForLockOn Enabled Disable only for arena designs where lock-on through minor props is desired.

6. Validation Checklist

  • One enemy: lock-on activates, marker appears, pressing lock-on again clears it.
  • Multiple enemies: camera-centered target is selected when the forward weight is high enough.
  • Switching: left/right swipe switches once and respects cooldown.
  • Invalid target: dead or distant enemies clear lock-on automatically.
  • Line of sight: enemies behind solid walls are ignored when LOS is enabled.
  • Regression: lock-on dodge, normal dodge, attack, block, parry, combat feel, AI feel, and trace tuning still work.

UI & COMBAT

Lock-On Target Marker

A professional circular reticle that identifies the currently locked enemy.

The Lock-On Target Marker is a high-fidelity Widget-based system that automatically tracks the player's current lock-on target. It provides clear visual feedback in 3D space while remaining mobile-friendly.

1. Component Architecture

The system uses a UWidgetComponent managed by the SoulsCombatComponent. This component is dynamically spawned and attached to the target's mesh or root when a lock is established, ensuring the marker perfectly follows the enemy's movement.

Setup Requirements

1 Create a Widget Blueprint inheriting from SoulsLockOnTargetWidget (e.g., WBP_SoulsLockOnTargetMarker).

2 Add a UImage child named exactly MarkerImage. This is where your reticle texture goes.

3 Enable Is Variable on MarkerImage so the C++ widget class can tint and animate it.

4 Assign your Widget class to LockOnWidgetClass on the player's SoulsCombatComponent in your Character Blueprint.

2. Blueprint Setup Walkthrough

1 Open your player Blueprint, select CombatComponent, and search for LockOnWidgetClass.

2 Set LockOnWidgetClass to WBP_SoulsLockOnTargetMarker.

3 Keep bShowLockOnTargetMarker enabled.

4 Start with LockOnMarkerDrawSize around 64 x 64 or 80 x 80.

5 Use LockOnMarkerWorldOffset to place the marker over the enemy body. A useful first value is a positive Z offset such as 0, 0, 80.

6 Leave LockOnMarkerSocketName empty for root attachment, or set it to a valid mesh socket such as head or spine_03 when your enemy skeleton provides one.

3. Technical Properties

Property Name Description
bShowLockOnTargetMarker Master toggle to enable/disable the widget-based marker system.
LockOnWidgetClass The Blueprint class (WBP_SoulsLockOnTargetMarker) to spawn.
LockOnMarkerSocketName Optional socket on the enemy mesh to attach to (e.g., spine_03 or head). Leave empty for root attachment.
LockOnMarkerWorldOffset Vector offset from the attachment point. Useful for centering the marker on the enemy's torso.
LockOnMarkerDrawSize The 2D size of the widget in the world (e.g., 100x100).

4. Customizing the Visuals

Inside your WBP_SoulsLockOnTargetMarker, you can adjust the following settings in the Class Defaults:

Pulse Animation

Set PulseSpeed and PulseIntensity to create a subtle breathing effect on the marker.

Color Tinting

Use MarkerColor to change the reticle color (e.g., white for normal enemies, red for bosses).

5. Runtime Behavior

Player Action Expected Marker Behavior
Start play with no locked target. No marker is visible.
Tap the mobile Lock-On button near an enemy with the Enemy tag. The marker appears on the locked enemy.
Switch to another target if your setup supports target switching. The marker moves to the new locked enemy and clears from the old target.
Unlock, move out of range, or kill the locked enemy. The marker is destroyed or hidden safely.
Manual Test: create WBP_SoulsLockOnTargetMarker, add MarkerImage, assign it to LockOnWidgetClass, then lock onto an enemy with the mobile HUD button. The white circular marker should appear instantly, follow the enemy, and disappear when lock-on is cleared or the enemy dies.
Tuning tip: if the marker appears too low, increase LockOnMarkerWorldOffset.Z. If it appears too large on mobile, reduce LockOnMarkerDrawSize before changing the widget artwork.

COMBAT MECHANICS

Combo & Animation-Driven Parry

A deep dive into combo flow, contextual defense, and notify-based parry finishers.

1. Smart Combo System

Our combo system is Data-Driven. You don't write logic for each swing; instead, the system reads the AttackMontage from your weapon and follows a strict naming convention for sections:

  • Attack_1, Attack_2, Attack_3: Standard light attack sequence sections.
  • Heavy_1, Heavy_2: Dedicated heavy attack sections.

The ComboCount variable tracks the current state and automatically jumps to the next section if the player clicks within the Combo Window.

2. Input Buffering System (BufferedAttack)

The most critical feature for "Souls-like" responsiveness. Instead of ignoring clicks during an animation, the system Buffers (stores) the next intent and executes it at the earliest valid frame.

  • Logic: When an attack is triggered while bIsAttacking is true, the system checks the EBufferedAttack enum.
  • Queuing: If you spam Light Attack, it stores a Light buffer. If you press Heavy Attack mid-swing, it overwrites with a Heavy buffer.
  • Execution: The AllowCombo notify triggers the ExecuteBufferedAttack() function, checking if a strike is queued.

3. Mixed Combos (Light-to-Heavy)

You can now perform seamless transitions. For example, starting with 2 Light Attacks and finishing with a devastating Heavy Strike.

Flow Path: Light (A1) -> Light (A2) -> [Input Heavy] -> Queues Heavy -> Plays Heavy_3 (or Heavy_1 if dedicated).

4. Advanced Charge Attack System v1.1

Heavy attacks can now be "Charged" by simply holding the attack button. This creates a high-reward tactical opening during combat. Everything is pre-configured to work with your existing Input Actions.

Blueprint Setup (Easy Steps):
1. Assign Animation: In your Weapon Blueprint, go to Souls | Animation and set your ChargeAttackMontage.
2. Visuals & Sound: In Souls | Effects, add your ChargeReadyVFX (spawns when fully charged) and ChargeCompleteSound.
3. Fine-Tuning: In Souls | Combat, adjust the ChargeTimeThreshold (e.g., 1.5s) to control how long the player must hold the button.
  • How it works: The system automatically detects a "Long Press". If released early, a standard Heavy Attack plays. If released after the "Glow" (VFX), the devastating Charge Strike is executed.
  • Power-Up: Use the ChargeDamageMultiplier to make these hits deal 2x or 3x damage.

4. Contextual Parry & Block

Instead of a cluttered UI with separate defense buttons, the kit uses a Contextual Defense system. The same Block input can start a parry attempt, then fall back into standard blocking if the incoming attack does not land during the active parry window.

State Timing Result
Parry Attempt Active Parry Window, default 0.35s for early testing. Damage negated. Enemy enters parried/stunned state and the player can play a counter montage.
Standard Block After the parry window or when parry is disabled. Damage reduced by BlockDamageReduction percentage.
Pro Tip: tune Active Parry Window for feel. Use larger values such as 0.35 while building, then tighten to 0.18 - 0.25 for a more demanding Souls-like release feel.

Animation-Driven Parry Finisher Current

Successful parries do not kill the enemy immediately. The system stores the enemy as a pending parry target, plays the enemy's parried reaction, then waits for the player's Souls_ParryImpact notify inside the Counter Montage.

  • Parry Success: enemy attack damage is cancelled before it reaches stats.
  • Pending Target: the parried enemy is saved on the player's combat component.
  • Impact Notify: Souls_ParryImpact applies Parry Finisher Damage at the visual hit frame.
  • Authoritative Rules: The Kill Enemy On Successful Parry setting is now fully authoritative. It overrides any difficulty preset behavior, ensuring that if it is disabled in the editor, the enemy will always receive damage instead of being instantly killed.
  • Fail-safe: if the notify is missing, Parry Impact Fail Safe Delay applies the finisher so testing does not get stuck.

5. Advanced Defense (AAA Features) v1.1

The system now supports high-fidelity feedback for defensive actions, including resource management and counter-offensive options.

Block Stagger

When blocking heavy attacks that exceed the BlockStaggerThreshold, the character will play a BlockStaggerMontage. This prevents "Tanking" everything and forces the player to manage their position.

Shield Break (Stamina Guard)

Every blocked hit consumes stamina based on the damage received. If stamina reaches zero, the character enters the ShieldBroken state and plays the ShieldBreakMontage, leaving them vulnerable to critical hits.

Parry Counter

Successfully performing a parry can play the configured Counter Montage. Put Souls_ParryImpact inside that montage to choose the exact frame where the enemy receives finisher damage.

6. Detailed Defense System Setup EDITOR GUIDE

This section covers the step-by-step configuration required inside the Unreal Editor to fully utilize the Advanced Defense System.

Step 1: Weapon Defense Configuration

Character defense is configured primarily on the player's CombatComponent. Weapon block montages can still be used as advanced per-weapon overrides, but the clean player-project setup is under Souls | Character | Defense and Souls | Character | Parry.

  • Block Montage: assign a looping defense montage on the CombatComponent.
  • Parry Montage: assign the short guard/parry attempt animation.
  • Counter Montage: assign the finisher montage and add Souls_ParryImpact at the hit frame.
  • Block Damage Reduction: A value between 0.0 and 1.0 (e.g., 0.8 for 80% protection).

Step 2: AnimGraph - Upper Body Blending

To allow the player to move while blocking, we use Layered Blend Per Bone. This separates the defensive pose from the locomotion (walking/running).

AnimGraph Node Setup:
1. Add a Layered blend per bone node.
2. Set the Base Pose to your main Locomotion State Machine.
3. Add a Slot 'UpperBody' node and connect it to Blend Pose 0.
4. In the Layered Blend node details, add a Branch Filter and set the Bone Name to spine_01.

Step 3: Character Defense Stats

In your Character Blueprint CombatComponent, you can fine-tune the global defense behavior:

  • Use Parry When Block Starts: makes the Block input begin with a parry attempt before falling back to normal blocking.
  • Active Parry Window: how long the incoming hit can be caught as a parry.
  • Parry Impact Fail Safe Delay: backup timing if Souls_ParryImpact is missing from the counter montage.
  • Block Stagger Threshold: If an incoming hit deals more damage than this value, the character will play the BlockStaggerMontage.
  • Shield Break Montage: This montage plays automatically when the player's stamina reaches zero while they are holding the block button.

3. Animation Notifies (The Combo Engine)

The sequence of your combo is controlled entirely by AnimNotifies within your Weapon Montage. Placing these correctly is the difference between a clunky game and a "Souls-like" feel.

Notify Name Placement Functionality
Souls AN Allow Combo Mid-Animation (Recovery) Opens the "Input Window". If the player clicks while the animation is inside this notify state, the system buffers the next attack.
Souls AN Reset Combat End of Animation Forces the ComboCount back to 0. Ensures that the next time the player attacks, they start from Attack_1.

The "Perfect" Notify Sequence:

  • 0.0s - 0.2s: Wind-up (Preparation).
  • Souls AN Enable Hitbox: Place during the active hitting frames. (Notify State).
  • Souls AN Allow Combo: Place during the recovery. Triggers Buffered Inputs.
  • Souls AN Reset Combat: Place at the very last frame to clear the strike queue.

5. Custom AnimNotify Reference Manual

The engine provides specialized Notifiers to handle complex combat logic without Blueprint spaghetti.

[Action] Souls AN Allow Combo

Internal Class: USoulsAN_AllowCombo

Logic: When the animation playhead hits this frame, the system calls ExecuteBufferedAttack(). If the player clicked earlier, the next attack starts immediately.

[State] Souls ANS Combat Trace AAA UNIFIED

Internal Class: USoulsANS_Hitbox

Logic: This is the "Gold Standard" for combat registration. It performs a Frame-to-Frame Sphere Trace between the previous and current positions of two sockets, ensuring a continuous damage volume even during sub-frame movement.

Socket Configuration Guide:

To use this system, your weapon (or character mesh) MUST have two sockets defined:

  • Start Socket: Usually placed at the Base/Handle of the weapon.
  • End Socket: Usually placed at the Tip/Point of the weapon.
  • Trace Radius: Defines the thickness of the blade. For a standard sword, 10 to 15 is ideal.
  • Num Points: Defines how many spheres are spawned between Start and End. For a standard longsword, use 3 to 5 points to ensure no "gaps".
Pro-Tip (Socket Naming): Standard naming like Socket_Start and Socket_End is recommended for consistency across all weapons and enemies.

Visual Debugging: Enable bShowDebug within the Notify to see the spheres in real-time. This can be toggled per-animation to assist in fine-tuning without polluting the global game view.

[Action] Souls AN Hitstop

Internal Class: UAnimNotify_SoulsHitstop

Logic: Triggers a brief global time dilation effect to simulate "Impact Weight". Essential for the AAA feel.

Execution Modes:
  • Only on Impact (True): The slow motion will ONLY trigger if the weapon has successfully hit a target in the current attack. This is the "Smart" mode that prevents slow-mo when swinging at the air.
  • Global (False): The slow motion triggers instantly when the notify is hit. Ideal for cinematic wind-ups or "Fury" attacks.
Time Dilation: Lower values (0.05) create a stronger "freeze".
Duration: How long the effect lasts (Recommended: 0.08 - 0.1s).

[AI] Advanced Combat Tactics PRO

The AI now utilizes a probability-based decision engine to switch between light and heavy strikes.

  • Heavy Attack Chance: Configurable per-enemy. Allows AI to break player guards and vary attack patterns.
  • Boss Aggression: Bosses automatically receive a 60% cooldown reduction and high-priority heavy strike queuing.

[Action] Souls AN Reset Combat

Internal Class: USoulsAN_ResetCombat

Logic: Resets ComboCount to 0 and clears BufferedAttack. Essential at the end of every montage to prevent "Stuck" input states.

5. The Buffering Logic Flow (Behind the Curtain)

Understanding the exact frame-logic is essential for high-level tuning. Here is the internal cycle:

Phase Internal Action Result
User Input Player clicks while bIsAttacking is TRUE. BufferedAttack variable is set to Light or Heavy.
Notify Check Animation reaches Souls AN Allow Combo. System calls ExecuteBufferedAttack().
State Reset Current animation section ends. Buffer is cleared to None to prevent ghost hits.
Boring technical detail: The buffer supports "Latent Overwriting". If you click Light then immediately change your mind and click Heavy before the AllowCombo notify triggers, the system will prioritize and execute the last input received (The Heavy Strike).

6. Data Dictionary: EBufferedAttack

Internal enumeration used to track the player's intent between strike frames.

Value Description Internal Logic
None Default state. No strike queued. Character returns to Idle/Locomotion after animation.
Light Player requested a standard strike. Triggers ComboCount++ and plays the next "Attack_X".
Heavy Player requested a power strike. Jumps directly to "Heavy_X" section, skipping light flow.

BORINGLY DETAILED GUIDE

Mastering Weapon Configuration

How to create, customize, and link weapons to your character.

1. Visual Representation (Skeletal vs Static)

The SoulsWeaponBase comes with a WeaponMesh (Skeletal) by default to support complex animated weapons. However, most swords are Static Meshes.

  • Option A (Static Mesh): In your Weapon Blueprint, click +Add -> Search for StaticMesh. Drag it under WeaponMesh to parent it. Set your sword model here.
  • Option B (Skeletal Mesh): Simply select the WeaponMesh component and assign your Skeletal Mesh directly in the details panel.
  • [NO HITBOX NEEDED]: You no longer need to add Box/Capsule collisions for damage. The system uses the Sockets on your mesh directly via the AnimNotify.
  • Important: Ensure the model is rotated correctly so it aligns with the character's hand in the viewport.

2. Combat Statistics (The "Souls" Properties)

Located under the "Souls | Weapon" category in the Details panel. These define the power of your weapon:

Property Description Ideal Value
Light Damage Damage dealt during a standard Light Attack sequence. 15 - 30
Heavy Damage Damage dealt during a Heavy Attack. Usually has higher poise damage. 40 - 60
Knockback Force The physical impulse applied to the enemy upon impact. 400 - 800
Attach Socket Name The exact string name of the bone socket on the player's skeleton. RightHandSocket

3. Dynamic Animation Overrides

One of the most powerful features is that each weapon carries its own "Personality". When equipped, the character reads these assets:

Attack Montage: The primary data source for Light Attacks. Ensure sections are named Attack_1, Attack_2, etc.

Heavy Attack Montage: (New) A dedicated montage for Heavy Attacks.
• If assigned: System uses sections from this montage (e.g., Heavy_1).
• If empty: System falls back to the primary Attack Montage and searches for "Heavy" sections.

Locomotion BlendSpace: (Optional) Providing a BlendSpace here allows the character to change their idle/walk/run animations based on the weapon (e.g., dragging a Greatsword vs holding a Dagger).

Dodge Montage: You can assign a unique dodge for specific weapons (like a 'Quickstep' for daggers).

Skeleton Flexibility: Montages no longer require matching skeletons. You can assign any animation montage to any character or weapon regardless of their base skeleton, provided the core bone names match (e.g., standard Humanoid setup).

4. Hit Feedback (VFX & SFX)

Located under "Souls | Effects". These trigger at the exact location of the collision:

Hit Effect Assign a Particle System (Cascade or Niagara). This will spawn at the impact point (e.g., Blood burst or sparks).

Hit Sound Assign a Sound Wave or Cue. This plays a "thud" or "slash" sound when the hitbox overlaps an enemy.

5. Common Setup Errors (Troubleshooting)

Issue Potential Cause Fix
Combo stops at attack 1. Section Name mismatch. Ensure Montage sections are named exactly Attack_1, Attack_2.
Heavy Attack plays Light sound. Missing HeavyAttackMontage assignment. Assign the dedicated montage or add "Heavy_1" sections to the main montage.
Input Buffer ignored. Allow Combo notify too short. Stretch the notify state box to cover the entire recovery window of the animation.
Camera Zooms/Clips on enemies. Collision Channel Conflict. The system now automatically sets ECC_Camera and ECC_Visibility to Ignore for all characters to prevent clipping.
Animation Montage cannot be selected. Skeleton Restriction (Internal). Fixed. We added AllowAnySkeleton metadata to combat montages, allowing cross-character animation usage.

WEAPON SYSTEM

EquipWeapon Node

The primary node for switching and initializing weapons.
EquipWeaponCharacter Node

Input: Weapon Class (Must inherit from SoulsWeaponBase)

Description: Despawns current weapon, spawns new class, and attaches it instantly.

Placement: Event BeginPlay or SwapWeapon event.

OFFENSIVE LOGIC

Attack Nodes

Executing light and heavy attack sequences.
LightAttackCombat Component

Input: None

Behavior: Checks if bIsAttacking is true. If yes, it sets BufferedAttack to Light. If no, it plays the montage section starting from ComboCount.

Contextual Action: If bCanParryCounter is true, this node will automatically execute ParryCounter() instead of a standard light attack.

Automatic Link: If bCanCombo (set by AN_AllowCombo) is true, it performs a direct jump to the next animation section.

HeavyAttackCombat Component

Input: None

Behavior: Similar to LightAttack but sets buffer to Heavy.

Priority Logic: Heavy strikes always override Light strike buffers, allowing the player to "pivot" their combo into a finisher at the last millisecond.

ExecuteBufferedAttackInternal / Notify Driven

Warning: This is primarily called by the AN_AllowCombo notify. Calling it manually in Blueprints is not recommended unless creating custom AI-driven strike sequences.

DEFENSIVE LOGIC

Defense & Block Nodes

Managing damage reduction, stamina consumption, and parry sequences.
StartBlockCombat Component

Behavior: starts a contextual defense. When Use Parry When Block Starts is true, this first enters Parrying for the configured Active Parry Window, then falls back to Blocking if no enemy hit is caught.

Animation: plays Parry Montage if assigned; otherwise it falls back to Block Montage.

EndBlockCombat Component

Behavior: Returns the character to Idle state and removes damage reduction modifiers.

GetBlockReductionPure Node

Output: float (0.0 to 1.0)

Technical Note: Returns the reduction percentage defined in the currently equipped weapon. Used to scale damage in TakeDamage logic.

ParryCounterCombat Component

Behavior: executes the rapid counter-attack montage when a manual counter input is desired. In the default flow, the configured Counter Montage can also play automatically when the parry succeeds.

ExecutePendingParryImpactCombat Component

Behavior: applies finisher damage to the stored parried enemy. This is called automatically by the Souls_ParryImpact animation notify.

Blueprint Rule: do not call this every frame. Only call it manually for a custom Blueprint finisher system. The normal setup is: add Souls_ParryImpact to the counter montage at the impact frame.

TryResolveIncomingParryCombat Component

Behavior: internal safety gate used by the hitbox trace system. It checks whether the defender is currently parrying and whether the attacking enemy can receive parry. On success, incoming damage is cancelled before it reaches stats.

EVASION SYSTEM

Dodging Nodes

AAA movement and invincibility frames.
StartDodgeCharacter Node

Input: DodgeDirection (Vector)

Description: Plays dodge montage and enables i-frames.

TARGETING

Advanced Lock-On System POLISHED

Intelligent target selection and perspective management for high-precision mobile combat.

1. Weighted Scoring Selection

Unlike basic systems that only pick the closest enemy, the lock-on scan uses configurable scoring to determine player intent:

  • Distance Score: Prioritizes immediate threats based on physical proximity.
  • Camera Center Score: Prioritizes enemies closest to where the player is looking.
  • Line of Sight: Optional trace check that prevents targets behind solid objects from being selected.

2. Polished Target Switching

Designed for touch screens. While locked on, a quick swipe on the right side of the screen triggers a Directional Switch.

  • Input Deadzone: Switches only trigger if LockOnSwitchMinInput is exceeded, preventing accidental cycles during camera adjustments.
  • Switch Cooldown: A short cooldown prevents switching through multiple targets in a single swipe.
  • Validation: The system automatically skips dead or invalid targets during the switch search.

3. Intelligent Target Validation (Auto-Clear)

The system constantly monitors the state of your target to ensure the camera never stays "stuck" on empty air or dead corpses:

  • Death Monitor: If the target's StatsComponent reports IsDead(), the lock-on clears instantly.
  • Distance Break: If the player or target moves beyond LockOnBreakDistance, the camera releases focus to prevent snapping.
  • Marker Cleanup: Guaranteed destruction of VFX/Widget components upon target loss, preventing "ghost" indicators.

Lock-On Configuration Reference

Property Default Description
LockOn Radius 1500.0 Initial detection radius for finding targets.
LockOn Break Distance 2500.0 Distance at which the lock-on automatically disconnects.
LockOn Forward Weight 1.5 Priority multiplier for targets near the center of the camera view.
LockOn Distance Weight 1.0 Priority multiplier for nearby targets.
Require Line Of Sight true If enabled, targets behind walls will be ignored by the initial scan.
LockOn Switch Cooldown 0.3s Prevents rapid target cycling on high-sensitivity mobile screens.
LockOn Switch Min Input 0.6 Minimum look or swipe strength required before switching targets.
Auto Clear Invalid Target true Automatically releases lock-on when the target dies, becomes invalid, or moves too far away.
LockOnIndicatorVFXNiagara Asset

Assign a Niagara System to this property in the Combat Component. The engine will automatically spawn and attach it to the target's root when locked on, and destroy it when cleared.

bShowLockOnDebugBoolean

A developer-only toggle. When enabled, it draws the sphere trace and logs target detection details including Scoring Results to the Output Log. Disable for production.

SYSTEM STATES

Impact & State Nodes

Reading real-time combat data for UI and FX.
GetCombatStatePure Node

Output: ESoulsCombatState Enum

Values: Idle, Attacking, Dodging, Blocking, Parrying, Stunned.

Usage: Connect this to a Switch on Enum node in your Animation Blueprint or UI to play specific FX or update HUD elements.

OnAttackLandedMulticast Delegate

Pins: HitActor, DamageAmount, bWasParried.

Description: Triggers whenever the weapon trace/overlap hits a valid target. Perfect for spawning blood particles directly from Blueprints.

Understanding the AAA Hit Flow (Advanced)

1. Notify Begin: The USoulsANS_Hitbox starts. It reads the sockets from the USoulsCombatComponent's owner (Mesh or Weapon).
2. Tick: Every frame, the system checks for overlaps in the path of the swing. If a hit is found, it is added to a "Hit List" so it isn't hit twice in the same swing.
3. Damage: The TakeDamage function is called on the victim, which passes through to the StatsComponent.
4. Notify End: The trace stops, and the "Hit List" is cleared for the next attack.

FEEL & STATE

Combat Feel Nodes

Game feel and internal state control.
ApplyHitstopCombat Component

Description: Temporarily freezes character time for impact weight.

ResetComboCombat Component

Description: Zeros the combo count and returns to Idle.

Attack Lunge & Knockback Tuning

These values are exposed on SoulsCombatComponent under Souls|Combat|Feel. They are designed to add weight without requiring Blueprint logic.

Property Default Use
bEnableAttackLunge true Enables a small forward impulse when an attack starts.
AttackLungeImpulse 260 Base movement push for light attacks.
HeavyAttackLungeMultiplier 1.35 Extra lunge applied to heavy attacks.
LightHitKnockbackForce 0 Optional push applied to targets hit by light traces.
HeavyHitKnockbackForce 800 Push applied to targets hit by heavy traces.

AI SYSTEMS

AI Intelligence & Architecture PRO

Technical breakdown of the Souls AI brain, blackboard memory, and combat decision flow.
AI Enemy Setup and Behavior Tree Flow

Enemy Blueprint setup, behavior tree flow, blackboard keys, and difficulty presets.

New Workflow: Organized Details Panel

To ensure a professional and clutter-free developer experience, all enemy configuration properties are now organized into a unified Enemy| hierarchy. This flat structure makes it easy for designers to find and tune critical settings without searching through multiple deep sub-categories.

  • Enemy | Identity: Contains core identity flags: Is Boss, Is Training Dummy, and Is Monster. These are surfaced at the top of the Class Defaults for instant character definition.
  • Enemy | AI: Groups Behavior Tree selection, aggression thresholds, strafing, retreat, and spawn leash logic.
  • Enemy | Combat: Holds stats and tactical tuning such as Heavy Attack Chance, Enrage thresholds, and combo limits.
  • Enemy | Death & Respawn: Standardized settings for Corpse Cleanup Delay and training dummy resurrection intervals.

Simple Combat AI Fallback Recommended First Test

The default enemy can now chase, face, and attack the player without requiring a Behavior Tree or NavMesh setup. This is the recommended first setup for testing damage, parry, hit reactions, and death flow in the showcase map.

  • Enable Simple Combat AI: keep bEnableSimpleCombatAI enabled on BP_SoulsEnemyBase.
  • Use Behavior Tree: keep bUseBehaviorTree disabled for the basic enemy. Enable it only when you want the advanced BT-driven enemy.
  • Training Dummy: enable bIsTrainingDummy to stop AI movement and keep the enemy useful for damage and parry testing.
  • Aggressive Enemy: disable bIsTrainingDummy, assign a default weapon, and place the enemy within SimpleDetectionRadius.

Current build also includes ready Blueprint parent classes: SoulsTrainingDummyEnemy for damage/parry testing and SoulsAggressiveEnemy for a fast showcase opponent. Create a Blueprint from either class, assign mesh, animation data, and weapon, then drop it into the showcase map.

AI Ability Selection PRO

Enemies can use a modular, data-driven ability system to execute special attacks based on weight, range, and cost. This system operates as a priority layer above the standard light/heavy combat fallback.

  • Modular Data Assets: Create a SoulsAIAbilityDataAsset to define each move.
  • Advanced Logic: Includes AbilityId, Weight, MinRange, MaxRange, Cooldown, and StaminaCost.
  • Interrupt Behavior: Configure if the ability can be interrupted by damage or if it grants "Hyper Armor" during execution.
  • Repeat Policy: Use Can Repeat Ability, Min Repeat Interval, Avoid Immediate Repeat, and Repeat Penalty Multiplier to prevent boring loops without blocking the only valid ability forever.
  • Boss Phase Lists: Bosses can assign a different AIAbilities list inside each entry of the Boss Phases array, while normal enemies can keep using the global AIAbilities list.
Selection Logic: When Use AIAbility Selection is enabled, the AI evaluates all available abilities in the current phase list. It filters by range, cooldown, stamina, repeat rules, and recent-use memory, then performs a weighted random selection.

Ability Repeat & Movement Policy Advanced

AI abilities now expose practical behavior controls directly on the ability data asset, letting designers tune whether an enemy repeats a move, lunges into range, or commits to a full animation before choosing the next action.

  • Can Repeat Ability: allows the same ability to be selected again after its cooldown and repeat interval.
  • Min Repeat Interval: adds a repeat-specific delay separate from the base cooldown.
  • Ability Repeat Memory Count: enemy-level memory used by weighted selection to avoid repeating the same ability too often.
  • Ability Movement Mode: supports dash, leap, or lunge-style movement depending on the configured mode.
  • Ability Movement Timing: lets movement happen before the montage or during the montage.
  • Desired Strike Distance: lets lunging abilities stop at an attack distance instead of standing exactly on top of the player.
Design note: If an enemy has only one valid ability, repeat policy should allow that ability to return after cooldown. If several abilities are valid, recent-use penalties keep the pattern varied.

AI Ability Movement Modes

Ability movement is used when a special attack should close distance before or during its montage. Use it for lunges, short dashes, leap attacks, and boss gap closers. Leave it disabled for grounded attacks that should rely only on normal AI approach movement.

Field Meaning Practical Tuning
Ability Movement Mode Chooses how the enemy moves for the ability. Use lunge/dash for melee strikes, leap-to-target for larger gap closers.
Desired Strike Distance Preferred distance from the target at the end of movement. Use weapon reach as the guide. Swords often work around 120 - 220.
Movement Speed How fast the enemy moves while the ability movement is active. Low values look like walking. Higher values create a dash or snap-lunge.
Max Movement Distance Hard limit for how far the ability may move the enemy. Keep lower than the leash radius. This prevents abilities from dragging enemies across the map.
Ability Movement Timing Controls whether movement happens before the montage or while the montage plays. Use During Montage for attacks where the animation itself should carry the enemy forward.
Movement Timeout Safety stop if the movement cannot reach its target. Use short values for melee attacks so the enemy does not slide for too long.

Data-Driven Boss Phases PRO

Bosses can use a flexible Boss Phases array instead of a fixed two-step setup. Each entry defines when that stage begins, which abilities it uses, and what transition feedback should play.

  • Health Threshold: Use normalized values such as 1.0, 0.66, and 0.33 to build one-stage, two-stage, or three-stage encounters.
  • Phase Display Name: The current label is shown in the Boss HP HUD, for example Guardian, Enraged, or Final Stand.
  • AI Abilities: Assign a different ability list per stage so the boss changes behavior as health drops.
  • Transition Feedback: Optional montage, sound, and VFX can play while movement and AI decisions are paused.
Fallback: If no boss phase entries are configured, the enemy safely falls back to its global AIAbilities and normal combat patterns.

Telegraphed AI Abilities PRO

Special attacks can include readable windups (Telegraph) and recovery delays. This improves combat readability and prevents AI from chaining powerful moves instantly.

  • Windup Time: A configurable delay before the montage begins. Ideal for "roar" or "weapon glow" cues.
  • Recovery Time: A post-execution pause that ensures a window of opportunity for the player.
  • Events: Bind to OnAIAbilityTelegraphStarted for visual/sound cues and OnAIAbilityRecoveryStarted for posture changes.

Boss Resistances & Immunities PRO

Configure advanced physical and status resistances to create formidable boss encounters. These settings allow bosses to ignore standard player interactions like parries or staggers.

  • Immune to Parry: Blocks parry finishers and stun states entirely. Perfect for giants or heavy-armored bosses.
  • Immune to Stagger: Prevents hit reaction montages, allowing the boss to power through player attacks (Hyper Armor).
  • Knockback Resistance: Scales or negates physical impulse from heavy attacks and explosions.
  • Status Resistance: Multiplier for status effect buildup (e.g., Poison, Bleed), making the boss harder to afflict.
Dynamic Control: Resistances can be toggled or modified during phase transitions to reward tactical play or increase difficulty.

Enemy Difficulty Presets New

Enemy Blueprints can now auto-apply a clean preset from AIDifficulty. This keeps setup fast while still producing distinct gameplay roles for basic enemies, elites, bosses, and testing dummies.

  • Auto Apply Difficulty Preset: enabled by default. The enemy applies its preset at BeginPlay.
  • Preset Can Override Stats: lets the preset set HP/stamina values.
  • Preset Can Override Tactics: lets the preset set combo count, cooldown, heavy chance, strafe, retreat, and enrage.
  • Apply Difficulty Preset: Blueprint-callable node for manually refreshing the enemy after changing difficulty.

Planned Enemy Combos & Action Commitment PRO

The simple enemy AI builds a short attack plan when it reaches combat range. Light and heavy attacks are protected by an action owner so the AI does not start an animation and immediately replace it with an ability or another attack.

How the AI Attacks:
  • Light Combo Plan: The AI can request several light attacks with a small input delay, letting the montage combo window drive the final rhythm.
  • Heavy Support: Heavy attacks can appear in the planned combo when a valid heavy montage exists, with fallback protection if it does not.
  • Commit Guard: AI Attack Owner Commit Guard Time and AI Combo Step Commit Time prevent instant action swapping.
  • Safe Cooldown: After an attack owner releases, Post Combo Decision Delay prevents immediate spam.

AI Debug Logs Optional

Enemy debug logs are disabled by default to keep the project clean. Enable them only while tuning or investigating enemy behavior, then turn them off again before normal playtesting.

  • Enable: open the enemy Blueprint or placed enemy instance, then turn on Show Simple AI Debug Logs under Souls > Enemy > AI > Debug.
  • Runtime Blueprint: call Set Simple AI Debug Logs Enabled if you want a debug button in your own test tools.
  • Read the log: search for SoulsAI in Output Log. Useful messages include Chasing target, Attack requested, Starting light combo plan, Starting standalone heavy attack, and Attack blocked: cooldown.
Production tip: keep this option disabled for clean logs and better presentation during demos.

Combat Strafe & Retreat New

When the enemy is close to the player but waiting for attack cooldown, it can now circle-strafe instead of standing still. After a combo or heavy attack, it can also step back briefly to create a more readable Souls-like rhythm.

  • Use Combat Strafe: enables side movement while the enemy is inside combat range.
  • Combat Strafe Chance: controls how often the enemy chooses to circle instead of holding position.
  • Post Attack Retreat Chance: controls how often the enemy backs away after an attack plan.

Low Health Enrage New

Enemies can become more dangerous when their health drops below a threshold. Enrage increases attack speed and reduces cooldown, giving bosses and elite enemies a simple phase-two feel without requiring a complex state machine.

  • Enable Low Health Enrage: turns the feature on or off per enemy.
  • Enrage Health Percent: health percentage where enrage activates.
  • Enraged Attack Speed Multiplier: controls how fast attacks play after enrage.
  • Enraged Cooldown Multiplier: lowers attack cooldown after enrage.

Spawn Leash Return New

The enemy can now return to its original spawn point if it is pulled too far away. This keeps the showcase map stable and prevents enemies from chasing forever across the level.

  • Use Spawn Leash: enables return-to-spawn behavior.
  • Leash Radius: maximum distance from spawn before the enemy disengages.
  • Return Acceptance Radius: distance from spawn where the enemy is considered back home.
  • Reset Stats When Leashed: optionally restores HP/stamina when the enemy returns.
  • Immediate Reacquire: after returning home, the AI polls for the player again instead of waiting for a new overlap event.
Detection rule: the enemy validates combat targets before accepting them. Player pawns can be accepted; world actors such as ladders, doors, gates, and props are rejected and should not become attack targets.

Identity & Corpse Cleanup Professional UI

Defining an enemy's role and its lifecycle after death is now centralized in the Enemy|Identity and Enemy|Death categories. This ensures consistent behavior across all enemy types.

  • Is Training Dummy: Disables normal AI aggression and turns the actor into a test target. Dummies use the Enemy|Respawn logic instead of cleanup.
  • Is Boss: Identifies the enemy as a boss, enabling boss-specific HUD integration and phase logic found in Enemy|Identity.
  • Corpse Cleanup Delay: Found in Enemy|Death. Controls how many seconds a normal enemy corpse remains before removal. Set to 0 to keep the corpse indefinitely.
  • Respawn Delay: Found in Enemy|Respawn. Specifically controls training dummy restoration intervals.

Showcase Mode (Cinematic)

Designed for developers and content creators. When enabled (bShowcaseMode = true), the AI transforms into a cinematic movement actor.

  • Zero Aggression: All combat logic is bypassed. The AI will never attempt an attack.
  • Fixed Cinematic Distance: AI maintains a strict 650-unit radius for optimal camera framing.
  • Intelligent Repulsion: If the player approaches, the AI smoothly backpedals to restore the cinematic distance.
  • Focus Maintenance: AI remains permanently focused on the player actor.

AI Ability Setup Recipe

1 Create a SoulsAIAbilityDataAsset in the Content Browser.

2 Assign a Montage and set MinRange / MaxRange values.

3 Enable Use Telegraph and set Windup Time (e.g., 0.5s) and Recovery Time (e.g., 0.3s).

4 Configure repeat behavior with Can Repeat Ability, Min Repeat Interval, and optional repeat penalty settings.

5 Configure Ability Movement Mode only when the ability needs dash, leap, or lunge movement.

6 Configure Impact Tuning if this ability needs unique damage, knockback, guard damage, poise damage, or hit reaction behavior.

7 Assign a Combat Feel Preset if this ability needs unique hitstop, camera shake, sound, VFX, block, or guard-break feedback.

8 Open your Enemy Blueprint and add the asset to the AIAbilities array.

9 Ensure Use AIAbility Selection is checked in the enemy defaults.

AI Troubleshooting

Issue Probable Cause Recommended Solution
Ability never triggers Range or Stamina mismatch Check MinRange/MaxRange and ensure the enemy has enough MaxStamina.
Enemy uses fallback attacks All abilities on cooldown Reduce Cooldown values or add more abilities to the list.
Ability does not repeat Repeat policy or recent-use memory blocks it Enable Can Repeat Ability, lower Min Repeat Interval, and reduce repeat penalty if the enemy has only one ability.
Ability movement misses the player Desired distance, speed, or max movement distance does not match the montage timing Reduce Desired Strike Distance, increase Movement Speed, and keep Movement Timeout short for fast melee lunges.
Ability hits but feels identical to normal attacks No custom impact or feel data assigned Set Impact Tuning for gameplay difference and Combat Feel Preset for hitstop, camera shake, SFX, and VFX.
Enemy changes actions too fast Commit time is too short for the montage set Increase AI Attack Owner Commit Guard Time or AI Combo Step Commit Time on the enemy.
Enemy does not chase after returning home Detection relies on overlap-only behavior Confirm the enemy returns to AcquireTarget after leash completion and that detection radius covers the player.
Corpse never disappears Corpse Cleanup Delay is 0 or the actor is a training dummy Set a positive cleanup delay for normal enemies. Training dummies use respawn flow instead of corpse cleanup.
Boss never enters the next phase Phases disabled Enable bUseBossPhases, add entries to Boss Phases, and confirm each Health Threshold is ordered from high to low such as 1.0, 0.66, 0.33.
Telegraph delay feels wrong Windup/Montage conflict Ensure Windup Time does not exceed the startup frames of your montage.
Logs are too noisy Debug flags enabled Disable bDebugActionSystem and bEnableDebugLogs in component defaults.
Player cannot parry boss Immunity enabled Check bImmuneToParry or bCanBeParried in the boss settings. Also ensure Kill Enemy On Successful Parry is set correctly; this property is now authoritative over difficulty presets.
Enemy stuck after parry Missing Souls_ResetCombat notify or fail-safe logic issue. Ensure the parried montage has Souls_ResetCombat near the end. The system now includes a fail-safe timer (Montage duration + buffer) to recover automatically if notifies are missing.
Boss ignores heavy hits Stagger immunity Check bImmuneToStagger. This is intended behavior for "Hyper Armor" bosses.

Advanced Behavior Tree Tasks

For developers using the Behavior Tree (BT) system, several custom C++ tasks are provided to handle complex Souls-like movement and combat logic.

BT Task Primary Keys / Parameters Behavior Description
BTTask_SoulsAttack AttackType, TargetActor Triggers the combat component's light or heavy attack sequence based on the blackboard key.
BTTask_SoulsCircleStrafe StrafeRadius, StrafeDirection, RotationSpeed Intelligent orbiting movement around the player. Automatically handles obstacle avoidance and direction switching.
Technical Note: These tasks interface directly with the SoulsCharacterBase combat and movement buffers, ensuring perfect synchronization with animation montages and root motion.

1. Behavior Tree Architecture (The Brain Map)

The following schematic represents the Master AI Behavior Tree logic flow. It handles everything from perception to tactical execution.

ROOT
BB_SoulsEnemy
SERVICE: Souls Focus Target (AAA LookAt)
SERVICE: Souls Distance Check (Perception)
SELECTOR: MAIN LOGIC
DECORATOR: Is Not Training Dummy
DECORATOR: AIState == 2 (Chase)
SEQUENCE: CHASE
TASK: Move To (TargetActor)
DECORATOR: Is Not Training Dummy
DECORATOR: AIState == 3 (Combat)
SERVICE: Souls Combat Logic (Pressure Engine)
SELECTOR: COMBAT BRAIN
ACTION: 0
CIRCLE STRAFE
TASK: Souls Circle Strafe
ACTION: 1
PERFORM ATTACK
TASK: Souls Perform Attack
ACTION: 2
WAIT / OBSERVE
TASK: Wait (2.0s)

2. The "Ultimate" AI Property Dictionary

Below is every single configurable value within the SoulsEnemyBase and its components.

Property Type Range / Default Deep Logic & Functionality
AIDifficulty Enum Grunt / Elite / Boss / TrainingDummy Grunt: up to 3-hit combos. Elite: up to 3-hit combos. Boss: up to 4-hit combos. Training Dummy keeps combat disabled for testing.
Auto Apply Difficulty Preset bool true Automatically applies the selected AIDifficulty preset when the enemy begins play.
Preset Can Override Stats bool true Allows the preset to set HP and stamina for Grunt, Elite, Boss, or Training Dummy.
Preset Can Override Tactics bool true Allows the preset to tune cooldowns, combo limits, heavy chance, strafing, retreat, and enrage settings.
AICombatStyle Enum Balanced Relentless: Never resets pressure. Aggressive: High building. Defensive: Circles player constantly.
AI_AggressionThreshold float 0.3 - 0.9 The point where Pressure triggers an attack. Lower = Higher attack frequency.
AI_PressureGainRate float 0.1 - 0.5 The speed of building aggression per second when in range. Multiplied by Difficulty.
AI_AggressionDecayRate float 0.05 - 0.2 Speed of pressure loss when the player is out of reach. Allows for "resetting" the duel.
AI_DecisionInterval float 0.1 - 1.0 The tick-rate of the SoulsCombatLogic service. Lower = More responsive AI.
AI_RetreatProbability float 0.0 - 1.0 Chance to trigger a backward dodge/move after a combo finishes. Essential for Souls-like flow.
bIsTrainingDummy bool false Disables normal AI aggression while preserving stats. Used for damage, parry, montage, and hitbox testing.
Training Dummy Respawn Delay float 3.0s Seconds before a training dummy restores itself after death.
Training Dummy Can Attack bool false Optional override for combat test dummies. Leave disabled for normal non-aggressive dummy behavior.
Corpse Cleanup Delay float 10.0s Seconds before a non-training enemy actor is removed after death. Set to 0 to keep the corpse.
Use Spawn Leash bool true Returns the enemy to its spawn point if it is pulled farther than Leash Radius.
Leash Radius float 2600 Maximum distance from spawn before the enemy disengages and returns home.
Return Acceptance Radius float 120 Distance from spawn where return behavior stops and normal targeting resumes.
Reset Stats When Leashed bool false Optional reset for HP/stamina when the enemy returns home. Useful for boss arenas.
Use AIAbility Selection bool false Enables the data-driven ability selection layer above legacy light/heavy fallback attacks.
AI Abilities array empty List of SoulsAIAbilityDataAsset entries used by the enemy or current boss phase.
Allow Legacy Attack Fallback bool true Allows light/heavy combo behavior when no valid AI ability can be selected.
Use Weighted Ability Scoring bool true Uses ability weights and recent-use penalties for varied ability selection.
Ability Repeat Memory Count int 2 Number of recent AI ability choices remembered when applying repeat penalties.
Show Simple AI Debug Logs bool false Optional development toggle. When enabled, enemy decisions are printed to Output Log using the SoulsAI prefix.
MinAIComboHits int 3 Minimum number of attacks the simple enemy AI tries to queue after it reaches attack range.
MaxAIComboHits int 4 Upper limit for the simple enemy AI combo plan. Boss enemies can use the full value.
AIComboInputDelay float 0.42 Delay between planned AI combo inputs. Lower values feel more aggressive; higher values feel easier to read.
Post Combo Decision Delay float 0.45s Short delay after an attack owner releases before the next decision can begin.
AI Attack Owner Commit Guard Time float 0.75s Minimum guard window that prevents a newly-started attack, ability, or weapon art from being replaced immediately.
AI Combo Step Commit Time float 0.75s Minimum delay before a planned AI combo step can advance or finish, protecting light/heavy animation startup.
Use Combat Strafe bool true Lets the enemy circle around the target while waiting for cooldown inside combat range.
Combat Strafe Chance float 0.65 How often the enemy chooses strafe movement while close to the player.
Post Attack Retreat Chance float 0.35 Chance to step backward briefly after finishing an attack plan.
Enable Low Health Enrage bool true Enables phase-two style behavior when enemy health is low.
Enrage Health Percent float 0.35 Health threshold where enrage activates.
Enraged Attack Speed Multiplier float 1.15 Attack play-rate multiplier after enrage.
Enraged Cooldown Multiplier float 0.75 Cooldown multiplier after enrage. Lower values make the enemy attack more often.
HeavyAttackChance float 0.35 Chance that the enemy chooses a standalone heavy attack instead of a light combo when a heavy montage is configured.
Weapon Art Chance float 0.15 Chance for an enemy to choose its weapon ability when range and cooldown rules allow it.
Weapon Art Cooldown float 8.0s Cooldown applied to AI-controlled weapon art usage.
bGuaranteeHeavyComboFinisher bool true Keeps heavy attacks separate from light combo chains so the heavy montage can finish cleanly.
CombatState Enum Idle Internal state tracker (Idle, Attacking, Dodging, Stunned). Used for AnimBP transitions.

3. Combat Archetype Presets (Pro-Tuning)

Preset Behavior Best Use
TrainingDummy No simple AI, no behavior tree, very high HP, can receive parry but does not die from parry by default. Damage testing, parry testing, montage timing, hitbox setup.
Grunt Readable attacks, lower HP, light combos, low heavy chance, can die from successful parry. Normal basic enemy in the showcase map.
Elite More HP, faster attacks, stronger combo plan, more strafe, enrage enabled. Mini enemy, stronger duel enemy, advanced combat demo.
Boss High HP, boss parry immunity, heavier attack chance, up to 4-hit plans, strong enrage. Boss prototype, arena showcase, late-game enemy sample.

The Pursuer (Nightmare AI)

  • Difficulty: Boss
  • Style: Relentless
  • Threshold: 0.3
  • Gain Rate: 0.4

The Strategic Duelist

  • Difficulty: Elite
  • Style: Defensive
  • Threshold: 0.85
  • Retreat Prob: 0.9

AAA Feature: The "Ghost Range" Logic

To ensure AI hits feel fair and dangerous on mobile, the system automatically scales the weapon hitbox by 1.5x during AI swings. This is a standard AAA technique to compensate for variable frame rates.

4. Blackboard Memory Key Reference

Key Name Type Purpose
TargetActor Object The current target being pursued (usually the Player).
AIState Integer 2 = Chase Mode | 3 = Combat Mode.
CombatAction Integer 0 = Circle Strafe | 1 = Attack | 2 = Wait.
CurrentPressure float Internal value tracking aggression build-up.
ShouldRetreat bool Triggers the tactical retreat/dodge sequence.

Data-Driven Implementation Guide:

1. Animation Data: Assign your USoulsAnimationDataAsset to the enemy. It must contain the locomotion BS for 8-way movement.
2. Hit Reaction: The AI will automatically play the HitReactionMontage when receiving damage, interrupting its current state unless it has Hyper-Armor.

RPG BACKBONE

Inventory & Equipment Blueprint Ready

A compact item, pickup, weapon equip, quick item, and save flow for a real Souls-like loop.

What This System Adds

The player now owns a SoulsInventoryComponent. It supports item stacks, equipment slots, weapon equip, quick consumable use, pickup actors, and save snapshots through the existing save system.

  • Item Data: create SoulsItemDataAsset assets for weapons, consumables, key items, and soul currency.
  • Inventory: add, remove, find, and count item stacks from Blueprint.
  • Equipment: equip a right-hand weapon from inventory and update the combat weapon automatically.
  • Quick Item: assign a consumable to the quick slot and call Use Quick Item to heal and consume one stack.
  • Pickup: place SoulsItemPickup in the level for overlap-based item rewards.
  • Enemy Drops: add loot entries on enemies so they spawn pickup actors on death.
  • Save: inventory stacks, right-hand weapon, and quick item are saved in SoulsSaveGame.

Quick Setup: Weapon Item

1 Create a Data Asset from SoulsItemDataAsset.

2 Set Item Type to Weapon.

3 Assign Weapon Class to your weapon Blueprint, for example BP_Sword.

4 Add the item to the player's SoulsInventoryComponent.

5 Call Equip Inventory Item on the player, or Equip Item on the inventory component using RightHandWeapon.

Quick Setup: Healing Item

1 Create a SoulsItemDataAsset and set Item Type to Consumable.

2 Set Max Stack to a value such as 10.

3 Set Heal Amount to the HP restored per use.

4 Add it to inventory, call Equip Quick Item, then call Use Quick Item.

Playtest Checklist: Inventory and Pickup

This is the fastest way to confirm the full item loop before building a final inventory UI.

1 Create DA_Item_Sword from SoulsItemDataAsset, set Item Type to Weapon, and assign your sword Blueprint to Weapon Class.

2 Create DA_Item_Heal, set Item Type to Consumable, set Max Stack to 10, and set Heal Amount to a value such as 40.

3 Create BP_ItemPickup from SoulsItemPickup, assign DA_Item_Heal, set Quantity to 3, and keep Pickup On Overlap enabled.

4 Place BP_ItemPickup in the map and walk over it. If the actor disappears, the item was added to the player's inventory.

5 For a weapon test, add DA_Item_Sword to InventoryComponent and call Equip Inventory Item. The weapon should spawn and attach to the character hand socket.

6 For a healing test, add DA_Item_Heal, call Equip Quick Item, take damage, then call Use Quick Item. HP should increase and the stack should decrease by one.

Enemy Loot Drops

Enemies can now spawn item pickups when they die. This gives the showcase a real reward loop after combat.

1 Open your enemy Blueprint, for example BP_SoulsEnemyBase or an aggressive enemy Blueprint.

2 In Souls > Enemy > Loot, keep Drop Loot On Death enabled.

3 Set Loot Pickup Class to your visual pickup Blueprint, for example BP_ItemPickup. If empty, the system uses the base SoulsItemPickup.

4 Add entries to Loot Drops. For each entry, assign an Item, set Quantity, and tune Drop Chance from 0.0 to 1.0.

5 Kill the enemy. A pickup should spawn near the death location and can be collected by walking over it.

Advanced Item Configuration

Upgrade your SoulsItemDataAsset with professional rules for a deeper RPG experience.

  • Weapon Grip: toggle between OneHanded and TwoHanded. 2H weapons automatically unequip the left hand.
  • Equip Side: restrict weapons to Right Hand Only, Left Hand Only, or Either Hand.
  • Action Rules: per-item flags for bCanBeDropped, bCanBeUsed, and bCanBeEquipped.
  • World Drop: assign a DroppedPickupClass and DroppedPickupMesh so dropped items respawn as collectable pickups.
  • Paired Offhand: one-handed weapons can optionally define a paired shield, spell book, or secondary weapon.

Drop Confirmation System Mobile Safe

Protect rare and important items from accidental deletion with the mobile-first drop confirmation system.

  • bRequireDropConfirmation: enable this in any SoulsItemDataAsset to force a popup before dropping.
  • ConfirmationDialogClass: assign your confirmation widget Blueprint in the WBP_SoulsInventory details.
  • Safe Behavior: Closing the inventory or tapping Cancel preserves the item. Only a deliberate Confirm tap executes the drop.
  • Mobile Priority: Optimized for touch with clear, large buttons and safe input restoration.
Test Pattern: Create a rare weapon, enable bRequireDropConfirmation, assign a dialog widget that inherits from SoulsConfirmationDialog, and try to drop the item from the inventory.

Key Items & World Unlock

Key items can now be configured to unlock specific world objects like doors or gates without building a full quest system. The key stays as normal inventory data, while the world object decides which key it accepts.

  • bCanUnlockWorldObjects: enable this for items that act as keys.
  • bConsumeOnWorldUse: if true, the key is removed from inventory after one successful use.
  • UnlockId: an optional ID (e.g., Gate.CourtyardKey) that must match the door's RequiredUnlockId.
  • Recommended key rules: set important keys to non-droppable, non-equippable, and non-usable from the inventory action bar.
Example Asset Field Suggested Value
DA_Item_Key ItemType KeyItem
DA_Item_Key bCanUnlockWorldObjects true
DA_Item_Key UnlockId Gate.CourtyardKey
DA_Item_Key bConsumeOnWorldUse false for reusable keys, true for one-time keys.

Inventory UI Foundation PRO

The backend inventory system is fully upgraded. The UI handles categories, dynamic action buttons, and professional equipment rules natively.

  • Tabs: All, Weapons, Consumables, and Key Items.
  • Details: selected item name, description, type, quantity, and icon.
  • Equipment: current right-hand weapon, left-hand weapon, and quick item readouts.
  • Actions: dynamic English labels: Equip / Unequip / Switch / Use / Drop.
  • Input: closing the inventory should restore the current developer playtest input mode, including visible cursor in Mobile UI Test mode.
Status: the inventory UI foundation is functional. It opens in Unreal, reads real inventory data, displays item rows, updates details, and drives equip/use/drop action states. Remaining work is polish, extra item examples, and deeper shield/spell gameplay.

WBP_SoulsInventory Layout Skeleton Built

The first Blueprint layout pass creates the inventory window structure without final styling. This gives C++ and Blueprint a stable set of widget names to bind before the real item entries are generated.

1 Create WBP_SoulsInventory with parent SoulsInventoryWidget.

2 Add InventoryRootPanel and InventoryMainBox as the centered inventory window.

3 Add a header with InventoryTitleText and SoulsCountText.

4 Add tab buttons: TabAllButton, TabWeaponsButton, TabConsumablesButton, and TabKeyItemsButton.

5 Add InventoryContentBox as a horizontal three-column area: ItemsPanel, DetailsPanel, and EquipmentPanel.

6 Add the item lists: ItemsList, WeaponsList, ConsumablesList, and KeyItemsList. Keep ItemsList visible and the category lists collapsed until tab switching is wired.

7 Add details widgets: SelectedItemIcon, SelectedItemNameText, SelectedItemTypeText, SelectedItemQuantityText, and SelectedItemDescriptionText.

8 Add equipment readouts: RightHandWeaponText, LeftHandWeaponText, and QuickItemText.

9 Add ActionButtonsBox with: EquipButton, UseButton, DropButton, and CloseButton.

10 Add InventoryButton to WBP_SoulsMobileHUD. The next implementation step binds this button to open WBP_SoulsInventory.

Functional Inventory UI Functional

The Inventory UI is now integrated with the SoulsInventoryComponent. It opens from the mobile HUD, reads real player item stacks, generates visible item rows, filters by tab, and updates the details panel when an item is selected.

  • Real-time Population: Automatically fetches items from the player's inventory component upon opening or refreshing.
  • Tab Filtering: Functional tabs for All, Weapons, Consumables, and Key Items.
  • Item Rows: Uses WBP_SoulsInventoryItemEntry for a clickable row with item icon, name, and quantity.
  • Item Selection: Clicking an item entry updates the details panel with the item's name, type, quantity, description, and icon.
  • Equipment Integration: Shows currently equipped weapons and quick items.
  • Action Button States:
    • Equip: visible for equippable items. It changes to Unequip or Switch when appropriate.
    • Use: visible only for usable items.
    • Drop: visible only for droppable items that are not currently equipped.

Equipment and Action Rules PRO

The inventory action bar is driven by item data and equipment state. Buttons that do not apply to the selected item should be Collapsed, not merely disabled, so the mobile UI stays clean.

Rule Behavior
OneHanded weapon Can occupy an allowed hand. The other hand remains available unless a paired off-hand item is equipped.
TwoHanded weapon Occupies both hands. Show the same item in RightHandWeaponText and LeftHandWeaponText.
Equipped item Cannot be dropped. Unequip it first, then drop if the item data allows dropping.
Non-usable item UseButton should be collapsed.
Non-droppable item DropButton should be collapsed. Use this for important keys and story items.

Inventory Input Enhanced Input

The inventory should be opened through the same Enhanced Input workflow as the rest of the kit, not through one-off keyboard events. Add or verify IA_Inventory in the player input mapping context, bind it to a keyboard key such as I, and call the same inventory toggle function used by the mobile HUD InventoryButton.

Inventory Item Entry Widget Required

Create the generated row widget as WBP_SoulsInventoryItemEntry in /Game/SoulsMobileKit/Blueprint/Widget/ and set its parent class to SoulsInventoryItemWidget. The C++ class provides the data bridge; the Blueprint widget provides the visible row design.

1 Use this hierarchy for a simple row:

SizeBox
  Border or Button
    HorizontalBox
      ItemIconImage
      ItemNameText
      QuantityText

2 Mark these widgets as variables with exact names: ItemIconImage, ItemNameText, and QuantityText.

3 Set the row height to about 44, avoid fixed width, and let the row fill its parent list horizontally.

4 In WBP_SoulsInventory, set ItemEntryClass to WBP_SoulsInventoryItemEntry. Do not leave it pointing at the native C++ class alone, because the native class has no visual Blueprint layout.

Tabbed List Layout Layout Rule

The four inventory lists should share the same space under the Items heading. Use Collapsed for inactive lists so they do not reserve layout space.

ItemsPanel
  ItemsPanelTitleText
  Overlay
    ItemsList
    WeaponsList
    ConsumablesList
    KeyItemsList
  • Default open: ItemsList is Visible; the other lists are Collapsed.
  • Weapons tab: only WeaponsList is Visible.
  • Consumables tab: only ConsumablesList is Visible.
  • Key Items tab: only KeyItemsList is Visible.
  • Fill behavior: each list and each generated entry row should fill the Items column width.

Required Inventory Widget Names

Area Required Names Purpose
Header InventoryTitleText, SoulsCountText Window title and current souls amount.
Tabs TabAllButton, TabWeaponsButton, TabConsumablesButton, TabKeyItemsButton Switches between item categories.
Lists ItemsList, WeaponsList, ConsumablesList, KeyItemsList Containers for generated item entry widgets. Place them in one shared list area and collapse inactive tabs.
Entry Row WBP_SoulsInventoryItemEntry with ItemIconImage, ItemNameText, QuantityText Clickable generated item row. Parent class should be SoulsInventoryItemWidget.
Details SelectedItemIcon, SelectedItemNameText, SelectedItemTypeText, SelectedItemQuantityText, SelectedItemDescriptionText Shows the currently selected item.
Equipment RightHandWeaponText, LeftHandWeaponText, QuickItemText Displays the currently equipped item slots.
Actions EquipButton, UseButton, DropButton, CloseButton Runs item actions or closes the inventory screen.
HUD Entry InventoryButton Button in WBP_SoulsMobileHUD that will open the inventory.

Core Classes

Class Use Buyer Setup
SoulsItemDataAsset Defines item name, icon, description, type, stack size, value, weapon class, and heal amount. Create one Data Asset per weapon, consumable, key item, or currency reward.
SoulsInventoryComponent Stores stacks and equipped item references, with Blueprint events for UI updates. Already created on SoulsCharacterBase.
SoulsItemPickup Level actor that adds an item to the overlapping player's inventory. Create BP_ItemPickup, assign Item and Quantity, then place it in the map.
SoulsInventoryWidget Planned UI foundation for item tabs, item details, equipment readouts, equip/use actions, and close behavior. Create WBP_SoulsInventory from this class when the UI foundation is available.
SoulsSaveGame Saves inventory stacks, right-hand weapon, and quick item references. Use the existing Bonfire save flow or call Save Inventory Snapshot.
Current scope: this is the first professional inventory foundation. The screen can open, show real items, select rows, filter by tab, equip and unequip weapons, use supported consumables, and drop allowed unequipped items. Full comparison panels, shield combat, spell casting, and advanced item grids remain later polish.

WORLD LOOP

Interaction & Pickups Blueprint Ready

A shared interaction flow for loot, bonfires, doors, and future world objects.

What This System Does

The player can now interact with nearby world actors through one shared flow. Pickups, bonfires, and doors use the same interaction base, so new objects can be added without rebuilding input logic.

  • Shared Base: use SoulsInteractable for any object the player can activate.
  • Player Input: assign Interact Action on the player, then call Try Interact.
  • Prompt Text: each object can return its own text through Get Interaction Prompt.
  • Manual Loot: pickups can be collected by interact instead of only overlap.
  • Bonfire Rest: bonfires can rest/save from the same interact button.
  • Door Example: SoulsDoorInteractable gives a simple open/close world object.

Quick Setup: Interact Input

1 Create an input action named IA_Interact.

2 Add it to your player input mapping, for example IMC_SoulsPlayer.

3 Open your player Blueprint and assign IA_Interact to Interact Action.

4 Press the mapped button near a pickup, bonfire, or door. The player will choose the closest valid interactable inside its radius.

Death Souls Recovery Marker

When the player dies, they drop their current souls at their location. This creates a recovery marker that must be collected before dying again, or the souls are lost forever.

  • ASoulsDroppedSoulsPickup: The specific class used for death recovery. It stores the DroppedSoulsAmount initialized by the death flow.
  • Double Death: If the player dies again before recovering their souls, the existing marker is destroyed and replaced by a new one representing the souls held at the second death.
  • Configuration: In the Player Blueprint, toggle bDropSoulsOnDeath and adjust SoulsDropOffset.

Vendor Stock Persistence

Merchants and Vendors support limited stock stacks that persist through the AAA Save System.

  • Unique ID Required: Every placed Vendor NPC must have a unique PersistentId and bSaveState enabled to track stock correctly.
  • Stock Snapshots: When saving at a Bonfire or via manual snapshot, the vendor captures its current runtime stock state.
  • Deselection: If a limited stock item reaches 0, the UI automatically prevents further purchases and can display a "Sold Out" state.
  • Autosave on Transaction: Enable bAutoSaveOnSuccessfulTransaction to write the world and player state to disk immediately after a successful purchase or sale. Otherwise, changes are only saved by a Bonfire or manual snapshot.
  • Debugging: Enable bEnableVendorDebugLogs on the Vendor NPC to track stock snapshots and restoration in the Output Log.

Placed Souls Rewards (World Loot)

For rewards placed in the world by designers (e.g., hidden soul items), use the ASoulsCurrencyPickup class.

  • Persistence: Placed soul pickups are persistent. Use bSaveState and a unique PersistentId to ensure they don't respawn after collection.
  • Custom Amounts: Unlike the death marker, placed pickups have a designer-defined SoulsAmount.
  • Autosave on Collect: Enable bAutoSaveOnInteractComplete to write the collected state to disk immediately. Otherwise, the state is only saved during a Bonfire rest or manual snapshot.
  • Avoid Markers: Do not use ASoulsDroppedSoulsPickup or BP_SoulsRecovery for placed world rewards, as they are tuned for the death recovery flow.

Dialog Rewards (Souls & Items)

NPC Dialogs can grant souls and items upon completion via the Dialog Data Asset.

  • Granting Souls: Managed by the OptionalRewardSouls property. Rewards are added directly to the player's active stats.
  • One-time Rewards: Set GiveRewardOnce to true. The system captures the first-time completion state to prevent reward duplication.
  • Completion Save: Ensure bSaveDialogCompletion is enabled on the NPC and a PersistentDialogId is set to track state across restarts.
  • Debugging: Enable bEnableDialogDebugLogs on the Dialog NPC to verify reward eligibility and delivery in the Output Log.

Manual Loot Pickup

Use this when you want loot to stay on the ground until the player presses the interact button.

1 Open your pickup Blueprint based on SoulsItemPickup.

2 Disable Pickup On Overlap.

3 Set Interaction Radius to a comfortable value such as 150 or 180.

4 Walk near the pickup and press Interact. The pickup disappears only after the item is added to inventory.

5 For enemy loot, use a pickup class with overlap disabled if you want manual collection after death.

Bonfire Interaction

Bonfires still support quick overlap testing, but the normal Souls-like flow is manual rest.

1 Place your BP_Bonfire in the level.

2 Disable Auto Activate On Overlap for manual rest.

3 Keep Restore Stats On Rest and Save Immediately enabled for the normal checkpoint loop.

4 Approach the bonfire and press Interact. This activates the checkpoint, restores stats, and saves if enabled.

Door or Gate Example

1 Create a Blueprint from SoulsDoorInteractable, for example BP_Door.

2 Add a door mesh as a child of DoorRoot.

3 Leave Closed Relative Transform at the default closed position.

4 Set Open Relative Transform to the open rotation or offset you want.

5 Enable Can Close Again if the same button should close the door after opening.

6 Press Interact near the door to toggle it.

Locked Doors & Gates

Doors can now be configured as locked, requiring a specific SoulsItemDataAsset to open. This is intended as a small world-use foundation for keys, dungeon items, and special items.

1 Create or open a Blueprint based on SoulsDoorInteractable, for example BP_LockedGate.

2 Add your gate or door mesh under DoorRoot, then set Closed Relative Transform and Open Relative Transform.

3 Set bStartsLocked to true.

4 Assign RequiredKeyItem to DA_Item_Key or your own key data asset.

5 Optional but recommended: set RequiredUnlockId to match the key's UnlockId, such as Gate.CourtyardKey.

6 Customize LockedPromptText, UnlockPromptText, and MissingKeyMessage.

7 Listen for OnDoorUnlocked or OnDoorUnlockFailed for sound, VFX, UI feedback, or Blueprint-specific logic.

Door/Gate Field Purpose Example
bStartsLocked Initial lock state when the level starts. true
RequiredKeyItem The inventory item required to unlock. DA_Item_Key
RequiredUnlockId Optional designer ID check against the key data. Gate.CourtyardKey
bCanCloseAgain Whether the same gate can close after opening. false for a one-way Souls-like unlock.

Manual Validation: Key Door

Use this short checklist after placing BP_Key and BP_LockedGate in the showcase map.

Test Expected Result
Interact with the locked gate before picking up the key. The gate stays locked and OnDoorUnlockFailed can provide feedback.
Pick up BP_Key. DA_Item_Key appears in the inventory under Key Items.
Interact with the gate after collecting the key. The gate unlocks, opens, and fires OnDoorUnlocked.
Set bConsumeOnWorldUse to true, then unlock again. One key is removed from the player's inventory after the successful unlock.
Set bConsumeOnWorldUse to false, then unlock again. The key remains in the player's inventory after the successful unlock.
Place a normal unlocked door with no required key. Existing open/close door behavior still works normally.

Core Interaction Properties

Property Use Recommended Setup
Interaction Radius Distance where the object can be selected by player interact. Use 120-180 for loot, 180-250 for bonfires and doors.
Interaction Prompt Text returned by the interactable for UI prompts. Use short verbs like Pick Up, Rest, Open.
Can Interact Lets each object decide if it is currently usable. Override in Blueprint for locked doors, empty pickups, or disabled objects.
Interact Runs the actual action. Use it for pickup, rest, open door, talk, inspect, or activate.
UI note: the interaction prompt logic is ready. A visible on-screen prompt widget can be added later by reading Get Interaction Prompt from the closest valid interactable.

DEVELOPMENT TOOLS

Showcase Route Guide PRO TOOL

A visual helper to organize and validate your demo level path.

What This System Does

The ASoulsShowcaseRouteGuide is a development-only tool designed to help level designers build the "Perfect Souls Loop". It provides visual lines and points in the editor to represent the standard demo path.

  • Visual Path: Draws debug lines and spheres between key gameplay points.
  • Logical Points: Standardizes the "Bonfire -> Enemy -> Reward -> Return" flow.
  • Quick Validation: Check if all critical showcase actors are linked with one button.
  • Blueprint Friendly: Can be customized as BP_ShowcaseRouteGuide.

How to Use

1 Create a Blueprint from SoulsShowcaseRouteGuide, for example BP_ShowcaseRouteGuide.

2 Place it in your Showcase map.

3 Auto-Setup: Click Auto Discover Actors in the details panel to automatically link actors with tags: Bonfire, ShowcaseEnemy, ShowcaseReward, and ReturnPoint.

4 Alternatively, manually assign your actors to the properties: Bonfire Actor, Enemy Encounter Actor, etc.

5 Enable Show Route Debug to see the visual path in the editor viewport.

6 Click Validate Route Setup to check for missing assignments and view the total Route Total Distance in the details panel.

Configuration Details

Property Description Recommendation
Show Route Debug Toggles editor-time debug lines and spheres. Keep ON during map setup; OFF before final packaging.
Draw Route In Game If enabled, draws the route for a short time on BeginPlay. Useful for verifying the path during playtests.
Route Color The color of the debug visualization. Use Green or Yellow for high visibility.
Design Tip: Use the Arrow Components inside the actor to mark the intended spots if you haven't placed your actors yet. Once the real Bonfire or Enemy is in the map, link them to the properties to lock the path.
Visual Modes:
  • Developer Debug Mode: Uses Show Route Debug to draw persistent lines/spheres (ideal for precision).
  • Future Polish: a later pass can add premium 3D labels and directional arrows for demo presentations. The current MVP focuses on debug lines, spheres, and route validation.

CHECKPOINT SYSTEM

Bonfire & Save Lite Blueprint Ready

A simple Souls-like checkpoint flow for resting, saving, and returning the player to the last bonfire.

What This System Does

The kit includes a lightweight checkpoint system designed for fast production. Drop a Bonfire actor in the level, let the player activate it, and the project stores the checkpoint transform, souls value, HP percentage, and stamina percentage in a save slot.

  • Checkpoint: saves the Bonfire location and optional Checkpoint Id.
  • Rest: can restore HP and stamina when activated.
  • Save Slot: saves immediately by default, so the player can return to the same checkpoint later.
  • Auto Respawn: the player can automatically return to the last Bonfire after death.
  • Safe Revive: restores the character mesh from death/ragdoll state and gives a short invulnerability window.

Current Implemented Flow Verified

This is the working first production pass used by the showcase test. It is intentionally simple, but it already covers the full loop needed for a playable Souls-like prototype.

  • Bonfire activation: saves the respawn point using Player Respawn Offset, not the exact Bonfire center.
  • Player death: stops input, clears sprint/lock-on/combat state, then starts the death sequence.
  • Death presentation: can play a death montage, optional ragdoll, and optional respawn widget.
  • Respawn: teleports to last checkpoint, restores HP/stamina/souls snapshot, restores mesh pose, then returns control.
  • No checkpoint fallback: if no Bonfire was activated, the player returns to the original spawn transform.

Quick Setup: Place a Bonfire

1 Create a Blueprint from SoulsBonfire, for example BP_Bonfire.

2 Add your mesh, flame effect, light, and sound inside the Blueprint.

3 Set Interaction Radius to the distance where the player can rest.

4 Enable Auto Activate On Overlap for instant checkpoint testing, or keep it disabled and call Activate Bonfire from your interact button.

5 Keep Restore Stats On Rest and Save Immediately enabled for the normal Souls-like flow.

6 Adjust Player Respawn Offset so the player revives beside or in front of the Bonfire, not inside the Bonfire mesh.

Blueprint Flow

When Blueprint Node Result
Player interacts with Bonfire Activate Bonfire Saves checkpoint, stores player snapshot, restores stats if enabled, then writes the save slot.
Game starts Load Game From Slot Loads saved souls and last checkpoint data into the Game Instance.
Player dies Auto Respawn At Checkpoint After Checkpoint Respawn Delay, the player returns to the last Bonfire and restores saved HP/stamina values.
Player dies before touching Bonfire Spawn fallback Returns the player to the transform captured at BeginPlay, then restores stats.
Player respawns Respawn Invulnerability Duration Temporarily ignores damage so traps or damage volumes cannot instantly kill the player again.
New game / reset test Delete Save Game Deletes the current save slot and clears stored souls.
Recommended death setup: keep Auto Respawn At Checkpoint enabled for the fast setup. Use the On Player Death event only for fade, sound, camera shake, or a custom death screen.

Player Death Properties

Property Default Use
Auto Respawn At Checkpoint true Automatically restores the player at the last Bonfire when HP reaches zero.
Checkpoint Respawn Delay 1.25 Delay before teleporting back. Increase it if you play a longer death animation or fade.
Respawn Invulnerability Duration 1.5 Short safety window after respawn. Prevents instant re-death from traps, lava, or repeated damage triggers.
Player Death Montage None Assign the player's death montage here. Respawn waits at least until this montage duration finishes.
Use Death Ragdoll false Optional physical collapse after Ragdoll Delay. Keep disabled for simple montage-only death.
Ragdoll Delay 0.75 Time before ragdoll begins after death. Use it when you want the death montage to start before physics takes over.
Respawn Widget Class None Optional widget shown during the death/respawn delay. Use this for a simple "You Died" or revive fade screen.
On Player Death Blueprint Event Optional event for UI, sound, camera shake, or screen fade before the respawn happens.
On Player Respawned Blueprint Event Optional event for respawn sound, camera fade-in, VFX, or restoring custom Blueprint state.

Bonfire Properties

Property Default Use
Checkpoint Id None Optional name for this Bonfire. Useful for UI text, map logic, or debugging.
Interaction Radius 180 Size of the overlap sphere used for activation range.
Auto Activate On Overlap false Great for testing. Disable it when you want a manual interact button.
Restore Stats On Rest true Restores HP and stamina when the Bonfire is activated.
Save Immediately true Writes the save slot as soon as the Bonfire is activated.
Player Respawn Offset X 120, Z 90 Local offset from the Bonfire used as the revive position. Rotate the Bonfire to control the facing direction.

Production Tip

Keep the first Bonfire version simple: activation, visual feedback, save, and respawn. Add menus, fast travel, level-up, and enemy reset later only after the combat loop feels stable.

Simple Respawn Widget

No-Button Death Screen

The respawn widget is optional and does not need buttons. A clean first version is just a fullscreen black overlay with centered text. The character system adds it on death and removes it automatically after respawn.

1 Create a Widget Blueprint, for example WBP_Respawn.

2 Add a fullscreen black Image or Border with partial opacity.

3 Add centered text such as YOU DIED.

4 Optional: add a fade-in animation inside the widget.

5 Assign it to Respawn Widget Class on the player Blueprint.

Fast Damage Test Volume

Testing Death and Respawn

Create a Blueprint from SoulsDamageVolume and place it near the Bonfire. This gives you a clean way to test damage, death, and checkpoint respawn without waiting for enemy attacks.

1 Create BP_DamageVolume from SoulsDamageVolume.

2 Scale the DamageBox so the player can walk into it.

3 Set Damage Amount to 25 for normal testing, or 999 to test instant death.

4 Keep Player Only enabled if you do not want enemies to take trap damage.

5 Enable Damage Over Time if the volume should hurt the player repeatedly while standing inside.

Damage Volume Properties

Property Default Use
Damage Amount 25 Damage applied when the player enters or remains in the volume.
Damage On Begin Overlap true Applies damage as soon as the player enters the box.
Damage Over Time false Applies repeated damage while the player stays inside. Useful for lava, poison, traps, or kill zones.
Damage Interval 0.5 Tick rate for repeated damage when Damage Over Time is enabled.
Per Actor Damage Cooldown 1.0 Prevents the same actor from being damaged every frame by the same volume.
Player Only true Limits damage to the player so enemies are not accidentally killed by testing volumes.
One Shot false Disables the volume after the first successful damage event.
Testing note: always activate a Bonfire before testing death if you want checkpoint respawn. If no Bonfire was activated, the character uses the original player spawn as a fallback.

PROGRESSION LOOP

Souls Economy & Recovery MVP

A compact souls reward, death drop, and recovery loop for a playable Souls-like foundation.

What This System Does

Enemies can now award souls when killed. If the player dies while carrying souls, the player drops a recovery pickup, respawns at the checkpoint with zero carried souls, and can recover them by returning to the drop. If the player dies again before recovery, the old pickup is destroyed and those old souls are permanently lost.

  • Enemy Reward: set Soul Reward on enemy Blueprints.
  • Death Drop: player can spawn a recoverable souls pickup on death.
  • Recovery: pickup can be recovered by Interact or by overlap.
  • Double Death Loss: only the latest dropped souls marker can be recovered.
  • Checkpoint Loop: player respawns at bonfire while dropped souls stay in the world.
  • HUD Counter: WBP_SoulsMobileHUD can show the live souls value through SoulsText.

Quick Setup: Enemy Souls Reward

1 Open an enemy Blueprint.

2 In Souls > Enemy > Souls Reward, enable Award Souls On Death.

3 Set Soul Reward to the amount the player receives, for example 25 for a weak enemy.

4 Keep Award Souls For Training Dummy disabled unless the dummy is being used for economy testing.

5 Kill the enemy. The attacking player receives the reward immediately.

Quick Setup: Player Death Recovery

1 Open the player Blueprint.

2 In Souls > Player > Souls Recovery, enable Drop Souls On Death.

3 Leave Souls Recovery Pickup Class empty to use the default recovery pickup, or assign your own visual Blueprint.

4 Keep Recover Dropped Souls On Overlap disabled if you want the player to press Interact.

5 Die while carrying souls. The player drops a recovery pickup and respawns with zero carried souls.

6 Return to the pickup and press Interact to recover the dropped amount.

Souls Recovery Grace Period

To prevent the "Instant Recovery" bug where the player accidentally collects their souls immediately upon death, the system now implements a mandatory spawn grace period.

  • Recovery Grace Period: Default 0.75s. Configurable in the souls recovery pickup class.
  • Overlap Protection: During the grace period, the pickup ignores all overlap events.
  • Living Player Safety: Only living players can recover souls. This prevents the dead body from accidentally consuming the souls before the respawn flow is complete.
  • Post-Grace Check: When the timer expires, the pickup automatically checks for overlapping players, ensuring smooth recovery even if the player remains stationary.
  • Debug Logs: The system now logs the specific class and location of each spawned marker, such as [Souls] Dropped Souls Recovery Marker! Class: BP_SoulsDroppedSoulsPickup at [Location].
Developer Tip: Assign your own visual Blueprint to Souls Recovery Pickup Class in the character defaults to customize the look of the recovery marker.

Soul Loss on Double Death

To maintain the challenge of the Souls-like loop, failing to recover your souls before dying again results in the permanent loss of the previous souls.

  • The Rule: Only the most recent souls dropped are recoverable.
  • Double Death: If the player dies while a souls marker is already in the world, the old marker is destroyed instantly before the new one spawns.
  • No Stacking: Souls markers do not stack. The player must choose between safety and the risk of recovering their previous cache.
  • Example: die with 10 souls, earn 10 more, then die again before recovery. The first 10 are lost, and the new marker contains only the latest 10.

Bonfire Level Up Lite

Spend your hard-earned souls at any bonfire to permanently increase your character's power. This system provides a clean C++ foundation for RPG progression.

Upgradable Stats:
  • Max HP: Increases total health pool.
  • Max Stamina: Increases stamina for more actions.
  • Attack Power: Multiplies all weapon damage.
Cost Formula:

Cost = BaseCost * (Growth ^ CurrentLevel)
Default: 50 souls starting cost with 1.5x growth per level.

How to Implement UI:

The bonfire now broadcasts OnBonfireLevelUpAvailable when activated. Link your Level Up Widget to this event and use these functions:

  • InitializeLevelUpWidget(Actor)
  • RefreshLevelUpValues()
  • UpgradeHPFromWidget()
  • UpgradeStaminaFromWidget()
  • UpgradeAttackFromWidget()
  • CloseWidget()
Persistence: Upgrade levels are automatically saved to SoulsSaveGame and restored when respawning or loading the game.
Game Pause: Opening the Level Up UI automatically pauses the game world to prevent enemy attacks while leveling.
Bonfire Troubleshooting: If the Bonfire does not activate or show UI:
  • Check Debug Logs: Enable Show Bonfire Debug Logs in the Bonfire details to see real-time overlap and interaction events.
  • Interaction Mode: If Auto Activate On Overlap is OFF, you MUST press your Interact button near the bonfire.
  • Collision: Ensure the Player Character has Generate Overlap Events enabled on its Capsule Component and is on the Pawn collision channel.
  • Widget Assignment: Double-check that Level Up Widget Class is set to WBP_BonfireLevelUp.
  • Save Game: Ensure your SoulsGameInstance is correctly set in Project Settings, as the bonfire relies on it for saving and snapshots.
UI Widget Setup:

Create a Widget Blueprint WBP_BonfireLevelUp inheriting from SoulsBonfireLevelUpWidget. You MUST name your components exactly as follows for C++ binding:

Category Name Type
Currency SoulsCountText TextBlock
HP HPLevelText, HPCostText, HPUpgradeButton Mixed
Stamina StaminaLevelText, StaminaCostText, StaminaUpgradeButton Mixed
Attack AttackLevelText, AttackCostText, AttackUpgradeButton Mixed
System CloseButton Button
Clean UI focus: the Level Up widget is made focusable in C++ and the Bonfire flow focuses CloseButton when the menu opens. Closing the menu uses guarded removal so repeated open/close tests do not create InputMode:UIOnly or RemoveFromParent warnings.

Quick Setup: HUD Souls Counter

1 Open WBP_SoulsMobileHUD.

2 Add or select the Text Block used for souls display.

3 Name it exactly SoulsText.

4 Compile and save the widget. No extra graph logic is required for the basic counter.

5 Kill an enemy, die with souls, or recover dropped souls. The number should update automatically.

Recommended Test

Step Expected Result
Activate a bonfire, then kill one enemy with Soul Reward above zero. The player's souls value increases.
Walk into a damage volume or let an enemy kill the player. A souls recovery pickup appears near the death location.
Respawn at the bonfire. The player returns safely with zero carried souls.
Go back to the recovery pickup and press Interact. The dropped souls return to the player and the pickup disappears.
Die with souls, skip recovery, earn more souls, then die again in a different location. The first recovery pickup is destroyed. Only the newest pickup can be recovered.
Activate a bonfire with enough souls and open Level Up. The player can spend souls on Max HP, Max Stamina, or Attack Power, and the upgrades persist through save/respawn.
MVP scope complete: the progression loop now supports earning souls, dropping them on death, losing old dropped souls on double death, recovering the latest marker, and spending souls on bonfire upgrades.

RPG FOUNDATION

Inventory UI Reference

A full-featured C++ foundation for inventory management, equipment, and item usage.

What This System Does

The USoulsInventoryWidget provides a premium C++ bridge to the existing inventory backend. It handles item filtering by tabs, selection details, and provides native hooks for equipping weapons or using consumables.

  • Tabbed Navigation: Filter items into Weapons, Consumables, and Key Items.
  • Detail Panel: Displays item names, descriptions, icons, and quantities automatically.
  • Equipment Slots: Visual feedback for Right Hand, Left Hand, and Quick Item slots.
  • Action Hooks: Native C++ support for selected item action states, with gameplay actions ready to extend.
  • Blueprint Friendly: Inherit from USoulsInventoryWidget to build your visual design.

1. Component Bindings

When creating your WBP_SoulsInventory, use these exact names for the UI components to enable C++ auto-binding. This section is a compact technical reference; the main setup flow lives in the Inventory & Equipment section above.

2. Paired Offhand Items

The inventory system now supports paired off-hand items (e.g., dual swords or sword-and-shield combos). This is configured directly on the weapon's SoulsItemDataAsset.

  • bSupportsPairedOffhandItem: Enable this to allow offhand pairing (only visible on One-Handed weapons).
  • PairedOffhandItem: The secondary item to equip.
  • bAutoEquipPairedOffhand: If true, equipping the main weapon will automatically add (if missing) and equip the paired offhand item to the left hand.
  • bPairedOffhandCanBeUnequipped: If false, the offhand item is locked while the main weapon is equipped. Unequipping the main weapon will automatically clear the offhand.

3. Input Action Setup

The inventory is now toggled via the Enhanced Input System. Ensure you have an IA_Inventory action assigned to the InventoryAction property on your character class, and map it in IMC_SoulsPlayer (e.g., Keyboard I and Gamepad Special Right).

Category Name Type
Lists ItemsList, WeaponsList, ConsumablesList, KeyItemsList PanelWidget
Details SelectedItemNameText, SelectedItemIcon TextBlock / Image
Equipment RightHandWeaponText, QuickItemText TextBlock
Buttons EquipButton, UseButton, DropButton, CloseButton Button
Tabs TabAllButton, TabWeaponsButton, TabConsumablesButton, TabKeyItemsButton Button

4. Item Entry Blueprint

Create WBP_SoulsInventoryItemEntry with parent class SoulsInventoryItemWidget. This Blueprint is the visible row used by the C++ inventory widget when it generates item entries.

  • Required child names: EntryButton, ItemIconImage, ItemNameText, and QuantityText.
  • Critical: The EntryButton must have Is Variable enabled in Blueprint for C++ binding.
  • Click Reliability: Ensure that ItemNameText, QuantityText, and ItemIconImage are set to Hit Test Invisible. This prevents them from blocking mouse clicks meant for the EntryButton behind them.
  • Use a row height around 44 and avoid fixed width so entries fill the list.
  • Set ItemEntryClass on WBP_SoulsInventory to this Blueprint class.
  • Put the four list widgets in one shared Overlay and collapse inactive lists during tab switches.

5. Logic Hooks

The system provides several BlueprintImplementableEvents to help you customize the visual behavior:

  • OnInventoryInitialized: Called when the widget is first opened.
  • OnInventoryRefreshed: Called after items are re-filtered or updated.
  • OnSelectedItemChanged: Triggered when a player selects a new item.
  • OnInventoryTabChanged: Triggered when switching between category tabs.
Mobile HUD Integration: To open the inventory, simply add an InventoryButton to your HUD and bind it to OnInventoryPressed in C++ or Blueprint.

6. Drop Confirmation Dialog

For rare weapons, story items, or any item that should not be dropped by accident, enable bRequireDropConfirmation on the item's SoulsItemDataAsset. Then assign a confirmation widget to ConfirmationDialogClass on WBP_SoulsInventory.

  • Create a Widget Blueprint that inherits from SoulsConfirmationDialog.
  • Required child names: TitleText, MessageText, ConfirmButton, and CancelButton.
  • Enable Is Variable for each required child so the C++ class can bind to it.
  • Use large touch-friendly buttons and keep Cancel visually distinct from Confirm.
  • Cancel closes only the dialog and keeps the item. Confirm executes the normal inventory drop flow.

Common Troubleshooting

  • Buttons not clickable on first open: This usually happens if multiple category lists (e.g., ItemsList and WeaponsList) are overlapping and both are set to Visible in the Blueprint. The system automatically collapses inactive lists via SetInventoryTab, but ensure your default Blueprint visibility isn't blocking input.
  • Data not showing in row: Verify your WBP_SoulsInventoryItemEntry inherits from SoulsInventoryItemWidget and the variable names match exactly.
  • Drop confirmation does not open: Verify the item has bRequireDropConfirmation enabled, the inventory widget has ConfirmationDialogClass assigned, and the dialog Blueprint inherits from SoulsConfirmationDialog.
  • Debug Logs: Enable bEnableDebugLogs on the inventory widget and filter the Output Log by [INV_DEBUG] to see real-time initialization and selection states.

WORLD MODULES

RPG World Modules

Foundational RPG systems including containers, loot boxes, and bonfire storage.

1. Chest & Container Logic

The ASoulsContainerInteractable provides a professional base for world containers that grant loot and persist their state.

  • Loot Granting: Automatically adds a list of items to the player's inventory upon opening.
  • One-Time Use: Configurable persistence ensures chests stay opened across deaths and reloads.
  • Interaction: Uses the shared interaction flow for a seamless world experience.
  • Persistence ID: Each chest uses a unique ContainerId to track its state in the SoulsSaveGame.

2. Bonfire Storage Box

Enable players to manage their inventory at bonfires by depositing or withdrawing items using the ASoulsStorageBoxInteractable.

  • Deposit/Withdraw: Transfer items between player inventory and persistent storage.
  • Stack Management: Automatically merges stacks and handles item quantities correctly.
  • Persistence: Storage content is saved to a global map in SoulsSaveGame, accessible from any storage box with the same StorageId.
  • Blueprint Hooks: Includes OnStorageChanged, OnDepositFailed, and OnWithdrawFailed events for UI updates.

3. Interaction Prompt HUD

Dynamic visual feedback that informs the player when they are within range of an interactable object, supporting both mobile and keyboard inputs.

  • Proximity Focus: Automatically detects the nearest interactable and updates the HUD prompt (e.g., "Press E to Rest").
  • Contextual Text: Prompts change based on the object state (e.g., "Open Chest" vs "Opened").
  • Seamless Integration: Integrated directly into USoulsMobileHUD for consistent performance.
  • Mobile Ready: Enables/Disables interaction buttons dynamically based on proximity focus.

Setup Checklist: World Containers & HUD

Check Expected Result
Place BP_ChestHUD prompt displays "Open Chest" when nearby.
Open ChestLoot is added to player inventory, chest state becomes "Opened", HUD prompt hides.
Reload MapChest remains "Opened"; prompt doesn't appear or says "Already Opened".
Bonfire RestStats and inventory are snapshotted; player returns to this point after restart.
Access StorageUI hooks trigger, allowing deposit/withdraw calls.
Persistence Foundation: Both systems are fully integrated with the SoulsSaveGame. OpenedContainerIds tracks which world chests are spent, while SavedStorages manages all stored items by unique ID. Player state (Souls, Level, Inventory) is snapshotted at Bonfires.

VISUAL FEEDBACK

Floating Damage UI AAA

Complete guide to creating and customizing floating combat text.

The Souls Floating Text system is designed for high-performance mobile rendering. It uses a dynamic Screen-Space Widget Component that automatically tracks hit locations while providing smooth, cinematic animations.

AAA Spacing: To prevent "Number Overlap", the system automatically calculates a random horizontal offset (+/-40 units) for every hit, ensuring that fast combos are visually readable and feel premium.

1. Blueprint Creation & Logic Schematic

1 Create a Widget Blueprint (Parent: SoulsFloatingText) and add a Text Block named DamageText.

2 Implement the Logic Schematic shown below to handle critical hits and animations.

Initialization
OnTextInitialized
  • Value (Float) ->
  • Color (Linear) ->
  • Is Critical ->
Data Prep
SetText (Damage)

Conv_DoubleToText is used to format the float into DamageText.

Logic
Branch
True (Critical) ->
False (Normal) ->
Critical Path
Styling (2.0x)

Sets Pink Color & Scale to 2.0

Normal Path
Styling (1.0x)

Sets Input Color & Scale to 1.0

FX Phase
Play Animation

Triggers the 'Fade' UI Sequence.

Cleanup
Delay & Safe Remove
  • Duration: 1.1s
  • Action: Safe Remove Parent

2. Visual Implementation Guide

Follow these professional layouts to finalize your Blueprint logic and ensure proper memory cleanup.

Clean removal: widgets based on SoulsUserWidget expose SafeRemoveFromParent(). Use it for floating text or any widget managed by a WidgetComponent; it checks whether the widget is actually in the viewport or has a parent before removing it, avoiding noisy UMG warnings during repeated playtests.
Logic Initialization

Step 1: Data Initialization

Animation & Cleanup

Step 2: Animation & Memory Management

3. Global Integration (Final Step)

Link your finalized Widget to characters to enable global damage tracking.

Character Configuration

  • Damage Text Class: Assign your WBP_FloatingText in BP_SoulsCharacter or BP_SoulsEnemy.
  • Bone Name: Recommended: head or spine_03.
  • Optimization: The system automatically pools and destroys these widgets to prevent performance drops.

4. Mobile Interface Base (SoulsUserWidget)

All core UI elements in the kit inherit from SoulsUserWidget, providing native support for mobile optimization and cinematic transitions.

Safe Zone Support

Automatically calculates screen padding for modern mobile devices with notches or rounded corners.

Unified Animations

Provides PlayFadeIn and PlayFadeOut hooks that can be called from C++ or Blueprint to ensure consistent UI feel.

Input Handling

Native support for touch interactions, preventing input "bleed-through" to the game world while UI is active.

Pro Tip: Use SoulsUserWidget as the parent for your menus, health bars, and inventory screens to maintain the premium glassmorphism aesthetic and performance.

MOBILE UX

Souls Mobile Move Stick Widget PRO

The USoulsMobileMoveStickWidget is a C++ foundation for creating high-performance virtual joysticks. It handles normalized 2D input vectors, deadzones, and radius clamping natively, ensuring smooth character movement on mobile devices.

How to Use

  • Create a Widget Blueprint parented to SoulsMobileMoveStickWidget.
  • Bind StickThumb and StickBackground to Image widgets.
  • Adjust StickRadius and DeadZone in the details panel.
  • Use OnMoveInputChanged to drive character movement.

Technical Features

  • Input Vector: Returns a normalized FVector2D for movement.
  • Radius Clamping: Prevents the thumb from leaving the designated area.
  • Auto-Reset: Smoothly returns to center using ThumbReturnSpeed.
  • Invert Y: Optional toggle for specialized control schemes.

ARCHITECTURE

Data-Driven Action System

A lightweight, extensible system for managing character actions and combat rules.

The Action System provides a standardized way to define and execute character actions like attacks, dodges, and interactions. It separates logic (C++) from data (Blueprints/Data Assets), allowing for rapid iteration without code changes.

Why not GAS? This system is designed to be lightweight, high-performance, and easy to debug, specifically tailored for mobile Souls-like games without the complexity of Gameplay Abilities.

1. Hardened Action State Management

The system is designed to be extremely resilient, ensuring your character never gets "stuck" in a busy state.

  • Automatic Cleanup: Actions are automatically finished when their associated montage ends, even if interrupted by other logic.
  • Fail-Safe Timeout: If an action somehow fails to report completion, a background fail-safe timer (Montage Length + 0.5s) will automatically clear the busy state.
  • Montage Control: Use the bActionSystemPlaysMontage flag on your Data Asset to choose whether the Action System should play the montage itself or just act as a validation/cooldown wrapper.
Core action rule: for existing combat actions such as Light Attack, Heavy Attack, Dodge, Block, Interact, and Use Quick Item, keep bActionSystemPlaysMontage set to false. These actions use the Action System for validation, stamina cost, cooldown, and buffering, while the existing Combat/Dodge systems continue to play their own montages. This prevents double montage playback and avoids stuck-busy input states.

2. Creating an Action Data Asset

1 Right Click in Content Browser -> Miscellaneous -> Data Asset.

2 Select SoulsActionDataAsset as the class.

3 Name it (e.g., DA_Action_LightAttack).

4 Configure stamina cost, cooldown, montage, and validation rules.

3. Component Responsibilities

Field Description
ActionId Unique identifier used for cooldown tracking and logic.
ActionMontage The animation montage to play when the action starts.
StaminaCost Amount of stamina consumed upon successful commitment.
Cooldown Time in seconds before the action can be used again.
bCanBeBuffered If true, the action can be queued while another is active.

4. Global Integration

Assign your Action Data Assets to the character's Action System category to enable the data-driven behavior. Existing input functions will automatically check these assets before executing logic.

Seamless Fallback: If no action asset is assigned to a specific slot (e.g., Dodge), the character will still perform the legacy hard-coded behavior, ensuring your project never breaks during migration.

5. Weapon Action Overrides

Equipped weapons can override the character's default action assets. This allows for unique stamina costs, cooldowns, and montages per weapon type.

How Overrides Work

  • Priority 1: The system checks the currently equipped weapon's Action Overrides category.
  • Priority 2: If the weapon override is empty, it falls back to the character's default action asset.
  • Priority 3: If both are empty, the legacy hard-coded combat logic is executed.

6. Weapon Abilities (Foundation)

The system includes a dedicated hook for Weapon Abilities (Weapon Arts). You can trigger these via the TryWeaponAbility function on the character.

Setup steps:

  1. Create a SoulsActionDataAsset with ActionType = WeaponAbility.
  2. Assign it to the Weapon Ability Action slot on your Weapon Blueprint.
  3. Call TryWeaponAbility from your input handling or HUD button.

7. Manual Validation

Test Expected Result
Press Dodge several times during PIE. Dodge may respect cooldown, but the character should never stay permanently busy.
Use Dodge, then Light Attack and Heavy Attack. Each action can start after its normal rules allow it; no repeated Character is busy lockout.
Set a core action to bActionSystemPlaysMontage = false. The legacy combat or dodge montage still plays, while the Action System handles rules and cooldown.
Assign a weapon action override on a weapon Blueprint. The equipped weapon action is used before the character default action.
Clear the weapon override. The character default action is used. If that is also empty, legacy behavior still works.

COMBAT DEPTH

Status Effects & Buffs

Reference for buildup effects, timed buffs, HUD icons, inventory effect details, weapon status, radial timers, and professional stacking rules.

System Overview

The system is split into Status Effects and Buffs. Status Effects are buildup-triggered gameplay states such as Poison, Bleed, Burn, Frost, Stun, or Custom effects. Buffs are timed stat modifiers such as Attack Up, Defense Up, Stamina Regen Up, Move Speed Up, or Custom designer-defined effects.

All core logic lives in C++ for stability and performance, while designers tune behavior through Data Assets and Blueprint widgets. The system connects weapons, consumables, HUD feedback, inventory details, and stack behavior into one reusable foundation.

  • Status Effects: Track buildup, decay buildup over time, trigger when the threshold is reached, optionally deal damage over time, and optionally stack.
  • Buffs: Apply timed gameplay modifiers to Max HP, Max Stamina, Attack Power, Defense, Stamina Regen, Move Speed, or Custom logic.
  • Inventory Use: Consumables can heal, apply a buff, cleanse one status effect, or cleanse all negative status effects.
  • Weapon On-Hit Status: Weapons can apply status buildup on light and heavy hits through weapon Blueprint defaults.
  • HUD Feedback: Active buffs and triggered statuses appear as icons with remaining seconds, optional stack text, and optional radial expiry overlay.
  • Inventory Details: Selected items show healing, buffs, cleanses, stack rules, and weapon on-hit status information.
  • Professional Stacking: Re-applying an effect can do nothing, refresh duration, extend duration, increase stack count, or increase magnitude depending on each Data Asset.

1. Status Effect Data Asset

1 Create a Data Asset of type SoulsStatusEffectDataAsset. Recommended folder: Content/SoulsMobileKit/Data/Effects.

2 Name it clearly, for example DA_Status_Poison, DA_Status_Bleed, DA_Status_Burn, or DA_Status_Frost.

3 Configure identity, buildup, damage, rules, HUD stack display, and debug fields.

Property What It Does Designer Guidance
EffectIdStable internal ID used for logs and matching.Use simple IDs like Poison, Bleed, or Burn.
DisplayNameName shown in UI and inventory details.Keep it short for mobile readability.
EffectTypeClassifies the effect as Poison, Bleed, Burn, Frost, Stun, or Custom.Use Custom for project-specific effects.
IconTexture shown in WBP_SoulsEffectIcon.Use high-contrast square icons.
DescriptionHuman-readable explanation shown to designers/players.Describe the gameplay result.
bUsesBuildupIf true, hits fill a buildup meter before the status triggers.Usually true for Poison, Bleed, Burn, and Frost.
BuildupThresholdAmount required before the status becomes active.100 is a good starting value.
BuildupDecayPerSecondHow fast untriggered buildup falls over time.Higher decay makes the status harder to trigger.
TriggerDurationHow long the active status remains after it triggers.Longer for Poison, shorter for burst-like effects.
bClearBuildupOnTriggerClears buildup after the status activates.Usually true to avoid instant repeated triggers.
bDealsDamageOverTimeAllows the active status to deal repeated damage ticks.Enable for Poison or Burn.
DamagePerTickDamage applied each tick while the status is active.Start small and tune upward.
DamageTickIntervalSeconds between DOT ticks.1.0 second is easy to read and tune.
bDamageIgnoresBlockIf true, DOT damage bypasses block.Good for poison pressure; disable if shields should counter it.
bRemoveOnDeathClears the status when the owner dies.Usually true.
bDebugEffectEnables effect-specific debug output when supported.Use while tuning, then disable.

2. Buff Data Asset

1 Create a Data Asset of type SoulsBuffDataAsset. Recommended folder: Content/SoulsMobileKit/Data/Effects.

2 Name it clearly, for example DA_Buff_AttackUp, DA_Buff_StaminaRegen, DA_Buff_DefenseUp, or DA_Buff_MoveSpeed.

3 Add one or more Modifiers. Each modifier has ModifierType, AdditiveValue, and MultiplierValue.

4 Set Duration. Use a positive duration for temporary buffs. Use 0 only for infinite/manual clear behavior.

Property What It Does Designer Guidance
BuffIdStable internal ID used for logs and matching.Use names like AttackUp or StaminaRegen.
DisplayNameName displayed in inventory and HUD contexts.Keep it short.
IconTexture shown in the active effect HUD.Use a clear icon silhouette.
DescriptionExplains the buff in human-readable text.Example: Temporarily increases attack power.
DurationHow long the buff lasts.15-30 seconds is a good starting range for consumables.
ModifiersArray of stat changes applied while active.Use one modifier for simple buffs, multiple for rare special items.
ModifierTypeTarget stat: MaxHP, MaxStamina, AttackPower, Defense, StaminaRegen, MoveSpeed, or Custom.Use Custom only when your own logic reads it.
AdditiveValueFlat stat increase or decrease.Example: +10 Max Stamina.
MultiplierValueMultiplies the target stat.1.2 means +20%.
bRemoveOnDeathRemoves the buff on death.Usually true for Souls-like flow.

3. Professional Stat Modifier System

The system features a robust C++ back-end for real-time stat modification using a non-destructive calculation logic:

  • Stat Types: Supports Max HP, Max Stamina, Attack Power, Defense, Stamina Regen, and Move Speed.
  • Calculation Logic: Uses (BaseValue + TotalAdditive) * TotalMultiplicative for all stat calculations, ensuring predictable outcomes.
  • Stacking Awareness: Modifiers automatically scale with stack count if bScaleMagnitudeWithStacks is enabled in the Buff Data Asset.
  • Safety & Cleanup: Modifiers are keyed by BuffId. When a buff expires or the owner dies, modifiers are cleanly removed, preventing permanent "stat leaking" or corruption.
  • Real-time UI: Any change to Max HP or Max Stamina triggers a UI broadcast to the Mobile HUD. The HealthTXT and StaminaTXT elements are automatically updated to reflect the Effective Max values (e.g., displaying "1200 / 1200" instead of the base "1000 / 1000" while the buff is active).

4. Professional Stacking Rules

Both SoulsBuffDataAsset and SoulsStatusEffectDataAsset use ESoulsEffectStackPolicy. This is the core setting that decides what happens when the same buff/status is applied again while already active.

Stack Policy What Happens On Re-Apply Best Use Case
NoneThe second application is ignored if the effect is already active.Unique buffs, boss mechanics, one-at-a-time special states.
RefreshDurationRemaining time resets back to the Data Asset duration.Safe default for Attack Up, Defense Up, Stamina Regen.
ExtendDurationBase duration is added to current remaining time. MaxExtendedDuration can cap it.Consumables that should last longer when reused without becoming stronger.
IncreaseStacksStack count increases up to MaxStacks. Duration behavior is controlled by the refresh/extend toggles.Layered poison, frost pressure, repeated status effects.
IncreaseMagnitudeStack count increases up to MaxStacks, and power can scale when bScaleMagnitudeWithStacks is enabled.Rare high-risk buffs, stronger DOT stacks, special RPG effects.

Stacking Properties

  • MaxStacks: Maximum stack count. Use 1 for effects that should not show x2/x3.
  • bRefreshDurationOnStack: When a stack is added, reset duration to the base duration.
  • bExtendDurationOnStack: When a stack is added, add base duration to the current remaining duration.
  • MaxExtendedDuration: Maximum duration allowed after extension. 0 means no cap.
  • bScaleMagnitudeWithStacks: Allows stack count to increase strength. Leave false for most balanced attack buffs.
  • StackMagnitudeMultiplier: Strength multiplier used when magnitude scaling is enabled.
  • bShowStackCountInHUD: Allows the HUD icon to show stack text. It still hides when stack count is 1.
  • StackDisplayFormat: Text format for stack display. Default: x{0}.
Balance Rule: Do not assume x3 always means three times stronger. The designer decides this per Data Asset. One buff can extend duration only, another can increase value, and a third can do both through the stack policy and scaling toggles.

4. Combat Integration

Apply status buildup directly through weapons or enemy attacks. Equipped weapons now have dedicated properties for status effects.

Property Description
Status Effect On Hit The SoulsStatusEffectDataAsset used when this weapon hits a target.
Status Buildup On Light Hit Amount of buildup applied per light attack hit.
Status Buildup On Heavy Hit Amount of buildup applied per heavy attack hit.

Weapon Status Flow

  • The weapon Blueprint owns the status settings, for example BP_Staff or BP_Sword_002.
  • When the combat component confirms a hit, it reads the current weapon defaults.
  • If StatusEffectOnHit is valid, the target must have USoulsStatusEffectComponent.
  • Light attacks use StatusBuildupOnLightHit.
  • Heavy attacks use StatusBuildupOnHeavyHit.
  • When buildup reaches BuildupThreshold, the status triggers and appears in the HUD active effects list.

5. Inventory Item Use

Consumables can now apply buffs or cleanse negative status effects.

  • Heal Amount: Restores HP immediately when the item is used.
  • Buff To Apply On Use: Triggers a buff (e.g., Attack Up) when the item is used.
  • Status Effect To Cleanse On Use: Instantly clears a specific status (e.g., Poison Moss).
  • Clear All Negative Status On Use: Wipes all active status effects (e.g., Divine Blessing).
  • Consume On Use: Removes one quantity from the stack after successful use if enabled.
Practical Examples: DA_Item_AttackBuff can set BuffToApplyOnUse = DA_Buff_AttackUp. DA_Item_StaminaBuff can set BuffToApplyOnUse = DA_Buff_StaminaRegen. A cure item can set StatusEffectToCleanseOnUse = DA_Status_Poison.

6. HUD & UI Feedback

The Mobile HUD has been enhanced with numeric stat tracking and an active effect tracker:

  • Numeric HP/Stamina: Added HealthTXT and StaminaTXT (BindWidgetOptional) to USoulsMobileHUD. Visibility can be toggled via bShowHealthText and bShowStaminaText in the HUD class defaults. When disabled, the widgets are collapsed completely and stale values are not shown.
  • Active Effects List: Added ActiveEffectsList (PanelWidget) to HUD. Dynamically populates with USoulsEffectIconWidget instances for active buffs and triggered statuses.
  • Radial Cooldown Overlay: USoulsEffectIconWidget now supports an optional RadialProgressImage (UImage). By assigning a RadialProgressMaterial, the icon will visually drain/fill based on remaining duration (using 'Percent' or 'Progress' scalar parameters).
  • Professional Stacking: Icons now support dynamic stack counts and formatting. Use bShowStackCountInHUD and StackDisplayFormat (e.g., "x{0}") in the effect data asset to configure visuals.
HUD Widget / Setting Required Name Behavior
Health TextHealthTXTOptional TextBlock for numeric health. Controlled by bShowHealthText.
Stamina TextStaminaTXTOptional TextBlock for numeric stamina. Controlled by bShowStaminaText.
Active Effects PanelActiveEffectsListPanelWidget that receives active effect icons under the stamina area.
Show Active EffectsbShowActiveEffectsDisables the active effect tracker when false.
Effect Icon ClassEffectIconWidgetClassSet this to WBP_SoulsEffectIcon.
Refresh IntervalEffectsRefreshIntervalTimer interval for remaining seconds and radial progress updates.

7. WBP_SoulsEffectIcon Setup

WBP_SoulsEffectIcon should inherit from SoulsEffectIconWidget. C++ uses optional bind widgets, so missing widgets will not crash, but the following names are recommended for the full status and buff UI.

Widget Required? Purpose
EffectIconImageRecommendedMain image for the active buff or status icon.
RemainingTimeTextRecommendedShows integer seconds such as 12, 5, or 1.
StackTextRecommendedShows x2, x3, etc. Hidden when stack count is 1 or when the Data Asset disables HUD stack count.
StackIconImageOptionalOptional support image for a custom stack layout.
RadialProgressImageOptionalImage used for the MMO-style radial expiry overlay.
Style Note: By default, SoulsEffectIconWidget respects the font sizes and layout set in WBP_SoulsEffectIcon. Enable bOverrideTextStyle only if you want C++ to force RemainingTimeFontSize and StackFontSize.

8. Radial Cooldown Overlay

The radial overlay is optional. CooldownPercent moves from 1.0 to 0.0 as the effect expires. If a UI material is assigned to RadialProgressMaterial, C++ pushes the value into a scalar parameter named Percent or Progress.

  • Add an Image named RadialProgressImage to WBP_SoulsEffectIcon.
  • Assign a UI material to RadialProgressMaterial.
  • The material should expose Percent or Progress.
  • If no material is assigned, the icon still works with image, time text, and stack text.

9. Inventory & Weapon Effects

Selecting an item in the inventory now displays comprehensive effect information in the details panel:

  • Consumables: Displays healing amounts, buff descriptions, and stacking rules (e.g., "Reapply: Extends duration").
  • Weapons: Now automatically detects and displays StatusEffectOnHit and buildup values directly from the weapon class defaults.
  • Scaling Awareness: If a weapon's status effect supports scaling, the inventory will highlight "Power scales with stacks" to inform the player.
  • Required Item Fields: Weapon items must have WeaponClass set so the inventory can read ASoulsWeaponBase defaults.
  • Required Details Panel: The inventory widget uses the selected item effect panel to add text lines for healing, buffs, cleanses, and weapon status info.
Displayed Line Source Meaning
+ Buff: [Buff Name]BuffToApplyOnUseThe selected consumable applies this buff on use.
Stacks: Up to [MaxStacks]Buff/Status stack settingsThe effect supports multiple stacks.
Power scales with stacksbScaleMagnitudeWithStacksStacks are allowed to increase strength, not only display x2/x3.
Reapply: Refreshes durationRefreshDurationUsing the same buff again resets the timer.
Reapply: Extends duration up to [seconds]sExtendDuration and MaxExtendedDurationUsing the same buff again adds time, optionally capped.
+ Cleanses: [Effect Name]StatusEffectToCleanseOnUseThe item clears one specific status.
+ Cleanses All Negative EffectsbClearAllNegativeStatusOnUseThe item clears all negative statuses.
On Hit: [Effect Name]Weapon class default StatusEffectOnHitThe selected weapon can apply this status on hit.
Light Buildup: [Value]Weapon class default StatusBuildupOnLightHitBuildup amount applied by light hits.
Heavy Buildup: [Value]Weapon class default StatusBuildupOnHeavyHitBuildup amount applied by heavy hits.

10. Recommended Example Assets

Asset Important Settings Expected Result
DA_Buff_AttackUp ModifierType = AttackPower, MultiplierValue = 1.2, Duration = 20, StackPolicy = ExtendDuration, MaxStacks = 1, bScaleMagnitudeWithStacks = false. Repeated use extends or refreshes time without multiplying damage endlessly.
DA_Buff_StaminaRegen ModifierType = StaminaRegen, MultiplierValue = 1.25, Duration = 20, StackPolicy = RefreshDuration. Safe stamina recovery buff for mobile combat pacing.
DA_Status_Poison EffectType = Poison, BuildupThreshold = 100, bDealsDamageOverTime = true, DamageTickInterval = 1, optional StackPolicy = IncreaseStacks, optional MaxStacks = 3. Repeated triggers can show x2/x3 if HUD stack display is enabled.
DA_Status_Bleed EffectType = Bleed, BuildupThreshold = 100, short TriggerDuration, StackPolicy = RefreshDuration or IncreaseMagnitude. Works as pressure now, with room for a later burst-damage implementation.
DA_Item_AttackBuff ItemType = Consumable, BuffToApplyOnUse = DA_Buff_AttackUp, bConsumeOnUse = true. Using the item applies the buff, shows a HUD icon, and displays buff details in inventory.
BP_Staff / BP_Sword_002 StatusEffectOnHit = DA_Status_Bleed, StatusBuildupOnLightHit = 35, StatusBuildupOnHeavyHit = 60. The inventory shows on-hit status information, and combat applies buildup to valid targets.

11. Manual Validation

Test Steps Expected Result
HUD Text ToggleOpen WBP_SoulsMobileHUD, disable Show Health Text and Show Stamina Text, then Play.HealthTXT and StaminaTXT are fully hidden/collapsed.
Buff UsePick up DA_Item_AttackBuff, open inventory, use it.Buff applies, item quantity updates, HUD icon appears with remaining seconds.
Stack PolicyUse the same buff/status multiple times with different stack policies.Refresh, extension, stack count, or magnitude behavior matches the Data Asset settings.
Radial OverlayAssign RadialProgressMaterial and use a timed buff.Radial progress moves from full to empty as remaining duration decreases.
Weapon Status DetailsSelect a weapon item whose WeaponClass has StatusEffectOnHit.Inventory details show On Hit, Light Buildup, and Heavy Buildup.
Combat BuildupEquip a weapon with status buildup and attack an enemy/player that has USoulsStatusEffectComponent.Buildup accumulates, status triggers at threshold, and the active effect appears in HUD.
Mobile Optimization: UI updates for status effects use a timer-based refresh plus event-driven delegates. The HUD only creates small icon widgets, stack text hides when unnecessary, radial material updates are optional, and stacking logic is centralized in C++ to avoid redundant Blueprint calculations.

WEAPON ABILITIES

Weapon Abilities

Setup for active weapon skills, action data assets, mobile buttons, and safe Action System rules.

What This MVP Does

Weapon Abilities are special actions owned by the currently equipped weapon. They allow weapons to feel different in gameplay, not only different in damage numbers.

The weapon points to a SoulsActionDataAsset, the player presses a HUD or input button, and the existing USoulsActionComponent handles stamina, cooldown, alive/grounded checks, busy state, and montage playback rules.

  • Designer-facing: create or edit a SoulsActionDataAsset and assign it to a weapon Blueprint.
  • Player-facing: press the mobile ability button or the mapped input action to trigger the equipped weapon skill.
  • Safe fallback: if the weapon has no ability, the input does nothing safely. With Action System debug enabled, the Output Log can explain why.
  • Current example: a sword-style Forward Slash or general Ability Attack using an existing attack montage.

1. Required Assets

Asset Recommended Name Purpose
Action Data Asset DA_Action_Sword_ForwardSlash or DA_Action_Ability Stores the ability id, display name, action type, montage, stamina cost, cooldown, and safety rules.
Weapon Blueprint BP_Sword, BP_Axe_001, or any child of SoulsWeaponBase Owns the WeaponAbilityAction reference. This makes the ability weapon-specific.
Mobile HUD Button WeaponAbilityButton Optional mobile button in WBP_SoulsMobileHUD. The C++ binding is optional-safe, so missing buttons do not crash.
Animation Montage Any clear attack montage, for example a charge or forward slash montage Visualizes the ability. Use an existing montage first, then replace it later with a custom weapon art montage.

2. Action Data Asset Settings

Create or open a SoulsActionDataAsset. These are the recommended first-test values for a safe sword-style ability.

Field Recommended Value Why It Matters
Action Id SwordForwardSlash or AbilityAttack Internal id used by cooldown tracking and logs. Keep it stable and without spaces.
Display Name Forward Slash or Ability Attack Readable name for UI, debug, and future inventory/action descriptions.
Action Type Weapon Ability This is mandatory. It tells ResolveActionForType to look for the equipped weapon ability slot.
Action Montage A sword/weapon attack montage Use a clear existing montage first. The ability can be made unique later with lunge, guard break, VFX, or custom notifies.
Action System Plays Montage Off first, turn On only if no animation plays Some existing combat paths may already play montages. If stamina/cooldown works but no animation appears, enable this. If the animation double-plays, disable it.
Stamina Cost 30 Makes the ability feel special without being free to spam.
Cooldown 2.0 Prevents repeated instant use and proves cooldown integration is working.
Can Be Buffered Off for the first test Keeps the first validation simple. Turn this on later after the basic button-to-ability flow is stable.
Buffer Window 0.25 Only matters if buffering is enabled later.
Can Interrupt Self Off Stops the ability from restarting itself while already active.
Can Interrupt Other Actions Off Keeps dodge, attack, block, and other busy states stable for the first MVP.
Requires Grounded On Prevents accidental air activation until aerial abilities are intentionally designed.
Requires Alive On Prevents dead or respawning characters from starting abilities.
Requires Enough Stamina On Connects the ability to the existing stamina economy.
Fail Reason Cannot use weapon ability Optional user/debug text for failed attempts.
Action Tag Weapon.Ability.Sword Optional organization tag for future UI, analytics, or special logic.
Montage rule of thumb: start with Action System Plays Montage disabled. If the button consumes stamina and starts cooldown but the character does not animate, enable it and test again. If the animation plays twice or feels duplicated, disable it again.

3. Key Fields & Setup

Field / Component Purpose
WeaponAbilityAction
UInputAction*
Enhanced Input binding in SoulsCharacterBase. Map it to a keyboard, gamepad, or touch-friendly input action.
WeaponAbilityButton
UButton*
Optional widget binding in SoulsMobileHUD using BindWidgetOptional. When clicked, it calls the character's weapon ability entry point.
WeaponAbilityAction
USoulsActionDataAsset*
Assigned on the equipped ASoulsWeaponBase Blueprint. This is the per-weapon action override that makes one weapon have a special skill and another weapon have none.

4. Logic Flow

Step 1
Input Triggered
  • WBP_SoulsMobileHUD Button Press
  • Enhanced Input WeaponAbilityAction
Step 2
Ability Resolution
  • TryWeaponAbility Checks weapon
  • ResolveActionForType Finds Data Asset
Step 3
Action Component
  • Stamina Check Spend stamina
  • Cooldown Start timer
  • Montage Play animation

5. Manual Setup Steps

1 Create the action: Create a SoulsActionDataAsset named DA_Action_Sword_ForwardSlash or use the existing DA_Action_Ability.

2 Set action identity: Set Action Id to SwordForwardSlash, Display Name to Forward Slash, and Action Type to Weapon Ability.

3 Set action cost: Set Stamina Cost to 30 and Cooldown to 2.0.

4 Set action rules: Disable Can Be Buffered for the first test. Keep Requires Grounded, Requires Alive, and Requires Enough Stamina enabled.

5 Assign animation: Assign a weapon attack montage to Action Montage. Leave Action System Plays Montage off first unless the ability does not animate during testing.

6 Link the weapon: Open the weapon Blueprint and assign the action asset to its WeaponAbilityAction property.

7 Link the HUD: In WBP_SoulsMobileHUD, add or confirm a button named WeaponAbilityButton. The C++ HUD binding will use it if present.

8 Playtest: Equip the weapon, press the ability button, and confirm animation, stamina cost, cooldown, and safe failure behavior.

6. Safety Validation: No Ability Weapon

Ensuring that the weapon ability system handles weapons without assigned abilities gracefully is critical for a stable production experience. A weapon without an ability should fail safely without consuming resources or causing side effects.

No Ability Weapon Safety Test

The system is designed to "fail safely" if a player attempts to use a weapon skill on a weapon that has no WeaponAbilityAction (and no moveset-level ability).

  • Safe Return: ASoulsCharacterBase::TryWeaponAbility returns false immediately.
  • No Side Effects: No stamina is consumed, no montages are played, and no internal action states are changed.
  • Debug Logging: If bDebugActionSystem is enabled on the character, the Output Log will explicitly state: [Souls Action] No weapon ability assigned.
Manual Test Procedure:
  1. Equip a weapon without a WeaponAbilityAction assigned (e.g., a basic starter weapon).
  2. Press the WeaponAbilityButton on the Mobile HUD or the mapped key.
  3. Verify: No animation plays, no stamina bar movement, and character remains in the Idle state.
  4. Verify: Check the Output Log for the "No weapon ability assigned" message.

7. Manual Validation Checklist

Test Expected Result
Ability button with valid weapon The character starts the ability action and plays the selected montage if montage playback is configured correctly.
Stamina cost Stamina decreases by the action's Stamina Cost.
Cooldown Repeated button presses do not spam the ability during the cooldown window.
Low stamina The ability does not start when Requires Enough Stamina is enabled and stamina is too low.
No ability assigned Pressing the button on a weapon with no WeaponAbilityAction does not crash and does not trigger a random fallback attack.
No HUD button The HUD still opens and runs because WeaponAbilityButton is optional.

8. Common First-Test Problems

Problem Likely Cause Fix
Button works, stamina changes, but no animation plays. Action System Plays Montage is off and no other system is playing the montage. Enable Action System Plays Montage on the ability action and test again.
Animation plays twice or feels duplicated. Both the Action System and existing combat path are playing animation. Disable Action System Plays Montage.
Ability never starts. Wrong Action Type, low stamina, cooldown active, no weapon ability assigned, or character is busy. Confirm Action Type = Weapon Ability, check stamina, wait for cooldown, and confirm the weapon Blueprint points to the action asset.
Ability works on one weapon but not another. The second weapon has no WeaponAbilityAction. Assign an action asset to that weapon, or leave it empty intentionally for weapons without special skills.
Safe Implementation: If no weapon is equipped or no ability is assigned, the system fails silently. If bDebugActionSystem is enabled on the character, a log message "No weapon ability assigned" will appear in the Output Log.

9. Weapon Ability Forward Lunge

Purpose

The Forward Lunge option makes the first Weapon Ability feel like a real weapon art instead of a normal attack montage. When enabled on a Weapon Ability action, the character moves forward over a short duration while the ability is executing.

This is useful for sword slashes, axe rushes, guard-break attacks, and any short-range special attack that should close a small gap. It should stay optional because not every ability should move the player: buffs, ranged casts, defensive arts, and stationary heavy slams may feel better with lunge disabled.

Lunge Setting Recommended Value Meaning
bUseForwardLunge On for Forward Slash, Off by default Enables the lunge movement only for this action. Keep it off for abilities that should not move the character.
ForwardLungeDistance 250 Total travel distance in Unreal units. Use 150 for subtle movement, 250 for a clear slash, and avoid going above 350 until the attack is tuned.
ForwardLungeDuration 0.18 How long the forward movement lasts. Lower values feel snappier; higher values feel heavier and easier to read.
ForwardLungeSpeedMultiplier 1.0 if available Optional tuning multiplier. Keep it neutral for the first pass, then adjust only if distance and duration are not enough.

Forward Lunge Setup

1 Open DA_Action_Sword_ForwardSlash or the current Weapon Ability action.

2 Search for Lunge in the Details panel.

3 Enable bUseForwardLunge.

4 Set ForwardLungeDistance = 250 and ForwardLungeDuration = 0.18.

5 Save the Data Asset, equip the weapon that references it, and press WeaponAbilityButton.

Forward Lunge Test Expected Result
Press ability on flat ground The character plays the ability and moves forward a short distance.
Cooldown spam test The character should not lunge repeatedly while cooldown is active.
Low stamina test The lunge should not start if the action cannot start due to stamina rules.
No ability assigned No lunge occurs and no crash happens.

10. Weapon Abilities & Movesets

Overview

The weapon ability and moveset system extends combat from generic light/heavy attacks into specialized, weapon-driven behavior. Each weapon can have a unique Weapon Ability and a comprehensive Moveset that defines its mechanical identity.

The system relies on SoulsActionDataAsset for ability logic, WeaponAbilityAction on the weapon blueprint, and SoulsWeaponMovesetDataAsset for organizing actions and montages with a strict resolution priority: Moveset > Weapon Override > Legacy Fallback.

1. Weapon Ability Action Data

Weapon abilities are defined as USoulsActionDataAsset with the following core properties:

Field Purpose
Action Id Unique identifier for the action system.
Display Name / Description UI metadata used in the inventory details panel.
Action Type Must be set to Weapon Ability for proper resolution.
Action Montage The animation montage played when the ability is triggered.
Action System Plays Montage Should be True for the standard ability flow.
Stamina Cost / Cooldown Resource rules applied when the action starts.

2. Forward Lunge

Used to give abilities a "gap closer" feel or extra momentum.

  • Use Forward Lunge: Enables the movement component during the action.
  • Distance: Total units traveled over the duration.
  • Duration: Time in seconds for the lunge to complete.

Usage Tip: Keep lunge OFF for stationary abilities (like buffs or ground slams) and ON for dashes, leaps, or lunging thrusts.

3. Impact Profile

Allows abilities to use combat tuning separate from standard weapon hits.

  • Use Ability Impact Profile: Enables ability-specific multipliers.
  • Damage Multiplier: Scales raw damage (e.g., 1.5 for 50% more damage).
  • Knockback Multiplier: Scales target reaction force.
  • Guard Break: Marks the attack as high guard pressure.
  • Guard Break Stamina Damage: Extra pressure against blocking targets.
  • Heavy Hit Reaction: Forces a stronger stagger animation on the target.

4. Feedback Fields (Optional Polish)

The system provides dedicated fields for audio-visual feedback. These are considered optional polish and do not block the ability logic if left empty.

  • Ability Start/Impact Sound
  • Ability Start/Impact VFX
  • Feedback Socket Name (Character or Weapon socket)

5. Weapon Moveset Data

The SoulsWeaponMovesetDataAsset acts as a container for a weapon's entire kit.

  • Moveset Id / Name: Identity metadata.
  • Weapon Ability Action: The shared ability asset for this moveset.
  • Weapon Ability Montage: The specific animation for this weapon type.
  • Action Fallbacks: Light, Heavy, Dodge, and Block fields can be left empty to use the current engine fallbacks.

Reference Examples

Sword Example:
  • Action: DA_Action_Sword_ForwardSlash
  • Moveset: DA_Moveset_Sword
  • Stamina: 30 | Cooldown: 2.0s
  • Lunge: 250 units / 0.18s
  • Impact: x1.35 Dmg | x1.25 KB
  • Guard Break: Enabled
Axe Example:
  • Action: DA_Action_Axe_Cleave
  • Moveset: DA_Moveset_Axe
  • Stamina: 40 | Cooldown: 3.0s
  • Lunge: 150 units / 0.22s
  • Impact: x1.65 Dmg | x1.6 KB
  • Heavy Reaction: Enabled

6. No-Ability Safety

The system is architected to handle weapons without assigned abilities gracefully:

  • Pressing input (Keyboard 'R' or Mobile Button) triggers a safe "no action" path.
  • Stability: No crashes occur when WeaponAbilityAction is null.
  • Resources: No stamina is consumed if the ability cannot fire.
  • Logic: No stuck states; previous abilities are cleared upon weapon swap.

7. Inventory Ability Details

The SoulsInventoryWidget provides full transparency for weapon properties:

  • Content: Displays Moveset, Ability Name, Description, Costs, Lunge, and Impact multipliers.
  • ScrollEffect: Long descriptions are contained within a dedicated ScrollBox, ensuring they never overflow the UI panel or cover HUD buttons.

Setup Checklist

Check Expected Result
Trigger Sword AbilityAnimation plays, lunges 250 units, costs 30 stamina.
Trigger Axe AbilityAnimation plays, lunges 150 units, deals heavy damage/knockback.
Weight/Feel DifferenceAxe feels noticeably heavier and slower than Sword.
No-Ability TestInput does nothing, character remains stable, no stamina loss.
Inventory SelectionAll ability stats (Dmg, KB, Cost, Cooldown) are visible.
Inventory OverflowLong text uses ScrollBox; HUD buttons remain accessible.
Input MethodsKeyboard (R) and Mobile HUD button both trigger the ability.
Core StabilityThe project builds and launches without missing dependencies.
Weapon ability foundation: the kit includes sword and axe ability/moveset examples, mobile and keyboard ability input, stamina/cooldown/action rules, data-driven Forward Lunge and Impact Profile tuning, safe no-ability behavior, and inventory details that display long ability information inside ScrollEffect without overflowing the UI.
Optional polish: bespoke ability VFX/SFX assets, more complete per-weapon animation packs for every action type, and full gamepad UI/navigation polish can be layered on top without changing the core gameplay path or data setup.

WORLD MODULES

Vendor NPC System

Implementing merchants, trade logic, and item economy.

Merchant Backend

The ASoulsVendorNPC provides a robust C++ backend for creating interactive merchants. It handles item stock, pricing overrides, and secure transactions between the player's inventory and Souls currency.

Create a Blueprint class from SoulsVendorNPC, place it in the level, set its Interaction Prompt to a short label such as Trade, and populate the vendor stock list in the Details panel.

1. Stock Management

Vendors use a Stock list of FSoulsVendorStockEntry structures. Each entry allows for detailed control over the merchant's inventory:

  • Item Data: The USoulsItemDataAsset to be sold.
  • Quantity: Available amount. Limited stock decreases with each purchase.
  • Buy Price Override: Manually set a price. If set to -1, the system uses the Value defined in the Item Data Asset.
  • Infinite Stock: If enabled, the item never runs out regardless of quantity.
Recommended first setup: add one consumable item with Quantity = 3, Buy Price Override = 25, and Infinite Stock disabled. This makes it easy to verify that purchases reduce stock and eventually fail when the item runs out.

2. Trade Logic

Buying
Souls → Item

System verifies player has enough Souls and vendor has enough stock before completing the swap.

Selling
Item → Souls

Players can sell items at a multiplier (default 50%). Equipped items and Key Items are protected from sale.

  • Buy checks: the vendor verifies the player has enough Souls, the item data is valid, and limited stock is still available.
  • Buy result: the item is added to the player inventory, Souls are removed, and limited stock decreases by the purchased quantity.
  • Sell checks: protected items cannot be sold when they are equipped, marked as key items, or blocked by item rules.
  • Sell result: the item is removed from inventory and Souls are awarded using the item value multiplied by the vendor sell multiplier.

3. Blueprint Integration

The system provides several hooks for UI development and custom logic:

Event/Function Description
OnVendorOpenedFired when a player interacts with the NPC. Use this to open your Trade UI.
BuyItemExecutes the purchase logic and broadcasts success/fail events.
SellItemExecutes the sale logic and adds Souls to the player's stats.
OnBuySucceededFired when a transaction is successful.
OnBuyFailedFired when the player lacks Souls, the stock entry is invalid, or the vendor has no remaining stock.
OnSellSucceededFired when an item is removed from inventory and Souls are awarded.
OnSellFailedFired when the item cannot be sold, is missing, or is protected by item/equipment rules.

4. Creating a Vendor Blueprint

1 In the Content Browser, create a new Blueprint Class and choose SoulsVendorNPC as the parent.

2 Name it BP_SoulsVendor and place it under Content/SoulsMobileKit/Blueprints/Interaction.

3 Add a simple mesh or character visual component, then compile and save.

4 Set Interaction Prompt to Trade and keep Can Interact enabled.

5 Add one or more entries to Stock, assigning item data, quantity, price override, and infinite-stock behavior.

6 Assign VendorWidgetClass to WBP_SoulsVendor and keep bOpenVendorWidgetOnInteract enabled.

7 Place the Blueprint in the level and interact with it to open the shop UI.

5. Vendor Trade UI

The included trade UI uses USoulsVendorWidget and USoulsVendorItemRowWidget. It is designed for a mobile-readable shop screen with square item tiles, Buy/Sell tabs, item details, feedback text, and transaction buttons.

Widget Name Type Purpose
BuyScroll / SellScrollScrollBoxScrollable containers for large vendor stock and player inventory lists. Set clipping to bounds so item tiles cannot draw over the header or buttons.
BuyList / SellListWrapBoxGrid containers for square item rows. Put each WrapBox inside its matching ScrollBox for product grids that wrap into new rows.
BuyTabButton / SellTabButtonButtonSwitches the UI between vendor stock and player inventory selling mode.
BuyButton / SellButtonButtonExecutes the selected buy or sell transaction. These names must match exactly for automatic binding.
CloseButtonButtonCloses the shop and restores normal gameplay input.
Info or InfoPanelPanel WidgetOptional details panel. It stays hidden until an item row is selected.
FeedbackTextTextBlockShows transaction results such as Purchased, Sold, Sold Out, or Not enough Souls.
imageinfo, SoulsIcon, or PriceIconImageOptional item/price images. These should be hidden when no item is selected.
Grid layout rule: use BuyScroll > BuyList and SellScroll > SellList. The ScrollBox owns the fixed visible area and scrolling; the WrapBox owns the square product grid. Keep the Buy/Sell transaction buttons outside the scroll area so item rows cannot cover them.

6. Item Row Widget

WBP_SoulsVendorItemRow should use SoulsVendorItemRowWidget as its parent. A square row works best for mobile shops because it keeps icons, price, quantity, and sold-out state readable.

Widget Name Purpose
SelectButtonThe clickable area for selecting the row.
IconImageDisplays the item icon when available.
ItemNameTextDisplays the item name.
PriceTextDisplays buy or sell price.
QuantityTextDisplays stock quantity or owned quantity.
SoldOutTextShown when limited stock reaches zero.

7. Transaction Behavior

  • Selection required: pressing BuyButton or SellButton without a selected row shows feedback instead of changing inventory.
  • Infinite stock: after purchase, the row remains selected and visible because the vendor can keep selling the same item.
  • Limited stock: stock quantity decreases after each purchase. When quantity reaches zero, the row becomes sold out or is removed from the active purchase list.
  • Selling: selling removes or decreases the player inventory item immediately and awards Souls using the vendor sell-price rules.
  • Protected items: equipped items, key items, and non-sellable items fail safely and remain in the inventory.
  • Feedback: transaction messages appear only when useful, such as successful purchase, successful sale, sold out, invalid item, protected item, or not enough Souls.

8. Sell Price Rules

Vendors can calculate sell prices from the item data asset or from vendor stock when appropriate.

  • SellPriceMultiplier: default value such as 0.5 means selling returns half of the base value.
  • Buy Price Override: if the item exists in vendor stock and stock pricing is allowed for sell calculations, the override can be used as the base value.
  • Item Data Value: if the item is not in vendor stock, the system uses the item data asset's value.
  • Default Item Value: if no valid value exists, the vendor uses a safe fallback such as 10.
  • Final formula: sell price is clamped to at least 1 Soul after applying the multiplier.

9. Manual Validation Checklist

Test Expected Result
Open a vendor with VendorWidgetClass = WBP_SoulsVendor.The shop opens, shows current Souls, and displays vendor stock in the Buy grid.
Select a stock item and press BuyButton with enough Souls.The item enters inventory, Souls decrease, and limited stock quantity updates.
Try to buy with insufficient Souls.The transaction fails and feedback explains the reason.
Buy an infinite-stock item.The row remains visible and selected after purchase.
Buy a limited-stock item until quantity reaches zero.The row becomes sold out or disappears and cannot be bought again.
Switch to Sell mode, select a normal item, and press SellButton.The item quantity decreases or is removed, and Souls increase immediately.
Try selling an equipped weapon or key item.The sale fails and the protected item remains in the inventory/equipment slot.
Save at a Bonfire after buying/selling, then restart play.Inventory, Souls, and limited vendor stock remain at the saved values.
Add many stock entries and scroll.Rows remain clipped inside the product area and never cover the title or transaction buttons.
Persistence Note: vendor stock changes, player inventory, and Souls are captured by the full save system. Save at a Bonfire or call SaveGameNow after important trade flows to persist purchases, sales, and sold-out limited stock.

WORLD MODULES

NPC Dialog System

Lightweight, data-driven NPC interactions with world flag conditions and rewards.

Dialog Foundation

The ASoulsDialogNPC provides a lightweight solution for Souls-like NPC interactions. It uses USoulsDialogDataAsset to define dialog lines, speaker names, and portraits, integrated with the global Save System via World Flags.

1. Dialog Data Asset (USoulsDialogDataAsset)

Dialog is defined in a Data Asset, allowing designers to create complex branching-like logic using World Flags without full quest systems.

Property Description
Dialog IdUnique name used to identify this dialog in save data, logs, and Blueprint setup.
Speaker NameDisplay name shown in the dialog widget.
LinesArray of FSoulsDialogLine. Each line can define text, optional portrait, optional voice, display time, and whether the player must press Next.
bRepeatableWhen enabled, the NPC can repeat this dialog after completion. When disabled, completion can permanently disable the NPC interaction.
Required World FlagsDialog only triggers if all these flags are marked "Completed" in the save.
Blocked World FlagsDialog is hidden if any of these flags are marked "Completed".
Completed World FlagFlag marked as "Completed" once the dialog finishes.
bMarkCompletedOnFinishMarks the completion flag when the last line is reached or the dialog is finished cleanly.
Optional RewardGive items or Souls automatically upon completion.
bGiveRewardOncePrevents duplicate rewards by granting them only the first time the dialog is completed.

2. NPC Setup (ASoulsDialogNPC)

1 Create a Blueprint inheriting from SoulsDialogNPC.

2 Assign your DialogData asset and DialogWidgetClass (WBP_SoulsDialog).

3 Set a unique PersistentDialogId if you need to track specific NPC state beyond world flags.

4 Set the interaction prompt to a short verb such as Talk.

5 Interact with the NPC in-game to start the dialog flow.

Non-Repeatable NPCs: If bRepeatable is disabled and the dialog completion is saved, the NPC can automatically stop being interactable. The prompt disappears, mobile/keyboard Interact no longer opens the dialog, and the disabled state remains after save/load.

3. Widget Bindings

The USoulsDialogWidget requires specific BindWidget names in your Blueprint widget:

  • SpeakerNameText (TextBlock)
  • DialogLineText (TextBlock)
  • PortraitImage (Image, Optional)
  • NextButton (Button)
  • CloseButton (Button, Optional)
  • ContinueHintText (TextBlock, Optional)

4. Integration with Save System

Dialog completion and rewards are tied to the AAA Save System:

  • World Flags: Use IsWorldFlagCompleted to check if an NPC has already spoken or if a world event has occurred.
  • Non-repeatable Dialogs: Non-repeatable dialogs can disable their NPC interaction after completion when saved.
  • Auto-Save: The game automatically saves after a dialog finishes if a reward was given or a completion flag was marked.
  • One-Time Rewards: If bGiveRewardOnce is enabled, rewards are only granted when the CompletedWorldFlag is first set.

5. Manual Validation Checklist

  • [ ] Prompt: Does the NPC show Talk only while it is available?
  • [ ] Line Flow: Does NextButton advance through each dialog line and finish cleanly?
  • [ ] Save Flag: Does the CompletedWorldFlag become saved after finishing the dialog?
  • [ ] Non-Repeatable: With bRepeatable disabled, does the NPC hide the prompt and ignore Interact after completion?
  • [ ] Save/Load: After saving and restarting play, does the completed non-repeatable NPC remain disabled?
  • [ ] Reward Once: If a reward is configured, is it granted only once when bGiveRewardOnce is enabled?

WORLD MODULES

Ladder / Climb System

A lightweight climb interactable with designer-friendly point generation, debug visibility, and animation hooks.

Designer-Friendly Foundation

The ASoulsLadderInteractable lets designers place climbable ladders without hand-positioning every helper point in every level instance. The system can auto-generate climb and mount points from simple settings, while still allowing manual point editing for special layouts.

1. Quick Setup

1 Create or place BP_SoulsLadder in the level.

2 Keep bAutoConfigurePoints enabled for normal ladders.

3 Set LadderHeight to match the climbable height.

4 Set MountForwardOffset so the player exits safely away from the ladder face.

5 Use bShowLadderPointDebugInEditor to show or hide helper points while designing.

2. Ladder Points

The ladder uses four scene points. They are stored as relative positions on the ladder actor, so moving the ladder in the level moves all points with it.

Point Description
BottomPointStart of the climb path at the bottom. A relative location of 0,0,0 is normal when the ladder root is placed at the bottom.
TopPointEnd of the climb path at the top. Auto-configured from LadderHeight.
MountBottomPointSafe exit position after climbing down or cancelling at the bottom.
MountTopPointSafe exit position after reaching the top.

3. Setup Properties

Auto Setup
  • LadderHeight: vertical climb length.
  • BottomOffsetZ: bottom point offset from the actor root.
  • MountForwardOffset: forward safety distance for exits.
  • MountBottomOffsetZ / MountTopOffsetZ: extra vertical adjustment for exit points.
Editing Mode
  • bAutoConfigurePoints: rebuilds points from ladder settings.
  • bAllowManualPointEditing: disables auto updates so designers can move points by hand.
  • RebuildLadderPointsFromSettings: call-in-editor helper to regenerate points from settings.
Debug View
  • bShowLadderPointDebugInEditor: show point spheres/lines while editing.
  • bShowLadderPointDebugInGame: show point debug during Play.
  • DebugPointSize / DebugLineThickness: visual size controls.

4. Climbing Behavior

  • Interact: the player presses Interact near the ladder to enter climb mode.
  • Movement: forward/backward input moves the player up and down between BottomPoint and TopPoint.
  • Restrictions: attacks, heavy attacks, abilities, dodge, jump, and normal movement are blocked while climbing.
  • Exit: the player exits at MountTopPoint or MountBottomPoint, then returns to normal walking movement.

5. Animation Hooks

Animation is optional. If no montages are assigned, the ladder still works using simple movement. Projects can later assign enter, loop, and exit montages or use Blueprint events for custom animation logic.

0,0,0 Note: BottomPoint having a relative location of 0,0,0 is expected. The bug to avoid is using world origin as a fallback. Valid ladders should have a meaningful distance between BottomPoint and TopPoint, and all movement should use the point locations from the placed ladder actor.

6. Manual Validation Checklist

  • [x] Place BP_SoulsLadder in the level.
  • [x] Change LadderHeight and confirm TopPoint plus MountTopPoint update.
  • [x] Change MountForwardOffset and confirm mount points move away from the ladder.
  • [x] Toggle bShowLadderPointDebugInEditor to show/hide point visualization.
  • [x] Enable bAllowManualPointEditing only for special ladders that need hand-placed points.
  • [x] Press Interact at the bottom and verify the player climbs without teleporting to world origin.
  • [x] Reach the top and verify the player exits at MountTopPoint.

ENEMY MODULES

AI & Boss Foundation

Sophisticated enemy behaviors and boss-level combat logic.

Boss System

Bosses feature specialized attack patterns and health-based transitions. Enabling bIsBoss on SoulsEnemyBase activates the boss HUD range flow, while Boss Phases defines how the encounter changes as health drops.

Initial State
Opening Form

Standard moveset and readable aggression levels.

Aggressive Form
Later Form

Unlocked at lower health thresholds with stronger abilities and transition feedback.

Boss HP HUD Integration

Professional mobile-first Boss Health display with support for multiple phases and proximity-based visibility. The HUD automatically syncs with the boss's status component and handles range-based detection.

Setup Instructions:
  1. Create a Widget Blueprint inheriting from SoulsBossHealthWidget (e.g., WBP_SoulsBossHealth).
  2. Assign this class to the Boss Health Widget Class property in your main WBP_SoulsMobileHUD.
  3. In your Boss Enemy Blueprint, enable bIsBoss and bShowBossHealthHUD.
  4. Configure Boss Display Name and Boss HUD Range (distance at which the HUD appears).
Required Component Bindings:

Ensure your WBP_SoulsBossHealth contains these components with exact names for native C++ binding:

Name Type Purpose
BossHealthBarProgressBarDisplays current HP percentage.
BossHealthTextTextBlockDisplays current and maximum HP, for example 500 / 1000.
BossNameTextTextBlockDisplays the Boss Display Name.
BossPhaseTextTextBlockDisplays the current phase label from Phase Display Name, or a safe default if no name is set.
BossPhaseIconsBoxPanelWidgetContainer (Horizontal Box) for dynamic phase icons.
Phase Icon Setup:

To enable phase icons, create a separate Widget Blueprint inheriting from SoulsBossPhaseIconWidget (e.g., WBP_SoulsBossPhaseIcon). Assign it to Boss Phase Icon Widget Class in your health widget settings.

  • Required Child: An Image component named IconImage with Is Variable enabled.
  • Custom Icon Source: Assign Phase Icon inside each entry of the boss's Boss Phases array. The HUD passes that texture into the icon widget automatically.
  • Behavior: Icons represent configured boss stages. Completed stages use the inactive tint, while current and remaining stages use the active tint.
  • Fallback: If no icon widget is assigned, the system skips rendering icons safely without errors.

Advanced Multi-Phase Setup

Create complex boss encounters with unlimited phases using the data-driven Boss Phases system. Each phase can have its own health threshold, cinematic transition, and unique ability set.

Configuration:
  • bUseBossPhases: Enable this to activate multi-phase logic on the boss.
  • Boss Phases Array: Add entries for each phase of the fight.
    • Phase Display Name: Custom label shown in the HUD (e.g., "Enraged" or "Final Form").
    • Phase Icon: Optional custom texture for the HUD phase indicator.
    • Health Threshold: Health percentage (0.0 to 1.0) required to enter this phase.
    • AI Abilities: The set of abilities the boss will prioritize in this phase.
    • Transitions: Configure optional Montage, Sound, and VFX to play when the phase starts. The boss can stop movement, pause AI decisions, and resume combat after the transition completes.
    • Behavioral Flags:
      • Stop Movement: Immediately halts all movement and AI pathing when the transition starts.
      • Can Take Damage During Transition: Controls if the player can damage the boss while the transformation is playing.
      • Allow Rotation During Transition: If enabled, the boss can continue facing the player during the transition. Keep it disabled for rooted cinematic transformations.
      • Prevent AI Decisions: Pauses all combat and ability logic until the transition completes.
HUD Synchronization:

The Boss HP HUD automatically reads the Boss Phases array to determine the total number of phase icons and displays the current Phase Display Name. If no name is provided, it defaults to "Phase X". This ensures a consistent professional look regardless of encounter complexity.

Recommended Three-Stage Setup:
Entry Health Threshold Example Name Use
01.0GuardianOpening moveset.
10.66EnragedFaster or wider attacks.
20.33Final StandMost dangerous ability set.
Transition tip: for transformation animations, enable Stop Movement and Prevent AI Decisions. Disable Can Take Damage During Transition if the boss should be invulnerable while transforming.
Manual Test:
  1. Place a boss with bIsBoss, bShowBossHealthHUD, and bUseBossPhases enabled.
  2. Add two or more entries to Boss Phases and assign different display names.
  3. Assign a transition montage to a later entry and keep movement/AI lockout enabled.
  4. Enter the HUD range, damage the boss below the next threshold, and confirm the boss stops, plays the transition, then resumes combat.
  5. Confirm the Boss HP bar, health text, phase label, and phase icons update during the fight.

USER EXPERIENCE

Interaction & HUD Polish

Refined mobile-first interfaces and interaction mechanics.

1. Souls Recovery System

Upon death, the player drops their current Souls at the death location, creating a Bloodstain. This recovery pickup persists across sessions but is lost if the player dies again before recovering it.

  • Auto-Tracking: The engine automatically tracks the latest death location and soul count.
  • Persistence: The bloodstain is saved to the active slot and survives game restarts.
  • Double Death: Only one bloodstain can exist at a time. A new death overwrites the previous one.

2. Quick Item HUD Logic

The mobile HUD now features smart visibility and icon synchronization for equipped quick items.

  • Smart Visibility: The QuickItemButton automatically hides when no item is equipped and appears instantly upon equipment.
  • Dynamic Icons: The button displays the assigned ItemIcon from the data asset. If no icon is set, it falls back to the default utility icon.
  • Numeric Feedback: The QuickItemText displays the current stack count, updating in real-time as items are used or looted.

3. Mobile-Safe UI Flow

Critical mobile interfaces are designed to open, close, and return to gameplay without trapping touch input. Inventory and Bonfire Level Up are validated as the primary mobile flow; other optional screens can follow the same pattern if your project expands them.

  • Touch Priority: HUD buttons, inventory actions, and bonfire controls remain usable with mobile-style tapping.
  • Safe Input Return: Closing a menu restores movement, camera look, attack, block, dodge, interact, and inventory controls.
  • Reusable Pattern: Vendor, storage, and save-slot screens can reuse the same mobile-safe open/close rules when customized for a specific game.

UI & MENUS

Mobile Settings Menu

A complete persistent settings system with live previews and save management.

Core Features

  • Live Preview: Layout scale and Master Volume apply instantly as you slide.
  • HUD Integration: The LayoutScaleSlider directly scales the entire mobile HUD in real-time.
  • Persistence: Settings are saved to the SoulsSaveGame system and persist across restarts.
  • Save Management: Built-in confirmation flow for resetting or deleting save data.

1. Implementation Guide

1 Create WBP_MobileSettings inheriting from SoulsSettingsWidget.

2 Add sliders and combo boxes in the Designer.

3 Critical: Ensure your widget names match the required bindings below.

4 Configure the DeleteSaveConfirmPanel as a hidden child widget for safety.

2. Required Widget Bindings

Widget Name Type Purpose
LayoutScaleSliderSliderAdjusts the size of the mobile HUD (0.5x to 1.5x).
CameraSensitivitySliderSliderAdjusts the look rotation speed.
MasterVolumeSliderSliderSets the global audio volume.
GraphicsQualityComboBoxComboBoxSwitches between Low, Medium, High, and Ultra presets.
CloseButtonButtonSaves settings and returns to game.
ResetSaveButtonButtonShows the delete confirmation panel.
DeleteSaveConfirmPanelWidget/BorderA panel that contains the confirm/cancel buttons.
ConfirmDeleteSaveButtonButtonPermanently deletes the current save slot.
CancelDeleteSaveButtonButtonHides the confirmation panel.
LevelToOpenAfterDeleteSaveClass DefaultOptional level to open after the save is deleted, commonly MainMenu.
Delete Confirmation: To prevent accidental data loss, the ConfirmDeleteSaveButton will only work if it is placed inside the DeleteSaveConfirmPanel. The C++ base class handles showing/hiding this panel automatically.

3. Troubleshooting

  • Game remains paused on close: The system now forces unpause and restores GameOnly input mode when the settings menu is closed. Ensure you call CloseSettings() in C++ or Blueprint to trigger this restoration.
  • Graphics Quality resets: The system uses ApplyMobileSettings to persist quality levels to both the save file and the engine runtime (via GameUserSettings). If settings reset, verify the GraphicsQualityComboBox index matches the preset level (0=Low, 3=Ultra).
  • Delete Save fails: The confirmation panel must be named DeleteSaveConfirmPanel in your WBP. Deletion uses ResetProjectSaveData which wipes both disk and memory, returning all settings to defaults.
  • Returning to Menu: Delete Save can optionally return the player to a configured level such as MainMenu. Set LevelToOpenAfterDeleteSave in the settings widget defaults to enable this transition.

UI & MENUS

Mobile Loading Screen

A professional C++ foundation for smooth, mobile-first level transitions.

Native Loading Management

The SoulsLoadingScreenWidget provides a smooth transition layer that stays visible during level travel and only hides once the destination world is fully ready and save data (if any) is restored.

1. Creation & Setup

1 Create a Widget Blueprint (e.g., WBP_LoadingScreen).

2 Set the Parent Class to SoulsLoadingScreenWidget.

3 In your GameInstance Blueprint (e.g., BP_SoulsGameInstance), assign your widget to the LoadingScreenWidgetClass property.

4 Tweak LoadingScreenHideDelay (default 0.2s) to ensure the world is settled before the screen fades.

2. Required Widget Bindings

Widget Name Type Requirement Description
BackgroundImageImageOptionalFull-screen background for the loading state.
LogoImageImageOptionalDisplays your game or studio logo.
LoadingTextTextBlockOptionalAutomatically set to "Loading..." or a custom message.
SpinnerImageImageOptionalAn icon that rotates continuously while bAnimateSpinner is true.
TipTextTextBlockOptionalDisplays a random tip from the Tips array.

3. Automatic Integration

  • Main Menu: Both "Tap to Start" and "Continue" automatically trigger the loading screen.
  • Continue Flow: The loading screen stays active while the map loads AND while your character/inventory are being restored from the save file.
  • Delete Save: When returning to the Main Menu after a reset, the loading screen ensures a clean visual transition.
  • Indeterminate Progress: Mobile titles typically use spinners and tips rather than fake 0-100% bars, which often stutter during heavy map loads.

PERSISTENCE MODULE

Complete Save System

A robust, AAA-grade system for managing character progression, world state, and inventory persistence.

1. Persistent Actor Setup

Make any Actor saveable by attaching a SoulsPersistentComponent. This captures the actor's state and restores it across sessions.

  • PersistentId: Must be unique (e.g., Gate_Shortcut_01).
  • bSaveOpenedStatus: Automatically persists the "Opened" state. Ideal for doors and chests.
  • bMarkCompletedOnInteract: Automatically marks the actor as "Completed" upon interaction.
  • Transform Tracking: Optional support for saving actor location/rotation.

2. Enemy & Boss Persistence Setup

Enemies (inheriting from SoulsEnemyBase) are handled automatically by the system without needing a component.

  • Save Enemy State: Enable to allow the enemy to save data to the global save. Assign a unique Enemy Persistent Id.
  • Save Current Health: Captures exact HP during a save snapshot.
  • Save Boss Phase: Persists phase and enrage status.
  • Defeated State: If an enemy dies and bSaveDefeatedState is true, they remain dead permanently.

3. What is Saved?

The system uses an "Atomic Snapshot" architecture. When a save occurs, it captures the player and the live world into one save file, then restores both sides together on load.

Category Saved Data
Player CoreCurrent souls, level/progression values, base stats, health/stamina upgrade levels, and map/checkpoint location.
Inventory & EquipmentAll item stacks and quantities, equipped right-hand/left-hand items, equipped quick item (and quantity), and inventory restore events for UI refresh.
Persistent WorldOpened state of doors/gates, chest looted states, remaining partial chest loot, collected one-time pickups, persistent actor transforms, global custom variables, and active crafting jobs.
NPC & AI StateVendor stock, dialog completion flags, enemy death states, elite enemy HP, and boss phase states.

4. Runtime Restore Coverage

Loading a slot does more than replace the player inventory. The save manager also refreshes live world actors after the save file is loaded, so testing from the Developer Hub or a custom menu matches the normal in-game load path.

System Restore Behavior
Inventory, Equipment, Quick ItemInventory is rebuilt from saved stacks, then equipped right-hand, left-hand, and quick item slots are restored and UI refresh events are broadcast.
Storage BoxesStored item stacks are matched by asset reference and quantity, preventing duplicate stacks or failed withdrawals after a reload.
Chest LootOpened state and remaining partial loot are reapplied to placed containers when a slot is loaded.
VendorsLimited stock quantities are saved in the global snapshot and restored on load, including manual slot loads after Play-In-Editor has already started.
Enemies and BossesSaved HP, defeated state, and boss phase are restored for enemies with a unique Enemy Persistent Id.
Dialogs and World FlagsDialog NPCs refresh their interactable state from saved completion flags so one-time rewards stay one-time.

5. When to Call SaveGameNow

The SaveGameNow node is the central full-snapshot save call. The project handles most saving automatically:

  • Bonfire Save Behavior: The game performs a full atomic snapshot whenever the player interacts with a bonfire or rests. All world state, inventory, and player stats are saved to disk instantly.
  • Vendor Transaction Autosave: Buying or selling items automatically triggers a background save to ensure currency and vendor stock states are never out of sync if the game is closed.
  • Manual UI/Developer Saves: You can call SaveGameNow from custom Blueprint events, important UI confirmations (like Level Up screens), or the Developer Hub.

6. Manual Validation Checklist

To verify the save system is functioning correctly in your project, perform these manual tests:

Validation Step Expected Result
Pick up a world item (e.g., a potion), rest at a Bonfire to save, and restart play.The item remains in your inventory and the pickup actor does not respawn in the world.
Open a chest and take half the loot, save, and restart play.The chest stays opened and contains only the remaining partial loot.
Defeat a boss, save at a Bonfire, and restart play.The boss does not respawn and the arena remains unlocked.
Equip a weapon and a quick item, rest to save, and restart play.The items remain in your inventory and are restored as your active equipped gear.
Buy an item from a Vendor, close the game immediately (without resting).Upon restarting, your souls are deducted and the vendor's stock is reduced correctly.
Death Recovery Note: By default, the active dropped souls recovery marker is transient and resets upon exiting the session. Do not expect the transient death recovery marker to save unless you explicitly extend it to be persistent.

PERSISTENCE MODULE

Enemy & Boss State Persistence

Ensuring enemies remember their health, phase, and defeated status across reloads.

How Health Persistence Works

The kit supports deep persistence for enemies and bosses. Unlike simple world actors that only remember if they are "Completed", enemies can store their exact current health and boss form.

  • Save Enemy State: Enable this to allow the enemy to save data to the EnemyStates map in the save game.
  • Save Current Health: If true, the enemy captures its exact HP during a save snapshot. On load, this health is restored after the stats system initializes, ensuring it's not overwritten by default Max HP.
  • Save Boss Phase: Persists CurrentBossPhase and bIsEnraged. The boss will immediately skip to the correct phase when the player returns.
  • Defeated State: If an enemy dies and bSaveDefeatedState is true, they stay dead. They can either be destroyed immediately on load or trigger their death flow visually.
Auto-Discovery: Enemies (inheriting from SoulsEnemyBase) do NOT require a SoulsPersistentComponent to be added manually. The system automatically discovers all enemies with bSaveEnemyState enabled and includes them in the global save snapshot.

Setup Checklist

1 Assign a unique Enemy Persistent Id (e.g., Boss_UndeadKing).

2 Enable Save Enemy State.

3 Enable Save Current Health for elite enemies or bosses.

4 Enable Save Boss Phase for multi-stage encounters.

5 (Optional) Enable Destroy if Defeated on Load to prevent the dead body from being seen if the enemy was already killed.

Timing Note: Health restoration happens with a 0.1s delay after BeginPlay. This ensures that any Blueprint logic or Stat Component defaults are finished before the saved persistence data overrides them.
Debugging: Enable bEnableSoulsDebugLogs on the Game Instance to see detailed HP save/load logs: [Persistence] Restoring Enemy Boss_Test1: SavedHP=450.0, SavedDefeated=No.

DEVELOPER TOOLS

Souls Developer Hub

Built-in editor tools for diagnostics, save testing, validation, and asset setup.

Overview

The Souls Developer Hub is the main editor utility window for Souls Mobile Kit. It provides project validation, save testing, data asset creation, and enemy inspection tools directly inside Unreal Editor.

Open it from the Unreal Editor menu using the Souls Dev Mode entry, then use the tabs across the top of the window: General, Save Data, Validation, Items, Actions, Effects, and AI Tools.

1. General and Save Data Tools

Tab Purpose Typical Use
GeneralProject/debug settings and quick development controls.Switch between PC-focused testing and mobile-style input testing.
Save DataSave management actions for the current test project.Force a save snapshot, reload saved data, or reset local save data during validation passes.
ValidationProject-wide setup scanner.Find missing IDs, missing montages, missing widget bindings, and other common setup errors.
ItemsGuided Item Data Asset creation.Create a clean USoulsItemDataAsset with required fields and recommended defaults.
ActionsGuided Action Data Asset creation.Create a clean USoulsActionDataAsset with action type, costs, cooldown, and montage settings.
EffectsGuided Status Effect and Buff creation.Create gameplay effect assets for buildup, duration, stacking, and stat modifiers.
AI ToolsAI Ability creation and enemy inspection.Create AI ability assets and inspect placed enemies in the active editor or PIE world.

2. Save Management

The Save Data tab provides utility actions for testing persistence without placing temporary Blueprint nodes in the level.

  • Reset Project Save Data: Completely wipes the active save slot from both disk and memory. Use this to test "First Time" player experiences.
  • Teleport to Checkpoint: Immediately restores the player to the last registered bonfire.
  • Save State Snapshot: Manually trigger an atomic save to verify persistence behavior.

3. Project Validation Tool

The Validation tab scans project assets and reports setup problems before they become runtime bugs. The scan is safe-only: it never edits, deletes, renames, or auto-fixes assets.

What It Checks

  • Item assets with missing IDs, display names, weapon classes, or dropped pickup classes.
  • Action assets with missing IDs, names, or required montages.
  • Status Effect and Buff assets with missing IDs, names, or icons.
  • AI Ability assets with missing IDs, names, or montages.
  • Known UMG widgets with missing required bindings such as recipe or item list widgets.

Result Severity

  • Error: A required setup value is missing and the system may not work correctly.
  • Warning: The asset can still work, but a recommended field is missing.
  • Summary Cards: The top dashboard shows total issues, errors, and warnings after each scan.

How to Run Validation

1 Open Souls Dev Mode from the Unreal Editor menu.

2 Select the Validation tab.

3 Click Run Project Scan.

4 Review the dashboard counters and the results table.

5 Use Clear Results to reset the table before another scan.

Validation names are exact: Widget binding checks look for specific required names. For example, a crafting widget list named RecipeList is different from RecipesList. If validation reports a missing binding, check the widget hierarchy and the variable name spelling.

4. Item Data Asset Creator

The Items tab provides a C++ Slate form for creating USoulsItemDataAsset assets directly from the Dev Hub. It is intended for fast, consistent setup of common item assets without requiring C++ edits or manual factory setup.

Field Description
Asset NameThe package and asset name to create, such as DA_Item_TestPotion.
Save Folder PathDefault path is /Game/SoulsMobileKit/Data/Items.
Item IDUnique gameplay identifier. If empty, the tool can derive it from the asset name where supported.
Display NamePlayer-facing item name shown in inventory and UI.
DescriptionInventory description text.
Item TypeControls item behavior, such as Weapon, Consumable, Key Item, Soul Currency, or Crafting Material when available.
Max StackRecommended defaults are 1 for Weapon/Key Item and 99 for Consumable/Crafting Material.
ValueBase economy value used by vendor and sell-price systems.
Dropped Pickup ClassOptional world pickup class used when the item can be dropped into the world.
Weapon ClassRequired for weapon item assets so equipment can spawn the correct weapon actor.

Example Item Setup

1 Open Souls Dev Mode and select the Items tab.

2 Set Asset Name to DA_Item_TestDevTool.

3 Keep the folder as /Game/SoulsMobileKit/Data/Items.

4 Set Item ID to test_dev_tool and Display Name to Test Dev Tool Item.

5 Choose Consumable, set Max Stack to 99, and set Value to 1.

6 Click Create Item Asset.

7 Confirm the new asset appears in the Content Browser, then run the Validation scan to check for missing setup.

Creation safety: The item creator checks required fields and prevents overwriting an existing asset with the same name. It saves the created package after successful creation.

5. Action Data Asset Creator

The Actions tab provides a streamlined interface for creating USoulsActionDataAsset instances. This tool handles the repetitive setup fields for data-driven combat actions, including action identity, action type, animation montage, stamina cost, cooldown, and whether the action system should play the montage directly.

Field Description
Asset NameThe package name (e.g., DA_Action_HeavyAttack).
Save PathDefault path is /Game/SoulsMobileKit/Data/Actions.
Action IDUnique identifier used by the action system and validation tools to identify the action.
Display NameThe name shown in ability menus or combat logs.
Action TypeCategorizes the action using the existing Souls action enum, such as Light Attack, Heavy Attack, Dodge, Block, Interact, Quick Item, or Weapon Ability when available.
Stamina CostAmount of stamina consumed when the action starts.
CooldownDuration in seconds before the action can be used again.
MontageThe animation montage to be played.
Action System Plays MontageIf enabled, the action system will automatically play the assigned montage when the action is triggered. Keep disabled for wrapper actions that should call existing legacy combat logic.

Example Combat Action Setup

1 Open Souls Dev Mode and select the Actions tab.

2 Set Asset Name to DA_Action_QuickDodge.

3 Set Action ID to quick_dodge and Display Name to Quick Dodge.

4 Set Action Type to Dodge.

5 Set a small stamina cost and cooldown appropriate for testing.

6 Assign a dodge montage to the Montage field if this action should play animation directly.

7 Enable Action System Plays Montage only when the action asset should play its assigned montage itself.

8 Click Create Action Asset.

9 Run the Validation scan to confirm the new action asset has no missing required setup.

Action asset creation does not assign gameplay automatically: after creating an action asset, assign it to the relevant character, weapon, moveset, or Blueprint property used by your setup. The creator only makes a valid data asset; it does not decide which actor should use it.

6. Effect & Buff Creator

The Effects tab provides two sub-tools for managing temporary gameplay modifications: the Status Effect Creator and the Buff Creator. These tools generate data assets used by the SoulsStatusEffectComponent to apply ticking damage or stat boosts.

Status Effects

Typically used for harmful or elemental effects like Poison, Bleed, or Frostbite. Supports ticking damage and custom execution intervals.

Buffs

Typically used for beneficial stat modifications like Strength Boosts, Stamina Regen increases, or Temporary Defense.

7. AI Tools & Enemy Inspector

The AI Tools tab is a comprehensive suite for designing enemy combat behaviors and performing live diagnostics on active AI agents in the world.

7.1 AI Ability Creator

This form allows designers to create USoulsAIAbilityDataAsset instances without manual property configuration. It includes safety checks for required montages and ranges.

FieldDescription
Ability IDUnique identifier for the ability (e.g., leap_attack).
MontageThe animation montage played during execution.
Min/Max RangeDistance requirements for the AI to consider this ability.
CooldownTime before this specific ability can be used again.
Windup (Telegraph)Preparation time before the actual attack hitboxes become active. Enables bUseTelegraph automatically if > 0.
RecoveryAnimation duration after the attack before the AI can return to idle/movement.

7.2 Enemy Inspector

The Enemy Inspector provides a real-time diagnostic view of any ASoulsEnemyBase actor in the current level. It is essential for balancing combat encounters and debugging AI target selection.

  • Deterministic Refresh: Refresh List scans the active editor or PIE world directly and does not require clicking the viewport first.
  • Rename-Safe List: Renaming an enemy actor in the level updates the dropdown and inspected label after refresh.
  • Stale Entry Cleanup: Deleted or invalid enemy references are removed safely from the list.
  • Live Stats: Monitor Current HP vs Max HP and health percentages in real-time.
  • Targeting: See exactly which actor the AI is currently tracking via its Blackboard.
  • Config Overview: Instantly check if the enemy is using Simple AI or a full Behavior Tree.
  • Boss Tracking: Monitor boss phases and phase-transition thresholds.
  • Auto-Refresh: Enable the checkbox to update data every 0.5 seconds while playing.
  • Editor Integration: Use Select in Editor to jump directly to the actor in the world outliner.
  • Log Export: Use Copy Summary To Log to print a readable enemy debug report to the Unreal Output Log.

How to Inspect an Enemy

1 Open a level that contains one or more ASoulsEnemyBase actors.

2 Open Souls Dev Mode and select AI Tools.

3 In Enemy Inspector, click Refresh List.

4 Select an enemy from the dropdown.

5 Review stats, target, AI config, boss phase, tactics, and assigned ability count.

6 Enable Auto Refresh Data when testing live HP, target changes, or behavior changes during Play.

7 Use Select in Editor to focus the enemy actor, or Copy Summary To Log to export the current debug summary.

Refresh behavior: the inspector refreshes from the active world context, so it works even when the Souls Dev Mode window is focused or full screen. Manual refresh rebuilds the enemy list; auto-refresh is intended for updating the selected enemy's live data.
Production note: Souls Dev Mode is an editor and development workflow tool. It is intended for designers and developers working inside Unreal Editor, not for player-facing runtime menus.

PRODUCTION READINESS

Debug & Performance Logs

Managing log noise and performance monitoring in the final build.

Souls Mobile Engine includes an extensive logging system to help developers track combat states, action lifecycles, and inventory changes. By default, these logs are disabled for performance and clarity in the final product.

1. System Debug Toggles

Most core components include a bDebugActionSystem or bEnableDebugLogs boolean. When enabled, the system will output detailed information to the Output Log and Console.

Property Component Log Category Description
bDebugActionSystem SoulsActionComponent LogSoulsActionDebug Logs action starts, finishes, interrupts, and cooldowns. Useful for debugging combo timing.
bShowCombatDebugLogs SoulsCombatComponent LogSoulsActionDebug Logs combat trace, guard, impact, hit reaction, and damage-flow information while tuning attacks.
bShowAICombatDebugOverlay SoulsEnemyBase On-screen overlay Draws compact PIE text above an enemy showing state, target, distance, active owner, active ability, and last impact data.
bShowAICombatDebugLogs SoulsEnemyBase LogTemp audit lines Enables verbose AI audit logs such as target detection, ability selection, ability movement, return-home, and action ownership.
bEnableDebugLogs SoulsInventoryComponent LogSoulsInventoryDebug Logs item additions, removals, equipment changes, and backend inventory logic.
bEnableDebugLogs SoulsInventoryWidget LogSoulsInventoryDebug Logs UI initialization, tab switching, and item selection events.
bEnableDebugLogs SoulsItemPickup LogSoulsInventoryDebug Logs pickup attempts and overlap events.
bDebugParryDamageFlow SoulsCombatComponent / SoulsEnemyBase LogSoulsActionDebug Enables the [PARRY_DAMAGE_TRACE] system. Logs detailed damage flow, startup configuration, and finisher resolution to isolate unintended damage sources.
bEnableDebugPersistence SoulsInteractable LogTemp Outputs detailed lifecycle logs for persistence (ID matching, state restoration, and auto-saves). Essential for debugging doors/chests.
Silent by Default: runtime combat and AI audit logs are disabled by default. Enable them only when tuning a specific actor or component. Unreal Engine startup logs can still appear in PIE; those are engine messages, not Souls Mobile Engine debug spam.

2. How to Enable Debugging

1 Open your Player Character or NPC Blueprint.

2 For player action or combat traces, select ActionComponent or CombatComponent.

3 For enemy behavior, select the enemy actor or enemy Blueprint and open Enemy | Debug.

4 Use Show AICombat Debug Overlay for visual tuning without Output Log noise.

5 Use Show AICombat Debug Logs or Show Combat Debug Logs only when you need detailed audit lines.

3. AI Combat Debug Overlay

The enemy overlay is the fastest way to understand why an enemy is idle, approaching, attacking, returning home, or using an ability. It is intended for PIE tuning and is disabled by default.

Overlay Line What It Shows How To Use It
State Current AI brain state. Watch for Dormant, Approach, AttackDecision, AbilityActive, and ReturnHome.
Target / Dist Accepted combat target and distance. Confirms the enemy is tracking the player and not a world object.
Owner Current action owner, such as AI ability or legacy combo. Useful for checking that actions are not replacing each other too early.
Ability Current active AI ability, if one is running. Use it to confirm selection, repeat behavior, and ability movement timing.
Last Impact Recent impact multipliers and hit reaction type. Use it to confirm that ability-specific impact tuning is being read.
Recommended workflow: enable overlay first. Enable verbose logs only if the overlay does not explain the behavior. This keeps PIE clean while still giving enough information for tuning.

4. Custom Log Categories

If you are writing custom C++ extensions, we recommend using the following categories for consistency:

  • LogSoulsActionDebug - Action and Ability logic.
  • LogSoulsInventoryDebug - Inventory and Item systems.
  • LogTemp audit prefixes - Enemy AI audit messages when bShowAICombatDebugLogs is enabled.

RPG WORLD MODULES

Chest Loot Widget

Optional immersive container interaction and persistent contents.

The Chest Loot Widget system lets a container open an inspection UI instead of instantly granting every item. Players can select one item, take it, take everything at once, or close the chest while leaving the remaining contents saved for later.

1. Key Features

Selective Take

Take items one by one or all at once (Take All).

Persistence

Remaining items are saved to the AAA Save System.

Mobile UI

Touch-friendly buttons and clear feedback messages.

Failsafe

Items only removed from chest if inventory addition succeeds.

2. Container Configuration

Use the same chest/container actor. The loot widget is optional, so existing instant-loot chests continue to work when the widget option is disabled.

Property Description
bOpenLootWidgetOnInteract When enabled, Interact opens the loot UI. When disabled, the chest uses the classic instant-loot behavior.
LootWidgetClass Assign your WBP_SoulsChestLoot here.
bAllowTakeSingleItem If true, shows the "Take" button for individual items.
bAllowTakeAll If true, shows the "Take All" button.
bCloseWhenEmpty Automatically closes the widget when the chest becomes empty.
bSaveRemainingLoot Stores the remaining chest contents, so partial looting survives save/load.
ContainerId Use a unique id per placed chest. This id connects opened state and remaining contents to the save file.

3. Main Widget Setup

Create WBP_SoulsChestLoot with parent class SoulsChestLootWidget. The widget must contain these exact BindWidget names:

Widget NameTypePurpose
ChestTitleTextTextBlockDisplays the chest title.
ItemListVerticalBoxContainer where item rows are created.
TakeButtonButtonTakes the currently selected row.
TakeAllButtonButtonTakes all remaining loot.
CloseButtonButtonCloses the loot UI and returns control to the player.
EmptyTextTextBlockShown when the chest has no remaining items.
FeedbackTextTextBlockShows short messages such as item taken or inventory failure.
ItemList Type: ItemList must be a VerticalBox, not a ScrollBox. For scrolling, place a ScrollBox in the layout and put the ItemList VerticalBox inside it.

4. Row Widget Setup

Create WBP_SoulsChestLootItemRow with parent class SoulsChestLootItemRowWidget. Each row represents one loot entry.

Widget NameTypePurpose
SelectButtonButtonSelects this loot row.
ItemIconImageDisplays the item icon.
ItemNameTextTextBlockDisplays the item name.
QuantityTextTextBlockDisplays the remaining quantity.

5. Assign the Row Class

Open WBP_SoulsChestLoot, go to Class Defaults, and assign LootItemRowWidgetClass to WBP_SoulsChestLootItemRow. Without this assignment, the chest can open but the item list cannot create rows.

6. Recommended Hierarchy

WBP_SoulsChestLoot
  Canvas Panel
    Border
      Vertical Box
        ChestTitleText
        ScrollBox
          ItemList                 // VerticalBox
        EmptyText
        FeedbackText
        Horizontal Box
          TakeButton
          TakeAllButton
          CloseButton

7. Save Behavior

  • Take One: removes only the selected item or quantity from the chest after it is added to inventory.
  • Take All: attempts to transfer every remaining item to the player's inventory.
  • Partial Loot: if the player takes some items and saves, the chest restores only the remaining entries later.
  • Empty Chest: when all loot is taken, the chest stays empty after save/load.
  • Transfer Safety: if an item cannot be added to inventory, it is not removed from the chest.

8. Manual Validation Checklist

  • [ ] Classic Chest: With bOpenLootWidgetOnInteract disabled, does the chest still grant loot directly?
  • [ ] Widget Chest: With bOpenLootWidgetOnInteract enabled, does Interact open WBP_SoulsChestLoot?
  • [ ] Rows: Does each loot entry appear using WBP_SoulsChestLootItemRow?
  • [ ] Take: Does selecting a row and pressing Take remove only that item from the chest?
  • [ ] Take All: Does Take All move every remaining item and show the empty state?
  • [ ] Save/Load: After taking one item and saving, does the chest restore only the remaining items?
  • [ ] Controls: After closing the UI, do movement, attack, dodge, and interact work normally?